我正在研究在Python之上实现的特定于域的语言。语法与Python非常接近,直到现在我们才进行了一些简单的字符串转换,然后将其转换为ast
。例如,缩进由#endfor
/ #endwhile
/ #endif
语句替换,因此我们将缩进标准化,同时它仍然是字符串。
我想知道是否有更好的方法?据我所知,ast
是硬编码解析Python语法的,除了http://docs.python.org/library/ast.html#module-ast之外我找不到任何其他文档(我猜想源代码本身)。
有没有人有PyParsing,ANTLR或PLY的个人经验?
有一些模糊的计划将解释器重写为将我们的语言转换为有效的Python并将其提供给Python解释器本身的东西,所以我想要与compile
兼容的东西,但这不是一个交易断路器。
更新:我刚刚想到
from __future__ import print_function, with_statement
更改了Python解析以下源代码的方式。但是,PEP 236表明这是编译器功能的语法窗口。有人可以确认试图覆盖/扩展__future__
不是我问题的正确解决方案吗?
答案 0 :(得分:1)
PLY有效。这很奇怪,因为它模仿lex / yacc的方式不是非常pythonic。
lex和yacc都有一个隐式接口,可以将lex的输出作为独立程序运行。这个“功能”被精心保留。类似地,对于PLY的yacc样特征。创建一个奇怪的,隐含的独立主程序的“特征”被精心保存。
然而,PLY作为lex / yacc兼容工具集相当不错。你所有的lex / yacc技能都得以保留。
[编辑评论。 “修复”Python的语法可能是浪费时间。几乎每个人都可以在没有任何帮助的情检查C,Java,C ++甚至Pascal代码,你会发现几乎每个人都可以缩进。实际上,人们不遗余力地在不需要的地方缩进Java。如果缩进在Java中不重要,为什么人们做得这么好呢?]