2012-03-29 27 views
4

我爲非常簡單的規則語言創建了一個正式的規範,非常簡單。 我想使用EBNF,因爲這是一個標準,但我不知道如何指定操作的順序。這是目前的規格。Extended Backus-Naur表單操作順序

rule = statement, { (‘AND’|’OR’), statement}; 

variable = ‘$’,alphabetic character, {alphabetic character | digit}; 

statement = variable, [ ‘count’,[white space ],’>’,[white space],number ]; 

alphabetic character = "A" | "B" | "C" | "D" | "E" | "F" | "G" 
        | "H" | "I" | "J" | "K" | "L" | "M" | "N" 
        | "O" | "P" | "Q" | "R" | "S" | "T" | "U" 
        | "V" | "W" | "X" | "Y" | "Z" ; 

number = [ "-" ] , digit , { digit } ; 

digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; 

white space = ? white space characters ? ; 

我的問題是如何顯示括號中的內容應該先評估。 因此,像這樣

$strap AND ($greenSticker count > 5 OR ($greenSticker AND $redSticker)) 

這似乎是一個共同的特點,以大多數語言,但我的谷歌技能沒有我,我似乎無法找到一個例子。

回答

11

鑑於這種作爲簡化示例LL語法:

expression -> (+|-|ε) term ((+|-) term)* 
term -> factor ((*|/) factor)* 
factor -> var | number | (expression) 

正如你可以看到,具有較低優先級(+-)的運營商在比優先級高運營商的更一般規則(*/ )。這完全是關於生成正確的分析樹。但根據經驗,「外部」或更一般的規則具有較低的優先級,這就是加法和減法運算符放在term旁邊的原因,因爲term必須進一步派生。如果你看看更復雜的語法,你會發現這被認爲是極端的,具有適當的優先級。

+1

在表達語法規則的優先順序時,我看不出爲什麼要區分自上而下和自下而上的解析。正如你所說的,這完全是關於生成正確的分析樹,而你只是構建自頂向下或自底向上,最終達到相同的結果。當然這有一些含義,但對於我來說,如何將解析技術與這種優先級相關聯並不明顯。請解釋。 – Gunther 2012-03-30 08:42:47

+1

該表達式語法也可以在自下而上的解析器中工作,也可以在自上而下的LL解析器中工作,而不僅僅用於遞歸下降解析器。普拉特解析器也是遞歸下降和自上而下的。你的第二段對我來說確實沒有任何意義。 – EJP 2012-04-05 01:26:57

+0

爲了解決您的兩個問題,我剛剛刪除了令人困惑的段落。我希望我的答案的其餘部分是有益的! – 2012-04-05 02:31:43