- 1、本文档共190页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译第5章08本cp
第五章 自下而上 语法分析; 语法分析
推导:
—自上而下的语法分析过程
—预测分析程序,递归下降分析法(最左推导)
—注:要求文法是LL(1)文法
归约:
—自下而上的语法分析过程
—简单优先分析法,算符优先分析法、LR分析法;5.1 自下而上分析的基本问题;自下而上的语法分析过程;a+b………#;注:1)初态时栈内仅有栈底符“#”,读头指在最左边的单词符号上 .
2)语法分析程序执行的动作:
a)移进:读入一个单词并压入栈内,读头后移;
b)归约:检查栈顶若干个符号能否进行归约,若能,就以产生式左部替代该符号串,同时输出产生式编号.
c)识别成功:移进—归约的结局是栈内只剩下栈底符号和文法开始符号,读头也指向语句的结束符.
d)识别失败.;自下而上分析的中心问题:
怎样判断栈顶的符号串的可归约性,以及如何归约。这是5.2节(算符优先分析)和5.3节(LR分析法)将讨论的问题。;例如:有文法如下:
(1) S aAcBe
(2) A b
(3) A Ab
(4) B d
问语句abbcde是否是该文法的合法语句?;步骤;5.1.2 规范规约简述;规范归约是关于α的一个最右推导的逆过程。
因此,规范归约也称最左归约。
S aAcBe aAcde aAbcde abbcde
注:文法是无二义的;句柄与归约;二、自下而上语法分析方法;一、简单优先分析法;二、简单优先文法;对任何X,若文法开始符号S X……,则# X;若有S …..X,则X # ; PDA读入一个单词后,比较栈顶符号和该单词的优先级,若栈顶符号优先级低于该单词,继续读入;若栈顶符号优先级高于或等于读入符号,则找句柄进行归约,找不到句柄就继续读入,直到最后栈内只剩下开始符号,输入串读到“#”为止,此时识别正确。; 5.2 算符优先分析法一、什么是算符优先分析法;5.2 算符优先分析法;如:i+i-i*(i+i) 归约过程如下:
1)i+i-i*(i+i) 设算数级别最高,最先归约
2)E+i-i*(i+i)
3) E+E-i*(i+i) +,-同级,先归约左边“+”
4)E-i*(i+i)
5)E-E*(i+i) -, ×不同级,先归约右边“×”
6)E-E*(E+i)
7)E-E*(E+E) 先算括号内,再算括号外
8)E-E*(E)
9)E-E*E 先归约“×”,再归约“+”
10) E-E
11 ) E;直观算符分析法;直观算符分析法
1)直观算符分析法使用两个工作栈:一个算符栈(OPTR)存放运算符和括号,一个算量栈(OPND)用于存放操作数和运算结果;OPTR的栈顶符号用Q表示,OPND的栈顶符号用p表示
2)初态时,OPND为空,OPTR只有”#“;OPND=“”;
OPTR=“#”
flag=true;
advance;/*读入一个单词*/
While flag{
If Q=“#”and SYM=“#”then flag=false/*成功*/
else if Q=“(“and SYM=“)” then /*匹配括号对*/
{OPTR栈顶出栈;advance}
else if SYM是算量 then /*移进算量*/;{SYM入OPND栈;advance;}
else if Q SYM then /*移进算符*/
{SYM入OPTR栈;advance;}
else if Q SYM then /*归约*/
{OPND栈顶两个元素p1,p2弹出;
弹出OPTR栈顶元素Q;
将p1Qp2的结果入OPND栈;}
else ERROR
}
};此算法的优缺点:
优点:1)简单明了,易于手工实现,适于分析各种算术表达式
2)使用此算法可以很方便地把表达式译成目标指令,只要在归约时把计算p1Qp2值改为生成相应指令(Q,p1,p2,T)即可
缺点:1)算法采用两个栈,有时会把错误句子当成合法句子;而且,它也无法指出输入串出错位置
2)对于含有单目正负号的算术表达式不好处理。因为负号的优先级高于加减法,低于乘除法,但负号的形式与减号相同,不容易识别。;1、确定运算符的优先级
算符优先分析法的关键是比较两个相继出现的终结符的优先级而决定应采取的动作
要完成运算符间优先级的比较,可以先定义各种可能相继出现的运算符的优先级,并表示为矩阵的形式,使得
文档评论(0)