关于Python解析器生成器的建议

22 投票
2 回答
11468 浏览
提问于 2025-04-15 16:14

我接到一个任务,要为一种简单的类似C语言的语言创建一个解析器。我可以使用任何我想要的编程语言和工具来制作这个解析器,但我正在学习Python,所以我更倾向于用Python。

我的解析器需要遵循一些限制。首先,它必须能够读取一个文本文件,这个文件包含以下信息:

kind1 : spelling1
kind2 : spelling2
kind3 : spelling3
      .
      .
      .
kindn : spellingn

这里的每种类型和拼写都代表了语言中的标记类型和对应的值。这个文件是通过语言的词法分析器处理一段示例代码后得到的结果。

其次,我必须能够自定义解析器的输出。理想情况下,我希望输出一个文件,将kind:spelling列表转换成另一种标记序列,这些标记将传递给语言的编译器,最终转换成MIPS汇编代码。下面是我希望解析器能够生成的内容的一个小例子:

%function int test
  %variable int x
  %variable int y
%begin
  %if %id y , %id x > %do
  %begin
    %return %num 0
  %end
  %return %num 1
%end

如果有人能给我推荐一些现有的Python解析器生成器,并告诉我是否能实现我在上面例子中提到的功能,那将非常有帮助。

2 个回答

9

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

Lark 可以解析所有的上下文无关文法,它会自动生成一个抽象语法树(AST),并且会标注行号和列号。它接受用 EBNF 格式写的文法,这种格式简单易写,而且被认为是标准格式。

22

PyParsing 是一个用来生成解析器的 Python 工具。这里有很多有趣的例子

上手很简单:

from pyparsing import Word, alphas

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

# input string
hello = "Hello, World!"

# parse input string
print hello, "->", greet.parseString( hello )

撰写回答