最近一直在學習編譯原理的內容,深知如果不自己動手實現乙個編譯器,那麼這就是在談一場不以結婚為目的的戀愛,這就是耍流氓。所以從現在開始我要自己實現乙個類似於c語言的編譯器,把設計的方案與細節總結在這裡。也希望大家多給我提一些寶貴的意見。
這個語言與c語言非常相似,也與現有的很多程式語言有很多共同點。但也有很多地方與c語言不同,比如c-mini包含了foreach迴圈語句,在函式體中變數的宣告順序也與c語言不同。
不同元素的型別使用不同的字型來表示:
2.1 token 的定義program → declarationlist
declarationlist → declarationlist
declaration | declaration
declaration → vardeclaration | funcdeclaration
vardeclaration → typespecifier
vardecllist ;
vardecllist → vardecllist , vardeclinitialize | vardeclinitialize
vardeclinitialize → vardeclid | vardeclid =******expression
vardeclid →id|id[ numconst ]
typespecifier →int|bool|char|voidfuncdeclaration →defid(params)typespecifierparams → paramlist |ε
paramlist → paramlist,paramtypelist | paramtypelist
paramtypelist → typespecifier paramid
paramid →id|id[ ]statement → expressionstmt | compoundstmt | ifstmt | whilestmt | foreachstmt | returnstmt | breakstmt
compoundstmt→localdeclarations → localdeclarations vardeclaration |ε
statementlist → statementlist statement |ε
expressionstmt → expression;|;
ifstmt →if(******expression)statement[elsestatement]whilestmt →while( ******expression ) statement
foreachstmt →foreach(mutablein******expression)statement
returnstmt →return;|returnexpression;
breakstmt →break;
expression → mutable=expression | mutable += expression | mutable −= expression| mutable ∗= expression | mutable /= expression | mutable ++ | mutable −− | ******expression
******expression → ******expression|andexpression | andexpression
andexpression → andexpression&unaryrelexpression | unaryrelexpression
unaryrelexpression →!unaryrelexpression | relexpression
relexpression → sumexpression relop sumexpression | sumexpression
relop →<=|<|>|>=|==|! =sumexpression → sumexpression sumop term | term
sumop →+|−term → term mulop unaryexpression | unaryexpression
mulop → ∗ | / | %
unaryexpression → unaryop unaryexpression | factor
unaryop →−factor → immutable | mutable
mutable →id|id[expression]immutable →(expression)| call | constant
call →id(args)args → arglist |ε
arglist → arglist , expression | expression
constant → numconst | charconst | stringconst |true|false
程式語言設計
scanf和printf的用法。scanf 是c語言中的乙個輸入函式。它是格式輸入函式,即按使用者指定的格式從鍵盤上把資料輸入到指定的變數之中。scanf被宣告在標頭檔案stdio.h裡,因此在使用scanf函式時要加上 include printf 是指c語言中的格式化輸出函式,主要功能是向標準輸...
設計與實現
為了概念上的完整性,系統的設計必須有乙個人,最多2個人來完成,問題來了,有的人會認為,那其他人員幹什麼?創意都被這1 2個人壟斷,剩下的實現過程就很枯燥了.實際上,經驗已經表明,沒有規矩,不成方圓 最差的建築往往是那些預算遠遠超標的專案,因為這些專案一開始的概念就不完整.外部的體系結構的強制性 設計...
磁碟排程演算法設計與實現 C語言
一 設計分析 尋道時間ts是磁頭從當前磁軌移動到目標磁軌所需要的時間 旋轉延遲時間tw是當磁頭停留在目標磁軌後,目標物理塊從當前位置旋轉到磁頭位置的時間 讀寫時間trw是目標物理塊內容與記憶體中對應交換的時間。磁碟排程的原則是公平和高吞吐量,衡量指標有訪問時間t和平均訪問時間ta t ts tw t...