在Python中解析编程语言用哪个工具?

40 投票
9 回答
24237 浏览
提问于 2025-04-16 20:47

你能推荐哪个Python工具来解析编程语言吗?这个工具应该能让我们清楚地看到源代码中的语言语法,而且还要能处理复杂的语言(比如像Python这样语法复杂的语言)。

我在搜索的时候,主要找到了pyparsing,我会去试试这个,但我当然也想知道其他的选择。

补充一下:如果这个工具能提供好的错误报告,并且能把源代码的位置和语法树的元素关联起来,那就更好了。

9 个回答

9

pyPEG(这是我开发的一个工具)有一个追踪功能,可以帮助你报告错误。

只需要设置 pyPEG.print_trace = True,pyPEG 就会给你详细的内部运行情况,让你清楚发生了什么。

19

我推荐你看看我的库:https://github.com/erezsh/lark

这个库可以解析所有的上下文无关文法,自动生成抽象语法树(AST),并且会带上行号和列号,接受的文法格式是EBNF,这个格式被认为是标准。

它可以轻松解析像Python这样的语言,而且速度比其他用Python写的解析库要快。

38

我非常喜欢 pyPEG。它的错误报告不太友好,但它可以在抽象语法树(AST)中添加源代码的位置。

pyPEG没有单独的词法分析器,这让解析Python本身变得困难(我认为CPython在词法分析器中会识别缩进和取消缩进),不过我用pyPEG构建了一个C#子集的解析器,结果出乎意料的简单。

这是一个改编自 fdik.org/pyPEG/ 的例子:一个像这样的简单语言:

function fak(n) {
    if (n==0) { // 0! is 1 by definition
        return 1;
    } else {
        return n * fak(n - 1);
    };
}

这是一个用于该语言的pyPEG解析器:

def comment():          return [re.compile(r"//.*"),
                                re.compile("/\*.*?\*/", re.S)]
def literal():          return re.compile(r'\d*\.\d*|\d+|".*?"')
def symbol():           return re.compile(r"\w+")
def operator():         return re.compile(r"\+|\-|\*|\/|\=\=")
def operation():        return symbol, operator, [literal, functioncall]
def expression():       return [literal, operation, functioncall]
def expressionlist():   return expression, -1, (",", expression)
def returnstatement():  return keyword("return"), expression
def ifstatement():      return (keyword("if"), "(", expression, ")", block,
                                keyword("else"), block)
def statement():        return [ifstatement, returnstatement], ";"
def block():            return "{", -2, statement, "}"
def parameterlist():    return "(", symbol, -1, (",", symbol), ")"
def functioncall():     return symbol, "(", expressionlist, ")"
def function():         return keyword("function"), symbol, parameterlist, block
def simpleLanguage():   return function

撰写回答