我正在用Python创建一个简单的迷你语言解析器,在问题域附近进行编程以及所有这些。
无论如何,我想知道这里的人们会怎么做 - 在Python中做这种事情的首选方法是什么?
我不会详细说明我所追求的内容,因为目前我只是在研究整个领域在Python中的容易程度。
感谢您的投入!
答案 0 :(得分:39)
Pyparsing对于编写“小语言”非常方便。我写了一个presentation at PyCon'06来编写一个简单的冒险游戏引擎,其中被解析和解释的语言是游戏命令集(“库存”,“拿剑”,“掉书”等)。 (源代码here。)
您还可以在pyparsing wiki Publications page找到其他pyparsing文章的链接。
答案 1 :(得分:22)
我对PLY(Python Lex-Yacc)的经验有限但积极。它将Lex and Yacc功能组合在一个Python类中。你可能想看一下。
Stackoverflow'er Ned Batchelder在他的网站上有nice overview个可用工具。还有Python website本身的概述。
答案 2 :(得分:20)
我会推荐funcparserlib
。它专门用于解析小语言和DSL,它比pyparsing
更快更小(参见其主页上的统计数据)。极简主义者和功能程序员应该喜欢funcparserlib
。
编辑:顺便说一句,我是这个图书馆的作者,所以我的观点可能有偏见。
答案 3 :(得分:5)
Python是一种非常简单且可扩展的语言,我建议只创建一个全面的python模块,并对其进行编码。
我看到,当我输入上述内容时,PLY
已被提及。
答案 4 :(得分:3)
为了提高工作效率,我总是使用像CocoPy(Tutorial)之类的解析器生成器将您的语法转换为(正确的)解析器(除非您想手动实现解析器)为了学习)。
其余的是编写实际的解释器/编译器(创建基于堆栈的字节代码或内存AST进行解释,然后对其进行评估)。
答案 5 :(得分:3)
如果你现在问我这个问题,我会尝试使用textx库进行python。你可以使用python轻松创建一个dsl!优点是它为您创建了一个AST,并且结合了lexing和解析。