8

是否有可能为 raku 语法定义自定义词法分析器,即将字符串转换为 int id + 值流?我在玩语法结构。

规则看起来很直观,因为它们可能在递归下降解析器中转换为函数。但是,令牌和正则表达式我希望能够使用显式令牌 ID 和接口将它们映射到名称以便我可以编写自己的词法分析器?

4

1 回答 1

10

Raku 语法是一种无扫描解析的形式,其中词法结构和解析结构一起指定。

虽然规则确实构成了递归下降解析器,但这只是故事的一半。当使用原始正则表达式或替换(|种类,而不是||种类)时,会收集这些的声明性前缀并形成 NFA。然后使用它来确定应该探索哪些交替分支(如果有的话);如果有多个,则按照最长的优先排序,最长的文字和继承深度用作决胜局。

形成声明性前缀涉及向下查看子规则调用以查找词法元素 - 然后有效地查找标记。因此,我们可以说 Raku 语法为我们派生了分词器(实际上是许多分词器)。这些通常在编译时生成,但是,对于通过混合到语法中完成的自定义运算符之类的事情,也必须在运行时生成进一步的 NFA 以解释新的令牌。

目前没有办法挂钩语法编译并以不同的方式做事(至少,不是不玩编译器内部的)。但是,可能会在下一个主要语言版本中,Raku 程序的 AST 将提供给语言用户,因此可以编写影响不同程序结构编译的模块。

于 2020-05-04T11:38:43.643 回答