『小豬呼嚕嚕』的專欄 -- I Write,therefore I am.
源自:ideawu (個人網站) 標籤:c/c++
這篇文章只是我學習編譯原理的日記。我不是要寫一個生成機器程式碼的編譯器,我想寫一個生成其它語言的編譯器。可能是生成html或者c語言程式碼? 這是一個基於某個自定義的文法(將在下面給出)所編寫的部分功能的編譯器。已經實現了詞法分析(Lexer.h/cpp),語法分析(Parser.h/cpp)並建立語法分析樹,語法分析樹資料結構(SyntaxTreeNode.h/cpp和SyntaxTree.h/cpp)。
這篇文章只是我學習編譯原理的日記。我不是要寫一個生成機器程式碼的編譯器,我想寫一個生成其它語言的編譯器。可能是生成html或者c語言程式碼?
- 簡介: 這是一個基於某個自定義的文法(將在下面給出)所編寫的部分功能的編譯器。已經實現了詞法分析(Lexer.h/cpp),語法分析(Parser.h/cpp)並建立語法分析樹,語法分析樹資料結構(SyntaxTreeNode.h/cpp和SyntaxTree.h/cpp)。
- 文法定義:
S: Statement
B: Boolean
L: Block
I: Identifier
N: Number
E: Expression
Seperator: 分隔符,包括';' '/n' '/t'等,建議使用';'
S = if B then S (else S)? | while Boolean do S | I=E | '{' L '}'
L = S? D L? | <epsilon>
E = T {'+' T}
T = F {'*' F}
F = I | N
B = T2 {'|' T2}
T2 = F2 {'&' F2}
F2 = E <Relop> E
Relop = '<' | '>' | '=='
N = [0-9]+
I = [A-Za-z][0-9A-Za-z]* - 基本思想和功能: 詞法分析器Lexer提供了nextToken()介面供語法分析器Parser使用。但是,詞法分析器也可以單獨使用,比如為了輸出原始檔的記號序列。 呼叫Parser的parse()方法將返回一棵原始檔對應的語法分析樹的指標。之後可以呼叫display()方法輸出格式化的語法分析樹。目前 Parser只能建立語法分析樹和判斷原始檔是否存在語法錯誤並指出錯誤的地方,無法生成可執行程式碼。
-
基本模組簡介:
(4.1) Lexer模組公用方法:
Lexer(char *filename); // filename: 原始檔
void reset(); // 如果想再次從頭分析原始檔,呼叫此方法
bool isReady(); // Lexer是否已經準備就緒
char *getSrc(); // 得到原始檔的拷貝的指標
int getIndex(); // 當前已經分析到的字元的位置
Token nextToken(); // 獲取下一個記號,永遠不會返回NULL
(4.2) Parser模組公用方法:
Parser(char* sourcefile); // sourcefile: 原始檔
void printError(); // 打印出錯誤在原始檔中的位置
SyntaxTree* parse(); // 得到一棵語法分析樹,並返回它的指標
(4.3) SyntaxTree模組公用方法
void display(FILE *fo=stdout); // 將語法樹輸出到檔案中,預設輸出到標準輸出 -
語法分析樹輸出格式
程式使用文字字元輸出語法分析樹,類似
'='---5
+-----ID
表示ID=5, ID表示識別符號。以後將實現儲存識別符號的表格,從而可以顯示識別符號的名字。
'='---'+'---5
| '+'---b
+-----ID
表示ID=ID+5
whl---'='---'+'---5
| | +-----ID
| +-----ID
+-----'>'---3
+-----ID
表示while ID>3 then ID=ID+5
if ---blk---whl---'='---9
| | | +-----ID
| | +-----'>'---ID
| | +-----3
| +-----blk---'='---'+'---'*'---ID
| | | | +-----9
| | | +-----8
| | +-----ID
| +-----'='---3
| +-----ID
+-----'>'---8
+-----ID
對應下面的程式:
if a>8 then{
b = 3;
a = 8 + 9 * t;
}else{
while 3>a do
a=9;
}
下面的程式:
if a>8+3*d+6 | 3>4 & e<8 then{
s=2;
b=15;
if a<b then{
s = 8+te
i = 4*8
}else{
s = 0;
}
a=8+9;
rel=8*7;
}else{
while d>a do
begin
a=9+a;
b=7;
c=5+17*a;
end
}
生成樹:
if ---blk---whl---blk---'='---'+'---'*'---ID
| | | | | | +-----17
| | | | | +-----5
| | | | +-----ID
| | | +-----blk---'='---7
| | | | +-----ID
| | | +-----'='---'+'---ID
| | | | +-----9
| | | +-----ID
| | +-----'>'---ID
| | +-----ID
| +-----blk---'='---'*'---7
| | | +-----8
| | +-----ID
| +-----blk---'='---'+'---9
| | | +-----8
| | +-----ID
| +-----blk---if ---blk---'='---0
| | | | +-----ID
| | | +-----blk---'='---'*'---8
| | | | | +-----4
| | | | +-----ID
| | | +-----'='---'+'---ID
| | | | +-----8
| | | +-----ID
| | +-----'<'---ID
| | +-----ID
| +-----blk---'='---15
| | +-----ID
| +-----'='---2
| +-----ID
+-----'|'---'&'---'<'---8
| | +-----ID
| +-----'>'---4
| +-----3
+-----'>'---'+'---6
| +-----'+'---'*'---ID
| | +-----3
| +-----8
+-----ID -
原始碼的可執行例子的使用方法:
下載原始碼包
程式碼已經在下列環境編譯並測試:
Linux debian 2.6.8-2-686
gcc version 4.0.3 (Debian 4.0.3-1)
GNU Make 3.81rc2
使用相同或者相近的環境,進入原始碼所在的目錄,執行
./compiler
解析附帶的test.txt檔案。同一個目錄下還附帶了test_complex.txt(複雜)和test_error.txt(出錯)兩個檔案供測試。
compiler可執行檔案的使用方法為
./compiler [srcfile [outfile]]
解析srcfile原始檔並輸出語法分析樹到outfile檔案。
執行
make clean
make
將再次編譯原始檔。
如果在Windows下使用VC6,新建立一個工程,將所有原始碼檔案加入工程中後就可以編譯運行了。
在DOS視窗執行,進入工程所在的目錄,把原始碼目錄下的test.txt, test_complex.txt, test_error.txt
三個測試用例複製到Debug目錄下,再進入Debug目錄,
使用main代替上面的compiler命令就可以測試了。 -
模組使用舉例:
- 輸出原始檔的記號序列
Lexer lexer("source.c");
while((token = lexer.nextToken()) != ERROR){
// print token
// 已經得到一個記號
} - 輸出語法樹到螢幕和檔案中,出錯則輸出出錯資訊
FILE *fp = fopen("tree.txt", "w");
Parser parser("source.c");
SyntaxTree *tree = parser.parse();
if(tree != NULL){
tree->display();
tree->display(fp);
}else{
parser.printError();
}
- 輸出原始檔的記號序列
(code in email)
Copyright©2006 idea's web. All rights reserved. | www.ideawu.net
相關推薦
『小豬呼嚕嚕』的專欄 -- I Write,therefore I am.
源自:ideawu (個人網站) 標籤:c/c++ 這篇文章只是我學習編譯原理的日記。我不是要寫一個生成機器程式碼的編譯器,我想寫一個生成其它語言的編譯器。可能是生成html或者c語言程式碼? 這是一個基於某個自定義的文法(將在下面給出)所編寫的部分功能的編譯器。已經
kira 考研數學小課糖『2019 終極整合包』
作者:Kira言而信 今年6月起,作者每週1條視訊+1篇文章地更新,到目前共50餘個小作品。在此整合出來供大家複習輔助,也可直接在B站和公號收看。眾少成多,積小致鉅。祝好運! 高數篇·視訊 Vol.1 等價無窮小替換(泰勒展開) Vol.2 第一類換元積分法
微信小程式開發--『側邊欄滑動』特效
側邊欄滑動是很常見的功能,但是小程式出來不久,很多特效還沒有成熟案例,只能原生重寫,所以今天為大家帶來4個漂亮的側邊欄特效~~ 側邊欄特效一 先看效果: Wxml: <view class="page"> <
飛跑的小豬的專欄
WINDOWS的鉤子函式可以認為是WINDOWS的主要特性之一。利用它們,您可以捕捉您自己程序或其它程序發生的事件。通過“鉤掛”,您可以給WINDOWS一個處理或過濾事件的回撥函式,該函式也叫做“鉤子函式”,當每次發生您感興趣的事件時,WINDOWS都將呼叫該函式。一共有兩種
小程序開發探秘:『 小程序·雲開發 』新功能“雲調用”上手體驗
配置服務 ces 希望 data 消息 觸發 從數據 所有 tom 近期微信『 小程序·雲開發 』悄悄的上線了一個叫做“雲調用”的新功能。 從文檔上看,雲調用是基於雲函數使用小程序開放接口的能力,在雲函數中使用雲調用來調用服務端
[Luogu P2973&BZOJ 1778][USACO10HOL]趕小豬DOtP(高斯消元+期望)
http ios iostream 爆炸 head swa sca 選擇 main Description 一個無向圖,節點1有一個炸彈,在每個單位時間內,有可能在這個節點炸掉,也有p/q的概率隨機選擇一條出去的路到其他的節點上。問最終炸彈在每個節點上爆炸的概率。 So
抓取小豬短租1000張列表頁內容
pre quest 個數 import rom lxml zip .text with 代碼如下 #!/usr/bin/env python# -*- coding:utf-8 -*-from bs4 import BeautifulSoupimport requestsd
小豬外送系統O2O快店多人極速拼單,點單應該這樣玩!
小豬外送系統 O2O快店 快店一直是小豬生活通O2O系統中使用頻率最高的模塊之一。所以,小豬O2O技術人員在不斷優化細節功能的同時,也在持續開發新功能,讓快店模塊能夠滿足更多的平臺及商家的運營需求。 近日,小豬生活通O2O為快店業務增加了一項全新功能——多人點單。
小豬智慧店鋪門店管理系統開發,員工權限分配更統一細致
小豬智慧店鋪 門店管理系統開發 小豬智慧店鋪門店管理系統開發,員工權限分配更統一細致 細致的門店管理權限分配,是小豬智慧店鋪一大運營亮點。門店商家可以依據自己的管理需求,對旗下員工分配具體的操作權限,比如會員管理、收銀、物料管理等等。 為方便商家快速分配員工相關權限,
小豬零售收銀系統開發 構建新零售商業模式
零售收銀系統開發 小豬電商 小豬零售收銀系統開發 構建新零售商業模式 隨著新零售時代的到來,線上線下融合趨勢增強。如何讓線下實體門店快速搶灘新零售市場、構建新零售商業模式? 小豬電商新推出零售收銀臺,從收銀環節打通線上線下數據融合互通,幫助線下實體門店快速開展新零售業務,為客戶提供
小豬CMS線下沙龍完美閉幕,開啟合作共贏新征程!
小豬CMS 線下沙龍 小豬CMS線下沙龍完美閉幕,開啟合作共贏新征程! 2017年6月13日,小豬CMS線下沙龍交流會在中國·合肥隆重召開。來自全國各地的互聯網創業者、小豬智慧店鋪代理商客戶們濟濟一堂,共同學習和探討移動互聯網趨勢下,行業如何實現經營模式轉型、高效開展業務,以及門店如何快速
小豬的數據結構輔助教程——2.4 線性表中的循環鏈表
linklist tro listt his alloc ret 線圖 循環鏈表 exit 小豬的數據結構輔助教程——2.4 線性表中的循環鏈表
『科學計算_理論』最大似然估計
width 我們 註意 logs 概率 -s 分享 pan 技術 概述 通俗來講,最大似然估計,就是利用已知的樣本結果,反推最有可能(最大概率)導致這樣結果的參數值。 重要的假設是所有采樣滿足獨立同分布。 求解模型參數過程 假如我們有一組連續變量的采樣值(x1,x2,…,x
微軟“小冰”識狗與人工神經網絡(I)
識別 content 如何 size weight class ack ng- 培訓 2014年8月21日,微軟“小冰”網絡機器人推出了一項圖像識別技能;“小冰識狗”。“小冰”怎麽會“識狗”呢? 依據微軟方面的說法,僅僅要“小冰”用戶“
抓取小豬短租列表內容並保存在mongodb裏
抓取 select requests orm com titles mongod lin ges import pymongoimport requestsfrom bs4 import BeautifulSoupclient = pymongo.MongoClient(‘
老秦『十裏桃花招商』Q849852
桃花 十裏 招商 老秦『十裏桃花招商』Q849852十裏桃花招商老秦是一個信譽至上的上級,對下級更是無私的教導十裏桃花招商老秦秉持著賺錢一起賺的心態!十裏桃花招商老秦把下級當做是兄弟、是親人、更是最重要的工作夥伴!十裏桃花招商老秦在市場已經混了六年,信譽更是無庸置疑!十裏桃花招商老秦團隊目前已有二
洛谷 P3904 三只小豬
efi 方案 str pic 分配 破壞 urn 文件 esp 題目背景 你聽說過三只小豬的故事嗎?這是一個經典的故事。很久很久以前,有三只小豬。第一只小豬用稻草建的房子,第二個小豬用木棍建的房子,第三個小豬則使用磚做為材料。一只大灰狼想吃掉它們並吹倒了稻草和木棍建的房子。
『淺入深出』MySQL 中事務的實現
一點 隨著 保留 partially 並不會 它的 事件 all previous 在關系型數據庫中,事務的重要性不言而喻,只要對數據庫稍有了解的人都知道事務具有 ACID 四個基本屬性,而我們不知道的可能就是數據庫是如何實現這四個屬性的;在這篇文章中,我們將對事務的實現進
『淺入淺出』MySQL 和 InnoDB
分享圖片 忽略 位置 現在 連續 適合 如果 聚集 快速 作為一名開發人員,在日常的工作中會難以避免地接觸到數據庫,無論是基於文件的 sqlite 還是工程上使用非常廣泛的 MySQL、PostgreSQL,但是一直以來也沒有對數據庫有一個非常清晰並且成體系的認知,所以最近
系統設計之可憐的小豬
cond ive ner ffi 設計 wait ram make div With 2 pigs, poison killing in 15 minutes, and having 60 minutes, we can find the poison in up to 2