语法中的致命错误 - 分段定义

时间:2013-03-05 10:31:50

标签: antlr antlr3 context-free-grammar

我正在将语法从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个致命错误,我宁愿不使用backtrack选项。

预期结果:

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如何能够捕获上述结果?

提前致谢!

1 个答案:

答案 0 :(得分:2)

ANTLR在确定哪些替代方案(至少)2个案例中存在问题:

  1. pieceexpression开头,但在piecewise{...}内,它也应该以{{1​​}}
  2. 结尾
  3. expressionpiecesExpression结尾,但也有可选的尾随'(' expression ...expression也匹配primitiveElement
  4. 没有必要使用全局回溯,但是如果不重写许多规则,您需要添加一些谓词(下面示例中的'(' expression ...)来修复上面列出的两个问题。

    试试这个:

    (...)=>