Как использовать строку одинарной кавычки и одинарную кавычку одновременно с antlr?

Я столкнулся с проблемой в antlr3, что я хочу описать строку одинарных кавычек, строку двойных кавычек и строку составных кавычек. но код не может быть скомпилирован.

SingleQuoteString
    :
    '\'' ( ~('\''|'\\') | ('\\' .) )* '\''
    ;

DoubleQuoteString
    :
    '\"' ( ~('\"'|'\\') | ('\\' .) )* '\"'
    ;

StringLiteral
    :
    (SingleQuoteString|DoubleQuoteString)+
    ;

Сообщается об ошибке, что SingleQuoteString конфликтует с StringLiteral.

Три вида строки могут использоваться в разное время.

1 ответ

Там действительно есть конфликт между DoubleQuoteString а также StringLiteralа также между SingleQuoteString а также StringLiteral - StringLiteral может соответствовать чему угодно SingleQuoteString может соответствовать (и больше).

Помните, что мы говорим о правилах лексеров, а не правилах синтаксического анализа (соглашение ANTLR гласит, что первая буква в верхнем регистре означает правило лексера). И лексер не может основывать свое решение на каком-либо контексте. Он должен испускать токен. Какой токен должен испускаться при чтении 'abc' например? Должен ли он излучать SingleQuoteString или же StringLiteral? Вход совпадает с обоими, и у лексера нет другого контекста.

Способ обойти это сделать StringLiteral правило парсера, а не правило лексера.

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