空制作规则
nonterminal -> epsilon
在lex-yacc LR自下而上解析器生成器(例如PLY)中很有用。
在什么情况下应该在PEG解析器中使用Empty产品,例如pyparsing?
答案 0 :(得分:4)
BNF经常使用空作为替代方案,有效地使整个表达式成为可选:
leading_sign ::= + | - | empty
integer ::= leading_sign digit...
这在pyparsing中是不必要的,因为pyparsing包括Optional的类:
# no empty required
leading_sign = Optional(oneOf("+ -"))
integer = leading_sign + Word(nums)
对于某些特定于pyparsing的目的而言,Empty确实派上用场了:
跳过空格 - pyparsing中的某些元素在开始解析之前不会跳过空格,例如CharsNotIn和restOfLine。如果您输入了键值条目,其中键是带引号的字符串,值是引用字符串后的所有内容,如下所示:
"Key 1" value of Key 1
"Key 2" value of Key 2
将其定义为:
quotedString + restOfLine
会给你“Key 1的值”和“Key 2的值”作为值。 Pyparsing的空 跳过空格,因此将语法更改为:
quotedString + empty + restOfLine
将为您提供没有前导空格的值。
在特定位置激活解析操作 - 我使用empty作为originalTextFor中生成的表达式的一部分来放入开始和结束位置标记。空的解析操作用它们的位置值替换它们,然后originalTextFor的解析操作使用这些位置从输入字符串中切割原始文本。
小心使用空。 empty 始终匹配,但从不提升解析位置(跳过空格除外)。所以:
OneOrMore(empty)
将是一个无限循环。
empty | "A" | "B" | "C"
由于MatchFirsts短路,永远不会匹配任何非空的替代品。