构建自己的编译器(二)语法分析器

既然已经拆分成一个个单词了,那么接下来做什么呢?构建语法树!因为我们是把一个字符串变成单词流了,但是我们并不知道其中的一个句子是否符合语法,那么我们怎么知道这个句子是否符合语法呢?就对它进行规约,从一个句子的几个单词开始,逐渐规约成更大的成分,最后规约成一个最大成分,如果规约成功,那么最后只有一个成分,也就是句子。

好,现在我们知道了一个句子是否符合语法,那么然后呢?然后就是针对不同的语句构建不同的三地址码,例如你在规约的时候发现它是一赋值语句,然后你用赋值语句的AST来做,如果你发现那是一个条件语句,就用条件语句的AST来做,就是这样。

针对每一个语句,执行压栈还是什么的操作,从而实现构建三地址码,这一部分的视频我没有看,不过这么快。。。

构建完三地址码之后,还需要进一步地构建二进制代码,构建exe文件,可能会有构建文件头什么的东西。

所以,parser经过lexer赋值之后,parser能够自动切割成句子,并且能够辨别出这是一个什么句子,辨别出来以后,就可以进行翻译三地址码,通过压栈什么的,首先你也要知道三地址码的格式是什么

另外,你还要知道x86机的01010101之类的代表什么东西,否则你也造不出exe是不是?那么你还需要制造一个汇编器。。。。要不然你只能做出中间代码为止了。

EBNF,是一个计算机用语,意思是扩展的巴科斯范式。
扩展的巴科斯范式
用来描述计算机语言语法的符号集。现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则。
扩展巴科斯-瑙尔范式(EBNF)是表达作为描述计算机编程语言和形式语言的正规方式的上下文无关文法的元语法符号表示法。它是基本巴科斯范式(BNF)元语法符号表示法的一种扩展。

代码,如由终结符即可视字符、数字、标点符号、空白字符等组成的计算机程序的源代码
EBNF 定义了把各符号序列分别指派到非终结符的产生规则:
digit excluding zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ;
digit = "0" | digit excluding zero ;
这个产生规则定义了在这个指派的左端的非终结符 digit。竖杠表示可供选择,而终结符被引号包围,最后跟着分号作为终止字符。所以 digit 是一个0或可以是1 或2 或 3 直到 9 的一个 digit excluding zero。
产生规则还可以包括由逗号分隔的一序列终结符或非终结符:
twelve = "1" , "2" ; two hundred one = "2" , "0" , "1" ; three hundred twelve = "3" , twelve ; twelve thousand two hundred one = twelve , two hundred one ;
可以省略或重复的表达式可以通过花括号 { ... } 表示:
natural number = {digit excluding zero} ;
在这种情况下,字符串 ', ', ...,'1',...,'1234',... 都是正确的表达式。要表示这种情况,于花括号内设立的所有东西可以重复任何次,包括根本不出现。
可选项可以通过方括号 [...] 表示:
integer ="0" | ["-"] natural number ;
所以 integer 是一个零(')或可能前导可选的负号的一个自然数。
EBNF 还包括描述指定次数的重复,和排除产生式的某部分或向 EBNF 文法插入注释的语法。

好,那么,语法编译器究竟怎么运作的呢?它是按照一条语句一条语句地进行编译,也就是说,token必须归纳成为一个语句。

如何归纳成语句?就是应该在词法编译器中实现,递归实现。那么怎么归纳呢?

我们既然能归结出句子,就会要断句,而断句,是自己实现的,最后归结为一个大token,就是这个大token进行下一步的语法编译。

而这个大token,是定义语句,赋值语句,条件语句,循环语句中的一种。

我们如何形成这么一个大token呢?或者说,这个大token就是一个语法树。这个语法树,各个阶层的都有其属性,我们就是通过这些属性,从而获得整条语句的属性。那么这个属性如何获得呢?就是语法树的难点,从终结符归纳为非终结符的过程中,是可以对上层非终结符进行赋值的,而每条语句总会有特殊的地方对吧,就是在那一步归纳的时候,进行赋值。这样我们的语法树就构建起来了,语法树构建起来了,我们就可以实现三地址码了。








 

发布了147 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/HeroIsUseless/article/details/104097970
今日推荐