是否可以在语法 nqp 中运行子语法?

Kon*_*ele 6 regex raku nqp

如果我有Grammar a并定义了Grammar b一个块 '{ ... }' 的语法为Grammar a,是否有可能以某种方式将这些语法链接在一起?即Grammar a是Tcl,Grammar b嵌入C。从Perl6 语法切换到Regex 语法时,乐堂是如何做到这一点的?

Eli*_*sen 5

语法实际上是课程。所以你可以继承他们。或者您可以在两个语法中创建一个角色does

role A {
   token foo { bar }
}
grammar B does A {
    ...  # other stuff
}
Run Code Online (Sandbox Code Playgroud)

这是否回答你的问题?


rai*_*iph 5

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
}
Run Code Online (Sandbox Code Playgroud)

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> '}' }
    ...
}
Run Code Online (Sandbox Code Playgroud)

Or-Perhaps-That

当从 Perl6 语法切换到 Regex 语法时,Rakudo 如何做到这一点?

上面的Or-Perhaps-This例子让事情变得简单。它硬编码了从 tcl 到 c 的调用,反之亦然,并且没有添加任何跟踪发生切换的“用户空间”代码。

如果有人想:

  • 使用上述Or-Perhaps-This技术相互调用的任意语言集合;

  • 能够替换或调整集合中的任何语法;

  • 能够添加一个新的(结合替换/修改现有的来调用新的);

  • 在任何给定时间动态/最内层地动态准确地跟踪“in”哪个语法?

此外,那是 Raku 本身采用的方法,使用自己的语法结构将自己定义为语言的辫子

这确实是 Raku 所采用的方法,反过来,nqp 通过称为“俚语”的功能(“子语言”的缩写)采用了这种方法。

俚语

虽然 Rakudo 中实现的 Raku 实际上是使用俚语构建的,但它们不是官方功能。我相信他们会有那么一天,但很容易就过了几年。

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