- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
川师编译原理课件
主程序 void main() { lookhead=nexttoken();//调词法分析程序 E(); //E的过程调用 } void match(token t); { if lookhead == t then lookhead = nexttoken(); else error(); //出错处理程序 } 递归子程序法 1)改造文法:消除二义性、消除左递归、提取左因子; 2)求每个候选式的FIRST集和变量的FOLLOW集; 3)检查是不是 LL(1) 文法; 若不是 LL(1),说明文法的复杂性超过自顶向下方法的分析能力,需要附加新的“信息”。 4) 按照 LL(1) 文法画语法图 5) 化简语法图 6) 按照语法图,编写程序 按照语法图,为每个非终结符设置一个子程序。 事实上,如果有一个恰当的文法,可以直接根据每个语法变量的产生式设计相应的程序 优缺点分析 优点: 1)直观、简单、可读性好 2)便于扩充 缺点: 1) 递归算法速度慢、占用空间多,其实现效率低; 2) 处理能力相对有限,要求文法必须为LL(1)文法,所以通用性差; 3) 难以自动生成; 5.4 预测分析法 对于LL(1)型文法,可以使用预测分析法 预测分析器由三部份组成 (1)预测分析表(矩阵) (2)先进后出栈 用来存放分析过程的语法符号 (3)预测分析程序 预测分析法适用于LL(1)型文法 所以在适用预测分析法时,必须先将文法化为LL(1)型文法. 例: E → E + T|T T → T * F|F F → ( E )|i E→ T E’ E’→ + T E’|ε T→ F T’ T’→* F T’|ε F→ ( E )|i 5.4.1 预测分析表 预测分析表为一个二维矩阵,其形式为M[A,a],其中A∈VN ,a∈VT或#。 若有产生式A→α,使得a∈SELECT(A→α),则将A→α填入M[A,a]中。(书写时,通常省略规则左部,只填→α) 对所有没有值的M[A,a]标记为出错。 例:文法G[E]的SELECT集如右 文法G[E]: E→ T E’ E’→ + T E’|ε T→ F T’ T’→* F T’|ε F→ ( E )|i SELECT(E→ T E’)={(,i} SELECT(E’→ + T E’)={+} SELECT(E’→ε)={#,)} SELECT(T→ F T’)={(,i} SELECT(T’→* F T’)={*} SELECT(T’→ε)={+,#,)} SELECT(F→( E ))={(} SELECT(F→i)={i} 根据SELECT集构造G[E]的预测分析矩阵M[X,a]如下: i + * ( ) # E →TE →TE E →+TE →ε →ε T →FT →FT T →ε →*FT →ε →ε F →i →(E) 5.4.2 预测分析程序 一些符号的约定: #:句子结束符 S:文法开始符 a:当前输入符号a,输入指针指向的符号 X:工作栈栈顶符号 #,S进栈 ; //初始化工作 do{ X=当前栈顶符号;a=当前输入符号; if (X∈VT∪{#}) {if (X==a) {if (X ! =#) {将X弹出,且前移输入指针}} else error() } else { if (M[X,a]==Y1Y2…Yk ) {将X弹出;依次Yk…Y2Y1将压入栈;} else error()}; }while( X ! =#); i + * ( ) # E →TE →TE E →+TE →ε →ε T →FT →FT T →ε →*FT →ε →ε F →i →(E) 根据下列预测分析矩阵,对输入串w=i+i*i 用预测分析程序进行分析。 步骤 分析栈 剩输入串 所用规则 1 #E i+i*i# E→TE 2 #ET i+i*i# T→FT 3 #ETF i+i*i# F→i 4 #ETi i+i*i# 匹配i 5 #ET +i*i# T→ε 6 #E +i*i# E→+TE 7 #ET+ +i*i# 匹配+ 8 #ET i*i# T→FT 9 #ETF i*i# F→i 对输入串w=i+i*i#的分析过程如下表所示 (注意:规则右部以逆序入栈) 步骤 分析栈 剩输入串 所用规则 10 #ETi i*i# 匹配i 11 #ET *i# T→*FT 12 #ETF* *i# 匹配* 13 #ETF i# F→i 14 #ETi i# 匹配i 15 #ET # T→
文档评论(0)