Raku грамматика с пользовательским лексером - PullRequest
7 голосов
/ 04 мая 2020

Есть ли возможность определить пользовательский лексер для грамматики raku, т.е. тот, который преобразует строку в поток int id + value? Я играл с грамматической конструкцией.

Правила кажутся интуитивно понятными, так как они, вероятно, преобразуются в функции в анализаторе спуска ie. Тем не менее, токены и регулярные выражения, которые я ожидал бы получить с помощью явных идентификаторов токенов и интерфейса для сопоставления их с именем, чтобы я мог написать свой собственный лексер?

1 Ответ

8 голосов
/ 04 мая 2020

Грамматики Raku являются формой синтаксического анализа без сканера , где лексическая структура и структура синтаксического анализа задаются вместе.

Хотя верно, что правила образуют синтаксический анализатор с рекурсивным спуском, это только половина история. Когда используются проторегекс или чередования (тип |, а не ||), их декларативные префиксы собираются и формируется NFA. Затем он используется для определения того, какую из ветвей чередования следует изучить, если таковые имеются; если их несколько, они ранжируются в соответствии с самым длинным первым, с самым длинным литералом и глубиной наследования, используемыми как на ie -breaker.

Формирование декларативного префикса включает в себя поиск вниз через вызовы подправил, чтобы найти лексические элементы - эффективно, тогда токены. Таким образом, мы можем сказать, что грамматики Раку выводят токенизатор (на самом деле многие токенизаторы) для нас. Как правило, они обычно генерируются во время компиляции, однако для таких вещей, как пользовательские операторы, которые выполняются путем смешивания с грамматикой, дополнительные NFA придется создавать также во время выполнения, чтобы учесть новые токены.

В настоящее время нет способа подключиться к грамматической компиляции и сделать что-то по-другому (по крайней мере, не без игры с внутренностями компилятора). Однако, вероятно, будет в следующем основном языковом выпуске, где AST программы Raku будет доступен для пользователя языка, и, таким образом, станет возможным писать модули, которые влияют на компиляцию различных программных конструкций.

...