Строковые литералы ANTLR3 и запрещение вложенных комментариев

Недавно мне было поручено написать грамматику ANTLR3 для вымышленного языка. В остальном все в порядке, но у меня есть пара небольших проблем, с которыми я мог бы справиться:

1) Комментарии между '/*' а также '*/'и не может быть вложенным. Я знаю, как реализовать комментарии сами ('/*' .* '*/'), но как мне запретить их вложение?

2) Строковые литералы определяются как любая последовательность символов (за исключением двойных кавычек и новых строк) между парой двойных кавычек. Они могут использоваться только в выходном операторе. Я попытался определить это так:

output : OUTPUT (STRINGLIT | IDENT) ;
STRINGLIT : '"' ~('\r' | '\n' | '"')* '"' ;

Однако по какой-то причине парсер принимает

OUTPUT "Hello,
World!"

и маркирует это как "Hello, \nWorld, Где восклицательный знак или закрытие " пошел я понятия не имею. Может быть, что-то делать с пробелами?

WHITESPACE : ( '\t' | ' ' | '\n' | '\r' | '\f' )+ { $channel = HIDDEN; } ;

Любой совет будет высоко ценится - спасибо за ваше время!:)

1 ответ

Решение
  1. Форма, которую вы написали, уже запрещает вложенные комментарии. Токен остановится на первом экземпляре */даже если несколько /* последовательности появились в комментарии. Чтобы разрешить вложенные комментарии, вы должны написать правило лексера для конкретной обработки вложенности.

  2. Проблема здесь STRINGLIT не позволяет разбивать строку на несколько строк. Не видя остальных ваших правил лексера, я не могу сказать вам, как это будет размечено, но это ясно из STRINGLIT Правило, которое вы дали, что пример ввода не является допустимой строкой.

ПРИМЕЧАНИЕ. Ваши данные, приведенные в исходном вопросе, были неясны, поэтому я переформатировал их, чтобы показать точные данные, которые вы использовали. Можете ли вы убедиться, что мои правки правильно представляют ввод?

Другие вопросы по тегам