Необязательное правило (myRule?) Против правила и пустая альтернатива ((myRule |)) - PullRequest
0 голосов
/ 01 декабря 2018

В грамматике ANTLRv4, которую можно найти в репозитории grammars-v4 (https://github.com/antlr/grammars-v4/blob/master/antlr4/ANTLRv4Parser.g4) необязательное правило ebnfSuffix:

  • иногда сопоставляется с использованиемebnfSuffix?, см. lexerElement
  • , иногда сопоставляемый с использованием (ebnfSuffix |), см. element.

Я действительно спрашивал себя, и здесь также, еслидва имеют немного различное значение.

У хранилища grammars-v4 есть еще один пример в https://github.com/antlr/grammars-v4/blob/master/cql3/CqlParser.g4 тех же двух шаблонов относительно используемого правила beginBatch, имеющего необязательный элемент или вместе с пустой альтернативой.

РЕДАКТИРОВАТЬ : Я добавил сюда часть грамматики, на которую я ссылаюсь, как предлагалось:

lexerElement
   : labeledLexerElement ebnfSuffix?   <-- case 1: optional rule
   | lexerAtom ebnfSuffix?
   | lexerBlock ebnfSuffix?
   | actionBlock QUESTION?
   ;

element
   : labeledElement (ebnfSuffix |)   <-- case 2: block with empty alternative
   | atom (ebnfSuffix |)
   | ebnf
   | actionBlock QUESTION?
   ;

1 Ответ

0 голосов
/ 01 декабря 2018

И ebnfSuffix?, и (ebnfSuffix | ) ведут себя совершенно одинаково: они (жадно) необязательно совпадают с ebnfSuffix.

Тот факт, что они оба используются в грамматике, может быть вызван тем, что она была переведена из некоторой спецификации (или другой грамматики), которая использовала эту запись, и что эта запись не имела оператора ?, ноэто просто догадка.

Лично я бы просто использовал ebnfSuffix?.

...