日记大全

日记大全 > 句子大全

语法分析的实现思路

句子大全 2023-01-30 04:32:01
相关推荐

语法分析,是根据语法规则,把词法分析处理后的一个个的词,转化为抽象语法树AST的过程。

(之前的文章也提过)

语法分析比词法分析难写:

1,程序源码的各种语句是互相嵌套的,导致语法分析器不得不使用复杂的递归;

2,为了照顾人的阅读习惯,以及使用尽可能少的关键字,不同类型语句的前缀有可能相同,导致语法分析器没法第一时间确定是什么语句,必须查看多个词才行。

不同的语言具有不同的语句类型,但大多数编程语言都无外乎这么几种:

1,表达式,

2,条件语句,

3,循环语句,

4,变量定义,函数定义,类定义。

除了表达式之外的语句,一般都是以关键字开始的。

表达式,一般以变量或者函数的标示符(变量名、函数名)开始。

以常量数字或者常量字符串开始的表达式,因为不修改变量的值,实际没有意义。

表达式也可以++这类运算符开始,例如++i。

以关键字开始的语句实际上容易分析,因为关键字就指明了语句类型。

例如python的def关键字说明之后的内容是函数定义。

C++的class关键字说明之后的内容是类定义。

if、while、for关键字在各种语言里都表示条件语句和循环语句。

所以,当语法分析写不出来时,就加关键字。

多加一个关键字,就写出来了(笑)。

多类型语句的互相嵌套,实际是以语句块为单位的。

即使单行的if、while、for语句没有大括号{},也要知道它其实是把大括号省略了,它依然是语句块。

if (1) i++;

与if (1) {i++; j++;}

在作为if语句分析时是一样的,不同的是条件表达式之后的语句块不一样。

单行语句块可以省略大括号,但多行的不可以,需要用大括号圈起来。

否则第一个分号就会被当成if块的结束,这里存在二义性,必须用大括号消除。

语句块里自然不只可以包括表达式组成的顺序语句,也可以包括条件语句、循环语句。

即,可以嵌套多层的if、while、for。

通过语句块去解耦合和递归,就可以很容易地分析复杂的语法结构。

变量、函数、类的定义,也是以类型关键字开始的,第二个词是表示变量名、函数名或类名的标示符,然后函数名之后跟左小括号(,类名之后跟左大括号{。

变量名之后稍微复杂一些,可以跟等号=接赋值表达式,也可以跟左方括号[定义数组,还可以跟逗号在一行里定义多个变量(函数的形参也是这么定义的),跟分号结束该语句。

PS:实际上是查看了跟在标示符之后的符号之后,才能确定标示符是变量或者函数。

类定义使用单独的class关键字。

但变量和函数的定义,因为返回值的类型与变量的类型使用一样的关键字,必须查看标示符之后的符号是不是左小括号。

自然,像go一样添加个func关键字,那么函数的定义就会简单很多。

实际上,最难的还是表达式的分析。

表达式里会有各种变量、符号、和函数调用,及多层嵌套的小括号()和方括号[]。

并且,表达式也是if、while、for语句和顺序语句块的子模块。

如果能够写得出来表达式的语法分析,那么一般就能写得出来全部的语法分析了。

阅读剩余内容
网友评论
相关内容
拓展阅读
最近更新