当前位置: 首页 > 知识库问答 >
问题:

Raku语法与自定义lexer

罗华翰
2023-03-14

是否有可能为raku语法定义一个自定义lexer,即将字符串转换为int-id值流的lexer?我在玩弄语法结构。

规则看起来很直观,因为它们可能在递归下降解析器中转换为函数。然而,令牌和正则表达式我希望能够通过显式令牌ID和一个接口将它们映射到一个名称,这样我就可以编写自己的lexer了?

共有1个答案

百里芷阳
2023-03-14

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

虽然规则确实形成了递归下降解析器,但这只是故事的一半。当使用protoregex或alternation(种类而不是|种类)时,将收集它们的声明性前缀并形成NFA。然后使用它来确定应该探索哪些交替分支(如果有的话);如果有多个,则根据最长优先顺序对它们进行排序,最长文字和继承深度用作平分符。

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

目前还没有办法连接到语法编译中并以不同的方式进行操作(至少在不使用编译器内部构件的情况下是这样)。然而,在下一个主要的语言版本中,可能会有Raku程序的AST可供语言用户使用,因此可以编写影响不同程序结构编译的模块。

 类似资料:
  • 简介 本章中,我会讲解如何自定义语法。用户定义语法称作宏(Macro)。Lisp/Scheme中的宏比C语言中的宏更加强大。宏可以使你的程序优美而紧凑。 宏是代码的变换。代码在被求值或编译前进行变换,程序会继续执行就像变换后的代码一开始就写好了一样。 你可以在Scheme中通过用符合R5RS规范的syntax-rules轻易地定义简单宏,相比之下,在Common Lisp中自定义语法就复杂多了。使

  • 我已经创建了一个包含多个分类法的自定义查询,在此基础上,我使用进行分页。分类法是通过下拉选择表单来选择的,使用可以过滤帖子,这只是一个临时解决方案,但目前效果良好,值得注意。 分页工作正常,当选择分类术语时,帖子可以正确显示,但是当我离开第一页,比如说我进入第2页,在下拉选择器中选择不同的分类术语时,URL会保留当前页码,并向其中添加选择器ID。我想实现的是,当我在选择器中单击不同的分类法时,新选

  • 问题内容: 我正在尝试在Java GUI上实现JTable,该JTable可以使用文件中的值填充自身,并允许用户对各种单元格进行修改。由于我在Netbeans IDE中使用GUI编辑器,因此我的第一个直觉是将JTable从面板添加到表单中。但是,我很快意识到我不能在表中添加超过100行(对于我的应用程序,我需要大约500行以上)。另外,在寻找解决方案时,我注意到很多人说使用Custom Table

  • 包是Go语言中代码组成和代码编译的主要方式。关于包的基本信息我们已经在前面介绍过了,本节我们主要来介绍一下如何自定义一个包并使用它。 到目前为止,我们所使用的例子都是以一个包的形式存在的,比如 main 包。在Go语言里,允许我们将同一个包的代码分隔成多个独立的源码文件来单独保存,只需要将这些文件放在同一个目录下即可。 我们创建的自定义的包需要将其放在 GOPATH 的 src 目录下(也可以是

  • 有没有办法将自定义语言语法高亮添加到JetBrains IDE? 在我的例子中,我想突出显示PyCharm中的MATLAB代码。IDE建议我使用“Mathematica”插件,但它不能正常工作。

  • 我使用FreshMvvm在Windows上开发和运行MAUI项目。 但我的ListView和自定义模板存在一些绑定问题。 以下是我的代码: 型号: 视图模型: 我创建了一个列表,并使用api服务来获取名称模型列表数据。如果api服务获得数据,将被更新。 是将在Listview上绑定的属性。物品来源 主页。xmal: 自定义ViewCell(.xml): 自定义ViewCell(.cs) 我定义了一