近期用到ABB機器人,RAPID使用BNF語法規則描述,所以不得不復習了一下BNF語法描述規則,通過C的BNF描述,喚醒我的記憶 %>_<%
C—的BNF語法如下:?
1. program ?→ ?declaration-list ?
2. declaration-list → declaration-list ?declaration | declaration ?3. declaration → var-declaration | fun-declaration ?
4. var-declaration → type-specifier ID ?| type-specifier ID [ NUM ] ? 5. type-specifier → int | void | float ?
6. fun-declaration → type-specifier ID(params) ?compound-stmt 7. params → params-list | void ?
8. param-list → param-list,param | param ?
9. param → type-specifier ID| type-specifier ID[] ?
10. compound-stmt → { local-declarations statement-list } ?
11. local-declarations → local-declarations var-declaration | empty ?12. statement-list → statement-liststatement | empty ?
13. statement → expression-stmt | compound-stmt | selection-stmt ?| iteration-stmt | return-stmt ?
14. expression-stmt → expression;|; ?
15. selection-stmt → if (expression) statement ?| if (expression) statement else statement ?
16. iteration-stmt → while (expression) statement ?17. return-stmt → return; | return expression; ?
18. expression → var = expression | simple-expression ?19. var → ID | ID[expression] ?
20. simple-expression → additive-expression relop additive-expression | ?additive-expression ?
21. relop → <= | < | > | >= | = = | != | && | || ?
22. additive-expression → additive-expression addop term | term ?23. addop → + | - ?
24. term → term mulopfactor | factor ?25. mulop → * | / ?
26. factor → (expression) | var | call | NUM ?27. call → ID (args) ?
28. args → arg-list |empty ?
29. arg-list → arg-list,expression | expression?
下面是對以上每條文法規則,給出了相關語義的簡短解釋。 ?
1.program → declaration-list ?
2.declaration-list → declaration-list declaration | declaration ?
3.declaration → var-declaration | fun-declaration ?
程序由聲明的列表(或序列)組成,聲明可以是函數或變量聲明,順序是任意的。至少必須有 一個聲明。接下來是語義限制(這些在C中不會出現)。所有的變量和函數在使用前必須聲明 (這避免了向后backpatching引用)。程序中最后的聲明必須是一個函數聲明,名字為main。 注意,C1缺乏原型,因此聲明和定義之間沒有區別(像C一樣)。 ?
4.var-declaration → type-specifier ID ?| type-specifier ID[NUM]; ?
5.type-specifier → int | void | float 變量聲明或者聲明了簡單的整數或浮點類型變量,或者是基類型為整數或浮點的數組變量,?索引范圍從0到NUM-1。注意,在C1中僅有的基本類型是整型和空類型。在一個變量聲明中,?只能使用類型指示符int。void用于函數聲明(參見下面)。也要注意,每個聲明只能聲明一 個變量。 ?
6.fun-declaration → type-specifier ID(params) compound-stmt ?
7.params → param-list | void ?
8.param-list → param-list , param | param ?
9.param → type-specifier ID |type-specifier ID[] ?函數聲明由返回類型指示符、標識符以及在圓括號內的用逗號分開的參數列表組成,后面跟 著一個復合語句,是函數的代碼。如果函數的返回類型是void,那么函數不返回任何值(即 是一個過程)。函數的參數可以是void(即沒有參數),或者一列描述函數的參數。參數后面 跟著方括號是數組參數,其大小是可變的。簡單的整型參數由值傳遞。數組參數由引用來傳 遞(也就是指針),在調用時必須通過數組變量來匹配。注意,類型“函數”沒有參數。一個 函數參數的作用域等于函數聲明的復合語句,函數的每次請求都有一個獨立的參數集。函數 可以是遞歸的(對于使用聲明允許的范圍)。 ?
10.compound-stmt → { local-declarations statement-list } ? 復合語句由用花括號圍起來的一組聲明和語句組成。復合語句通過用給定的順序執行語句序 列來執行。局部聲明的作用域等于復合語句的語句列表,并代替任何全局聲明。 ?
11.local-declarations → local-declarations var-declaration | empty ?
12.statement-list → statement-list statement | empty ?
注意聲明和語句列表都可以是空的(非終結符empty表示空字符串,有時寫作ε。) ?
13.statement → expression-stmt ?| compound-stmt ?| selection-stmt ?| iteration-stmt ?| return-stmt ?
14.expression-stmt → expression; | ??
表達式語句有一個可選的且后面跟著分號的表達式。這樣的表達式通常求出它們一方的結 果。因此,這個語句用于賦值和函數調用。 ?
15.selection-stmt → if (expression) statement ?| if (expression) statement else statement ?
if語句有通常的語義:表達式進行計算;非0值引起第一條語句的執行;0值引起第二條語句的執行,如果它存在的話。這個規則導致了典型的懸掛else二義性,可以用一種標準的方法解決:else部分通常作為當前if的一個子結構立即分析(“最近嵌套”非二義性規則)。 ?
16.iteration-stmt → while (expression) statement ?
while語句是C-中唯一的重復語句。它重復執行表達式,并且如果表達式的求值為非0,則 執行語句,當表達式的值為0時結束。 ?
17.return-stmt → return; | return expression ?返回語句可以返回一個值也可無值返回。函數沒有說明為void就必須返回一個值。函數聲明?
為void就沒有返回值。return引起控制返回調用者(如果它在main中,則程序結束)。 ?
18.expression → var=expression | simple-expression ?
19.var→ ID | ID[expression] ?
表達式是一個變量引用,后面跟著賦值符號(等號)和一個表達式,或者就是一個簡單的表達 式。賦值有通常的存儲語義:找到由var表示的變量的地址,然后由賦值符右邊的子表達式 進行求值,子表達式的值存儲到給定的地址。這個值也作為整個表達式的值返回。var是簡 單的(整型)變量或下標數組變量。負的下標將引起程序停止(與C不同)。然而,不進行下標 越界檢查。 ?
var表示C1比C的進一步限制。在C中賦值的目標必須是左值(l-value),左值是可以由許多操?
作獲得的地址。在C1中唯一的左值是由var語法給定的,因此這個種類按照句法進行檢查, 代替像C中那樣的類型檢查。故在C1中指針運算是禁止的。 ?
20.simple-expression → additive-expression relop additive-expression ?|additive-expression ?
21.relop → <= | < | > | >= | == | != | && | || ?
簡單表達式由無結合的關系操作符組成(即無括號的表達式僅有一個關系操作符)。簡單表達 式在它不包含關系操作符時,其值是加法表達式的值,或者如果關系算式求值為ture,其值 為1,求值為false時值為0。 ?
22.additive-expression → additive-expression addop term | term?23.addop → + | - ?
24.term → term mulop factor | factor ?
25.mulop → * | / ??
加法表達式和項表示了算術操作符的結合性和優先級。/符號表示整數除;即任何余數都被 截去。 ?
26.factor → (expression) | var | call | NUM ?
因子是圍在括號內的表達式;或一個變量,求出其變量的值;或者一個函數調用,求出函數 的返回值;或者一個NUM,其值由掃描器計算。數組變量必須是下標變量,除非表達式由單個ID組成,并且以數組為參數在函數調用中使用(如下所示)。?
27.call → ID(args) ?
28.args → arg-list | empty ?
29.arg-list → arg-list,expression | expression ?
函數調用的組成是一個ID(函數名),后面是用括號圍起來的參數。參數或者為空,或者由逗 號分割的表達式列表組成,表示在一次調用期間分配的參數的值。函數在調用之前必須聲明, 聲明中參數的數目必須等于調用中參數的數目。函數聲明中的數組參數必須和一個表達式匹 配,這個表達式由一個標識符組成表示一個數組變量。