编译原理 文法分析

本文介绍了一个简单的语法分析程序设计案例,通过递归下降法验证给定字符串是否符合特定文法。该程序能够处理长度不超过4001的字符串,并判断其是否符合四则运算表达式的文法规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译原理实验二:语法分析一
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB
Total submit users: 115, Accepted users: 109
Problem 10835 : No special judgement
Problem description
  给定文法 ,其中, P如下:

可以证明这是一个LL(1)文法,因此可以使用确定性分析。请编写语法分析程序,判断给定的输入是否为该文法的句子。输入可以认为是一不含空格的字符串,长度不超过4001。

该文法实际上是四则运算表达式结构的抽象,凡是符合四则运算表达式结构的均是该文法的句子,反之则不是。


Input
  输入只有一行,是一个长度不超过4001的字符串。
Output
  如果输入的字符串是上述文法的句子,则输出YES;否则输出NO。
Sample Input
i+i*i
Sample Output
YES
Judge Tips
  输入可以使用scanf(“%s”,…)或者gets(…)直接读入一个字符串。然后使用递归下降法或者预测分析法均可完成该实验。
 


int E();
int Ec();
int T();
int Tc();
int F();

char s[5000];
int idx;

int E(){
    return T() && Ec();
}
int Ec(){
    if ( s[idx] == '+' || s[idx] == '-') return idx++ && T() && Ec();
    return 1;
}
int T(){
    return F() && Tc();
}
int Tc(){
    if ( s[idx] == '*' || s[idx] == '/') return idx++ && F() && Tc();
    return 1;
}
int F(){
    if ( s[idx] == '(') return idx++ && E() && s[idx++] == ')';
    if ( s[idx] == 'i') return idx++ ;
    return 0;
}

int main(){
    while(scanf("%s",s+1) != EOF){
        s[0] = '1';
        idx = 1;
        int ans = E() && s[idx] == '\0';
        printf( ans ? "YES\n" : "NO\n");
    }
    return 0;
}

poj 1126


//S :: p~z
//S :: NS;
//S :: CSS | DSS | ESS | ISS
const int SIZE = 1111;
char  s[SIZE];
int idx;
bool Parse(){
    char ch = s[idx];
    switch(ch){
    case 'N': idx++; return Parse();
    case 'C': idx++; return Parse() && Parse();
    case 'D': idx++; return Parse() && Parse();
    case 'E': idx++; return Parse() && Parse();
    case 'I': idx++; return Parse() && Parse();
        default : idx++;return ch >= 'p' && ch <= 'z';
    }
}
int main(){
    while(scanf("%s",s) != EOF){
        idx = 0;
        int ans = (Parse() && '\0' == s[idx]);
        printf( ans ? "YES\n" : "NO\n");
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值