Практическое использование инклюзивных условий запуска в генераторе сканера - PullRequest
0 голосов
/ 05 апреля 2019

Какие существуют проблемы лексического сканирования в реальном мире (не выдуманные), в которых «инклюзивные условия сканирования» (в отличие от «эксклюзивных») являются лучшим решением?

То есть, когда %s FOO лучше, чем %x FOO в определении (f) lex?

Я понимаю разницу в функциях, а также как реализовать разницу в генераторе сканера. Я просто пытаюсь понять, в каких ситуациях вы могли бы на законных основаниях объединить различные группы правил сканирования в одно условие сканирования.

Полное раскрытие: ответы вдохновят пример кода для этого проекта .

1 Ответ

1 голос
/ 05 апреля 2019

Лексические правила "смешивания" довольно распространены.Рассмотрим обработку обратной косой черты, которую вы можете сделать более или менее одинаково в различных синтаксисах цитирования и даже в литералах регулярных выражений.Но они, вероятно, будут объединены явно.

В качестве лишь немного надуманного примера использования неявной комбинации с состоянием INITIAL рассмотрим лексический анализ языка, подобного Python, с контекстно-значимым начальным пробелом.Здесь есть два почти идентичных лексических контекста: нормальный контекст, в котором символ новой строки является синтаксическим маркером, а начальные пробелы должны быть превращены в последовательности INDENT / DEDENT, и контекст в скобках, в котором символы новой строки и начальные пробелы являются простопробелы, которые не передаются парсеру.Эти контексты будут отличаться только парой паттернов;Подавляющее большинство правил будут распространены.Поэтому наличие включающего состояния, которое содержит только что-то вроде:

<IN_PAREN>[[:space:]]+  /* Ignore all whitespace */

, может быть простым решением.Конечно, это правило должно быть помещено перед обычной обработкой пробелов, чтобы оно переопределялось, когда IN_PAREN активно.

...