语法规范中*和+的含义

day*_*day 3 rascal

我是一个有点意思混淆*+语法规范.我期待类似的东西

rascal>syntax Statement = "{" {Statement ";"}* "}";
Run Code Online (Sandbox Code Playgroud)

表示以分号分隔和结束的语句块.但在文档中它说:

由分号分隔的语句块

我确实在一些代码中看到,这样的语法规范允许{ x = 1; x }解析语句.为什么会那样?

Jur*_*nju 5

分离列表和普通列表只有不同的表示法.结尾的语句列表;可以使用序列运算符表示:(...).

例如:

 (Expr ";")* 
Run Code Online (Sandbox Code Playgroud)

会接受

 1; 2; 3;
Run Code Online (Sandbox Code Playgroud)

 {Expr ";"}*
Run Code Online (Sandbox Code Playgroud)

将在最终产生解析错误 ;,而是接受:

 1; 2; 3
Run Code Online (Sandbox Code Playgroud)

分隔列表在Rascal的模式匹配和构造特性中也有特殊的语义.当我们匹配例如使用具体语法时,空子列表意味着忽略前面和后面的分隔符:

 ({Expr ","}*) `1 ; <{Expr ","}* rest>` := ({Expr ","}*) `1`;
Run Code Online (Sandbox Code Playgroud)

此模式将成功,并将空表达式列表绑定到rest忽略;模式中的模式.

同样,当我们构建一个新列表时:

 ({Expr ","}*) `1 ; <{Expr ","}* rest>`
Run Code Online (Sandbox Code Playgroud)

将生成简单1;从构造列表中删除rest是空的.

分离列表通常用于在函数定义和函数应用程序等中定义形式和实际参数的列表.人们通常不会将分隔符用于具有分号的语句.