【发布时间】:2015-01-28 16:10:21
【问题描述】:
这个语法模块在语法上是有效的:
module mod1
syntax Empty =
;
这个也是,应该是和上一个等价的语法:
module mod2
syntax Empty =
( )
;
(生成的解析器只接受空字符串。)
这意味着你可以制作这样的语法:
module mod3
syntax EmptyOrKitchen =
( ) | "kitchen"
;
但是,以下是不允许的(嵌套括号):
module mod4
syntax Empty =
(( ))
;
我猜想多余的括号是允许的,因为它们在诸如表达式之类的东西中是允许的,例如((2)) + 2.
在处理流氓语法定义的内部表示的数据类型时出现了这个问题。以下代码将创建与上一个示例相同的模块,即mod4(以一些空格为模):
import Grammar;
import lang::rascal::format::Grammar;
str sm1 = definition2rascal(\definition("unknown_main",("the-module":\module("unknown",{},{},grammar({sort("Empty")},(sort("Empty"):prod(sort("Empty"),[
alt({seq([])})
],{})))))));
数据的有问题的部分在它自己的行上 - alt({seq([])})。如果将此代码更改为seq([]),那么您将获得与mod2 相同的语法模块。如果你进一步删除这整个表达式,即这样你得到这个:
str sm3 =
definition2rascal(\definition("unknown_main",("the-module":\module("unknown",{},{},grammar({sort("Empty")},(sort("Empty"):prod(sort("Empty"),[
], {})))))));
然后你会得到mod1。
那么definition2rascal(...) 函数应该打印出这样的多余括号吗?使生成的模块有效与否是否重要?
【问题讨论】:
标签: rascal