【问题标题】:ANTLR3 parse expressionANTLR3 解析表达式
【发布时间】:2016-08-26 22:44:16
【问题描述】:

我想通过 antlr3 解析一个表达式,但是遇到了一些错误。以下是我的语法文件:

grammar Expr;

options {
  output       = AST;
  ASTLabelType = CommonTree;
  language     = Java;
  k =3;
// backtrack=true;
}

tokens {
    DIVIDE = '/' ;
    PLUS = '+' ;
    MINUS = '-' ;
    STAR = '*' ;
    MOD = '%' ;
    AMPERSAND = '&' ;
    TILDE = '~' ;
    BITWISEOR = '|' ;
    COMMA = ',';
    DOT = '.';
    LPAREN = '(' ;
    RPAREN = ')' ;
    THRESHOLD = '>';
    EQUIValence = '=';  
    AND = 'AND' ;
    OR = 'OR' ;
    TRUE = 'TRUE';
    FALSE = 'FALSE';
    DOUBLE_QUOTE = '\"';
    SINGLE_QUOTE = '\'';
}


// LITERALS
fragment
Letter
    : 'a'..'z' | 'A'..'Z'
    ;

fragment
Digit
    :
    '0'..'9'
    ;

fragment
Exponent
    :
    ('e' | 'E') ( PLUS|MINUS )? (Digit)+
    ;

Number
    :
    (Digit)+ ( DOT (Digit)* (Exponent)? | Exponent)?
    ;

fragment
UnquotedString
    :  
      ( ~(SINGLE_QUOTE|DOUBLE_QUOTE|' '|'\t'|'\n'|LPAREN|RPAREN|COMMA))+
    ;

fragment
QuotedLiteral
    :
    DOUBLE_QUOTE ( ~(DOUBLE_QUOTE|'\\') | ('\\' .) )* DOUBLE_QUOTE 
    ;

Parameter
    :
    UnquotedString | QuotedLiteral
    ;

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


/********************************************rule******************************************/
searchCondition
    :
    // subCondition (( AND | OR ) subCondition)? EOF?
    andExpr (OR^ andExpr)*
    ;

andExpr
    :
    subCondition (AND^ subCondition)*
    ;

subCondition
    : 
      LPAREN searchCondition RPAREN 
    | atom  
    ;

atom returns [QueryBuilder result]
    :
    //p0=expression  (comparisonOperator expression)?
    p0=expression
    {
      $result = $p0.result;
    }        
    ;

comparisonOperator
    :
    THRESHOLD | EQUIValence
    ;

expression returns [QueryBuilder result]
    : 
    //p0=subExpression (binaryOperator subExpression)*
    p0=subExpression
    ;

subExpression returns [QueryBuilder result]
    :
      p0=Parameter 
    ;

输入QQ OR (UU AND WW) OR XX时,解析结果不完整,右括号后面的内容不匹配。

【问题讨论】:

  • 你为什么不看看各种语法中的许多表达式规则之一。支持表达式的语言的每个语法都有这样的规则。

标签: antlr3 antlrworks


【解决方案1】:

最终的 AST 似乎没问题。只是antlworks的解释功能无法为你展示。正如它所说:“它不运行动作也不评估句法谓词”。尽管您没有明确地拥有这些,但您有一个递归(searchCondition->andExpr->subCondition->searchCondition)。

你试过调试器吗? 生成的 AST 将如下所示:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多