Skip to main content

水杉解析器生成器:提供了 LR(0)、SLR、LR(1)、LALR(1) 四种解析器,以及 LALR(1) 解析器生成器,可以根据定义的语法自动生成 Python 代码。

Project description

metasequoia-parser 水杉语法解析器

水杉语法解析器提供了 LR(0)、SLR、LR(1)、LALR(1) 四种解析器,以及根据语法自动编译 LALR(1) 解析器的 Python 代码的功能。

安装方法

pip install metasequoia-parser

使用方法

定义语法规则

使用 create_grammar 函数创建语法类的构造器,使用构造器的 group_append 方法添加语义组,在语法定义完成后调用构造器的 build 方法构造语法类(Grammar)。

使用 create_group 函数创建语义组,其参数为语义组名称(name)和语义组备选规则的列表(rules)。

使用 create_rule 函数创建备选规则,其参数为符号列表(symbols)和规约函数(action)。

import metasequoia_parser as ms_parser

grammar = ms_parser.create_grammar(
    start="S",
    terminal_type_enum=ms_parser.TerminalType.create_by_terminal_name_list(["a", "b", "c"])
).group_append(ms_parser.create_group(name="S", rules=[
    ms_parser.create_rule(symbols=["a", "B"], action=lambda x: f"{x[0]}{x[1]}"),
    ms_parser.create_rule(symbols=["a", "B", "c"], action=lambda x: f"{x[0]}{x[1]}{x[2]}"),
])).group_append(ms_parser.create_group(name="B", rules=[
    ms_parser.create_rule(symbols=["b"], action=lambda x: f"{x[0]}"),
])).build()

构造解析器

将语法类作为参数构造解析器:

parser = ms_parser.parser.ParserLR0(grammar)  # 构造 LR(0) 解析器
parser = ms_parser.parser.ParserSLR(grammar)  # 构造 SLR 解析器
parser = ms_parser.parser.ParserLR1(grammar)  # 构造 LR(1) 解析器
parser = ms_parser.parser.ParserLALR1(grammar)  # 构造 LALR(1) 解析器

使用解析器对象

直接使用解析器解析词法解析的结果,适用于测试场景:

from metasequoia_parser.lexical import create_lexical_iterator_by_name_list

parser.parse(create_lexical_iterator_by_name_list(grammar, ["a", "b"]))

在正式场景下,需实现词法解析器(ms_parser.lexical.LexicalBase)抽象基类,作为 parse 方法的参数。

编译解析器

使用 ms_parser.compiler.compile_lalr1 函数,可以将 LALR(1) 解析器对象编译为 Python 代码,适用于生产环境:

source_code = ms_parser.compiler.compile_lalr1(parser, import_list=[
    "from my_package import my_tree_node"
])
with open("my_parser.py", "w+", encoding="UTF-8") as file:
    for row in source_code:
        file.write(f"{row}\n")

使用编译的解析器

引用编译的 Python 代码所在文件中的 parse 函数,其参数及返回值等价于解析器对象的 parse 方法。

from metasequoia_parser.lexical import create_lexical_iterator_by_name_list
from my_parser import parse  # 引用编译的 Python 代码所在文件中的 parse 函数

parse(create_lexical_iterator_by_name_list(grammar, ["a", "b"]))  # 测试场景

在正式场景下,需实现词法解析器(ms_parser.lexical.LexicalBase)抽象基类,作为 parser.parse 函数的参数。

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

metasequoia-parser-0.2.0.tar.gz (48.9 kB view details)

Uploaded Source

File details

Details for the file metasequoia-parser-0.2.0.tar.gz.

File metadata

  • Download URL: metasequoia-parser-0.2.0.tar.gz
  • Upload date:
  • Size: 48.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.11.5

File hashes

Hashes for metasequoia-parser-0.2.0.tar.gz
Algorithm Hash digest
SHA256 76c94cfbf49da09291eb5bfa641f6769ce2aeb330dbf48182e45e5be809b3b7d
MD5 5dae857f44fc7849efd5d6fcd5e78906
BLAKE2b-256 9f1c9f7a20498c6492c34739967ee5a76eeca269a1892b4bcc385725ab8af368

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page