首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能在语法nqp中运行子语法?

是否有可能在语法nqp中运行子语法?
EN

Stack Overflow用户
提问于 2020-05-11 09:54:00
回答 2查看 101关注 0票数 6

如果我有Grammar a并定义了一个具有Grammar a语法的块“{.}”的Grammar b,那么是否有可能将这些语法链接到一起呢?也就是说,Grammar a是Tcl,Grammar b是嵌入式C。当Rakudo从Perl6语法切换到Regex语法时,是如何做到这一点的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-11 12:23:53

代码语言:javascript
复制
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语法/解析器所需要的,反之亦然,或者两者兼而有之:

代码语言:javascript
复制
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技术调用的任意语言集合;
  • 能够替换或修改集合中的任何语法;
  • 能够添加一个新的(同时替换/修改一个现有的,以调用新的);
  • 在任何给定的时间里,动态地精确地跟踪哪一个语法是" in“的?

另外,对于Raku本身所采用的方法,使用自己的语法构造将自己定义为语言的辫子,这又如何呢?

这确实是Raku所采用的方法,而nqp则是通过一个名为"slangs“的特性,即”slangs“的缩写。

俚语

虽然在Rakudo中实现的Raku实际上是使用俚语构建的,但它们不是官方特性。我相信他们会有一天,但这很容易是几年。

在此期间,我认为我能提供的最好办法是:

票数 5
EN

Stack Overflow用户

发布于 2020-05-11 12:04:38

语法真的是一门课。这样你就可以继承他们的遗产了。或者,您可以在两个语法中创建一个角色和does

代码语言:javascript
复制
role A {
   token foo { bar }
}
grammar B does A {
    ...  # other stuff
}

这能回答你的问题吗?

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61726883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档