Fra*_*ery 6 python ply peg pyparsing
空生产规则
nonterminal -> epsilon
Run Code Online (Sandbox Code Playgroud)
在lex-yacc LR自下而上解析器生成器(例如PLY)中很有用.
在什么情况下应该使用PEG解析器中的空产品,例如pyparsing?
BNF通常使用empty作为替代,有效地使整体表达式成为可选:
leading_sign ::= + | - | empty
integer ::= leading_sign digit...
Run Code Online (Sandbox Code Playgroud)
在pyparsing中这是不必要的,因为pyparsing为此包含了Optional类:
# no empty required
leading_sign = Optional(oneOf("+ -"))
integer = leading_sign + Word(nums)
Run Code Online (Sandbox Code Playgroud)
不过,对于某些特定于pyparsing的目的,Empty确实派上用场:
跳过空白-pyparsing中的某些元素在开始解析之前不会跳过空白,例如CharsNotIn和restOfLine。如果您有一个简单的键值条目输入,其中键是带引号的字符串,而值则是带引号的字符串之后的所有内容,例如:
"Key 1" value of Key 1
"Key 2" value of Key 2
Run Code Online (Sandbox Code Playgroud)
定义为:
quotedString + restOfLine
Run Code Online (Sandbox Code Playgroud)
将为您提供“键1的值”和“键2的值”作为值。Pyparsing的empty 确实会跳过空白,因此将语法更改为:
quotedString + empty + restOfLine
Run Code Online (Sandbox Code Playgroud)
将为您提供没有前导空格的价值。
在特定位置激活解析操作-我在原文本生成器中使用空值作为生成表达式的一部分来插入开始和结束位置标记。空值的解析动作将其替换为其位置值,然后originalTextFor的解析动作将使用这些位置从输入字符串中切出原始文本。
使用空时要小心。empty 总是匹配,但绝不推进解析位置(跳过空白除外)。所以:
OneOrMore(empty)
Run Code Online (Sandbox Code Playgroud)
将是一个无限循环。
empty | "A" | "B" | "C"
Run Code Online (Sandbox Code Playgroud)
绝不会匹配任何非空的替代项,因为MatchFirsts会短路。