语法分析是编译过程的第二个阶段。语法分析的任务是在词法分析的基础上将单词序列分解成各类语法短语,如“程序”“语句”“表达式”等。一般这种语法短语,也称语法单位可表示成语法树,比如上述程序段中的单词序列。
id1∶=id2﹢id3∗10,经语法分析得知其是PASCAL语言的“赋值语句”,表示成如图6.52所示的语法树或是图6.53所示的形式。
图6.52 语句id1:=id2﹢id3∗10的语法树
图6.53 语句id1:=id2﹢id3∗10的语法树的另一种形式
语法分析所依据的是语言的语法规则,即描述程序结构的规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。程序的结构通常是由递归规则表示的,例如,我们可以用下面的规则来定义表达式:
①任何标识符是表达式。
②任何常数(整常数、实常数)是表达式。
③若表达式1和表达式2都是表达式,那么,表达式1﹢表达式2以及表达式1∗表达式2都是表达式。
类似地,语句也可以递归地定义,如
①标识符∶=表达式是语句。(www.daowen.com)
②while(表达式)do语句和if(表达式)then语句、else语句都是语句。
词法分析和语法分析本质上都是对源程序的结构进行分析。但词法分析的任务仅对源程序进行线性扫描即可完成,比如识别标识符,因为标识符的结构是字母打头的字母和数字串,这只要顺序扫描输入流,遇到既不是字母又不是数字字符时,将前面所发现的所有字母和数字组合在一起而构成单词标识符。但这种线性扫描则不能用于识别递归定义的语法成分,比如就无法仅用线性扫描去匹配表达式中的括号。
语法分析的功能是进行层次分析,把源程序的单词序列组成语法短语(表示成语法树),依据的是语法规则。Pascal语言的赋值语句的规则为:
<赋值语句>::=<标识符>“:=”<表达式>
<表达式>::=<表达式>“﹢”<表达式>
<表达式>::=<表达式>“∗”<表达式>
<表达式>::=“(”<表达式>“)”
<表达式>::=id
<表达式>::=n
单词序列id1∶=id2﹢id3∗10之所以能表示成图6.52的语法树,依据的是赋值语句和表达式的定义规则。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。