正在加载图片...
112 编译原理及实践 China-pub.com 下载 相反地,递归下降分析程序在严格的自顶向下的风格中可构造出语句的语法树 function ifStatement:syntaxTree; var temp syntaxTree begin match ) match (() temp :makeStmtNode(i) testChild(temp):=exp; natch)): thenChild(temp):=statement if token=else then match (else): elseChild(temp):=statement; else elseChild(temp):=nil end if; end ifStatement 正因为递归下降分析允许程序设计人员可调整动作的安排,这样它就可以选择手工生成的分析 程序了。 4.1.3其他决定问题 前面描述的递归下降分析虽然非常强大,但它仍有特殊性。若使用的是一个设计精巧的小 型语言(例如TNY,甚至是C),那么对于构造一个完整的分析程序,这些办法是适合的。读 者应注意在复杂情况中还需要更形式的方法。此时还会出现一些问题。首先,将原先在BNF中 编写的文法转变成EBNF格式可能会有些困难。下一节将学习不用EBNF的另一种方法,其中 构造了一个与EBNF基本相等的转变了的BNF。其次,在用公式表达一个用以区分两个或更多 的文法规则选项的测试 A-a1B1... 时,如果α和B均以非终结符开始,那么就很难决定何时使用A→α选项,何时又使用A一B选项。 这个问题就要求计算α和B的Fist集合:可以正规地开始每个串的记号集合。4.3节将详细介绍 这个计算。再次,在写ε产生式的代码 A-8 时,需要了解什么记号可以正规地出现在非终结符A之后,这是因为这样的记号指出A可以恰 当地在分析中的这个点处消失。这个集合被称作A的Foow集合。4.3节中也有这个集合的准确 计算。 最后读者需要注意:人们进行Fist集合和Follow集合的计算是为了对早期错误进行探测。 例如:在程序清单4-1的计算器程序中,假设有输入)3-2),分析程序在报告错误之前,将从 exp到texm再到factor下降:由于在表达式中,右括号作为第I个字符并不合法,而在ex 中可能早已声明了这个错误。xp的Frst集合将会告诉我们这一点,从而可以进行较早的错误 探测(本章最后将更详细地讨论错误探测和恢复)。相反地,递归下降分析程序在严格的自顶向下的风格中可构造出 i f语句的语法树: function ifStatement : s y n t a x Tree ; var temp : s y n t a x Tree ; b e g i n match (i f) ; match (() ; temp := m a k e S t m t N o d e(i f) ; t e s t C h i l d(t e m p) := exp ; match ( ) ) ; t h e n C h i l d(t e m p) := statement ; i f token = e l s e t h e n match (e l s e) ; e l s e C h i l d(t e m p) := statement ; e l s e e l s e C h i l d(t e m p) := nil ; end if ; end ifStatement ; 正因为递归下降分析允许程序设计人员可调整动作的安排,这样它就可以选择手工生成的分析 程序了。 4.1.3 其他决定问题 前面描述的递归下降分析虽然非常强大,但它仍有特殊性。若使用的是一个设计精巧的小 型语言(例如T I N Y,甚至是C),那么对于构造一个完整的分析程序,这些办法是适合的。读 者应注意在复杂情况中还需要更形式的方法。此时还会出现一些问题。首先,将原先在 B N F中 编写的文法转变成 E B N F格式可能会有些困难。下一节将学习不用 E B N F的另一种方法,其中 构造了一个与E B N F基本相等的转变了的B N F。其次,在用公式表达一个用以区分两个或更多 的文法规则选项的测试 A→a | b | . . . 时,如果a和b均以非终结符开始,那么就很难决定何时使用A→a选项,何时又使用A→b选项。 这个问题就要求计算 a和b的F i r s t集合:可以正规地开始每个串的记号集合。 4 . 3节将详细介绍 这个计算。再次,在写 产生式的代码 A→ 时,需要了解什么记号可以正规地出现在非终结符 A之后,这是因为这样的记号指出 A可以恰 当地在分析中的这个点处消失。这个集合被称作 A的F o l l o w集合。4 . 3节中也有这个集合的准确 计算。 最后读者需要注意:人们进行 F i r s t集合和F o l l o w集合的计算是为了对早期错误进行探测。 例如:在程序清单 4 - 1的计算器程序中,假设有输入 ) 3 - 2 ),分析程序在报告错误之前,将从 e x p到t e r m再到f a c t o r下降;由于在表达式中,右括号作为第 1个字符并不合法,而在 e x p 中可能早已声明了这个错误。 e x p的F i r s t集合将会告诉我们这一点,从而可以进行较早的错误 探测(本章最后将更详细地讨论错误探测和恢复)。 1 1 2 编译原理及实践 下载
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有