Python 空生产对于PEG的作用是什么?

Python 空生产对于PEG的作用是什么?,python,pyparsing,ply,peg,Python,Pyparsing,Ply,Peg,空产生式规则 nonterminal -> epsilon 在lex-yacc-LR自底向上解析器生成器(例如PLY)中非常有用 在什么情况下,应该在PEG解析器中使用空结果,例如pyparsing?BNF经常使用空作为替代,从而有效地使整个表达式成为可选的: leading_sign ::= + | - | empty integer ::= leading_sign digit... 这在pyparsing中是不必要的,因为pyparsing包含以下可选类: # no empty

空产生式规则

nonterminal -> epsilon
在lex-yacc-LR自底向上解析器生成器(例如PLY)中非常有用


在什么情况下,应该在PEG解析器中使用空结果,例如pyparsing?

BNF经常使用空作为替代,从而有效地使整个表达式成为可选的:

leading_sign ::= + | - | empty
integer ::= leading_sign digit...
这在pyparsing中是不必要的,因为pyparsing包含以下可选类:

# no empty required
leading_sign = Optional(oneOf("+ -"))
integer = leading_sign + Word(nums)
Empty确实适用于某些特定用途:

跳过空白-pyparsing中的某些元素在开始解析之前不会跳过空白,例如CharsNotIn和restOfLine。如果您有一个简单的键值输入项,其中键是带引号的字符串,值是带引号的字符串后面的所有内容,如下所示:

"Key 1" value of Key 1
"Key 2" value of Key 2
将其定义为:

quotedString + restOfLine
将“键1的值”和“键2的值”作为值。Pyparsing的empty会跳过空白,因此将语法更改为:

quotedString + empty + restOfLine
将为您提供不带前导空格的值

在特定位置激活解析操作-我在originalTextFor中使用空作为生成表达式的一部分,以插入开始和结束位置标记。空字符串的解析操作将它们替换为它们的位置值,然后originalTextFor的解析操作使用这些位置从输入字符串中分割原始文本

小心使用空的。empty始终匹配,但从不推进解析位置(跳过空格除外)。因此:

将是一个无限循环

empty | "A" | "B" | "C"
将永远不会匹配任何非空备选方案,因为MatchFirsts短路

empty | "A" | "B" | "C"