首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >K框架-与玩具语言的混淆

K框架-与玩具语言的混淆
EN

Stack Overflow用户
提问于 2020-03-01 19:41:15
回答 1查看 54关注 0票数 0

我正在尝试学习kframework,作为练习,我想尝试创建一种高级语言,它可以编译成视频游戏的脚本语言。这种高级语言并没有真正的执行,只是编译成具有重写规则的脚本语言。

下面是原始脚本语言语法的示例

代码语言:javascript
复制
variables {
  0: 'message'
}

init {
  SetVariable("message", "Test message");
}

rule("press button") {
  conditions {
    IsButtonPressed(EventPlayer, INTERACT_KEY);
  }
  actions {
    SendMessage(EventPlayer, GetVariable("message"))
  }
}

我希望我的高级语言允许正确的变量声明,这样我就可以编写类似这样的东西,它将编译成上面的脚本。

代码语言:javascript
复制
init {
  var message = "Test message";
}

rule("press button") {
  conditions {
    IsButtonPressed(EventPlayer, INTERACT_KEY);
  }
  actions {
    SendMessage(EventPlayer, message)
  }
}

我知道如何创建一个简单的重写规则,将变量声明var x = y替换为SetVariable("x", y),但是我如何还能添加到顶部的变量声明块中呢?

我很可能误解了K的能力,或者我应该如何做。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-03 01:35:01

通常,在K中将一个输入程序转换为另一个输出程序的方法是,在构造输出程序时让输出单元格包含它,并具有一系列规则,这些规则迭代地从输入单元格中删除语句和声明,并以您期望的任何修改形式将它们添加到输出单元格中。如果您遇到这样的情况,您希望无序地插入某些内容,通常的做法是让第二个单元格包含输出程序的一部分,处理变量声明的规则修改两个输出单元格。然后,一些规则将在稍后进行匹配,并将输出组合在一起。在这种情况下,当输入程序耗尽时,该规则可能适用。

下面是它在K中的大致样子:

代码语言:javascript
复制
rule <k> var X:Id = E:Expr => . ... </k>
     <output> init { D:Declarations => append(D, SetVariable(Id2String(X), E)) } </output>
     <variables> variables { D:Declarations => append(D, !Y:Int : Id2String(X)) } </variables>
rule <k> . </k>
     <output> P:Program => append(P2, P) </output>
     <variables> P2:Program => . </variables>

请注意,您必须自己编写list append函数。如果你真的关心性能,你可能应该使用列表排序,或者追加到cons列表的前面,然后反转它,但为了解释的目的,我简化了它。

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

https://stackoverflow.com/questions/60474703

复制
相关文章

相似问题

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