Повторение сопоставления с образцом в antlr4 - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь написать правило лексера, которое будет соответствовать следующим строкам aa aaa bbbb

требование здесь - все символы должны быть одинаковыми

Я пытался использовать это правило: REPEAT_CHARS: ([az]) (\ 1) *

Но \ 1 недопустимо в antlr4. Можно ли придумать образец для этого?

1 Ответ

1 голос
/ 16 апреля 2020

Вы не можете сделать это в лексере ANTLR. По крайней мере, не без указания целевого кода c внутри вашей грамматики. А помещать код в свою грамматику - это то, что вы не должны делать (это затрудняет чтение, и грамматика привязана к этому языку). Лучше проводить такие проверки / валидации внутри слушателя или посетителя.

Такие вещи, как обратные ссылки и осмотры, являются функциями, которые хранятся в regex-движках языков программирования. Синтаксис регулярного выражения, доступный в ANTLR (и всех известных мне генераторах синтаксических анализаторов), не поддерживает эти функции, но является истинным регулярными языками .

Многие функции встречаются практически во всех современных библиотеки регулярных выражений обеспечивают выразительную силу, которая намного превосходит обычные языки. Например, многие реализации позволяют группировать подвыражения с круглыми скобками и вызывать соответствующие им значения в одном выражении (обратные ссылки). Это означает, что, помимо прочего, шаблон может соответствовать цепочкам повторяющихся слов, таких как «папа» или «WikiWiki», которые в теории формального языка называются квадратами.

- https://en.wikipedia.org/wiki/Regular_expression#Patterns_for_non -regular_languages ​​

...