正在加载图片...
China-pub.com 第4章自顶向下的分析 107 下载 4.1.2重复和选择:使用EBNF 例如,一个i语句(简化了的)文法规则是: if-stmt一iE(exp)statement if(exp statement else statement 可将它翻译成以下过程 procedure ifSimt; begin match match (( match ()) statement if roken else then match (else): statement end ifStmt 在这个例子中,不能立即区分出文法规则右边的两个选择(它们都以记号1£开始)。相反地。 我们必须直到看到输入中的记号else时,才能决定是否识别可选的else部分。因此,if语句的 代码与EBNF ifstmt(exp)statement [else statement] 匹配的程度比与BNF的匹配程序要高,上面的EBNF的方括号被翻译成ifStmt的代码中的一个测 试。实际上,EBNF表示法是为更紧密地映射递归下降分析程序的真实代码而设计的,如果使 用的是递归下降程序,就应总是将文法翻译成EBNF。另外还需注意到即使这个文法有二义性 (参见前一章),编写一个每当在输入中遇到e1se记号时就立即匹配它的分析程序也是很自然 的。这与最近嵌套的消除二义性的规则精确对应。 现在考虑一下BNF中简单算术表达式文法中的exp情况: expexp addop termterm 如要根据我们的计划试着将它变成一个递归的x知过程,则首先应做的是调用xp本身,而这将 立即导致一个无限递归循环。由于ep和em可以以相同的记号开头(一个数或左括号),所以 要想测试使用哪个选择(exp一exp addop term或ep一term)就会出现问题了。 解决的办法是使用EBNF规则 ep→term{addop term} 花括号表示可将重复部分翻译到一个循环的代码中,如下所示: procedure exp; begin term; while token =+or token =-do 4.1.2 重复和选择:使用E B N F 例如,一个i f语句(简化了的)文法规则是: if-stmt → i f ( exp ) s t a t e m e n t | i f ( exp ) statement e l s e s t a t e m e n t 可将它翻译成以下过程 p ro c e d u re ifStmt ; b e g i n match (i f) ; match (() ; exp ; match ( )) ; statement ; i f token = e l s e t h e n m a t c h (e l s e) ; statement ; end if ; end ifStmt ; 在这个例子中,不能立即区分出文法规则右边的两个选择(它们都以记号 i f开始)。相反地, 我们必须直到看到输入中的记号 e l s e时,才能决定是否识别可选的 e l s e部分。因此,i f语句的 代码与E B N F if-stmt → if ( exp ) statement [ e l s e statement ] 匹配的程度比与B N F的匹配程序要高,上面的E B N F的方括号被翻译成i f S t m t的代码中的一个测 试。实际上,E B N F表示法是为更紧密地映射递归下降分析程序的真实代码而设计的,如果使 用的是递归下降程序,就应总是将文法翻译成 E B N F。另外还需注意到即使这个文法有二义性 (参见前一章),编写一个每当在输入中遇到 e l s e记号时就立即匹配它的分析程序也是很自然 的。这与最近嵌套的消除二义性的规则精确对应。 现在考虑一下B N F中简单算术表达式文法中的e x p情况: exp → exp addop term | t e r m 如要根据我们的计划试着将它变成一个递归的 e x p过程,则首先应做的是调用e x p本身,而这将 立即导致一个无限递归循环。由于 e x p和t e r m可以以相同的记号开头(一个数或左括号),所以 要想测试使用哪个选择(exp → exp addop term或exp → t e r m)就会出现问题了。 解决的办法是使用E B N F规则 exp → term { addop term } 花括号表示可将重复部分翻译到一个循环的代码中,如下所示: p ro c e d u re exp ; b e g i n term ; while token = + or token = - do 第 4章 自顶向下的分析 1 0 7 下载
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有