gpt4 book ai didi

python - 将 BNF 语法转换为 pyparsing

转载 作者:太空狗 更新时间:2023-10-29 21:00:53 24 4
gpt4 key购买 nike

我如何使用正则表达式(或 pyparsing 更好?)描述下面呈现的脚本语言的语法(Backus–Naur 形式):

<root>   :=     <tree> | <leaves>
<tree> := <group> [* <group>]
<group> := "{" <leaves> "}" | <leaf>;
<leaves> := {<leaf>;} leaf
<leaf> := <name> = <expression>{;}

<name> := <string_without_spaces_and_tabs>
<expression> := <string_without_spaces_and_tabs>

脚本示例:

{
stage = 3;
some.param1 = [10, 20];
} *
{
stage = 4;
param3 = [100,150,200,250,300]
} *
endparam = [0, 1]

我使用 python re.compile 并希望将所有内容分组,如下所示:

[ [ 'stage',       '3'],
[ 'some.param1', '[10, 20]'] ],

[ ['stage', '4'],
['param3', '[100,150,200,250,300]'] ],

[ ['endparam', '[0, 1]'] ]

更新:我发现 pyparsing 是比正则表达式更好的解决方案。

最佳答案

Pyparsing 让您可以简化其中一些类型的构造

leaves :: {leaf} leaf

只是

OneOrMore(leaf)

所以你的 BNF 在 pyparsing 中的一种形式看起来像这样:

from pyparsing import *

LBRACE,RBRACE,EQ,SEMI = map(Suppress, "{}=;")
name = Word(printables, excludeChars="{}=;")
expr = Word(printables, excludeChars="{}=;") | quotedString

leaf = Group(name + EQ + expr + SEMI)
group = Group(LBRACE + ZeroOrMore(leaf) + RBRACE) | leaf
tree = OneOrMore(group)

我添加了 quotedString 作为替代 expr,以防你想要一些确实包含排除的字符之一的东西。并且在叶和组周围添加组将保持支撑结构。

不幸的是,您的样本不太符合此 BNF:

  1. [10, 20][0, 1] 中的空格使它们成为无效表达式

  2. 有些叶子没有终止;

  3. 单独的 * 个字符 - ???

此示例使用上述解析器成功解析:

sample = """
{
stage = 3;
some.param1 = [10,20];
}
{
stage = 4;
param3 = [100,150,200,250,300];
}
endparam = [0,1];
"""

parsed = tree.parseString(sample)
parsed.pprint()

给予:

[[['stage', '3'], ['some.param1', '[10,20]']],
[['stage', '4'], ['param3', '[100,150,200,250,300]']],
['endparam', '[0,1]']]

关于python - 将 BNF 语法转换为 pyparsing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27926697/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com