空の生産ルール
nonterminal -> epsilon
lex-yacc LR ボトムアップ パーサー ジェネレーター (PLY など) で役立ちます。
pyparsing などの PEG パーサーで空のプロダクションを使用する必要があるのはどのような状況ですか?
BNF は代わりに空を使用することが多く、式全体を効果的にオプションにしています。
leading_sign ::= + | - | empty
integer ::= leading_sign digit...
pyparsing にはこのための Optional クラスが含まれているため、これは pyparsing では不要です。
# 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
値として「キー 1 の値」と「キー 2 の値」が得られます。Pyparsing の emptyは空白をスキップするため、文法を次のように変更します。
quotedString + empty + restOfLine
先頭のスペースなしで値を提供します。
特定の場所での解析アクションのアクティブ化 - originalTextFor で生成された式の一部として空の値を使用して、開始位置マーカーと終了位置マーカーをドロップしました。empty の解析アクションはそれらを位置の値に置き換え、originalTextFor の解析アクションはそれらの位置を使用して、入力文字列から元のテキストをスライスします。
空の使用に注意してください。emptyは常に一致しますが、解析位置を進めることはありません (空白のスキップを除く)。そう:
OneOrMore(empty)
無限ループになります。
empty | "A" | "B" | "C"
MatchFirsts が短絡するため、空でない選択肢のいずれとも一致しません。