Alloy语法规范中方括号的含义

时间:2014-04-24 01:49:54

标签: alloy

在Alloy网站的the Alloy grammar spec中,我发现自己对使用方括号感到困惑。

在如下的制作中,事情似乎很清楚。

specification ::= [module] open* paragraph*

我猜方括号表示可选性,星号是Kleene闭包,因此引用的规则意味着规范最多包含一个module语句,零个或多个open子句,以及零或更多paragraph s。这对我来说很有意义(虽然我会逐渐使用Wirth的EBNF表示法,所以我的笔记将其显示为[module] {open} {paragraph})。

在下面的作品中,括号让我感到困惑。

cmdDecl ::= [name ":"] ["run"|"check"] [name|block] scope

如果关键字runcheck在命令中是可选的,并且要运行的谓词的名称,要检查的断言的名称,ditto,我会感到很惊讶,或者要运行或检查的匿名块。但这就是这条规则所说的。

问题1:方括号在语法中表示什么?

问题2:是否使用方括号,某些读者可能会认为括号是拼写错误?即这个规则应该采用以下形式吗?

cmdDecl ::= [name ":"] ("run"|"check") (name|block) scope

也许我对在野外发现的各种语法符号不够熟悉;也许指示工具或指向符号的描述会很有帮助。

问题3:某些解析器生成工具是否使用了这种表示法?哪个?

2 个答案:

答案 0 :(得分:2)

  

问题1:方括号在语法中表示什么?

你正确地指出方括号的使用在你提到的语法中是不一致的。我认为这个语法是从第一版"软件抽象"书;我不确定这本书的第二版是否包含相同的语法。

  

问题2:是否使用方括号,某些读者可能会认为括号是拼写错误?

完全正确。

  

问题3:某些解析器生成工具是否使用了这种表示法?哪个?

不是。 Alloy Analyzer使用Cup中编写的语法。 .lex和.cup文件(Alloy.lexAlloy.cup)包含在Alloy分发jar文件中(位于" edu / mit / csail / sdg / alloy4compiler / parser /&#34 ;)

答案 1 :(得分:1)

谢谢,迈克尔。 cmdDecl的制作在本书中确实是错误的,所以我发布了erratum。 Aleks还更新了Alloy网站上的语法,该网站还有其他一些错误。