如何用K框架转换下面的EBNF规则?
元素可用于表示前一个元素中的零或多个:
items ::= {"," item}*
目前,我正在使用来自域模块的列表。但是内联List
声明是不允许的,如下所示:
syntax Foo ::= Stmt List{Id, ""}
现在,我必须为列出的项创建一个新的语法规则来解决这个问题:
syntax Ids ::= List{Id, ""}
syntax Foo ::= Stmt Ids
还有其他方法来对抗这种新规则的产生吗?
一个元素可以出现零或一次。换句话说,它可以是可选的:
array-decl ::= <variable> "[" {Int}? "]"
我们想接受的地方:a[4]
和a[]
。现在,为了绕过这个规则,我创建了两个规则,其中一个分支拥有项,而另一个分支没有。但在我看来,这个解决方案以一种不必要的方式重复了规则。
元素可以显示一个或多个先前的元素:
e ::= {a-z}+
我们不接受任何大小写字母的非零长度序列。现在,我没有找到一个方法来模拟这个。
提前谢谢你!
发布于 2021-05-31 03:25:54
内联零或更多的结果在K-框架中受到限制,因为后端不支持带有可变参数的术语。
因此,我们要求将每个列表声明为一个单独的产品,这将产生一个反对列表。典型的功能样式匹配可以用来处理AST。
典型的EBNF扩展如下所示:
{Id ","}*
- syntax Ids ::= List{Id, ","}
{Id ","}+
- syntax Ids ::= NeList{Id, ","}
Id?
- syntax OptionalId ::= "" [klabel(none)] | Id [klabel(some)]
可选(?
)产品也有同样的问题。因此,我们要求用户指定可由规则引用的标签。请注意,语义模块中不允许出现空的生成,因为它可能会干扰规则中的具体语法的解析。因此,您需要创建一个具有大多数语法的公共模块,以及一个具有可能干扰规则解析的结果的*-SYNTAX
模块(可能与K变量冲突的空生成和标记)。
发布于 2021-05-31 03:20:31
https://stackoverflow.com/questions/67769733
复制相似问题