gpt4 book ai didi

rascal - 语法规范中*和+的含义

转载 作者:行者123 更新时间:2023-12-02 07:15:36 25 4
gpt4 key购买 nike

我对语法规范中 *+ 的含义有点困惑。我期望类似的东西

rascal>syntax Statement = "{" {Statement ";"}* "}";

表示由分号分隔并结束的语句 block 。但在documentation它说:

A block of statements separated by semicolons

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

最佳答案

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

例如:

 (Expr ";")* 

会接受

 1; 2; 3;

同时

 {Expr ";"}*

将在最终的;上产生解析错误,并且接受:

 1; 2; 3

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

 ({Expr ","}*) `1 ; <{Expr ","}* rest>` := ({Expr ","}*) `1`;

此模式将成功,并将空表达式列表绑定(bind)到 rest,同时忽略模式中的 ;

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

 ({Expr ","}*) `1 ; <{Expr ","}* rest>`

将生成简单的1并从构造的列表中删除;,因为rest为空。

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

关于rascal - 语法规范中*和+的含义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19713286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com