- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第4次上机—语法分析2
目的:熟练掌握自下而上的语法分析方法,并能用程序实现。
要求:
1. 使用如下文法:
E ? E+T | T
T ? T*F | F
F ? (E) | id
2. 对于任意给定的输入串(词法记号流)进行语法分析,要求采用LR分析器来完成。手工构造LR分析表,利用移进-归约分析算法(P69 图3.12)输出(P70 表3.8)对应的动作部分。如:
输入:id*+id/(id+id)#
输出:移进
按 F-id归约
移进
error
……
3. 要有一定的错误处理功能。即对错误能提示,并且能在一定程度上忽略尽量少的记号来进行接下来的分析。
例如:
从状态0开始的记号流为:bm
将b移进之后,栈里的情况应该为: 0 b 2
此时查表发现 action[2,m]=error
输出打印:error
把A和状态1相继压入栈,用户指针后移到FOLLOW(A)对应的元素继续分析。
0
0
.
.
.
.
.
.
栈
.. . . . a . .
A
发现错误
I0 :
C?a ·Ac
A?· bn
. . .
I 1
C?a A ·c
. . .
A
I 2
A?b · n
. . .
b
扩展:
1.利用P92页的表3.13的方式将错误进行分类提示,即给出具体的出错信息。
2. 在已有文法的基础上再加上减法“-”和除法“/”对应的产生式构成最终的文法。从而使得记号流可以处理带括号的加、减、乘、除四则运算。
#includeiostream
#includefstream
#includestring
#includestack
using namespace std;
stackint astack;
int i=0,b,c,a;//a为输入符号,即table数组列,b为table数组行
char temp[1000];
string wenfa[6]={按E-E+T规约,按E-T规约,按T-T*F规约,按T-F规约,按F-(E)规约,按F-id规约};
int table[12][9]=
{/*数组列,id=0,+=1,*=2,(=3,)=4,$=5,E=6,T=7,F=8 ;行为状态, 表中所存数字0~11代表移进;12~17代表按1~6产生式规约,-1代表接受状态*/
5,-2,-2,4,-3,-2,1,2,3,
-4,6,-4,-4,-3,-1,-2,-2,-2,
13,13,7,13,13,13,-2,-2,-2,
15,15,15,15,15,15,-2,-2,-2,
5,-2,-2,4,-3,-2,8,2,3,
17,17,17,17,17,17,-2,-2,-2,
5,-2,-2,4,-3,-2,-2,9,3,
5,-2,-2,4,-3,-2,-2,-2,10,
-4,6,-4,-4,11,-5,-2,-2,-2,
12,12,7,12,12,12,-2,-2,-2,
14,14,14,14,14,14,-2,-2,-2,
16,16,16,16,16,16,-2,-2,-2
};
void Analysis()
{
i=0;
while(#!=temp[i])
{
if(i==temp[i]) a=0;
if(+==temp[i]) a=1;
if((==temp[i]) a=3;
if()==temp[i]) a=4;
if(*==temp[i]) a=2;
if($==temp[i]) a=5;
if(E==temp[i]) a=6;
if(T==temp[i]) a=7;
if(F==temp[i]) a=8;
b=astack.top();
c=table[b][a];
if(-1==c)
{
cout接受endl;break;
}
if(c=0c=11)
{
cout移进endl;
astack.push(c);
if(0==a) i++;
i++;
}
if(c=12)
{
coutwenfa[c-12]endl;
if(c==12||c==14||c==16)
{astack.pop(); astack.pop();astack.pop();}
else
{astack.pop();}
b=astack.top();
astack.push(table[b][c/2]);
}
if(-2==c)
{
cout
文档评论(0)