我在一个实用程序中解析 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 会产生一个带有 OR_EXPR 节点的 AST,尽管没有“|” 人物实际出现。我确定这是由于表达式的定义,但我看不到任何其他方式来编写规则。
我确实对此进行了实验以解决歧义。
// 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*)
它有效,但黑客强化了我的信念,即一些根本性的问题是错误的。
非常感谢任何提示。