我正在尝试将评估堆栈实现为 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
.
我怀疑我实际上在这里谈论的是不同的问题。但是一种模式如何正确匹配评估上下文呢?