使用什么工具来解析Python中的编程语言?

问题描述 投票:0回答:9

您可以推荐哪种Python工具来解析编程语言?它应该允许源代码中语言语法的可读表示。它还应该能够扩展到复杂的语言(语法像 Python 本身一样复杂的语言)。

良好的错误报告和附加到语法树元素的源代码位置的奖励积分。

python parsing
9个回答
39
投票

我真的很喜欢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

19
投票

我建议您查看我的库:https://github.com/erezsh/lark

它可以解析所有上下文无关语法,自动构建 AST(带有行号和列号),并接受 EBNF 格式的语法,这被认为是标准。

它可以轻松解析像 Python 这样的语言,并且比任何其他用 Python 编写的解析库更快。


9
投票

pyPEG(我编写的工具)具有用于错误报告的跟踪功能。

只需设置

pyPEG.print_trace = True
,pyPEG 就会为您提供内部发生情况的完整轨迹。


6
投票

对于更复杂的解析器,我会使用 pyparsing。 Py解析

这是主页的解析示例

from pyparsing import Word, alphas

greet = Word(alphas) + "," + Word(alphas) + "!"  # <-- grammar 

在此定义

hello = "Hello, World!"
print(hello, "->", greet.parseString(hello))


4
投票

Ned Batchelder 对 python 解析工具进行了一项调查,显然他一直在更新(最后更新于 2010 年 7 月):

http://nedbatchelder.com/text/python-parsers.html

如果我今天需要一个解析器,我要么推出自己的递归下降解析器,要么可能使用PLYLEPL——取决于我的需要以及我是否愿意引入外部依赖项。我个人不会将 PyParsing 用于任何非常复杂的事情。


2
投票

对于简单任务,我倾向于使用shlex模块。

请参阅 http://wiki.python.org/moin/LanguageParsing,了解 python 语言解析的评估。


2
投票

如果你正在评估 PyParsing,我认为你应该看看 funcparserlib:http://pypi.python.org/pypi/funcparserlib

有点相似,但根据我的经验,生成的代码要干净得多。


0
投票

Antlr 生成 LL(*) 解析器。这可能很好,但有时删除所有左递归可能很麻烦。

如果您精通 LALR(1),则可以使用 PyBison。如果您知道 Yacc 是什么,它的语法与 Yacc 类似。另外,有很多人知道 yacc 的工作原理。

© www.soinside.com 2019 - 2024. All rights reserved.