2010-04-09 2 views
1

У меня есть простая грамматика ANTLR, которую я урезал до своих основных основ, чтобы продемонстрировать эту проблему, которую я испытываю. Я использую ANTLRworks 1.3.1.ANTLR lexer не соответствует токенам

grammar sample; 

assignment : IDENT ':=' NUM ';' ; 

IDENT  : ('a'..'z')+ ; 

NUM   : ('0'..'9')+ ; 

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

Очевидно, что это утверждение принимается грамматике:

x := 99; 

Но это один и есть:

x := @!$()()%99***; 

Выход из ANTLRworks переводчика:

ANTLR Interpreter diagram http://cs.sierracollege.edu/~barry/antlr-lexer.png

Что я делаю неправильно? Даже такие примеры грамматик, которые поставляются с ANTLR (например, грамматика CMinus), демонстрируют такое поведение.

+0

Я следующее Сообщение об ошибке придумывают, запустив «х: = @! $()()% 99 ***; " на ваш пример: строка 1: 5 нет жизнеспособной альтернативы у персонажа '@' строка 1: 6 нет жизнеспособной альтернативы на символе '!' ... –

+0

Вы не получаете эти сообщения? –

ответ

2

Если вы посмотрите на консоль вашей ANTLRWorks IDE, вы увидите много ошибок lexer.

Попробуйте в командной строке:

grammar Sample; 

@members { 
    public static void main(String[] args) throws Exception { 
    ANTLRStringStream in = new ANTLRStringStream("x := @!$()()\%99***;"); 
    SampleLexer lexer = new SampleLexer(in); 
    CommonTokenStream tokens = new CommonTokenStream(lexer); 
    SampleParser parser = new SampleParser(tokens); 
    parser.assignment(); 
    } 
} 

assignment : IDENT ':=' NUM ';' ; 

IDENT  : ('a'..'z')+ ; 

NUM   : ('0'..'9')+ ; 

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

, а затем:

// generate parser/lexer 
java -cp antlr-3.2.jar org.antlr.Tool Sample.g 

// compile 
javac -cp antlr-3.2.jar *.java 

// run Windows 
java -cp .;antlr-3.2.jar SampleParser 
// or run *nix/MacOS 
java -cp .:antlr-3.2.jar SampleParser 

будет производить:

line 1:5 no viable alternative at character '@' 
line 1:6 no viable alternative at character '!' 
line 1:7 no viable alternative at character '$' 
line 1:8 no viable alternative at character '(' 
line 1:9 no viable alternative at character ')' 
line 1:10 no viable alternative at character '(' 
line 1:11 no viable alternative at character ')' 
line 1:12 no viable alternative at character '%' 
line 1:15 no viable alternative at character '*' 
line 1:16 no viable alternative at character '*' 
line 1:17 no viable alternative at character '*' 
+0

Точно! Вот о чем я говорил в комментарии! –

+0

@Wing, ANTLRWorks также показывает эти ошибки, но затем на другом экране. –

+0

@Bart, да. Спасибо за вашу информацию. Но тогда я не понимаю, почему Барри не мог видеть antlr err msgs. Использует ли он другую версию antlr? –