Как использовать строку одинарной кавычки и одинарную кавычку одновременно с antlr?
Я столкнулся с проблемой в antlr3, что я хочу описать строку одинарных кавычек, строку двойных кавычек и строку составных кавычек. но код не может быть скомпилирован.
SingleQuoteString
:
'\'' ( ~('\''|'\\') | ('\\' .) )* '\''
;
DoubleQuoteString
:
'\"' ( ~('\"'|'\\') | ('\\' .) )* '\"'
;
StringLiteral
:
(SingleQuoteString|DoubleQuoteString)+
;
Сообщается об ошибке, что SingleQuoteString конфликтует с StringLiteral.
Три вида строки могут использоваться в разное время.
1 ответ
Там действительно есть конфликт между DoubleQuoteString
а также StringLiteral
а также между SingleQuoteString
а также StringLiteral
- StringLiteral
может соответствовать чему угодно SingleQuoteString
может соответствовать (и больше).
Помните, что мы говорим о правилах лексеров, а не правилах синтаксического анализа (соглашение ANTLR гласит, что первая буква в верхнем регистре означает правило лексера). И лексер не может основывать свое решение на каком-либо контексте. Он должен испускать токен. Какой токен должен испускаться при чтении 'abc'
например? Должен ли он излучать SingleQuoteString
или же StringLiteral
? Вход совпадает с обоими, и у лексера нет другого контекста.
Способ обойти это сделать StringLiteral
правило парсера, а не правило лексера.