为什么语法定义中不允许使用多余的括号?
Why are redundant parenthesis not allowed in syntax definitions?
这个语法模块在语法上是有效的:
module mod1
syntax Empty =
;
这个也是,应该和上一个是等价的语法:
module mod2
syntax Empty =
( )
;
(生成的解析器只接受空字符串。)
这意味着你可以创建这样的语法:
module mod3
syntax EmptyOrKitchen =
( ) | "kitchen"
;
但是,以下是不允许的(嵌套括号):
module mod4
syntax Empty =
(( ))
;
我猜想多余的括号是允许的,因为它们可以出现在表达式中,例如((2)) + 2
.
这个问题是在处理 rascal 语法定义的内部表示的数据类型时出现的。下面的代码将创建与上一个示例相同的模块,即 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(...)
函数应该打印出这样多余的括号吗?生成的模块是否有效是否重要?
为什么不允许他们基本上是我们想看看我们是否可以没有。目前符号种类之间没有优先级关系,因此通常不需要括号语法(就像表达式中需要 + 和 * 一样)。
括号已经有两种不同的语义,一种 ()
是 epsilon 符号,两种 (Sym1 Sym2 ...)
是嵌套序列。这个嵌套序列被定义(在句法上)期望至少有两个符号。现在我们可以毫不含糊地为带有单个符号的括号引入第三种语义,或者放宽对序列的要求......但我们认为这会让人感到困惑,在一种情况下你会在生成的解析树(序列)中得到一个额外的层,而在另一种情况下你不会(忽略多余的括号)。
更详细地说,打印 seq([])
的问题与其说是元语法的问题,不如说是支持抽象符号比具体符号更宽松(即它是一种更大的语言或过近似)。解析器生成器将为 seq([])
生成一个可用的解析器。但是,空序列没有 Rascal 符号,我想漂亮的打印机应该抛出异常。
这个语法模块在语法上是有效的:
module mod1
syntax Empty =
;
这个也是,应该和上一个是等价的语法:
module mod2
syntax Empty =
( )
;
(生成的解析器只接受空字符串。)
这意味着你可以创建这样的语法:
module mod3
syntax EmptyOrKitchen =
( ) | "kitchen"
;
但是,以下是不允许的(嵌套括号):
module mod4
syntax Empty =
(( ))
;
我猜想多余的括号是允许的,因为它们可以出现在表达式中,例如((2)) + 2
.
这个问题是在处理 rascal 语法定义的内部表示的数据类型时出现的。下面的代码将创建与上一个示例相同的模块,即 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(...)
函数应该打印出这样多余的括号吗?生成的模块是否有效是否重要?
为什么不允许他们基本上是我们想看看我们是否可以没有。目前符号种类之间没有优先级关系,因此通常不需要括号语法(就像表达式中需要 + 和 * 一样)。
括号已经有两种不同的语义,一种 ()
是 epsilon 符号,两种 (Sym1 Sym2 ...)
是嵌套序列。这个嵌套序列被定义(在句法上)期望至少有两个符号。现在我们可以毫不含糊地为带有单个符号的括号引入第三种语义,或者放宽对序列的要求......但我们认为这会让人感到困惑,在一种情况下你会在生成的解析树(序列)中得到一个额外的层,而在另一种情况下你不会(忽略多余的括号)。
更详细地说,打印 seq([])
的问题与其说是元语法的问题,不如说是支持抽象符号比具体符号更宽松(即它是一种更大的语言或过近似)。解析器生成器将为 seq([])
生成一个可用的解析器。但是,空序列没有 Rascal 符号,我想漂亮的打印机应该抛出异常。