我有一个形式的规则
rule <k> (try S1 catch(Param) S2 => S1 ~> foo) ~> K </k>
<stack> .List => ListItem((bar)) ... </stack>
wherestack
是我的配置中的列表类型单元格,它是k
单元格的兄弟,并且foo
是一个函数。
当我的程序卡住时,k
单元格输出<k> try { baz } catch(p) { buz } </k>
和stack
单元格<stack> .List </stack>
. 在我看来,这两者确实匹配,并且应该应用规则中定义的替换,但是krun
卡在这里。输出的配置、语法和类型似乎匹配,所以我想知道是否还有其他原因导致不应用替换。
对于上下文,这是simple-typed-static
对教程中语言的修改;为了清楚起见,我删除了部分规则和输出,尽管它们也都匹配。我正在使用 java 后端编译它。
编辑:我在下面添加了语法声明
syntax Stmt ::= "try" Block "catch" "(" Param ")" Block
syntax Block ::= "{" Stmts "}"
syntax Param ::= Type Id
除了标准k
单元和其他一些(我认为)不相关的单元之外,配置还有,
<stack multiplicity="?"> .List </stack>
和foo
具有以下形式的函数
syntax KItem ::= "foo"
rule <k> foo => . ... </k>
<stack> ListItem(_) => .List ... </stack>