在实现Neo Pascal语法分析器前,必须有一套完备的语言文法。Pascal自1971年诞生后,广泛应用于教学、科研等领域。1990年,Pascal语言标准(IS0 7185)正式提出。这个标准的主要制定者就是Pascal语言创始者Niklaus Wirth。标准详细阐述了Pascal语言的相关规范及约定,并完整给出了文法的EBNF描述形式。在过去的二十年中,这个标准得到了广泛的认同,成为现代Pascal编译器的设计规范。笔者在设计Neo Pascal文法时,主要也是参考这个标准完成的,同时加入了少量现代Delphi语言的语法元素。为了节省篇幅,笔者省略了原始的Neo Pascal文法定义,只给出Neo Pascal的LL(1)文法定义形式,这是构造语法分析器的依据,见表3-3。
表3-3 Neo Pascal文法
(续)
(续)
(续)
(续)(www.daowen.com)
(续)
实践证明,试图凭空设计一个优秀的语言是非常困难的,一门经典的语言往往是从某些现存的语言发展继承而来的。例如,C语言来自B语言、Pascal来自Algol等。不过,既便如此,设计一门严谨且完美的程序设计语言并不简单,离不开程序设计语言相关理论的支持,这是一个复杂的研究课题,在此不再赘述。
下面对Neo Pascal的文法作简单说明。
首先,必须明确文法的非终结符集合与终结符集合。为了使文法描述形式更清晰、易于理解,笔者尽可能使用中文词组作为非终结符名,符号与符号之间以空格分隔。此文法中除了“标识符”、“整数常量”、“普通形式实数常量”、“不带十一号的科学记数形式实型常量”、“带十一号的科学记数形式实型常量”、“字符串常量”外,其他含有中文的符号都是非终结符。当然,除了非终结符与e之外,剩下的符号就是文法的终结符了。
其次,读者可能会对文法中出现的大量数字感到疑惑。笔者在介绍文法的概念时并未提及这些数字的作用,实际上,它们既不是终结符也不是非终结符,当然,更不是标准文法的组成部分。在此,读者不必深究,稍后笔者将解释其作用。
最后,从文法形式来看,不难看出此文法是一个标准的LL(1)文法。它既不存在公共左因子,也不存在左递归形式。至于First集合与Follow集合是否存在交集,读者可以先尝试计算验证,3.3.2节将给出答案。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。