FM推导过程

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是对下列文法编写的C++程序,使用LL(1)分析法对任意输入的符号串进行分析: ```c++ #include <iostream> #include <string> #include <stack> using namespace std; // 预测分析表 string table[5][8] = { {"TG", "", "", "", "TG", "", "TG", ""}, {"", "ε", "+TG", "-TG", "", "", "", "ε"}, {"FM", "", "", "", "FM", "", "FM", ""}, {"", "ε", "", "", "ε", "*FM", "/FM", "ε"}, {"(E)", "", "", "", "i", "", "i", ""} }; // 判断非终结符 bool isNonTerminal(char c) { return c == 'E' || c == 'G' || c == 'T' || c == 'M' || c == 'F'; } // 获取预测分析表中的产生式 string getProduction(char X, char a) { int row, col; switch(X) { case 'E': row = 0; break; case 'G': row = 1; break; case 'T': row = 2; break; case 'M': row = 3; break; case 'F': row = 4; break; } switch(a) { case '(': col = 0; break; case ')': col = 1; break; case '+': col = 2; break; case '-': col = 3; break; case '*': col = 4; break; case '/': col = 5; break; case 'i': col = 6; break; case '#': col = 7; break; } return table[row][col]; } // LL(1)分析过程 bool LL(string str) { stack<char> stk; stk.push('#'); stk.push('E'); int i = 0; char X = stk.top(); while(X != '#' && i < str.length()) { char a = str[i]; if(X == a) { stk.pop(); i++; } else if(isNonTerminal(X)) { string prod = getProduction(X, a); if(prod == "") { // 无法推导出该符号串,分析失败 return false; } stk.pop(); if(prod != "ε") { for(int j = prod.length() - 1; j >= 0; j--) { stk.push(prod[j]); } } } else { // 栈顶符号是终结符,但与输入符号不匹配,分析失败 return false; } X = stk.top(); } if(X == '#' && i == str.length()) { // 分析成功 return true; } else { // 栈为空但输入符号串未被完全处理,或者栈不为空但输入符号串已被处理完,分析失败 return false; } } int main() { string str; cout << "请输入以#结束的符号串:"; cin >> str; if(LL(str)) { cout << "该符号串是该文法的句子" << endl; } else { cout << "该符号串不是该文法的句子" << endl; } return 0; } ``` 该程序会从标准输入读取一个符号串,并使用LL(1)分析法对该符号串进行分析。如果分析成功,则输出“该符号串是该文法的句子”,否则输出“该符号串不是该文法的句子”。 注意:该程序中的预测分析表是根据题目中的文法手动构造的,如果文法发生改变,则需要相应地修改预测分析表。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值