Я разбираю грамматики CoCo / R в утилите для автоматизации перевода CoCo -> ANTLR. Основная грамматика ANTLR:
rule '=' expression '.' ;
expression
: term ('|' term)*
-> ^( OR_EXPR term term* )
;
term
: (factor (factor)*)? ;
factor
: symbol
| '(' expression ')'
-> ^( GROUPED_EXPR expression )
| '[' expression']'
-> ^( OPTIONAL_EXPR expression)
| '{' expression '}'
-> ^( SEQUENCE_EXPR expression)
;
symbol
: IF_ACTION
| ID (ATTRIBUTES)?
| STRINGLITERAL
;
Моя проблема связана с такими конструкциями:
CS = { ExternAliasDirective }
{ UsingDirective }
EOF .
CS приводит к AST с узлом OR_EXPR, но без "|" персонаж действительно появляется. Я уверен, что это связано с определением выражения, но я не вижу другого способа написать правила.
Я экспериментировал с этим, чтобы разрешить двусмысленность.
// explicitly test for the presence of an '|' character
expression
@init { bool ored = false; }
: term {ored = (input.LT(1).Type == OR); } (OR term)*
-> {ored}? ^(OR_EXPR term term*)
-> ^(LIST term term*)
Это работает, но этот взлом укрепляет мою убежденность в том, что что-то фундаментальное не так.
Любые советы очень ценятся.