天天看點

文法圖(Syntax diagram)、鐵路圖(railroad diagrams)

鐵路圖(railroad diagram)規則:

[list]

[*]1.從左邊界開始沿着軌道去到右邊界。

[*]2.沿途,你将在圓框中遇到的是字面量,在方塊中遇到的是規則或者描述。

[*]3.任何沿着軌道能走通的序列都是合法的。

[*]4.任何不能沿着軌道走通的序列都是非法的。

[*]5.每個末端隻有一個豎條的鐵路圖允許在任何一對标記中間插入空白。而在末端有兩個豎條的鐵路圖是不允許的。

[/list]

文法圖(Syntax diagrams )又叫鐵路圖(railroad diagrams)是描述形式文法的一種方式。它是巴科斯範式或擴充巴科斯範式的圖形化表示。最早使用文法圖的書包括Niklaus Wirth寫的“Pascal User Manual”(文法圖開始于47頁)和the Burroughs CANDE manual。在編譯領域,像BNF和它的變體這樣的文字式表示法都是首選的。BNF能很好的被編譯器作者和編譯器了解,但是不能很好的被這些語言的大部分使用者了解。鐵路圖能更容易被大多數人了解。資料交換格式JSON之是以流行的部分原因就是它用鐵路圖來表示。

[b]準則[/b]

一個文法的表示法是由一套文法圖組成。每個圖定義了一個非終結符。有一個主圖通過下面方式定義了這門語言:屬于這門語言的每句話都必須在主圖上描繪一個路徑。

每個圖都有一個起始點和一個終點。這個圖通過穿過其他的非終結符和終結符描繪了這些兩點之間的可能路徑。終結符用圓形區域表示,同時非終結符用方形區域表示。

[b]例子[/b]

我們用一個算術表達式作為一個例子。首先我們提供一段簡單的BNF文法:

<expression>::= <term> | <term> "+" <expression>
<term>::= <factor> | <factor> "*" <term>
<factor>::= <constant> | <variable> | "(" <expression> ")"
<variable>::= "x" | "y" | "z"
<constant>::= <digit> | <digit> <constant>
<digit>::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
           

這段文法也能在EBNF中被表示:

expression = term , {"+" term};
term = factor , {"*" factor};
factor = constant | variable | "(" , expression , ")";
variable = "x" | "y" | "z";
constant = digit , {digit};
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
           

關于這段文法的一組可能的文法圖:[img]http://dl.iteye.com/upload/attachment/570104/1395365f-86d8-3a35-92e2-0b20d5d8d9f0.png[/img]