这篇文章解析转换器3:手写php转python编译器的词法部分
一时技痒,自然而然地想搞个大家伙,把整个php程序转成python。不比模板,可以用正则匹配偷懒,这次非写一个php编译器不可。
上网搜了一下,发现大部分python to xxx的transpile都是直接基于ast,省略了最重要的tokenizer,parser。直接写个visitor了事。要不然就是基于antlr之类的生成器,搞一大堆代码,看得令人心烦。
既然大家都不想做这个苦力,我就来试试,手工写一个php编译器。分tokenizer,parser,visitor三个部分来实现。
翻出《龙书》《虎书》做参考,仔细学了一回php,不学不知道,原来php有那么多特性,做个编译器真心累人。
词法部分很简单,就是一个自动机。设计了一个结构存放自动机,然后简单粗暴地在自动机上编程,也顾不上什么性能了,就是个一锤子买卖。
写得还算快,调试不是很顺,不过我是不会说的,哈
自动机不复杂,发上来大家看看,敬请指正。
self.statemachine = {
‘current’: {
‘state’: ‘default’, ‘content’: ”, ‘line’: 0},
‘default’: [
{‘name’: ‘open’, ‘next’: ‘php’, ‘extra’: 0, ‘start’: 0, ‘end’: 0, ‘cache’: ”,
‘token’: r’