如何用Yacc实现一个Python的编译器?
程序员文章站
2022-03-24 18:09:55
...
YACC for ansi C 的文法在很多地方都可以找到了。为什么没有Python的?如何把Python源代码中的grammar编译成yacc的?
至于分析的方法,您可以先建一个Stack来存放每一层缩进块的Token,
然后根据Lexer送来的Token中的行号、列号等信息来和Stack栈顶的数据进行对比,
判断下来是该进入缩进的就push一个INDENT,并这个INDENT插入到输出的Token流中。
发现是Stack中旧的Token匹配的,就把之前的缩进块pop出来,并在输出的Token流中插入DEDENT。
然后在Paser层面处理语句块的时候可以这样处理(我只写大概意思的伪码,具体您自己看着办)
block ::= INDENT NLS statements NLS DEDENT
if ::= IF LPAREN expression RPAREN COLON block
cpython源码的token分析是用C手撸的,超长,可以看看源码 补充一下 @vczh ,因为是上下文有关的,所以Yacc是不行的,不过我通过 peg, ometa 解决什么问题,ometa-js怎么入门/正确理解和认知? 这个问题知道 PEG 适合进行。
pyPEG 这个项目的主页,底下就有对缩进的分析,可以参考一下。 我用C语言实现过一个简化的python解释器,用yacc来分析python的思路如下:
1. 在源程序中插入两个虚拟的TOKEN:TOKEN_BEGIN和TOKEN_END
TOKEN_BEGIN标志语法块的开始,TOKEN_END标志语法块的结束。看一个例子:
https://github.com/python-git/python/blob/master/Grammar/Grammar
回复内容:
理论上是可以的,关键点在于您要在Lexer和Parser之间要多加一层,用于分析哪些地方是进入缩进,哪些地方是退出缩进。然后匹配到缩进的时候插入INDENT和DEDENT这样的Token。至于分析的方法,您可以先建一个Stack来存放每一层缩进块的Token,
然后根据Lexer送来的Token中的行号、列号等信息来和Stack栈顶的数据进行对比,
判断下来是该进入缩进的就push一个INDENT,并这个INDENT插入到输出的Token流中。
发现是Stack中旧的Token匹配的,就把之前的缩进块pop出来,并在输出的Token流中插入DEDENT。
然后在Paser层面处理语句块的时候可以这样处理(我只写大概意思的伪码,具体您自己看着办)
block ::= INDENT NLS statements NLS DEDENT
if ::= IF LPAREN expression RPAREN COLON block
1:python这种靠缩进的语言的文法其实是上下文有关的,EBNF是表达不出来的,我不知道yacc是不是有什么丧心病狂的扩展来给你做这个。
2:每一行前面的tab的数量你不要看成一堆tab,要把他的数量本身看成一个整体,也就是说再作语法分析的时候其实是:
[0]def fuck
[1]if true:
[2]fuck
[1]else:
[2]shit
[0]def shit
..
主要是缩进语法的问题吧,只要先在词法上把python的缩进改成类似大括号分界的语法即可,压力在lex这边cpython源码的token分析是用C手撸的,超长,可以看看源码 补充一下 @vczh ,因为是上下文有关的,所以Yacc是不行的,不过我通过 peg, ometa 解决什么问题,ometa-js怎么入门/正确理解和认知? 这个问题知道 PEG 适合进行。
pyPEG 这个项目的主页,底下就有对缩进的分析,可以参考一下。 我用C语言实现过一个简化的python解释器,用yacc来分析python的思路如下:
1. 在源程序中插入两个虚拟的TOKEN:TOKEN_BEGIN和TOKEN_END
TOKEN_BEGIN标志语法块的开始,TOKEN_END标志语法块的结束。看一个例子:
while i 100:
print i
i += 1
还不如直接看python源码里的interpreter好了。
COOL都日出来了,python算个DIAO啊,文法拿去,玩吧。写完了我们膜拜一下。https://github.com/python-git/python/blob/master/Grammar/Grammar
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
相关文章
相关视频
专题推荐
-
独孤九贱-php全栈开发教程
全栈 170W+
主讲:Peter-Zhu 轻松幽默、简短易学,非常适合PHP学习入门
-
玉女心经-web前端开发教程
入门 80W+
主讲:灭绝师太 由浅入深、明快简洁,非常适合前端学习入门
-
天龙八部-实战开发教程
实战 120W+
主讲:西门大官人 思路清晰、严谨规范,适合有一定web编程基础学习
上一篇: PHP解决JSON中文显示问题
下一篇: 反向Ajax 30分钟快速掌握
网友评论
文明上网理性发言,请遵守 新闻评论服务协议
我要评论