Грамматика Raku с настраиваемым лексером

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

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


person Konrad Eisele    schedule 04.05.2020    source источник
comment
token regex и rule почти идентичны. token - это просто regex, у которого нет возврата. rule - это просто token, у которого включена функция :sigspace. Обратите внимание, что все они рассматриваются в Raku как функции с другим базовым синтаксисом и семантикой.   -  person Brad Gilbert    schedule 07.05.2020


Ответы (1)


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

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

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

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

person Jonathan Worthington    schedule 04.05.2020