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