Почему ANTLR не анализирует весь ввод? - PullRequest
3 голосов
/ 05 апреля 2010

Я новичок в ANTLR, так что это, вероятно, простой вопрос.
Я определил простую грамматику, которая должна включать арифметические выражения с числами и идентификаторами (строки, начинающиеся с буквы и продолжающиеся одной или несколькими буквами или цифрами)

Грамматика выглядит следующим образом:

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; };

Я использую ANTLR v3 с плагином ANTLR IDE Eclipse. Когда я анализирую выражение (8 + a45) с помощью интерпретатора, генерируется только часть дерева разбора:

альтернативный текст http://i43.tinypic.com/or4idw.png

Почему второй член (a45) не анализируется? То же самое происходит, если оба термина являются числами.

Спасибо,

Мартин Вибо

1 Ответ

4 голосов
/ 06 апреля 2010

Вы захотите создать правило синтаксического анализатора, содержащее маркер EOF (конец файла), чтобы анализатор был вынужден пройти весь поток токенов.

Добавьте это правило к вашей грамматике:

parse
  :  arith EOF
  ;

и пусть интерпретатор начинает с этого правила вместо правила arith:

альтернативный текст http://i40.tinypic.com/dg5c06.png

...