【编译原理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;
}
  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值