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