文法用於描述一種語言,語言中包含多個句子,句子又是由表達式組成的。多個原子表達式(不可再分的表達式,比如:a+b,c*d,-a等)和操作符或者括號一起又可以組成複合表達式(比如:a+b*c,a*(b+c)等)。在書寫表達式文法時需要注意算符優先級問題,比如:四則運算中要優先計算乘除,然後纔是加減,而被括號括起的表達式具有更高的優先級。解決優先級問題可以採取從優先級低的算符到優先級高的算符的順序構造文法規則,由於括號相對於操作符具有更高的優先級,所以由括號括起的複合表達式可以作爲原子表達式處理。下面拿四則運算舉例說明:
下面爲比較運算構造文法,只涉及'>','<','==','!='和邏輯運算符'&&'和'||'。我們知道所有比較運算符都具有相同的優先級,邏輯運算符中'&&'優先級要比'||'高。所以,與四則運算的文法類似,先構建低優先級的複合表達式,最後是最高優先級的原子表達式。所以首先是描述||的規則,然後是&&,最後是原子表達式,根據上面闡述,比較運算的文法可以構造爲:
1. 從低優先級到高優先級的順序構造規則。
2. 每個複合表達式都有一個只包含下一個優先級的表達式作爲解析選項。
3. 括號具有高優先級,被括號括起的符合表達式作爲原子表達式。
expr : expr '+' term
| expr '-' term
| term
term : term '*' factor
| term '/' factor
| factor
factor : NUMBER
| '(' expr ')'
expr和term都是複合表達式。expr就是表達式的起始規則,處理+和-操作符以及不含+和-的情況。term用於表示*和/操作符以及不含*和/的情況。factor就是原子表達式,直接返回詞法單元或者是由括號括起來的複合表達式。下面爲比較運算構造文法,只涉及'>','<','==','!='和邏輯運算符'&&'和'||'。我們知道所有比較運算符都具有相同的優先級,邏輯運算符中'&&'優先級要比'||'高。所以,與四則運算的文法類似,先構建低優先級的複合表達式,最後是最高優先級的原子表達式。所以首先是描述||的規則,然後是&&,最後是原子表達式,根據上面闡述,比較運算的文法可以構造爲:
compexpr : compexpr '||' andexpr
| andexpr
andexpr : andexpr '&&' factor
| factor
factor : ID '>' NUMBER
| ID '<' NUMBER
| ID '==' NUMBER
| ID '!=' NUMBER
| '(' compexpr ')'
根據四則運算和比較運算的文法,我們可以總結具有優先級的表達式文法的構造原則是:1. 從低優先級到高優先級的順序構造規則。
2. 每個複合表達式都有一個只包含下一個優先級的表達式作爲解析選項。
3. 括號具有高優先級,被括號括起的符合表達式作爲原子表達式。