это, кажется, работает, как вы хотели:
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% не уверены.
Скажите мне, если это помогает, если я придумал способ исправить второй случай, я сделаю правку :)
Это вся грамматика? Или есть еще грамматика? –
Я немного поменял его – Annabelle
Аннабель, мне кажется, нам нужно больше деталей. Является ли aaa корневым правилом? Что вам нужно для анализа? –