- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第6讲 语法判别及算法--自顶向下
$ E T ) E T – 2 ) * x $ 替换T→ ε $ E T ) E – 2 ) * x $ 替换E → -T E $ E T ) E T - – 2 ) * x $ 匹配 $ E T ) E T 2 ) * x $ 替换T→F T $ E T ) E T F 2 ) * x $ 替换F→ num $ E T ) E T num 2 ) * x $ 匹配 $ E T ) E T ) * x $ 替换T→ ε $ E T ) E ) * x $ 替换E → ε $ E T ) ) * x $ 匹配 $ E T * x $ 替换T→ * F T $ E T F * * x $ 匹配 $ E T F x $ 替换F→id $ E T id x $ 匹配 $ E T $ 替换T→ ε $ E $ 替换E → ε $ $ 接受 LL(1)文法: 分析表中每格最多1个规则,否则就无法进行唯一性的分析 例如:A→aAa|ε 不是LL(1)文法 VT VN a $ A A→aAa A→ε A→ε 对于A→aAa First(aAa)={ a } 对于A→ε Follow(A)={$ , a } 作业: 文法:lexp → atom | list atom → num | id list →( lexp_seq ) lexp_seq → lexp , lexp_seq | lexp 对( a , ( b , ( 2 ) ) , ( c ) ) 进行LL(1)分析 第6讲 语法判别及算法--自顶向下 自顶向下分析对应文法的最左推导,本讲有两种分析方法: 递归下降分析 LL(1)分析 1 递归下降分析 对每个形如 A→α文法规则,各设计一个子程序A( ) ,先设计上级文法的子程序,再设计下级文法的子程序,这些子程序往往递归地调用,故称递归下降分析或递归子程序法,运行这些程序就可以对源程序进行语法分析。 (1)表达式文法的递归子程序 exp → exp addop term | term addop →+ | - term → term mulop factor | factor mulop →*| / factor →(exp) | number | id 规则exp → exp addop term | term有递归,不便于设计子程序,有对规则进行修改。 exp = term exp = exp addop term = term addop term exp = exp addop term = term addop term addop term 修改为 exp → term {addop term },{}中表示重复0或若干遍 修改后的文法: exp → term {addop term} addop →+ | - term → factor {mulop factor} mulop →*| / factor →(exp) | number | id 源程序经扫描后的记号存入一个数组中 如源程序 3+(5-2)*2 则记号序列为: NUM PLUS LPAREN NUM MINUS NUM RPAREN TIMES NUM 代码: token=gettoken(); 先获得一个记号 设计规则exp → term {addop term}的子程序 void exp() { term(); while((token==PLUS) || (token==MINUS)) {token=gettoken();
原创力文档


文档评论(0)