编译原理测试

LL(1)预测表匹配过程

void test(int &state){

     Inital_AnalysisTableMap();
     Print_AnalysisTable();

     SqStack Analysis_Stack;                //定义分析栈
     InitalStack(Analysis_Stack);           //初始化分析栈
     PushStack(Analysis_Stack,'#');         //先将#压入栈
     PushStack(Analysis_Stack,'E');         //将开始符号E压入分析栈底



     SqStack Input_Stack;                   //定义输入栈
     InitalStack(Input_Stack);              //初始化输入栈
     PushStack(Input_Stack,'#');            //将#压入输入栈底

//     string input_str = "i+i*i";          //输入将要匹配的字符串

     string input_str ;                     //输入将要匹配的字符串
     cout<<"请输入待匹配的字符串:";
     cin>>input_str;

    if (input_str.length()==3 & input_str[0]=='e' && input_str[1]=='n' && input_str[2]=='d'){  //退出
        state=0;
        return;
    }


     Push_Str_resverse(Input_Stack,input_str);  //将输入的字符逆序压入输入栈当中
//     PrintStackUpToDown(Input_Stack);


    cout<<"Analysis_Stack"<<"\t"<<"     input_Stack"<<"\t"<<"    production"<<endl;

    while (Input_Stack.top!=-1){  //输入栈非空
            char top_analysis_stack;                                //用于接收查看分析栈顶元素
            getStackTop(Analysis_Stack,top_analysis_stack);    //查看当前分析栈的栈顶元素

            char top_input_Stack;                                     //用于接收查看输入栈顶元素
            getStackTop(Input_Stack,top_input_Stack);           //查看当前输入栈顶元素

           int indexOfNonterminal =getNonterminalCharIndex(top_analysis_stack);  //该非终结符对应下标
           int indexOfCharacter  = getCharacterIndex(top_input_Stack);           //该输入字符在字符表当中的下标


            if(indexOfNonterminal!=-1){    //当前分析栈顶元素是不是产生式左部的非终结符 不是-1代表是非终结符
                int status = AnalysisTableMap[indexOfNonterminal][indexOfCharacter];     //分析表当中对应产生式右部的下标
                if(status==-1){          //不存在该字符的后选式
                    cout<<"匹配失败!"<<endl;
                    return;
                }else if(status!=999){   //存在候选式但是不为空

                     PrintStackDownToUp(Analysis_Stack);
                     cout<<"\t\t\t";
                     PrintStackUpToDown(Input_Stack);
                     cout<<"\t\t\t";
                     cout<<product_left[indexOfNonterminal]<<"->"<<product_right[status]<<endl;

                    PopStack(Analysis_Stack,top_analysis_stack);    //分析栈出栈

                    string str=product_right[status];                     //获取当前产生式右部
                    Push_Str_resverse(Analysis_Stack,str);             //将产生式逆序压入分析栈中


                }else{                   //存在空候候选式,直接弹出
                    PrintStackDownToUp(Analysis_Stack);
                    cout<<"\t\t\t";
                    PrintStackUpToDown(Input_Stack);
                    cout<<"\t\t\t";
                    cout<<product_left[indexOfNonterminal]<<"->"<<"$"<<endl;
                    PopStack(Analysis_Stack,top_analysis_stack);    //弹出当前分析栈栈顶元素
                }

            }else if(top_analysis_stack!='#'){    //当前分析栈顶元素不为非非终结符,是终结字符,不是'#'

                PrintStackDownToUp(Analysis_Stack);
                cout<<"\t\t\t";
                PrintStackUpToDown(Input_Stack);
                cout<<"\t\t\t";
                if(top_analysis_stack==top_input_Stack){   //当前分析栈顶元素跟输入栈顶元素相等(终结符)
                    cout<<top_analysis_stack<<"匹配"<<endl;
                    PopStack(Analysis_Stack,top_analysis_stack);
                    PopStack(Input_Stack,top_input_Stack);
                }else{                                  //当前分析栈顶元素跟输入栈顶元素不相等(终结符)匹配失败退出
                    cout<<"匹配失败"<<endl;   //匹配失败
                    return;
                }

            }else{                                //当前分析栈顶元素是'#'
                PrintStackDownToUp(Analysis_Stack);
                cout<<"\t\t\t";
                PrintStackUpToDown(Input_Stack);
                cout<<"\t\t\t";
                if(top_analysis_stack==top_input_Stack){
                    cout<<"接受"<<endl;
                    PopStack(Analysis_Stack,top_analysis_stack);
                    PopStack(Input_Stack,top_input_Stack);
                }else{
                    cout<<"匹配失败"<<endl;
                    return;
                }
            }

    }
     cout<<endl<<"---------------------------------------------"<<endl<<endl<<endl<<endl;
}

DFA

int  DFA(int start_index,char end_index){

    char test[100];
    printf("请输入字符串:");
    scanf("%s",&test);


    int length=0;
    for(int i=0;test[i]!='\0';i++){
        length++;
    }

    if(length==3 && test[0]=='e' && test[1]=='n' && test[2] == 'd'){    //终止匹配
        printf("停止工作!\n");
        return 0;
    }


    int flag=1;   //判断循环是否正常进行,若中途break flag=0
    int current_state=start_index;

    for (int i = 0; test[i]!='\0' ; ++i) {
//        printf("%d: %c\n",i,test[i]);
        if(isInAlphabet(test[i])==1){     //该字符存在于字母表当中
            int al_index=getAlphabetIndex(test[i]);
            if(Map[current_state][al_index] != -1){
                printf("%c --%c-->%c\n",state[current_state],alphabet[al_index],state[Map[current_state][al_index]]);
                current_state = Map[current_state][al_index];
            } else{
                flag =0;                 //不存在该映射关系
                break;
            }
        }else{                            //该字符不存在于字母表当中
            flag = 0;
            break;
        }
    }

    if(flag==1 && current_state == end_index){
        printf("%s match YES!!!\n",test);
        return 1;
    }else{
        printf("%s match NO!!!\n",test);
        return 1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sgh.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值