1

我正在将语法从 LALR 翻译为 ANTLR,但在翻译这一规则时遇到了麻烦,即分段表达式。

附上示例语法:

grammar Test;
options {
  language = Java;
  output = AST;
}

parse : expression ';'
      ;

expression : binaryExpression
           | piecesExpression
           ;

binaryExpression : addingExpression (('=='|'!='|'<='|'>='|'>'|'<') addingExpression)*
                 ;

addingExpression : multiplyingExpression (('+'|'-') multiplyingExpression)*
                 ;

multiplyingExpression : unaryExpression 
                        (('*'|'/') unaryExpression)*
                      ;

unaryExpression: ('!'|'-')* primitiveElement;   

primitiveElement : literalExpression
                 | id
                 | '(' expression ')'
                 ;  

literalExpression : INT
                  ;              

id : IDENTIFIER
   ;

piecesExpression : 'piecewise' '{' piece expression '}'  ('(' expression ',' expression ')')? expression?
                 ;

piece : expression '->' expression ';' (expression '->' expression ';')*
      ;


// L E X I C A L   R U L E S      

INT : DIGITS ;   

IDENTIFIER : LETTER (LETTER | DIGIT)*;

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

fragment LETTER : ('a'..'z' | 'A'..'Z' | '_') ;
fragment DIGITS: DIGIT+;
fragment DIGIT : '0'..'9';

ANTLR v3.5 抱怨piecesExpression 规则。它有 2 个致命错误,我宁愿不使用回溯选项。

预期成绩:

piecewise {t -> s; t -> x; 100}
piecewise {t -> s; t -> x; 100} (0, x+1) 
piecewise {t -> s; t -> x; 100} (0, x+1) y+5

piecesExpression 是如何捕捉到上述结果的呢?

提前致谢!

4

1 回答 1

2

ANTLR 在确定(至少)2 种情况下采用哪些替代方案时存在问题:

  1. piece以 a 开头,expression但在 内部piecewise{...},它也应该以 a 结尾expression
  2. piecesExpression结尾,'(' expression ...但也有一个可选的尾随expression(并且依次primitiveElement匹配)'(' expression ...

无需使用全局回溯,但无需重写许多规则,您确实需要添加一些谓词((...)=>在下面的示例中)来解决上述两个问题。

试试这个:

piecesExpression
 : 'piecewise' '{' ((expression '->')=> piece)+ expression '}' 
     ( ('(' expression ',')=> '(' expression ',' expression ')' expression?
     |                        expression
     )
 ;

piece
 : expression '->' expression ';'
 ;
于 2013-03-05T11:22:36.583 回答