Выражение синтаксического анализа ANTLR3

Я хочу проанализировать выражение с помощью 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 результат синтаксического анализа не завершен, так как содержимое после правых круглых скобок не совпадает.

введите здесь описание изображения


person sol    schedule 13.01.2016    source источник
comment
Почему бы вам просто не взглянуть на одно из многих правил выражения в различных грамматиках. Каждая грамматика языка, поддерживающего выражения, имеет такие правила.   -  person Mike Lischke    schedule 13.01.2016


Ответы (1)


Окончательный AST, кажется, в порядке. Это просто функция интерпретации Antlworks, которая не может показать это для вас. Как говорится: «он не выполняет действия и не оценивает синтаксические предикаты». Хотя у вас их нет явно, у вас есть рекурсия (searchCondition->andExpr->subCondition->searchCondition).

Вы пробовали отладчик? Результирующий AST будет выглядеть следующим образом: введите здесь описание изображения

person lp_    schedule 14.01.2016