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

CODE: https://github.com/pxjw/Principles-of-Compiler/tree/master/consDFA

原题:

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;
}

 

 

 

 

posted @ 2015-04-21 20:31  Pxjw  阅读(18865)  评论(3编辑  收藏  举报