在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
如果关键字run
和check
在命令中是可选的,并且要运行的谓词的名称,要检查的断言的名称,ditto,我会感到很惊讶,或者要运行或检查的匿名块。但这就是这条规则所说的。
问题1:做方括号在语法中表示什么?
问题2:是否使用方括号,某些读者可能会认为括号是拼写错误?即这个规则应该采用以下形式吗?
cmdDecl ::= [name ":"] ("run"|"check") (name|block) scope
也许我对在野外发现的各种语法符号不够熟悉;也许指示工具或指向符号的描述会很有帮助。
问题3:某些解析器生成工具是否使用了这种表示法?哪个?
答案 0 :(得分:2)
问题1:方括号在语法中表示什么?
你正确地指出方括号的使用在你提到的语法中是不一致的。我认为这个语法是从第一版"软件抽象"书;我不确定这本书的第二版是否包含相同的语法。
问题2:是否使用方括号,某些读者可能会认为括号是拼写错误?
完全正确。
问题3:某些解析器生成工具是否使用了这种表示法?哪个?
不是。 Alloy Analyzer使用Cup中编写的语法。 .lex和.cup文件(Alloy.lex
和Alloy.cup
)包含在Alloy分发jar文件中(位于" edu / mit / csail / sdg / alloy4compiler / parser /&#34 ;)
答案 1 :(得分:1)