Pergunta

Eu sou muito novo no ANTLR, então essa é provavelmente uma pergunta simples.
Eu defini uma gramática simples que deveria incluir expressões aritméticas com números e identificadores (strings que começam com uma carta e continuam com uma ou mais letras ou números.)

A gramática parece o seguinte:

grammar while;

@lexer::header {
  package ConFreeG;
}  

@header {
  package ConFreeG;

  import ConFreeG.IR.*;
}

@parser::members {
}

arith:
    term
    | '(' arith ( '-' | '+' | '*' ) arith ')'  
    ;

term  returns [AExpr a]:    
    NUM
    {
        int n = Integer.parseInt($NUM.text);
        a = new Num(n);
    }
    | IDENT
    {
        a = new Var($IDENT.text);
    }
    ;

fragment LOWER : ('a'..'z');
fragment UPPER : ('A'..'Z');
fragment NONNULL : ('1'..'9');
fragment NUMBER : ('0' | NONNULL);
IDENT  : ( LOWER | UPPER ) ( LOWER | UPPER | NUMBER )*;
NUM    : '0' | NONNULL NUMBER*;

fragment NEWLINE:'\r'? '\n';
WHITESPACE  :   ( ' ' | '\t' | NEWLINE )+ { $channel=HIDDEN; };

Estou usando o ANTLR V3 com o plug -in Antlr IDE Eclipse. Quando eu analiso a expressão (8 + a45) Usando o intérprete, apenas parte da árvore de análise é gerada:

alt text

Por que o segundo termo (A45) não é analisado? O mesmo acontece se ambos os termos forem números.

Obrigada,

Martin Wiboe

Foi útil?

Solução

Você vai querer criar uma regra de pastor que tenha um EOF (Fim do arquivo) Token nele para que o analisador seja forçado a passar por todo o fluxo de token.

Adicione esta regra à sua gramática:

parse
  :  arith EOF
  ;

e deixe o intérprete começar nessa regra em vez do arith regra:

alt text

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top