В Antlr Lexer, как я могу добиться разбора фишки, как это: «{»Antlr Лексер исключает определенную модель
Слова, которое содержит любое некосмическими письма, но не внутри него. Лучшее, что я могу придумать, - использовать предикат семантики.
WORD: WL+ {!getText().contains(".{")};
WL: ~[ \n\r\t];
Я немного волнуется, чтобы использовать семантику предикат, хотя причина WORD здесь будет lexed миллионов раз я думаю поставить семантику предикат ударит по производительности.
Это исходит из требования, что мне нужно, чтобы разобрать что-то вроде:
TOKEN_ONE.{TOKEN_TWO}
в то время как TOKEN_ONE может включать в себя. и {в его письме.
Я использую Antlr 4.
Я думаю, что ваш вопрос нуждается в более подробной информации. Я сделал ответ, несколько раз переработал его и удалил, потому что есть много крайних случаев, которые не были рассмотрены. Например, должен 'foo {} bar' действительно быть' СЛОВО'? Можно ли написать 'foo. {Бар} '? и т. д. – Darien
yeah foo {} bar будет словом и foo. {bar}. Причина, по которой это происходит, заключается не в том, что я хочу обозначить их как слово любого смысла, они просто будут freetext, которые могут принимать любую букву, но. {Начнет другой вид токена. Я объясню больше в главном вопросе. – Wudong
В зависимости от того, сколько изменений поведения происходит внутри разделов '. {}', Вы можете захотеть просмотреть [лексические режимы] (http://www.antlr.org/wiki/display/ANTLR4/Lexer+Rules). Таким образом, при вводе '. {' Вы можете переключиться на набор правил lexer, которые больше не распознают '}' как допустимый символ слова. (В противном случае 'foo. {Bar} baz' может быть интерпретирован как' foo', '. {', 'Bar} baz'.) – Darien