代码之家  ›  专栏  ›  技术社区  ›  Ward Bekker

求解ANTLR互左递归规则

  •  3
  • Ward Bekker  · 技术社区  · 14 年前

    LPAREN : ( '(' ) ;
    RPAREN : ( ')' );
    AND : ( 'AND' | '&' | 'EN' ) ;
    OR : ( 'OR' | '|' | 'OF' );
    NOT : ('-' | 'NOT' | 'NIET' );
    WS :  ( ' ' | '\t' | '\r' | '\n' ) {$channel=HIDDEN;}  ;
    WORD :  (~( ' ' | '\t' | '\r' | '\n' | '(' | ')' | '"' ))*;
    
    input : expr EOF;
    expr : (andexpr | orexpr | notexpr | atom);
    andexpr : expr AND expr;
    orexpr :  expr OR expr;
    notexpr : NOT expr;
    phrase : '"' WORD* '"';
    atom : (phrase | WORD); 
    
    1 回复  |  直到 14 年前
        1
  •  5
  •   Arne Deutsch    12 年前

    我建议看一下antlr站点上的示例语法。java语法做你想做的。

    基本上你可以这样做:

    expr : andexpr;
    andexpr : orexpr (AND andexpr)*;
    orexpr : notexpr (OR orexpr)*;
    notexpr : atom | NOT expr;