0

我正在尝试将评估堆栈实现为 KItems 列表。

我有一个将评估上下文添加到堆栈中的规则:

rule <k> X:KVar V:Val ~> E => !DOSOMETHING! </k>
     <stack> ES => E ~> ES </stack>

但是,在将空 E 添加到堆栈时遇到了一个错误。

我试图用构造函数扩展 KItem:

syntax KItem ::= "MyContext" KItem

但是,这会导致形式的规则

rule <k> !DOSOMETHING! => !V:KVar ~> E </k>
     <stack> MyContext E ~> ES => ES </stack>

模式匹配失败。

有没有像我试图做的那样实现一堆评估上下文的正确方法?

编辑:

  syntax Exp ::= Int | KVar | Exp "+" Exp [seqstrict(1,2), left]
               | "!DOSOMETHING!"
               | "(" Exp ")"       [bracket]

  syntax KResult ::= Int

  configuration 
      <T>
        <k> $PGM:Exp </k>
        <stack> .K </stack>
      </T>

  syntax KItem ::= "MyContext" KItem

  rule I1:Int + I2:Int => I1 +Int I2
  
  rule <k> X:KVar + V ~> E:KItem => !DOSOMETHING! </k>
       <stack> ES => MyContext E ~> ES </stack>
  rule <k> V + X:KVar ~> E:KItem => !DOSOMETHING! </k>
       <stack> ES => MyContext E ~> ES </stack>
  rule <k> !DOSOMETHING! => 0 ~> E </k>
       <stack> MyContext E:KItem ~> ES => ES </stack>

会立即卡在文件上:

1 + X + 3 + X + 5

如果我们删除MyContext,

  rule <k> X:KVar + V ~> E:KItem => !DOSOMETHING! </k>
       <stack> ES => E ~> ES </stack>
  rule <k> V + X:KVar ~> E:KItem => !DOSOMETHING! </k>
       <stack> ES => E ~> ES </stack>       
  rule <k> !DOSOMETHING! => 0 ~> E </k>
       <stack> E:KItem ~> ES => ES </stack>

语义卡在x + 1.

我怀疑我实际上在这里谈论的是不同的问题。但是一种模式如何正确匹配评估上下文呢?

4

1 回答 1

1

看起来您的 k 单元格包含一个 KItem,它是加法表达式,但是与 k 单元格顶部的加法相匹配的唯一规则需要存在第二个 KItem,因此如果只有一个 KItem,则不适用。您的意思是要匹配 K 类变量吗?k 单元格通常包含排序 K 的术语,它是表示 KItem 的 cons 列表的排序,其中 ~> 是连接运算符,.K 是列表单元。为方便起见,用户可以编写 K 类术语,就好像它是一个关联列表一样,只要它们实际上不匹配另一个术语之上的 K 类术语,但是您编写的规则只匹配一个列表两个要素。如果您打算让 E 匹配列表的尾部,则需要将 E 的排序更改为 K。

于 2020-06-25T20:35:10.883 回答