编译原理与技术(三)——语法分析(一)上下文无关文法

一、语法分析概貌

通过词法分析,我们可以获取一个程序字符串的词法单元集合。

编过程序的都知道,每个程序都有其语法,那么问题来了,我们怎么判断这些词法单元符合语法呢?编程的错误之一不就是语法错误吗?

所以,我们必须找出一种判断程序字符串是否符合语法的方法。

判断程序是否符合语法的过程就是语法分析。

编译原理与技术(三)——语法分析(一)上下文无关文法_第1张图片

下面介绍一位在编译技术领域做出巨大贡献的科学家——John Backus。

编译原理与技术(三)——语法分析(一)上下文无关文法_第2张图片

 John Backus带领团队创建了第一种高级语言Fortran,创建了巴克斯范式(Backus-Naur Form,BNF)与上下文无关文法。

而我们的语法分析就是基于上下文无关文法。

二、上下文无关文法(CFG)

上下文无关文法,是一种文法。关于文法的详细定义,读者可自行了解,这里重点介绍上下文无关文法。

上下文无关文法描述了语言的语法结构。其定义如下。

编译原理与技术(三)——语法分析(一)上下文无关文法_第3张图片

编译原理与技术(三)——语法分析(一)上下文无关文法_第4张图片编译原理与技术(三)——语法分析(一)上下文无关文法_第5张图片

编译原理与技术(三)——语法分析(一)上下文无关文法_第6张图片 所以,上下文无关文法是一个四元组。

比如下面这个上下文无关文法。

编译原理与技术(三)——语法分析(一)上下文无关文法_第7张图片

对于一个算数式——1+(2-3),让我们看看该上下文无关文法是如何检查其合法性的。

编译原理与技术(三)——语法分析(一)上下文无关文法_第8张图片

编译原理与技术(三)——语法分析(一)上下文无关文法_第9张图片 编译原理与技术(三)——语法分析(一)上下文无关文法_第10张图片

 编译原理与技术(三)——语法分析(一)上下文无关文法_第11张图片

编译原理与技术(三)——语法分析(一)上下文无关文法_第12张图片 编译原理与技术(三)——语法分析(一)上下文无关文法_第13张图片

 编译原理与技术(三)——语法分析(一)上下文无关文法_第14张图片

编译原理与技术(三)——语法分析(一)上下文无关文法_第15张图片 上面这些图中左边的式子称作推导,右边的树状结构称作语法树

 编译原理与技术(三)——语法分析(一)上下文无关文法_第16张图片

 推导可分为两种——最左推导与最右推导。

编译原理与技术(三)——语法分析(一)上下文无关文法_第17张图片

上下文无关文法是上下文无关的。

编译原理与技术(三)——语法分析(一)上下文无关文法_第18张图片

文法定义了语言、句型和句子。

编译原理与技术(三)——语法分析(一)上下文无关文法_第19张图片

举个例子。

编译原理与技术(三)——语法分析(一)上下文无关文法_第20张图片

 编译原理与技术(三)——语法分析(一)上下文无关文法_第21张图片

从上面可以得到一个结论——由文法推导出的所有句子的集合就是该文法定义的语言。

三、文法的二义性

定义:若文法的某些句子存在不止一种的最左(最右)推导,或不止一颗语法树,则该文法是二义的。

举个例子。

编译原理与技术(三)——语法分析(一)上下文无关文法_第22张图片

二义性会导致分析出错,比如。

编译原理与技术(三)——语法分析(一)上下文无关文法_第23张图片

(一)消除文法的二义性

结合下面这个例子,可以看出表达式产生二义性的原因。

编译原理与技术(三)——语法分析(一)上下文无关文法_第24张图片

编译原理与技术(三)——语法分析(一)上下文无关文法_第25张图片 

据此,我们提出一种消除文法二义性的方法。

通过定义运算优先级和结合律来消除二义性。

还是以上面的二义性文法为例。

我们发现上面表达式语法分析出错的原因是在该文法中没有体现+与*的优先级关系。

我们修改文法如下:

E ---> E + T | T

T ---> T *  F | F

F ---> (E) | -E | id

E是开始符号。

读者可实操验证上述文法是否是二义的,并自行领会原因。

四、总结

(一)上下文无关文法的优缺点

编译原理与技术(三)——语法分析(一)上下文无关文法_第26张图片

(二)为什么将词法分析器从语法分析中剥离 

词法规则定义了词素的结构,语法规则定义了句型的结构。

词法规则远远简单于语法规则,与其使用上下文无关文法去描述,不如使用正则表达式去描述,因为从正则表达式构造出的词法分析器效率高。而正则表达式描述语言的能力弱于上下文无关文法,即正则表达式能描述的语言,上下文无关文法都能描述,但上下文无关文法能描述的语言,正则表达式却不一定能够描述。故语法分析采用上下文无关文法。

所以从描述工具上看,词法分析与语法分析使用的基本工具不同。

从软件工程的角度看,分离词法分析器与语法分析器,会简化设计、提高编译器的移植性、便于编译器前端的模块划分与提高编译器的效率。

参考资料:

 [1]USTC 编译原理和技术 2023 (ustc-compiler-principles.github.io) 

你可能感兴趣的:(数学建模)