日记大全

日记大全 > 句子大全

编译器入门 语法分析(顺序块)

句子大全 2008-12-14 23:38:58
相关推荐

顺序块(block),是语法分析的基础单位之一。

它可以出现在if else语句,while循环语句,for循环语句,函数体等地方。

它还可以出现在class关键字定义类型时,类的成员变量和成员函数也可以看作一个顺序块。

它的里面也可以包含各种语句,表达式,变量定义,类型定义,等等。

它,是各种代码块互相嵌套组合,实现复杂功能的基础。

代码的嵌套,意味着语法解析时的递归。

顺序块的DFA节点如下:

1,顺序块,block,

它自己占一个节点,可以在其他模块引用。

2,左右大括号LB,RB,

left brace,right brace,

表示顺序块的开始和结束。

3,分号,semicolon,

表示单号语句的结束。

4,表达式,expr,

在前篇提到的表达式模块定义,在这里引用一下。

5,if语句,if,

6,while语句,while,

7,for语句,for,等等。

if、while、for等的DFA节点定义在他们各自的模块里,但可以在这里引用。他们的具体定义,后面再聊。

这些语句都是顺序块中允许出现的语句。

在上述DFA节点的基础上,顺序块解析的语法规则可以这么设计:

1,block:semicolon,

单号分号是允许的。

2,block:expr,

expr:semicolon,

以分号结尾的表达式。

例如if (cond) a = 1;

这行if语句的主体部分就是这种情况。

3,block:LB,

LB:RB,

大括号构成的空块是允许的。

LB:LB,

RB:LB,

RB:RB,

大括号可以嵌套,可以接下一个大括号标示的块,在结尾可以出现连续的右大括号。这种代码在以{}作为块标示的编程语言里很普遍。例如这样:

int main()

{

{

}

{

}

}

4,LB:expr,

expr:semicolon,

semicolon:RB,

大括号内的以分号结尾的表达式。

5,LB:if,while,for

大括号内可以有if、while、for语句。

这些语句的结束在他们自己的模块内判断,我们在这里可以挂载一个捕获end信号的hook给DFA框架,用以捕获if等模块结束的信号,然后继续顺序块的后续解析。

如果是解析完成,则把所得的内容添加到AST抽象语法树。

顺序块里含有这些语句,这些语句的主体又是顺序块,所以可以递归解析,直到最内层顺序块的最后一个以“分号”或“右大括号”结尾的语句完成,然后整个递归链条依次返回,完成解析。

6,顺序块内还可以含有变量声明语句,一些语言还允许临时定义类型,即含有类型定义语句。

在已经做好了类型定义的情况下,变量声明语句比较简单。

添加几个DFA节点:type类型名,id变量标示符,assign赋值运算符,expr表达式,comma逗号,以及前面的大括号,分号等。

变量定义可以这么写:

type:id,

id:comma,

comma:id,

id,semicolon,

这样就可以定义1个变量,或者连续定义多个以逗号分隔的变量,他们最后都以分号结束。

id:assign,

assign:expr,

expr:semicolon,

这是支持初始化表达式的变量定义,例如

int a = 1+2;

变量和类型的定义,后面单独写一篇,毕竟还有数组变量,数组初始化之类的。

顺序块就先这么结束了,它是代码块嵌套和递归解析的基础。

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