2015-12-10 2 views
1

Я пытаюсь разобрать ints, но я могу анализировать только многозначные числа, а не однозначные числа.не удалось разобрать ints с antlr

я сузил его до очень небольших лексического и синтаксического анализатора, который я на основе выборки из грамматик antlr.org следующим образом:

# IntLexerTest.g4 
lexer grammar IntLexerTest; 

DIGIT 
    : '0' .. '9' 
    ; 

INT 
    : DIGIT+ 
    ; 


#IntParserTest.g4 
parser grammar IntParserTest; 
options { 
    tokenVocab = IntLexerTest; 
} 

mything 
    : INT 
    ; 

И когда я пытаюсь разобрать цифры 3 все сам по себе, я получаю "строка 1: 0 несогласованный вход '3' ожидает INT". С другой стороны, если я попытаюсь разобрать 33, это нормально. Что я делаю не так?

+0

У меня была такая же проблема, и я не получил ее до конца. Завершено определение правил для одноразрядного INT и многозначного INT отдельно. Не может быть прав, но это все, что я мог сделать, чтобы заставить его работать. – v0rl0n

ответ

2

lexer соответствует правилам сверху донизу. Когда 2 (или более) правила соответствуют одинаковому количеству символов, первое правило, которое будет определено первым, победит. Вот почему одна цифра соответствует DIGIT и двум или более цифрам как INT.

Что вы должны сделать, это сделать DIGIT a fragment. Фрагменты используются только в других правилах лексера и никогда не станут их лексикой:

fragment DIGIT 
: '0' .. '9' 
; 

INT 
: DIGIT+ 
; 
+2

Маленькое дополнение: никогда не используйте фрагменты в правилах парсера. ANTLR позволяет это, но результат не тот, который вы ожидаете. –

Смежные вопросы