【编译原理11】递归下降法分析算术表达式

Problem Description

已知算术表达式文法G[E]:
E → E + T|T
T → T * F|F
F → ( E )|i
判断是否为LL(1)文法;如果是请编写一个递归下降LL(1)分析程序,
判断文法G所能接受的串。如果不是转换为LL(1)文法后,编写一个递归下降LL(1)分析程序。
Input 输入多行由终止符构成的算术表达式,输入EOF结束。
Output 判断每行输入的算术表达式,如果表达式在语法结构上是合法的,输出"syntax correct";否则输出"syntax error"。

Sample Input
i+ii#
i+i
i+i++#
Sample Output
syntax correct
syntax error

消除左递归后的文法
E →TE1
E1→+TE1 | ε
T → FT1
T1→*F T1 | ε
F→(E)|i

C++代码实现

//
// Created by Visunf Chen on 2020-10-23.
//先消除左递归
#include "iostream"

using namespace std;

string str;
int flag=1;//默认合法

void E(string s);//1.非终结符E
void E1(string s);//2.非终结符E'
void T(string s);//3.非终结符T
void T1(string s);//4.非终结符T'
void F(string s);//非终结符F

void E(string string1){

    str = string1;
    T(str);
    E1(str);
    return;
}

void E1(string string1){
    str = string1;
    if (str[0]=='+'){
        str = str.substr(1,str.length());
        T(str);
        E1(str);
    }
    return;
}

void T(string string1){
    str = string1;
    F(str);
    T1(str);
    return;
}

void T1(string string1){
    str  = string1;
    if (str[0]=='*'){
        str = str.substr(1,str.length());
        F(str);
        T1(str);
    }
    return;
}

void F(string string1){
    str = string1;
    if (str[0]=='i'){
        str = str.substr(1,str.length());
    }
    else if (str[0]=='('){
        str = str.substr(1,str.length());
        E(str);
        if (str[0]==')')
            str = str.substr(1,str.length());
    } else{
        flag = 0;
    }
    return;
}



int main()
{
    while (cin>>str&&str!="EOF"){
        E(str);
       if (str.length()==1 && flag==1 && str[0]=='#')cout<<"syntax correct"<<endl;
        else cout<<"syntax error"<<endl;
    }


    return 0;
}

你可能感兴趣的:(《编译原理》,非确定性有穷自动机,确定有穷自动机)