是否可以 运行 语法 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 实际上是使用俚语构建的,但它们不是官方功能。我敢肯定他们会是一天,但很可能是几年。

同时,我认为我能提供的最好的是: