C mini 程式語言的設計與實現

2021-07-11 00:04:02 字數 3455 閱讀 6577

最近一直在學習編譯原理的內容,深知如果不自己動手實現乙個編譯器,那麼這就是在談一場不以結婚為目的的戀愛,這就是耍流氓。所以從現在開始我要自己實現乙個類似於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...