编译原理中生成器能否像解析器用ebnf实现?

1个回答

写回答

Swift
Swift

编译原理常被用于编程语言语法扩展,以及高低级、不同编程语言间的语法转换。在开发过程中,llvm、acron、tree - sitter等,编译原理可谓无处不在。先读取代码,接着通过lexer把代码处理成tokens,再由解析器parser把tokens转化为语法树(包括cst、ast),最后利用手写代码生成器generator将ast转换为相应的目标代码。编译是把一种编程语言转变成另一种。解析器parser可用ebnf实现,那生成器generator是否也能通过ebnf实现?我想使用类似flutter、Swift那样非html类语法开发前端界面,像div(attrs){children}这种语法。于是我踏上了编译原理的学习之旅,在完成一个简单demo后,还写了一篇文章。入了编译原理这个坑之后,我感觉自己的潜力被激发出来了。以前那些无力实现的想法,现在都想尝试一下。比如JS为何不支持对象继承关键字,对象不支持装饰器,那我就自己去实现好了。于是我着手写generator,不停地写啊写,感觉特别累。然后我就思索,解析器parser能够借助ebnf来实现,那生成器generator是否也能通过ebnf来实现?要是能凭借两种不同编程语言的语法定义文件达成自动转换编程语言就好了,所以我开启了编译原理进阶之旅。generator代码生成方面:不再编写代码生成器,而是利用类ebnf语法达成不同编程语言的自动转换。

2. lexer解析token,它利用正则读取字符串,遍历token时找到最长匹配的那个,然后从字符串里删掉这个token,并添加到tokens列表中(这是删减非核心容错逻辑后的代码)3. 以编码形式定义类似ebnf的syntax语法(向chevrotAIn致敬且创新,创新之处在于采用装饰器方法直接定义静态且可提示的具体方法,chevrotAIn是通过方法动态创建匿名方法),这种方式便于调试,可读性强于ebnf。规则定义冗余、啰嗦,目的是多种定义语法使用方式。4. parser会读取tokens,然后执行顶级语法Es6Parser.program()(顶级语法包含子语法,有嵌套层级)。它把顶级语法推进语法栈,去匹配token,要是匹配到了就从tokens列表里删掉这个token,并加到语法树里,接着进入子语法,把子语法推进语法栈,同样进行token匹配,子语法执行完后,把子语法推出语法栈,再把子语法添加到父语法的子节点,这样执行完就能得到完整的语法树。核心思路。

执行后得到语法树结果。若本文思路有问题,或有更简便的实现方法,烦请告知,若有不足也请指出,多谢。本文只是尝试新思路,是个简单demo,细节处理有漏洞,还请谅解。

举报有用(0分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号