水杉语法解析器提供了 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
96ae6f42bc89f51dc0dc57d8120b370401b274a8061e5b31c5267ec80c8dbdf8
|
|
| MD5 |
14f84be74e2d1e55f04fee57bd3a1800
|
|
| BLAKE2b-256 |
09e44f345366d85bb095a2b5c1faa0939178c3bed94ab55aeeb50615c422fa85
|