我对语法规范中*
和+
的含义感到有些困惑。我期待像
rascal>syntax Statement = "{" {Statement ";"}* "}";
表示以分号分隔并结束的语句块。但在documentation中它说:
以分号分隔的语句块
我确实在一些代码中看到,这样的语法规范允许解析像{ x = 1; x }
这样的语句。为什么会那样?
答案 0 :(得分:5)
对于分隔列表和普通列表,只有不同的表示法。以;
结尾的语句列表可以使用序列运算符表示:(...)
。
例如:
(Expr ";")*
将接受
1; 2; 3;
,而
{Expr ";"}*
会在最终;
上产生解析错误,而是接受:
1; 2; 3
分隔列表在Rascal的模式匹配和构造特性中也有特殊的语义。当我们使用具体语法匹配时,空子列表意味着忽略前面和后面的分隔符:
({Expr ","}*) `1 ; <{Expr ","}* rest>` := ({Expr ","}*) `1`;
此模式将成功,并将空表达式列表绑定到rest
,同时忽略模式中的;
。
同样,当我们建立一个新列表时:
({Expr ","}*) `1 ; <{Expr ","}* rest>`
由于1
为空,只会生成;
并从构建的列表中删除rest
。
分隔列表通常用于定义函数定义和函数应用程序等中的形式和实际参数列表。人们通常不会将分隔符用于具有分号的语句。