2016-09-02 3 views
1

Я новичок в ANTLR, поэтому, надеюсь, вы, парень, объясняете мне явно.ANTLR4 String и комментарии Lexer

У меня есть/* комментарий */(BC) лексер в ANTLR, я хочу, чтобы это было так:

/* sample */ => BC 
/* s 
a 
m 
p 
l 
e */ => BC 
"" => STRING 
" " => STRING 
"a" => STRING 
"hello world \1" => STRING 

, но я получил это:

/* sample */ 
/* s 
a 
m 
p 
l 
e */ => BC 
"" 
" " 
"a" 
"hello world \1" => STRING 

это займет только 1st/* и последний * /, то же самое с моим токеном String. Вот код Комментариев:

BC: '/*'.*'*/'; 

И Строка:

STRING: '"'(~('"')|(' '|'\b'|'\f'|'r'|'\n'|'\t'|'\"'|'\\'))*'"'; 

ответ

3

правило LeXeR является жадным по умолчанию, то есть они пытаются потреблять самую длинную последовательность согласования. Поэтому они останавливаются на последнем закрывающем ограничителе.

Чтобы сделать правило nongreedy, использовать, ну, nongreedy правила:

BC: '/*' .*? '*/'; 

Это остановится на первого закрытия */ это именно то, что вам нужно.

То же самое относится к вашей STRING. Читайте об этом в Категорическая ANTLR4 Ссылка, страница 285.

+0

Благодарим Вас за решение для комментариев , Но в String, если я использую '?', Тогда все было нормально, пока я не проверил этот тестовый файл: «Он спросил меня:« Где Джон? »« ». Он вернет фразу '' Он спросил меня: \ "=> STRING'. Но я хочу получить все предложение. Это мой Лексер: 'STRING: '' '(~ (' '') | ('' | '\ b' | '\ f' | 'r' | '\ n' | '\ t' | '\" '|' \\ ')) *?' "';' Я думаю, что я включил \ "как законное содержимое в STRING, но это не работает. – Alex

+0

Это мое требование к String из присваивания: Строковые литералы состоят из нуля или более символов, заключенных двойными кавычками ("). Используйте escape-последовательности (см. Ниже) для представления специальных символов в строке. Это ошибка времени компиляции для новой строки или символа EOF для отображения внутри строкового литерала. Все поддерживаемые escape-последовательности следующие: \ b \ f \ r \ n \ t \ "\\ – Alex

1

Также вы можете использовать следующий фрагмент кода без нежадным синтаксиса (более общий soultion):

MultilineCommentStart:  '/*' -> more, mode(COMMENTS); 

mode COMMENTS; 

MultilineComment:    '*/' -> mode(DEFAULT_MODE); 
MultilineCommentNotAsterisk: ~'*'+ -> more; 
MultilineCommentAsterisk:  '*' -> more; 
Смежные вопросы