Строковые литералы ANTLR3 и запрещение вложенных комментариев
Недавно мне было поручено написать грамматику ANTLR3 для вымышленного языка. В остальном все в порядке, но у меня есть пара небольших проблем, с которыми я мог бы справиться:
1) Комментарии между '/*'
а также '*/'
и не может быть вложенным. Я знаю, как реализовать комментарии сами ('/*' .* '*/'
), но как мне запретить их вложение?
2) Строковые литералы определяются как любая последовательность символов (за исключением двойных кавычек и новых строк) между парой двойных кавычек. Они могут использоваться только в выходном операторе. Я попытался определить это так:
output : OUTPUT (STRINGLIT | IDENT) ;
STRINGLIT : '"' ~('\r' | '\n' | '"')* '"' ;
Однако по какой-то причине парсер принимает
OUTPUT "Hello,
World!"
и маркирует это как "Hello, \nWorld
, Где восклицательный знак или закрытие "
пошел я понятия не имею. Может быть, что-то делать с пробелами?
WHITESPACE : ( '\t' | ' ' | '\n' | '\r' | '\f' )+ { $channel = HIDDEN; } ;
Любой совет будет высоко ценится - спасибо за ваше время!:)
1 ответ
Форма, которую вы написали, уже запрещает вложенные комментарии. Токен остановится на первом экземпляре
*/
даже если несколько/*
последовательности появились в комментарии. Чтобы разрешить вложенные комментарии, вы должны написать правило лексера для конкретной обработки вложенности.Проблема здесь
STRINGLIT
не позволяет разбивать строку на несколько строк. Не видя остальных ваших правил лексера, я не могу сказать вам, как это будет размечено, но это ясно изSTRINGLIT
Правило, которое вы дали, что пример ввода не является допустимой строкой.
ПРИМЕЧАНИЕ. Ваши данные, приведенные в исходном вопросе, были неясны, поэтому я переформатировал их, чтобы показать точные данные, которые вы использовали. Можете ли вы убедиться, что мои правки правильно представляют ввод?