2015-03-31 4 views
0

EDIT: Я изменил пример, чтобы лучше объяснить, что я пытаюсь получить. Это моя грамматика:Грамматика в ANTLR и выбранные слова

INTEGER : ' int '; 
LET : [a-z] ; 
cchar : LET | '-' | ' ' ; 
wor : cchar+; 
aaa : wor+ | wor* INTEGER wor* ; 

ааа является корнем. И пишите, например: «xx int xx int». Я хотел бы получить результат: 'x x int x x i n t'. Только первый int должен быть пойман, следующий не должен давать ошибку «постороннего входа», но должен быть разделен на буквы.

Как это исправить?

+0

Это вся грамматика? Или есть еще грамматика? –

+0

Я немного поменял его – Annabelle

+0

Аннабель, мне кажется, нам нужно больше деталей. Является ли aaa корневым правилом? Что вам нужно для анализа? –

ответ

0

это, кажется, работает, как вы хотели:

LET : [a-z]; 
INT : 'int '; 

cchar : LET | '-' | ' '; 
wor: cchar+; 

int_string: INT; 

aaa: (wor|int_string)+; 

Что эта грамматика говорит, что: Alow мне слово или целое объявление, где целое число является заявление, если оно «INT» с последующим пробелом определяемый как элемент лексера, все остальное - слова.

Теперь следующий не работает:

LET : [a-z]; 
INT : 'int'; 

cchar : LET | '-' | ' '; 
wor: cchar+; 

int_string: INT ' '; 

aaa: (wor|int_string)+; 

После перемещения пространства PARSER правил вместо правил LeXeR, он не разобрать «INTT», например, на самом деле любое слово, которое имеет ВНУТР подстрока. Это происходит потому, что лексерская часть, кажется, читает любое появление «int» как INT, и даже wor не анализирует «intt» как строку сейчас, она пытается сопоставить (wor int (cchar t)), и по какой-то причине она не соответствует «int» в качестве отдельных chchars ,

Правило первого примера wor правило анализирует 'intt' как (wor (cchar i) (cchar n) (cchar t) (cchar t)). Это имеет смысл. Грамматика первого примера не может соответствовать ей в фазе лексера, потому что символ пробела, необходимый для правила lexer INT, отсутствует в 'intt'.

Почему это так? Я думаю, что это потому, что lexer работает до анализатора и то, что получает парсер, уже является семантическим эквивалентом. Даже заменяя правило lexer INT с 'int' в int_string во втором примере дает такое же поведение, как я ожидаю, antlr просто генерирует скрытое правило лексера для этого соответствия. На 100% не уверены.

Скажите мне, если это помогает, если я придумал способ исправить второй случай, я сделаю правку :)

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