ANTLR "неожиданный конец поддерева" - PullRequest
5 голосов
/ 16 декабря 2009

Эй. Я новичок в ANTLR. Мастер ANTLRWorks написал для меня следующий код:

grammar test;

ID  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;

INT :   '0'..'9'+
    ;

FLOAT
    :   ('0'..'9')+ '.' ('0'..'9')* EXPONENT?
    |   '.' ('0'..'9')+ EXPONENT?
    |   ('0'..'9')+ EXPONENT
    ;

COMMENT
    :   '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
    |   '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
    ;

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

STRING
    :  '"' ( ESC_SEQ | ~('\\'|'"') )* '"'
    ;
CHAR:  '\'' ( ESC_SEQ | ~('\''|'\\') ) '\''
    ;

fragment
EXPONENT : ('e'|'E') ('+'|'-')? ('0'..'9')+ ;

fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;

fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    |   UNICODE_ESC
    |   OCTAL_ESC
    ;

fragment
OCTAL_ESC
    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7')
    ;

fragment
UNICODE_ESC
    :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
    ;

При отладке выдает следующую ошибку:

[22:45:49] error(100): C:\Documents and Settings\user\Desktop\test.g:0:0: syntax error: codegen: <AST>:0:0: unexpected end of subtree

Может кто-нибудь объяснить мне, что это за ошибка, где она и как ее можно исправить?

Спасибо.

Ответы [ 2 ]

7 голосов
/ 17 декабря 2009

В ANTLR каждое правило, которое начинается с заглавной буквы, является правилом лексера. Те, которые начинаются со строчной буквы, являются правилами парсера. Как видите, у вас есть только правила лексера: и есть ваша проблема. Вы должны иметь хотя бы одно правило синтаксического анализа. Если добавить следующее правило:

parse
  :  ID
  |  INT
  |  // ...
  ;

ошибка исчезнет при создании исходных файлов для вашего лексера / парсера.

2 голосов
/ 17 декабря 2009

Отказ от ответственности: я ничего не знаю о мастере ANTLR.

Поиск в Google выдает эту цитату:

Обычно "неожиданный конец поддерева" означает, что вы забыли сделать что-то root в парсере.

Это имеет смысл для меня, если в вашем файле должна быть грамматика, а не только правила лексического анализа. Первая строка вашего файла - это «тест грамматики», так что, вероятно, это грамматика.

Грамматика позволяет сократить серию терминальных символов до одного нетерминального символа. Так, например, очень простая грамматика, представляющая полностью заключенные в скобки выражения, будет выглядеть так:

P : E
E : (X)
  | E E
  | (E)
X : 'x'

Здесь P - корень, потому что все предложения в конечном итоге сводятся к P. Если предложение не может привести к P, оно не соответствует этой грамматике. Итак, вам нужно найти корень для вашей грамматики, а все остальные произведения должны появляться только в контексте корня (то есть путем прямого или косвенного деривации).

...