Грамматики Raku - это форма бессанерного синтаксического анализа, где лексическая структура и структура синтаксического анализа указываются вместе.
Хотя это правда, что правила формируют синтаксический анализатор с рекурсивным спуском, это только половина дела. Когда protoregexes или их альтернативы (тип |
, а не ||
), их декларативные префиксы собираются и формируется NFA. Затем он используется, чтобы определить, какую из ветвей чередования следует исследовать, если таковые имеются; если их несколько, они ранжируются в соответствии с самым длинным первым, причем самый длинный литерал и глубина наследования используются в качестве разрешения конфликтов.
Формирование декларативного префикса включает просмотр вызовов субправил в поисках лексических элементов, а именно токенов. Таким образом, мы могли бы сказать, что грамматики Raku производят токенизаторы (на самом деле многие токенизаторы) для нас. Как правило, они генерируются во время компиляции, однако для таких вещей, как пользовательские операторы, которые выполняются путем подмешивания в грамматику, во время выполнения также должны быть созданы дополнительные NFA, чтобы учесть новые токены.
В настоящее время нет возможности подключиться к компиляции грамматики и сделать что-то по-другому (по крайней мере, не без игры с внутренними компонентами компилятора). Однако, вероятно, будет в следующем выпуске основного языка, где AST программы Raku будет доступен пользователю языка, и, таким образом, будет возможно писать модули, которые влияют на компиляцию различных программных конструкций.
person
Jonathan Worthington
schedule
04.05.2020
token
regex
иrule
почти идентичны.token
- это простоregex
, у которого нет возврата.rule
- это простоtoken
, у которого включена функция:sigspace
. Обратите внимание, что все они рассматриваются в Raku как функции с другим базовым синтаксисом и семантикой. - person Brad Gilbert   schedule 07.05.2020