编译原理DFA(有限确定自动机)的构造

原题:

1、自己定义一个简单语言或者一个右线性正规文法

示例如(仅供参考)  G[S]:S→aU|bV    U→bV|aQ

V→aU|bQ     Q→aQ|bQ|e

2、构造其有穷确定自动机,如


3、利用有穷确定自动机M=(K,Σ,f,
S,Z)行为模拟程序算法,来对于任意给定的串,若属于该语言时,该过程经有限次计算后就会停止并回答“是”,若不属于,要么能停止并回答“不是”      

K:=S;

c:=getchar;

while c<>eof do

{K:=f(K,c);  

  c:=getchar;       };

if K is in Z then return (‘yes’)

                  else return (‘no’)

开始编程!

1.状态转换式构造类:
current——当前状态
next——下一状态

class TransTile
{
public:
    char current;
    char next;
    char input;
    TransTile(char C,char I,char Ne){
        current = C;
        next = Ne;
        input = I;
    }
};

2.DFA的构造类

此处包括DFA的数据集,字母表,以及过程P的定义。

包括了初始化,遍历转换,以及最终的字符串识别。

class DFA
{
public:
    //构造状态集各个元素
    string States;
    char startStates;
    string finalStates;
    string Alphabets;
    vector <TransTile> Tile;

    DFA(){
        init();
    }
    void init()
    {
        cout << "输入有限状态集S:" << endl;
        cin >> States;
        cout << "输入字符集A:" << endl;
        cin >> Alphabets;
        cout << "输入状态转换式(格式为:状态-输入字符-下一状态,输入#结束):" << endl;
        cout << "例如:1a1 \n 1a0 \n 2a1 \n #" << endl;
        int h = 0;

        //while (cin>>input){
        //    TransTile transval(input[0], input[1], input[2]);
        //    Tile.push_back(transval);
        //}
        while(true){
            char input[4];
            cin>>input;
            if(strcmp(input,"#")==0)
                break;
            TransTile transval(input[0],input[1],input[2]);
            Tile.push_back(transval);
        }
        cout << "输入初态:" << endl;
        cin >> startStates;
        cout << "输入终态:" << endl;
        cin >> finalStates;
    }
    //遍历转换表
    char move(char P,char I){
        for (int i = 0; i < Tile.size(); i++){
            if (Tile[i].current == P&&Tile[i].input == I){
                return Tile[i].next;
            }
        }
        return ‘E‘;
    }
    //识别字符串函数
    void recognition(){
        string str;
        cout << "输入需要识别的字符串:" << endl;
        cin >> str;
        int i = 0;
        char current = startStates;
        while (i < str.length()){
            current = move(current, str[i]);
            if (current == ‘E‘){
                break;
            }
            i++;
        }
        if (finalStates.find(current) != finalStates.npos){
            cout << "该自动机识别该字符串!" << endl;
        }
        else
        {
            cout << "该自动机不能识别该字符串!" << endl;
        }
    }
};

3.测试

Main函数

int main(){
    DFA dfa;
    bool tag;

    while(1){
        cout<<"你想要继续吗?是请输入1,否输入0:"<<endl;
        cin>>tag;
        if(tag){
            dfa.recognition();
        }else
            break;

    }
    return 0;
}
时间: 2024-10-06 03:44:44

编译原理DFA(有限确定自动机)的构造的相关文章

0909编译原理

1.编译原理学什么? “编译原理”是一门研究设计和构造编译程序原理和方法的课程,是计算机各专业的一门重要专业基础课. 2.为什么学编译原理? 通过学习该课程,掌握编译的基本理论.常用的编译技术,了解编译过程及编译系统结构和机理,更好的理解程序. 3.怎么学编译原理? 实践中学习,当然,需要掌握一些基本知识,通过在课堂中认真听课,运用已有的编程基础多加实践. 4.思考:在没有学习本书理论之前,如果让你写一个编译器,你是什么思路? 之前了解过编译器的原理就是将高级语言翻译成机器语言,但是如何写一个编

0909对编译原理的理解

1.编译原理学什么? 编译原理旨在让人们学习编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成,而且这门课程关注的是编译器方面的产生原理和技术问题.回归到本质上,学习编译原理其实也就是学习一个相对复杂的算法. 2.为什么学编译原理? 编译原理这门课程实际蕴含着计算机学科中解决问题的思路.形式化问题和解决问题的方法,这些思路和方法除了对应用软件和系统软件的设计与开发有一定的启发和指导作用外,在提倡学科的交叉不断创新

0909 初遇编译原理

编译原理学什么?      编译原理是一门研究设计和构造编译程序原理和方法的课程,是计算机各专业的一门重要专业基础课.编译原理主要学习的是编译程序结构及各部分功能.文法和语言         的基本概念和表示.词法分析.语法分析.属性文法与语法制导翻译技术.符号表.运算时存储空间的组织.代码优化与目标代码生成.并行编译技术概述等. 为什么学编译原理?      编译原理这门课程实际蕴含蕴含着计算机学科中解决问题的思路.形式化问题和解决问题的方法,这些思路和方法除了对应用软件和系统软件的设计与开发

我对编译原理的看法

在我看来,编译原理是一门比较深奥的一门学科,但毫不疑问,它对于我们来说,是很重要的,它是我们进阶的第一步.首先编译原理是学习编译技术的基本理论和实现技术,从源语言提取需要的信息,把源语言翻译成目标语言,大概就是学习编译器方面的产生原理和技术问题. 编译原理让我们学到编译器构造的基本原理和流程,更重要的是还让我们如何严谨地去思考.编写程序,让我们从中学会更多算法思想,对我们以后的编程很有用. 当如果不学的话,就是不能真真正正的理解编程.不能更进一步. 首先,提高自己对编译原理的学习兴趣,理解编译原

编译原理-NFA构造DFA

本题摘自北邮的编译原理与技术. 首先,根据此图构造状态转换表 表中第一列第一行表示从第一个符号B通过任意个空转换能到达的节点,Ia表示由此行的状态数组({B,5,1}可以看作0状态)经过一个a可以到达的节点,同理,Ib表示由状态数组经过一个b可以到达的节点. 当然,有些人可能觉得{B,5,1}和{5,1,3}看作两个状态不合理,他们之间不是有交集嘛,实际上他们之间并无交集,因为输入a后,{B,5,1}能到达的新节点是3,之所以要写成{5,1,3},可能是要兼顾逻辑吧>_> 再仔细观察第一行,既

【学习笔记】编译原理-有限自己主动机

一.定义: 不确定的有限自己主动机(NFA): 一种数学模型 (1) 一个有限的状态集合S (2) 一个输入符号集合∑(不包括ε) (3) 一个转换函数move: S X (∑ U {ε}) -> P(S) (4) 状态s0是唯一的開始状态 (5) 状态集合F是接受状态集合,S包括F 确定的有限自己主动机(DFA): 是NFA的特殊情况 (1) 不论什么状态都没有ε转换 (2) 对于不论什么状态s和不论什么输入符号a,最多仅仅有一条标记为a的边离开,即转换函数move: S X ∑-> S能够

编译原理——正规式转DFA算法概述

一.概念概述 给定一个单词,判断该单词是否满足我们给定的单词描述规则,需要用到编译原理中词法分析的相关知识,其中涉及到的两个很重要的概念就是正规式(Regular Expression)和有穷自动机(Finite Automata).正规式是描述单词规则的工具,首先要明确的一点是所有单词组成的是一个无穷的集合,而正规式正是描述这种无穷集合的一个工具:有穷自动机则是识别正规式的一个有效的工具,它分为确定的有穷自动机(Deterministic Finite Automata,DFA)和不确定的有穷

编译原理-如何使用flex和yacc工具构造一个高级计算器

Flex工具的使用方法 Lex 是一种生成扫描器的工具. Lex是Unix环境下非常著名的工具,主要功能是生成一个扫描器(Scanner)的C源码. 扫描器是一种识别文本中的词汇模式的程序. 这些词汇模式(或者常规表达式)在一种特殊的句子结构中定义.一种匹配的常规表达式可能会包含相关的动作.这一动作可能还包括返回一个标记. 当 Lex 接收到文件或文本形式的输入时,它试图将文本与常规表达式进行匹配. 它一次读入一个输入字符,直到找到一个匹配的模式. 如果能够找到一个匹配的模式,Lex 就执行相关

了解编译原理-笔记小结

这是之前学习编译原理过程中做下的笔记. 因能力有限,在很多地方都理解不到位,特别是对于词法分析与语法分析的过程感觉特别晦涩. 分享这个笔记也是为了自己做个总结,算是一个小的提纲吧,都没怎么深入解析编译的过程. 等以后领悟更多了再作补充吧. 希望各路人士能多加指点,谢谢. 词法分析 作用:将输入转换为一个一个的token,而其用一串整数来表示. 协作:只有当解析器需要的时候才会请求词法分析器,继续扫描输入流,在这个过程中将不断生成符号表. 实现:在通常的编程语言中,相对于不确定的有限自动机(NFA