是否可以 运行 语法 nqp 中的子语法?
Is it possible to run a sub-grammar inside a grammar nqp?
如果我有 Grammar a
并定义了一个 Grammar b
,它有一个语法为 Grammar a
的块“{ ... }”,是否有可能以某种方式 link 这些文法在一起? IE。 Grammar a
是Tcl,Grammar b
是嵌入式C。从Perl6语法转Regex语法,Rakudo是怎么做到的?
语法真是类。所以你可以继承他们。或者您可以在两个语法中创建一个角色和 does
。
role A {
token foo { bar }
}
grammar B does A {
... # other stuff
}
这是否回答了您的问题?
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 grammar/role 在另一个 Raku grammar/role.
中以文本形式声明了一个或多个规则
但随后您编辑了问题以添加:
I.e. Grammar a
is Tcl and Grammar b
is embedded C.
c 和 tcl 的语法在文本上共享任何规则不太可能有意义。 :)
Or-Perhaps-This
另一个可能相关的解决方案是让一个语法中的方法调用另一个 class 中的另一个方法。这可以包括一个语法中的规则调用另一个语法中的规则。
这 可能 是你想要的 tcl grammar/parser 调用 c grammar/parser,反之亦然,或两者兼而有之:
grammar c { ... }
grammar tcl {
rule TOP { ... }
...
rule block { 'c {' <c::TOP> '}' }
...
}
grammar c {
rule TOP { ... }
...
rule block { 'tcl {' <tcl::TOP> '}' }
...
}
Or-Perhaps-That
How does Rakudo do this when switching from Perl6 grammar to Regex grammar?
上面的 Or-Perhaps-This
示例使事情变得简单。它对从 tcl 到 c 的调用进行硬编码,反之亦然,并且没有添加任何 "userland" 代码来跟踪已发生的切换。
如果有人想要怎么办:
使用上述 Or-Perhaps-This
技术可以任意组合语言相互调用;
能够替换或调整集合中的任何语法;
可以添加新的(结合replacing/modifying现有的调用新的);
在任何给定时间,在 dynamic/innermost 意义上,动态精确地跟踪哪个语法是 "in"?
此外,Raku 本身采用的方法如何,使用自己的语法结构将自己定义为 braid 种语言?
这确实是 Raku 所采用的方法,反过来,nqp 通过称为 "slangs" 的功能,"sub-languages" 的缩写。
俚语
虽然在 Rakudo 中实现的 Raku 实际上是使用俚语构建的,但它们不是官方功能。我敢肯定他们会是一天,但很可能是几年。
同时,我认为我能提供的最好的是:
A link 到 SO's matching "[raku] slang".
友情建议:在你探索编译器代码时自由地应用编译器优化标志-Ofun
,并可能在 Rakudo 上使用逗号来弄清楚发生了什么......
如果我有 Grammar a
并定义了一个 Grammar b
,它有一个语法为 Grammar a
的块“{ ... }”,是否有可能以某种方式 link 这些文法在一起? IE。 Grammar a
是Tcl,Grammar b
是嵌入式C。从Perl6语法转Regex语法,Rakudo是怎么做到的?
语法真是类。所以你可以继承他们。或者您可以在两个语法中创建一个角色和 does
。
role A {
token foo { bar }
}
grammar B does A {
... # other stuff
}
这是否回答了您的问题?
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 grammar/role 在另一个 Raku grammar/role.
中以文本形式声明了一个或多个规则但随后您编辑了问题以添加:
I.e. Grammar
a
is Tcl and Grammarb
is embedded C.
c 和 tcl 的语法在文本上共享任何规则不太可能有意义。 :)
Or-Perhaps-This
另一个可能相关的解决方案是让一个语法中的方法调用另一个 class 中的另一个方法。这可以包括一个语法中的规则调用另一个语法中的规则。
这 可能 是你想要的 tcl grammar/parser 调用 c grammar/parser,反之亦然,或两者兼而有之:
grammar c { ... }
grammar tcl {
rule TOP { ... }
...
rule block { 'c {' <c::TOP> '}' }
...
}
grammar c {
rule TOP { ... }
...
rule block { 'tcl {' <tcl::TOP> '}' }
...
}
Or-Perhaps-That
How does Rakudo do this when switching from Perl6 grammar to Regex grammar?
上面的 Or-Perhaps-This
示例使事情变得简单。它对从 tcl 到 c 的调用进行硬编码,反之亦然,并且没有添加任何 "userland" 代码来跟踪已发生的切换。
如果有人想要怎么办:
使用上述
Or-Perhaps-This
技术可以任意组合语言相互调用;能够替换或调整集合中的任何语法;
可以添加新的(结合replacing/modifying现有的调用新的);
在任何给定时间,在 dynamic/innermost 意义上,动态精确地跟踪哪个语法是 "in"?
此外,Raku 本身采用的方法如何,使用自己的语法结构将自己定义为 braid 种语言?
这确实是 Raku 所采用的方法,反过来,nqp 通过称为 "slangs" 的功能,"sub-languages" 的缩写。
俚语
虽然在 Rakudo 中实现的 Raku 实际上是使用俚语构建的,但它们不是官方功能。我敢肯定他们会是一天,但很可能是几年。
同时,我认为我能提供的最好的是:
A link 到 SO's matching "[raku] slang".
友情建议:在你探索编译器代码时自由地应用编译器优化标志
-Ofun
,并可能在 Rakudo 上使用逗号来弄清楚发生了什么......