0

在修改教程中的玩具语言 SIMPLE 时,我认为有一个仅打印当前配置的语句会很有帮助,这样我就可以在程序运行时看到程序的内部状态。为此,我添加了Stmt一个printConfig命令。在语义上,我想我所要做的就是将其重写为调用单元格print的主体,T所以我添加了

rule <k> printConfig; => print(cfg); </k>
     <T> cfg </T>

编译器抛出一个错误,指出有一个意外的结束括号,特别是print(cfg). 我之前遇到过类似的问题,在这种情况下,错误原来是由于我输入的两个语句的组件造成的。我想知道是否有办法将T单元格中的值“转换”为 anExp以便我可以打印它。

如果有更好的方法可以调试不涉及此的语义,我也对此非常开放。谢谢!

4

1 回答 1

0

好吧,我可以看到的一个问题是,您的规则中有<k><T>单元格彼此相邻,但在初始配置中它们没有兄弟关系。

SIMPLE 配置如下所示,其中<k>单元格是单元格的孙子<T>

  configuration <T color="red">
                  <threads color="orange">
                    <thread multiplicity="*" color="yellow">
                      <k color="green"> $PGM:Stmts ~> execute </k>
                      <control color="cyan">
                        <fstack color="blue"> .List </fstack>
                        <xstack color="purple"> .List </xstack>
                      </control>
                      <env color="violet"> .Map </env>
                      <holds color="black"> .Map </holds>
                      <id color="pink"> 0 </id>
                    </thread>
                  </threads>
                  <genv color="pink"> .Map </genv>
                  <store color="white"> .Map </store>
                  <busy color="cyan"> .Set </busy>
                  <terminated color="red"> .Set </terminated>
                  <input color="magenta" stream="stdin"> .List </input>
                  <output color="brown" stream="stdout"> .List </output>
                  <nextLoc color="gray"> 0 </nextLoc>
                </T>

所以如果你想写你的规则,你至少必须这样做:

syntax Stmt ::= "printConfig" ";"
rule <T> ... <k> printConfig; => print(CFG); ... </k> ... </T> #as CFG

请注意,我在这里做了三处更改,(1)我对变量 CFG 使用了大写字母(在 K 中是常规的),(2)我在单元格...的末尾添加了程序结束,以及 (3) 我使用模式同时匹配超项和子项,为超项命名。<k>printConfig;_#as_<T> ... </T><k> ... </k>CFG

_#as_模式记录在Pending Documentation中。

希望有帮助!

于 2020-03-22T10:00:02.450 回答