2014-04-24 56 views
3

在Alloy網站的the Alloy grammar spec中,我發現自己被方括號使用困惑。合金文法規範中方括號的含義

在像下面這樣的製作中,事情看起來很清楚。

specification ::= [module] open* paragraph* 

我猜的方括號表示可選性和星號是克萊尼關閉,所以剛纔所引述的規則意味着一個規範包括最多一個module聲明,零項或多個open條款,以及零個或多個paragraph秒。這對我來說很有意義(儘管我會盡可能逐漸使用Wirth的EBNF表示法,所以我的筆記將其顯示爲[module] {open} {paragraph})。

雖然在下面的製作中,括號令我感到困惑。

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

這讓我感到吃驚很大,如果關鍵字runcheck是在命令可選,並且要運行同上謂詞的名字,要檢查的斷言的名稱,或匿名塊運行或檢查。但這就是這條規則所說的。

所以問題1:什麼方括號表示在語法?

問題2:是否使用方括號,有些讀者可能會認爲括號是錯字?即這條規則是否應該採取以下形式?

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

也許我只是不熟悉在野外發現的各種語法符號;也許這將有助於指出該工具,或者指出對該符號的描述。

問題3:這是一種解析器生成工具使用的符號嗎?哪一個?

回答

2

問題1:方括號在語法中表示什麼?

您正確地指出,使用方括號在您提到的語法中是不一致的。我認爲語法是從第一版的「軟件抽象」書中複製而來的;我不確定本書的第二版是否包含相同的語法。

問題2:是否使用了方括號,有些讀者可能會認爲括號會出現錯字?

沒錯。

問題3:這個符號是否被一些解析器生成工具使用?哪一個?

不是。合金分析儀使用Cup編寫的語法。 .lex和.cup文件(Alloy.lexAlloy.cup)包含在合金分發jar文件中(位於「edu/mit/csail/sdg/alloy4compiler/parser /」中)。

+0

哎呀,不小心投了票,現在不能撤消! – Daniel

1

謝謝,邁克爾。cmdDecl的製作在本書中確實是錯誤的,所以我發佈了erratum。 Aleks還更新了Alloy網站上的語法,其中還有其他一些錯誤。