是指從源程式到中間**這一部分
之後開始涉及適應硬體的部分。當然,要做ide的話還要涉及執行時環境。
本科課程設計主要是前端。
從原始檔到詞法單元(token),也就是tokenizer。
也就是parser。
考慮選擇自頂向下的ll,還是自底向上分析的lr。從分析能力上看是這樣的。
ll不能解決左遞迴,能勉強搞定右遞迴。
知乎上有個問題:我看過很多國外的的編譯教科書,其自底向上語法分析部分全部採用工具生成(絕大多數是bison/yacc)。為什麼他們說:「不推薦手寫」呢?有沒有手寫的自底向上語法分析器?其難點在**?
yacc的輸入是巴科斯正規化(bnf)表達的語法規則以及語法規約的處理**,yacc輸出的是基於表驅動的編譯器,包含輸入的語法規約的處理**部分。
yacc是開發編譯器的乙個有用的工具,採用lalr(1)語法分析方法。
由於所產生的解析器需要詞法分析器配合,因此yacc經常和詞法分析器的產生器——一般就是lex——聯合使用。ieee posix p1003.2 標準定義了lex和yacc的功能和需求。
我是混子,我不會都寫的,我選擇ll(1)!
ll(1)有遞迴的**分析器
和非遞迴的**分析器
。「**」兩個字是指ll分析表。(根據分析表來選擇產生式)
我選擇非遞迴的**分析法。
語法制導翻譯是把語法分析和語義分析放在一起實現。
語義資訊通過為文法符號設定語義屬性來實現。
s屬性定義是不用考慮繼承屬性的ssd。而l屬性定義不止考慮綜合屬性,也考慮繼承屬性。
目標**的一種是三位址**(把復合運算拆開),三位址**對應的資料結構的一種是四元式。三位址**屬於線性表示形式。還有一種是樹形結構。
這個專案就不寫了。我太菜了(¬_¬)
乙個整合開發環境至少要擁有編譯、除錯和**編輯的功能。除錯涉及到執行時環境的設計和監視,僅僅編譯源**則不需要這部分。而編輯器需要給使用者提供良好的編碼體驗,比如**摺疊、高亮等功能。在圖中,綠色框內的部分是我這次實習實現的內容。專案一開始的設計是實現乙個編譯器的所有內容,也就是從源**到目標**的翻譯。但是我沒有能力全部寫完。
文法概述:
1.全域性變數在main函式之前宣告,自定義過程在main函式之後定義
2.不可以在變數宣告的同時賦值
3.不支援巢狀過程的定義
4.過程沒有返回值
5.支援if語句、while迴圈語句和for迴圈語句
6.支援一維定長陣列
7.目前變數型別只有int
專案採用物件導向的設計思想(但也不全是物件導向,比如token、**分析表的定義用了結構體)下圖是uml類圖,給出了主要類的核心屬性和方法。
部分流程圖和狀態機
介面
傳送門
乙個完整的編譯器前端 A 1 源語言
這個語言的乙個程式由乙個塊組成,該塊中包含可選的宣告和語句。語法符號basic表示基本型別。program block block decls desls decl decl type id type type num basic stmts stmts stmt 把複製當做乙個語句 而不是表示式中...
乙個編譯器的小陷阱
有時候在乙個平台執行正確的程式,在另乙個平台就會出問題。在平台移植中,最常見的問題可能就是位元組序和對齊這類問題了。本文記錄的是我以前碰到過的乙個小陷阱。看看這段 的輸出應該是什麼?include stdio.h char do something int p void test1 void int...
手寫乙個微前端,qiankunjs
window.powered by qiankun true let module null const pushstate history.pushstate history.pushstate args export const start 處理函式 如果沒有匹配的子應用,則不處理 若上一次掛載...