《自己手动写一个编译器、连接器》一(2)

来源:互联网 发布:java applet简单例子 编辑:程序博客网 时间:2024/06/10 12:40

文法的分类概括,文法的分类大概有4类,关系就非常类似于之前的权限级别,从0到3个级别以此包涵(0最大,然后是1,然后是2.。。)

0类:

这个类型的文法其实就是一个总括的推导:a->b
a属于V*,b属于V+

1类:

这个类型其实就是在0类的基础上加上了一个条件就是b的长度要长于a来确保递归(递归的解释后面有一个例子的)

2类:

这个类又在1类的基础上加了一个约束就是要求左边的a必须为终结符也就是说a就只能是最小的单位类似于:Aa->Bab此时左边就是A和a,其中A不是终结符,所以不符合,只有为:a->Bab才是第二类。

3类:

这个类其实就是正则文法,在2的基础上满足了:a->a|aB这个样子(或是a->a|Ba)通常我们的程序设计语言就属于这一类,由于可递归,这使得写起编译器来会比较轻松


现在来说一个什么事上下文有关和无关,上下文有关的意思就是其中任何产生规则的左手端和右手端都可以被终结符和非终结符的上下文所围绕的形式文法,无关呢就是可以通过下文 V∈N ,w∈(N∪Σ)* 。上下文无关文法取名为”上下文无关”的原因就是因为字符 V 总可以被字串 w 自由替换,而无需考虑字符 V 出现的上下文。


现在来说说递归的大概的看法:
<有符号整数>::=<无符号整数>|<正负号><无符号整数>
<无符号整数>::=<数字>|<无符号数><数字>
<数字>::=0|1|2|3|4|5|6|7|8|9
<正负号>::=+|-
通过这个例子我们就可以看出上下文无关和递归的含义了。
(这些符号的意思下面要说)


在一开始的BNF中(巴科斯范式)有以下三个元符号:
::=(->;:=)定义为
括号内的两个形式是等价可替换的。
|或者
<>用于括起非终结符
把这三个定义带入上面的例子我们就可以轻松的解读出有符号整数的具体含义是什么了。
但是由于BNF的缺陷:对于重复和可选的无法直接表达,比如上面的无符号数的定义,我们的无符号整数可以是很多个数字组合出来的一个大数,此时<无符号数><数字>的定义形式就让人觉得有点诧异(一个自我递归的表达表示无数多个)
那么就出现了一个EBNF(BNF的扩展版)这个扩展板就很厉害了,先看上面的改良的例子:
<有符号整数>::=[<正负号>]<无符号整数>
<无符号整数>::=<数字>{<数字>}
<数字>::=”0”|”1”|”2”|”3”|”4”|”5”|”6”|”7”|”8”|”9”
<正负号>::=”+”|”-”
然后我们来看看这些符号的定义:
{}包含0次的任意多次重复
[]0次或1次
()看做一项
.一条生成规则的结束
“”终结符
此时就很清晰的表示出来了有符号整数的定义了。

阅读全文
0 0
原创粉丝点击