如果我有Grammar a并定义了一个具有Grammar a语法的块“{.}”的Grammar b,那么是否有可能将这些语法链接到一起呢?也就是说,Grammar a是Tcl,Grammar b是嵌入式C。当Rakudo从Perl6语法切换到Regex语法时,是如何做到这一点的?
发布于 2020-05-11 12:23:53
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
另一个可能相关的解决方案是在语法中调用其他类中的另一个方法。这可以包括一种语法中的规则,在另一种语法中调用规则。
这可能是tcl语法/解析器调用c语法/解析器所需要的,反之亦然,或者两者兼而有之:
grammar c { ... }
grammar tcl {
rule TOP { ... }
...
rule block { 'c {' <c::TOP> '}' }
...
}
grammar c {
rule TOP { ... }
...
rule block { 'tcl {' <tcl::TOP> '}' }
...
}Or-Perhaps-That
当Rakudo从Perl6语法切换到Regex语法时,Rakudo是如何做到这一点的?
上面的Or-Perhaps-This示例使事情变得简单。它对从tcl到c的调用进行了硬编码,反之亦然,并且没有添加任何跟踪交换机发生的"userland“代码。
如果有人想:
Or-Perhaps-This技术调用的任意语言集合;另外,对于Raku本身所采用的方法,使用自己的语法构造将自己定义为语言的辫子,这又如何呢?
这确实是Raku所采用的方法,而nqp则是通过一个名为"slangs“的特性,即”slangs“的缩写。
俚语
虽然在Rakudo中实现的Raku实际上是使用俚语构建的,但它们不是官方特性。我相信他们会有一天,但这很容易是几年。
在此期间,我认为我能提供的最好办法是:
-Ofun,因为你可以拼写编译器的代码,也许可以在Rakudo上使用逗号来找出发生了什么.发布于 2020-05-11 12:04:38
语法真的是一门课。这样你就可以继承他们的遗产了。或者,您可以在两个语法中创建一个角色和does。
role A {
token foo { bar }
}
grammar B does A {
... # other stuff
}这能回答你的问题吗?
https://stackoverflow.com/questions/61726883
复制相似问题