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

Ste*_*sky 31 python parsing

您可以推荐哪种Python工具来解析编程语言?它应该允许源内语言语法的可读表示,并且它应该能够扩展到复杂的语言(具有像Python本身那样复杂的语法).

当我搜索时,我主要找到pyparsing,我将评估,但当然我对其他替代品感兴趣.

编辑:奖励点,如果它附带有良好的错误报告和附加到语法树元素的源代码位置.

Wil*_*ris 30

我真的很喜欢pyPEG.它的错误报告不是很友好,但它可以向AST添加源代码位置.

pyPEG没有单独的词法分析器,这会使解析Python本身很难(我认为CPython会识别词法分析器中的缩进和dedent),但我使用pyPEG为C#的子集构建解析器,但工作量极少.

改编自fdik.org/pyPEG/的示例:这样的简单语言:

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

该语言的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
Run Code Online (Sandbox Code Playgroud)

  • 我试图找出如何运行此示例。我认为应该像`from __future__ import unicode_literals,print_function; 从pypeg2 import *; f = parse(example_string,simpleLanguage)`。前提是您将上面的示例作为example_string加载。但这是行不通的。另外,语法与pyPEG网站上的(当前)原始示例有很大不同。任何建议如何运行相同的代码? (2认同)

Ere*_*rez 13

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

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

它可以很容易地解析像Python这样的语言,并且它可以比用Python编写的任何其他解析库更快地完成.


小智 9

pyPEG(我创作的工具)有一个用于错误报告的跟踪工具.

只需设置pyPEG.print_trace = True,pyPEG将为您提供内部发生的全部信息.

  • 你的答案的基调是谈话的基调.请使用问题下的评论部分来讨论问题.答案是帖子的答案,应该提供信息,直截了当,不需要回复. (2认同)

Jak*_*yer 5

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

这是主页的解析示例

from pyparsing import Word, alphas

greet = Word(alphas) + "," + Word(alphas) + "!"  # <-- grammar 
Run Code Online (Sandbox Code Playgroud)

此处定义

hello = "Hello, World!"
print(hello, "->", greet.parseString(hello))
Run Code Online (Sandbox Code Playgroud)

  • 不过,Pyparsing 确实属于答案,允许向上/向下投票。对于OP来说,从一开始就将其作为答案可能会更好。 (3认同)