7

ucc编译器(语法解析)

 3 years ago
source link: https://feixiaoxing.blog.csdn.net/article/details/118054286
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

ucc编译器(语法解析)

费晓行 2021-06-19 16:00:12 50
分类专栏: ucc编译器

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

    做完词法分析,后面紧接着就是语法分析。对于一个编程语言而言,语法解析才是语言和语言之间最大的区别。c语言有自己的语法,cpp也有cpp的语法,所以我们说学习一门新的语言,其实主要工作就是学习它的语法。

    语法分析有自顶向下和自底向上两种。对于编译器手动实现来说,自顶向下其实是比较好处理的,因为大部分工作都可以用递归的方法来处理,只要不出现左递归语法的情况。

    此外,目前而言,实现一门新的语言,已经不再需要自己从头到尾编写全部代码。完全可以用bison、yacc这样的工具帮助我们来完成代码的编写,这样也是可以的。毕竟,所谓语法分析,最终都是为了构建一个语法树。

1、c语言的主要三种语法形式

a,declaration语法

b,expression语法

c,statement语法

2、语法解析文件

decl.c

https://github.com/nobled/ucc/blob/master/ucl/decl.c

expr.c

https://github.com/nobled/ucc/blob/master/ucl/expr.c

stmt.c

https://github.com/nobled/ucc/blob/master/ucl/stmt.c

3、语法树打印

dumpast.c

https://github.com/nobled/ucc/blob/master/ucl/dumpast.c

入口函数是DumpTranslationUnit

相关数据结构,

4、不失一般性,我们以分析stmt入手

4.1 stmt分析总入口

4.2 if statement解析

4.3 for statement解析

4.4 switch statement解析

4.5 break statement解析

    这部分可能和大家理解的不一样,case、break、continue、return、goto其实都是作为独立的一个statement处理的。

4.6 和declaration有连接的一个statement,

    这个statement叫compound statement,可以看成是一个大杂烩statment。它最大的一个特点,也就是区别于其他statement的地方,它实现了和declaration之间的衔接,这是很重要的。

4.7 和expression之间的衔接

     如果什么statement都不是,那么它只能是expression-statement了。也就是说,这个时候编译器就要调用ParseExpression函数做进一步的解析了。

4.8 总结

    当然不管是哪一种statement,目的都是为了要构建一个abstract syntax tree,也就是抽象语法树。这个过程其实可能遇到不断地嵌套处理地,比如statement -> ifstatement -> statement -> forstatement-> ......,就这样一直递归调用下去。这部分本来就是被允许的。等到解析完成后,一个抽象语法树其实就可以被构建出来了。

    一般的高校,作业实践的部分基本上到这就结束了。但是对编译器来说,现在只是完成了前端解析而已。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK