![编译系统透视:图解编译原理](https://wfqqreader-1252317822.image.myqcloud.com/cover/487/844487/b_844487.jpg)
上QQ阅读APP看书,第一时间看更新
1.3.2 语法分析
如果说词法分析的作用是从连续的字符中识别出标识符、关键字、数字、运算符并存储为符号(token)流,语法分析的作用就是从词法分析识别出的符号流中识别出符合C语言语法的语句。
因为计算机无法像人那样同时看多个标识符、关键字、数字、运算符,无法像人那样一眼看出这是一个函数声明,那是一个if语句,只能非常笨拙地一个符号一个符号去识别。与词法分析器有些类似,语法分析器也是依据用计算机表示的语法,一个符号一个符号地识别出符合C语言语法的语句。语法的计算机表示就是产生式。在语法分析器中把通过产生式产生的C语言语法映射成一套模板,并把这套模板融汇在语法分析器的程序中。语法分析器的作用就是将词法分析器识别出的符号(token)一个一个地与这套模板进行匹配,匹配上这套模板中的某个语法,就可以识别出一句完整的语句,并确定这条语句的语法。
我们以案例中“int fun(int a,int b);”这条函数声明语句为例描述这个过程,它与语句模板的匹配情景如图1-38所示。
![](https://epubservercos.yuewen.com/CCC398/5922738704546701/epubprivate/OEBPS/Images/figure_0039.jpg?sign=1738918075-DrCEFefwn5ozV77YWH4VuT6CMkvHJsT9-0-70518123792c58275df98bf309d8b703)
图1-38 fun函数声明语句与模板匹配的结果
这段token流最终与函数声明模板相匹配,在匹配成功后,计算机就认为此语句为函数声明语句,并以语法树的形式在内存中记录下来,情景如图1-39所示。
![](https://epubservercos.yuewen.com/CCC398/5922738704546701/epubprivate/OEBPS/Images/figure_0040.jpg?sign=1738918075-LzJ1mQtAcIQxMApuCcKkIQ1CVITI1996-0-5d98cee7c9589c24c0b878f137850747)
图1-39 fun函数声明语句生成的语法树
以树型结构来记录分析出的语句是一个非常巧妙、深谋远虑、通盘考虑的选择。一方面,树型结构能够“记住”源程序全部的“意思”,另一方面,树型结构更容易对应到运行时结构。