此语法模块在语法上有效:
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(...)
函数打印的冗余括号应该是什么?关于使得结果模块有效是否重要?
答案 0 :(得分:1)
为什么他们不被允许基本上我们想看看我们能否做到。目前在符号种类之间没有优先级关系,因此通常不需要括号语法(就像你需要在表达式中使用+和*)。
括号已经有两种不同的语义,一个()
是 epsilon 符号,两个(Sym1 Sym2 ...)
是嵌套序列。该嵌套序列被定义(语法上)以期望至少两个符号。现在我们可以毫不含糊地为一个符号引入括号的第三个语义或放宽对序列的要求......但是我们认为在一种情况下你会在得到的解析树(序列)中得到一个额外的层会让人感到困惑。 ,而在另一种情况下,你不会(忽略多余的括号)。
更详细的说,打印seq([])
的问题并不是元语法的问题,而是支持抽象符号比具体符号更宽松(即它是更大的语言或者结束语-近似)。解析器生成器将为seq([])
生成一个有效的解析器。但是,对于空序列没有Rascal表示法,我猜漂亮的打印机应该抛出异常。