Какова роль пустого производства для ПЭГ? - PullRequest
6 голосов
/ 04 мая 2011

Пустое производственное правило

nonterminal -> epsilon

полезно для генераторов синтаксического анализатора lex-yacc LR (например, PLY).

В каком контексте следует использовать пустое производство в PEG-анализаторах, напримеркипарис?

1 Ответ

5 голосов
/ 04 мая 2011

BNF часто используют пустой в качестве альтернативы, фактически делая общее выражение необязательным:

leading_sign ::= + | - | empty
integer ::= leading_sign digit...

Это необязательно в pyparsing, так как в pyparsing есть дополнительный класс для этого:

# no empty required
leading_sign = Optional(oneOf("+ -"))
integer = leading_sign + Word(nums)

Empty действительно пригодится для некоторых специфичных для pyparsing целей:

Пропускает пробел - некоторые элементы в pyparsing не пропускают пробел перед началом их анализа, такие как CharsNotIn и restOfLine.Если у вас был простой ввод записей значения ключа, в которых ключ представлял собой строку в кавычках, а значение было всем после строки в кавычках, например:

"Key 1" value of Key 1
"Key 2" value of Key 2

Определение этого как:

quotedString + restOfLine

даст вам «значение ключа 1» и «значение ключа 2» в качестве значений.Пустое значение в Pyparsing пропускает через пробел , поэтому изменение грамматики на:

quotedString + empty + restOfLine

даст вам значения без пробелов.

Активация действий разбора в определенных местах -Я использовал empty как часть сгенерированного выражения в originalTextFor для добавления маркеров начала и конца местоположения.Действия разбора для пустых заменяют их значениями их местоположения, затем действие разбора для originalTextFor использует эти местоположения для вырезания исходного текста из входной строки.

Будьте осторожны, используя пустое.пусто всегда соответствует, но никогда не продвигает место разбора (за исключением пропуска пробелов).Итак:

OneOrMore(empty)

будет бесконечным циклом.

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

никогда не будет соответствовать ни одной из непустых альтернатив, поскольку MatchFirsts закорачивает.

...