如果我有Grammar a
并定义了一个Grammar b
具有语法的块'{ ... }',Grammar a
是否有可能以某种方式将这些语法链接在一起?即Grammar a
是Tcl,Grammar b
是嵌入式C。从Perl6 语法切换到Regex 语法时,Rakudo 是如何做到这一点的?
2 回答
use Liz's-Answer;
answer Mine { ... }
say ?Mine if prompt 'Does that answer your question?' eq 'n' ;
answer Mine is B does Or-Perhaps-This does Or-Perhaps-That { }
role Or-Perhaps-This {
token baz { <Liz's-Answer::B::foo> }
}
role Or-Perhaps-That {
https://repl.it/@RalphMellor/Simple-slang
}
Liz's-Answer
Liz 的最初回答明智地从一开始就开始了:声明一个 Raku 语法/角色在另一个 Raku 语法/角色中以文本形式声明了一个或多个规则。
但随后您编辑了您的问题以添加:
即语法
a
是Tcl,语法b
是嵌入式C。
c 和 tcl 的语法在文本上共享任何规则是不太可能的。:)
Or-Perhaps-This
另一个可能相关的解决方案是让语法中的方法调用其他类中的另一个方法。这可以包括一个语法中的规则调用另一个语法中的规则。
对于调用 ac 语法/解析器的 tcl 语法/解析器,这可能是您想要的,反之亦然,或两者兼而有之:
grammar c { ... }
grammar tcl {
rule TOP { ... }
...
rule block { 'c {' <c::TOP> '}' }
...
}
grammar c {
rule TOP { ... }
...
rule block { 'tcl {' <tcl::TOP> '}' }
...
}
Or-Perhaps-That
从 Perl6 语法切换到 Regex 语法时,Rakudo 是如何做到这一点的?
上面的Or-Perhaps-This
例子让事情变得简单。它将从 tcl 到 c 的调用硬编码,反之亦然,并且没有添加任何跟踪切换发生的“用户空间”代码。
如果一个人想要:
Or-Perhaps-This
使用上述技术相互调用任意语言集合;能够替换或调整集合中的任何语法;
能够添加新的(结合替换/修改现有的以调用新的);
在任何给定时间动态/最内在的意义上动态地精确跟踪一个语法是“在”什么?
另外,对于 Raku 本身采用的方法,使用它自己的语法结构将自己定义为语言的辫子,那又如何呢?
这确实是 Raku 和 nqp 采用的方法,通过一个称为“slangs”的功能,即“子语言”的缩写。
俚语
虽然在 Rakudo 中实现的 Raku 实际上是使用俚语构建的,但它们并不是官方功能。我相信他们会是一天,但很可能是几年。
与此同时,我认为我能提供的最好的是:
指向SO 匹配的 "[raku] slang"的链接。
友好的建议:
-Ofun
当你探索编译器的代码时,自由地应用编译器优化标志,也许在 Rakudo 上使用逗号来弄清楚发生了什么......
语法真的是类。所以你可以从他们那里继承。does
或者您可以在两个语法中创建一个角色和那个。
role A {
token foo { bar }
}
grammar B does A {
... # other stuff
}
这是否回答你的问题?