C—的BNF語法

近期用到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(函數名),后面是用括號圍起來的參數。參數或者為空,或者由逗 號分割的表達式列表組成,表示在一次調用期間分配的參數的值。函數在調用之前必須聲明, 聲明中參數的數目必須等于調用中參數的數目。函數聲明中的數組參數必須和一個表達式匹 配,這個表達式由一個標識符組成表示一個數組變量。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255969.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255969.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255969.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Warning: Attempt to present on whose view is not in模態跳轉問題

錯誤分析&#xff1a; controller A present controller B ,前提是A的view要存在&#xff0c;如果不存在&#xff0c;就會報這個錯。解決方法&#xff1a; 將原來的present語句由 viewDidLoad方法中移到 viewDidAppear中&#xff0c;問題就可以解決。但是這樣的話&#xff0c;畫…

Reflector7及破解

Reflector7開始收費&#xff0c;前面的版本都已經過期&#xff0c;在網上下載了Reflector7&#xff0c;并找到了破解軟解&#xff0c;特在此分享。 下載地址&#xff1a; Reflector7.1.0.143.zip&Red.Gate_.NET_.Reflector.7.1.0.143.patch-SND.zip 本文轉自xwdreamer博客園…

win7系統的右鍵菜單只顯示一個白色框不顯示菜單項 解決辦法

如上圖所示&#xff0c;桌面或其他大部分地方點擊右鍵菜單&#xff0c;都只顯示一個白色框&#xff0c;鼠標移上去才有菜單項看&#xff0c;并且效果很丑 解決辦法&#xff1a; 計算機—右鍵—屬性—高級—性能—設置—視覺效果—淡入淡出或滑動菜單到視圖&#xff0c;將其前面…

【setup.py編譯出錯】——提示無法查找到powershell.exe

https://www.cnblogs.com/wind-chaser/p/11359521.html pytorch fasterrcnn訓練自己數據集文章鏈接 在進行faster rcnn pytorch跑通的時候遇到的&#xff0c;我是直接在pycharm中的終端上進行運行的&#xff0c;但是一直會跳出powershell.exe無法查找的錯誤&#xff0c; pytho…

同工不同酬,年薪 50 萬美金的工程師到底有什么神本事?

同工不同酬&#xff0c;年薪 50 萬美金的工程師到底有什么神本事&#xff1f;投遞人 itwriter 發布于 2014-05-10 23:09 評論(6) 有6066人閱讀 原文鏈接 [收藏] 英文原文&#xff1a;What kind of jobs do the software engineers who earn $500K a year do? 他們究竟是作…

201671010117 2016-2017-2 《Java程序設計》Java第十七周學習心得

Java第十七周學習心得 這一周老師對線程的內容進行了詳細講解&#xff0c;包括線程創建的兩種技術&#xff0c;和線程的優先級屬性及調度方法&#xff0c;對于布置的實驗作業中&#xff0c;實驗九中存在一點問題&#xff0c;程序運行不出來&#xff0c;后來跟同學商量探討沒有…

ACM數論之旅4---擴展歐幾里德算法(歐幾里德(???)?是誰?)

為什么老是碰上 擴展歐幾里德算法 ( ????? )最討厭數論了 看來是時候學一學了 度娘百科說&#xff1a; 首先&#xff0c; axby gcd(a, b) 這個公式肯定有解 &#xff08;( ????? )她說根據數論中的相關定理可以證明&#xff0c;反正我信了&#xff09; 所以 axby g…

艾里斑大小與像元尺寸的匹配問題

寫給自己看的學習記錄&#xff1a; 光具有波粒二象性&#xff0c;由此衍生出了幾何光學與衍射光學。在光學設計軟件中&#xff0c;最常用的判斷標準是查看點列圖的RMS半徑以及MTF圖的曲線&#xff0c;這兩者分別代表了兩種傳播性質的評價方式。 在剛接觸光學設計時&#xff0…

Android 保持Service不被Kill掉的方法--雙Service守護 Android實現雙進程守護

本文分為兩個部分&#xff0c;第一部分為雙Service守護&#xff0c;第二部分為雙進程守護 第一部分&#xff1a; 一、Service簡介&#xff1a;Java.lang.Object ?Android.content.Context ?android.content.ContextWrapper ?android.app.Service Service是應用程序Applicati…

【mmdetection2.0錯誤】——ModuleNotFoundError: No module named ‘mmdet‘

一開始以為是安裝包導入的相對路徑的問題&#xff0c;結果鼓搗了一上午都沒有用&#xff0c;最后才發現再進行mmdet2.0環境配置的時候忘記編譯了 也就是如下語句&#xff1a; python setup.py develop

聊聊分布式事務

事務就是一個會話過程中&#xff0c;對上下文的影響是一致的&#xff0c;要么所有的更改都做了&#xff0c;要么所有的更變都撤銷掉。就要么生&#xff0c;要么死。沒有半死不死的中間不可預期狀態。參考下薛定諤的貓。 事務是為了保障業務數據的完整性和準確性的。分布式事務&…

PLSQL DBMS_DDL.ANALYZE_OBJECT

http://space.itpub.net/11893231/viewspace-683241 本文轉自健哥的數據花園博客園博客&#xff0c;原文鏈接&#xff1a;http://www.cnblogs.com/gaojian/archive/2012/11/30/2795775.html&#xff0c;如需轉載請自行聯系原作者

【深度學習mmdetection錯誤】——mmdetection 運行報錯KeyError:‘ConvWS is already registered in conv layer‘

于是修改以下mmdetection的安裝文件&#xff1a; site-packages/mmdet-2.1.0unknown-py3.7-linux-x86_64.egg/mmdet/ops/conv_ws.py" 把 CONV_LAYERS.register_module(ConvWS) 修改為&#xff1a; CONV_LAYERS.register_module(nameConvWS, forceTrue)

ABB RAPID 在 Notepad++ 中語法高亮的實現

ABB RAPID 在 Notepad 中語法高亮的實現 分類&#xff1a; Misc2014-04-08 15:43 145人閱讀 評論(0) 收藏 舉報notepadNotepad 內置了一個稱為 UDL2.0 (User Defined Language) 的引擎&#xff0c;來實現用戶自定義語法高亮&#xff0c;使用它&#xff0c;可以定制自己的代碼語…

Redis服務器的啟動過程分析

轉載于&#xff1a;http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/127.html?1455808771 本文將通過分析代碼來介紹Redis的啟動過程&#xff0c;通過查看Redis 的啟動腳本&#xff0c;得知Redis的啟動時從Redis.c的main方法開始的。Redis啟動可以分為以下幾個步驟…

MyEclipse運行時自動保存

今天第一次用MyEclipse&#xff0c;我發現我的代碼明明修改了&#xff0c;但運行結果發現總是修改前的代碼結果。后來發現&#xff0c;是代碼修改后必須保存&#xff0c;再點運行。這個功能明顯不合適&#xff0c;所以需要更改MyEclipse的配置。紅框是修改后的結果。 轉載于:ht…

PLSQL中INDEX BY TABLE 的 prior 和 next 操作學習

開始 --INDEX BY Table SET SERVEROUTPUT ON;DECLARETYPE enm_tab_type IS TABLE OFemp.ename%TYPEINDEX BY BINARY_INTEGER;enm_table enm_tab_type; BEGINenm_table(1):1001;enm_table(2):1002;enm_table(3):1003;enm_table(4):1004;enm_table(6):1006;dbms_output.put_line(…

【深度學習torch——error】——“xxx.pt is a zip archive(did you mean to use torch.jit.load()?)

這個問題是在進行權重文件加載進行預測的時候發生的&#xff0c;原因其實就是torch版本不對 我是用的工作站訓練使用的是torch1.7.0&#xff0c;然后用自己的電腦進行預測&#xff0c;就報錯了&#xff0c;原因就是自己的電腦是torch1.2.0版本的 因為在1.6版本以上的模型改變…

ABB 機器人 IRBP系列轉臺的一段代碼注釋

PROC IndexToStn1() //檢測變位機狀態 并設置要運行到的角度位置 并對不同的GetNextPartAdv返回值情況 進行處理 VAR bool bActive;VAR jointtarget jtCurrent; //聲明一個位置變量IF (NOT bInterchCalib1) CalibIntch1; ! reset inpo…

如何寫一個bootloader

聲明&#xff1a;本文為學習Codeproject文章的個人總結性文章&#xff0c; 原文&#xff1a;http://www.codeproject.com/Articles/664165/Writing-a-boot-loader-in-Assembly-and-C-Part 本人開發環境&#xff1a; 操作系統&#xff1a;Ubuntu 32位&#xff08;64位的會有push…