表达式语法分析——预测分析法
来源:互联网 发布:淘宝行业排名 编辑:程序博客网 时间:2024/05/17 01:54
表达式语法分析——预测分析法
Time Limit: 1000MS Memory Limit: 65536KB
SubmitStatistic
Problem Description
预测分析法是自顶向下分析的一种方法,一个预测分析程序是由三个部分组成:
(1)预测分析程序
(2)先进后出栈
(3)预测分析表
现给出表达式文法:
E→TG
G→+TG |ε
T→FS
S→*FS |ε
F→(E) | i
该表达式文法是LL(1)文法,其预测分析表为:
请根据该预测分析表构造预测分析程序,完成对表达式的语法分析,对给定的输入串,判断其是否为合法表达式,给出所使用的产生式序列。
Input
给定输入串(长度不超过50个符号,以#号结束,符号保证是终结符或#)。
例如:
i+i*i#是合法表达式
i+i*(i+i)#是合法表达式
ii+i*i#不是合法表达式
i*(i+i#不是一个合法的表达式。
Output
要求输出分析过程中使用的所有产生式,产生式按使用顺序各占一行,每行有两个数据,使用顺序号(从1开始编号)及产生式本身,中间用一个空格分开,最后一行表示语法分析是否成功结束,如果成功分析结束输出acc!,表示该输入串是合法表达式,否者输出error!,表示该输入串不是合法表达式。
注:其中^符号代表文法中的ε符号。
针对输入串i+i*i#,因为分析过程使用了11次产生式,且该输入串是合法表达式,输出如下:
注:其中^符号代表文法中的ε符号。
针对输入串i+i*i#,因为分析过程使用了11次产生式,且该输入串是合法表达式,输出如下:
1 E->TG
2 T->FS
3 F->i
4 S->^
5 G->+TG
6 T->FS
7 F->i
8 S->*FS
9 F->i
10 S->^
11 G->^
acc!
针对输入串i*(i+i#,因为分析过程使用了14次产生式后,发现语法错误,该输入串不是合法表达式,输出如下:
1 E->TG
2 T->FS
3 F->i
4 S->*FS
5 F->(E)
6 E->TG
7 T->FS
8 F->i
9 S->^
10 G->+TG
11 T->FS
12 F->i
13 S->^
14 G->^
error!
Example Input
i+i*i#
Example Output
1 E->TG2 T->FS3 F->i4 S->^5 G->+TG6 T->FS7 F->i8 S->*FS9 F->i10 S->^11 G->^acc!
Hint
Author
#include<iostream>#include<stdio.h>using namespace std;int main(){ string a[200][200]; string b,s; b="#E"; int i=2,l=1; a['E']['i']="E->TG"; a['E']['(']="E->TG"; a['G']['+']="G->+TG"; a['G'][')']="G->^"; a['G']['#']="G->^"; a['T']['i']="T->FS"; a['T']['(']="T->FS"; a['S']['+']="S->^"; a['S']['*']="S->*FS"; a['S'][')']="S->^"; a['S']['#']="S->^"; a['F']['i']="F->i"; a['F']['(']="F->(E)"; cin>>s; int sl=s.length(),sl1=0; while(b[i-1]!='#'||s[sl1]!='#') { if(b[i-1]>='A'&&b[i-1]<='Z') { if(a[b[i-1]][s[sl1]]!="") { cout<<l++<<" "<<a[b[i-1]][s[sl1]]<<endl; if(b[i-1]=='E'&&(s[sl1]=='i'||s[sl1]=='(')) { b[i-1]='G'; b[i++]='T'; } else if(b[i-1]=='G'&&s[sl1]=='+') { b[i-1]='G'; b[i++]='T'; b[i++]='+'; } else if(b[i-1]=='G'&&(s[sl1]==')'||s[sl1]=='#')) { i--; } else if(b[i-1]=='T'&&(s[sl1]=='i'||s[sl1]=='(')) { b[i-1]='S'; b[i++]='F'; } else if(b[i-1]=='S'&&s[sl1]=='*') { b[i-1]='S'; b[i++]='F'; b[i++]='*'; } else if(b[i-1]=='S'&&(s[sl1]=='+'||s[sl1]==')'||s[sl1]=='#')) { i--; } else if(b[i-1]=='F'&&s[sl1]=='i') { b[i-1]='i'; } else if(b[i-1]=='F'&&s[sl1]=='(') { b[i-1]=')'; b[i++]='E'; b[i++]='('; } } else { cout<<"error!"<<endl; break; } } else { if(b[i-1]==s[sl1]) { i--; sl1++; } else { cout<<"error!"<<endl; break; } } } if(b[i-1]=='#'&&s[sl1]=='#') { cout<<"acc!"<<endl; } //cout<<a['E']['i']<<endl;}此代码非本人所写,本人不承担任何责任,侵删
0 0
- 表达式语法分析——预测分析法
- 表达式语法分析——预测分析法
- 表达式语法分析——预测分析法
- 表达式语法分析——预测分析法
- SDUT 表达式语法分析——预测分析法
- SDUT 2148 表达式语法分析——预测分析法
- 语法分析 预测分析法
- 语法分析:算术表达式预测分析程序设计
- 编译原理实验二——语法分析(预测分析)
- 编译器-语法分析(预测分析表法)
- 表达式语法分析——递归子程序法
- 表达式语法分析——递归子程序法
- 表达式语法分析——递归子程序法
- 表达式语法分析——递归子程序法
- 表达式语法分析——递归子程序法
- 表达式语法分析——递归子程序法
- 表达式语法分析——递归子程序法
- 算术表达式的语法分析及语义分析程序设计 —— LR分析法、输出三元式
- 第12周OJ实践 爬楼梯
- 自定义View的简单案例(2)
- java类加载机制
- HDU5980 Find Small A
- 通过函数的地址调用函数
- 表达式语法分析——预测分析法
- 本地与远程服务器之间的文件传输
- meta标签viewport申明,解决手机浏览页面缩放异常问题
- Java截取最后一个/后面的所有字符
- 【寒江雪】构件图和部署图
- git 经验小结
- Codeforces #380(Div.2)C.Road to Cinema【思维+二分查找】好题~
- leetcode_效率题解_[python/C++]_147. Insertion Sort List(链表插入排序)
- 聊一聊Fork/Join Framework