将BNF语法转换为pyparsing

马克斯·特卡琴科

对于下面显示的脚本语言(Backus–Naur形式),我如何使用正则表达式描述语法(或进行pyparsing更好?):

<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是比regex更好的解决方案。

保罗·麦格

通过Pyparsing,您可以简化其中一些构造

leaves :: {leaf} leaf

只是

OneOrMore(leaf)

因此,pyparsing中BNF的一种形式将类似于:

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]让他们无效exprs

  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]']]

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将BNF语法转换为Java

来自分类Dev

将扩展 BNF 转换为 Bison 语法,但有移位/减少错误

来自分类Dev

将自上而下的语法规则转换为BNF

来自分类Dev

将Netscaler show show输出转换为BNF进行解析

来自分类Dev

将Webpack语法转换为browserify语法

来自分类Dev

将简单的SelectMany转换为查询语法

来自分类Dev

将CoffeeScript问号语法转换为Javascript

来自分类Dev

将MySQL查询转换为CI语法

来自分类Dev

将语法生成转换为Parsec

来自分类Dev

将查询转换为SQL Server语法

来自分类Dev

将MySQL查询转换为CI语法

来自分类Dev

将代码从MATLAB转换为PYTHON的语法

来自分类Dev

将DokuWiki语法转换为MediaWiki的脚本

来自分类Dev

将语法从 cURL 转换为 php cURL

来自分类Dev

是否可以将clojure语法转换为python语法?

来自分类Dev

如何将语法转换为自上而下的可解析语法

来自分类Dev

将旧的Rspec语法转换为新语法

来自分类Dev

将AT&T语法转换为Intel语法(ASM)

来自分类Dev

将data.table语法转换为dplyr语法

来自分类Dev

将do语法转换为>> =语法的简单示例

来自分类Dev

如何将Xpath语法转换为XSL / XSLT语法?

来自分类Dev

PHP 将旧的数组推送语法转换为新的语法

来自分类Dev

强制转换语法以将总和转换为浮点数

来自分类Dev

转换为Float时的Python / Pyparsing结果

来自分类Dev

如何将errors_on转换为RSpec 3语法?

来自分类Dev

了解语法(将NSInteger转换为NSNumber)

来自分类Dev

如何将新的SomeFunction()语法转换为TypeScript?

来自分类Dev

Django将旧网址转换为新语法

来自分类Dev

将linux ssh配置语法转换为PuTTY和Git