带有自定义词法分析器的 Raku 语法
Raku grammar with custom lexer
是否有可能为 raku 语法定义自定义词法分析器,即
将字符串转换为 int id + value 的流?
我在玩弄语法结构。
规则好像
直观,因为它们可能在递归下降中转换为函数
解析器。但是,我希望能够使用显式令牌 ID 和将这些映射到名称的接口来分解令牌和正则表达式,以便我可以编写自己的词法分析器?
Raku 文法是 scannerless parsing 的一种形式,其中词法结构和解析结构一起指定。
虽然规则确实构成了递归下降解析器,但这只是故事的一半。当使用 protoregexes 或交替(|
类型,而不是 ||
类型)时,收集这些的声明性前缀并形成 NFA。然后,它用于确定应该探索哪个交替分支(如果有的话);如果有多个,则按照最长在前的顺序,以最长字面量和继承深度作为决胜局。
形成声明性前缀涉及向下查看子规则调用以查找词法元素 - 然后有效地找到标记。因此,我们可以说 Raku 文法为我们派生了分词器(实际上是许多分词器)。这些通常通常在编译时生成,但是,对于自定义运算符之类的东西,它们是通过混合到语法中完成的,为了解释新标记,还必须在运行时生成更多的 NFA。
目前没有办法挂钩到语法编译中并以不同的方式做事(至少,在不使用编译器内部机制的情况下)。然而,在下一个主要语言版本中,Raku 程序的 AST 可能会提供给语言用户,因此可以编写影响不同程序结构编译的模块。
是否有可能为 raku 语法定义自定义词法分析器,即 将字符串转换为 int id + value 的流? 我在玩弄语法结构。
规则好像 直观,因为它们可能在递归下降中转换为函数 解析器。但是,我希望能够使用显式令牌 ID 和将这些映射到名称的接口来分解令牌和正则表达式,以便我可以编写自己的词法分析器?
Raku 文法是 scannerless parsing 的一种形式,其中词法结构和解析结构一起指定。
虽然规则确实构成了递归下降解析器,但这只是故事的一半。当使用 protoregexes 或交替(|
类型,而不是 ||
类型)时,收集这些的声明性前缀并形成 NFA。然后,它用于确定应该探索哪个交替分支(如果有的话);如果有多个,则按照最长在前的顺序,以最长字面量和继承深度作为决胜局。
形成声明性前缀涉及向下查看子规则调用以查找词法元素 - 然后有效地找到标记。因此,我们可以说 Raku 文法为我们派生了分词器(实际上是许多分词器)。这些通常通常在编译时生成,但是,对于自定义运算符之类的东西,它们是通过混合到语法中完成的,为了解释新标记,还必须在运行时生成更多的 NFA。
目前没有办法挂钩到语法编译中并以不同的方式做事(至少,在不使用编译器内部机制的情况下)。然而,在下一个主要语言版本中,Raku 程序的 AST 可能会提供给语言用户,因此可以编写影响不同程序结构编译的模块。