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.1.0.tar.gz (40.5 kB view details)

Uploaded Source

File details

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

File metadata

  • Download URL: metasequoia-parser-0.1.0.tar.gz
  • Upload date:
  • Size: 40.5 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.1.0.tar.gz
Algorithm Hash digest
SHA256 96ae6f42bc89f51dc0dc57d8120b370401b274a8061e5b31c5267ec80c8dbdf8
MD5 14f84be74e2d1e55f04fee57bd3a1800
BLAKE2b-256 09e44f345366d85bb095a2b5c1faa0939178c3bed94ab55aeeb50615c422fa85

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