編輯:關於android開發
從今天開始研究開發自己的編程語言Ocelot,從《自制編譯器》出發,然後再自己不斷完善功能並優化。
編譯器前端簡單,就不深入研究了,直接用現成的一款工具叫JavaCC,它可以生成抽象語法樹,抽象語法樹是生成中間代碼的關鍵,而中間代碼又是生成後端代碼的關鍵。
整個編譯器代碼采用java語言編寫,主要功能是對JavaCC生成的抽象語法樹進行語義分析、優化,最後生成優化後的匯編代碼,然後再用匯編器對匯編代碼匯編生成機器碼,最後再用命令鏈接生成Linux可執行文件,就可以直接在Linux上運行了。
整個編譯器采用的語法基本上都是C語言的語法,去除掉一些語法成C語言簡化版,而且原項目並無優化。我想做的是在原項目的基礎上對其各種優化並使其支持垃圾回收。- -!有的玩了。
抽象語法樹和其節點都是繼承自Node類。介紹一下Node 類群的繼承層次:



再來通過一個簡單的helloworld小demo來查看抽象語法樹的結構,demo如下所示:
int main(int argc, char **argv)
{
int i, j = 5;
if (i) {
return (j * 1 - j);
}
else {
exit(1);
}
}
編譯器項目運行後生成的抽象語法樹如下所示:
<<AST>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:1)
variables:
functions:
<<DefinedFunction>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:1)
name: "main"
isPrivate: false
params:
parameters:
<<Parameter>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:1)
name: "argc"
typeNode: int
<<Parameter>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:1)
name: "argv"
typeNode: char**
body:
<<BlockNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:2)
variables:
<<DefinedVariable>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:3)
name: "i"
isPrivate: false
typeNode: int
initializer: null
<<DefinedVariable>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:3)
name: "j"
isPrivate: false
typeNode: int
initializer:
<<IntegerLiteralNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:3)
typeNode: int
value: 5
stmts:
<<IfNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:4)
cond:
<<VariableNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:4)
name: "i"
thenBody:
<<BlockNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:4)
variables:
stmts:
<<ReturnNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:5)
expr:
<<BinaryOpNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:5)
operator: "-"
left:
<<BinaryOpNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:5)
operator: "*"
left:
<<VariableNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:5)
name: "j"
right:
<<IntegerLiteralNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:5)
typeNode: int
value: 1
right:
<<VariableNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:5)
name: "j"
elseBody:
<<BlockNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:7)
variables:
stmts:
<<ExprStmtNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:8)
expr:
<<FuncallNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:8)
expr:
<<VariableNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:8)
name: "exit"
args:
<<IntegerLiteralNode>> (G:\編譯原理\自制編譯器\源碼\test\hello.cb:8)
typeNode: int
value: 1
1.<<AST>> 和<<DefinedFunction>> 表示節點的類名。
2.右側所顯示的(G:\編譯原理\自制編譯器\源碼\test\hello.cb:1) 是該節點對應的語法所記載的文件名和行號。
3.縮進表示該節點被前一個節點引用。
Android音樂播放器源碼(歌詞.均衡器.收藏.qq5.0菜單.通知),android.qq5.0
Android音樂播放器源碼(歌詞.均衡器.收藏.qq5.0菜單.通知),android.qq5.0一款Android音樂播放器源碼,基本功能都實現了 qq5.0菜單(歌
自定義Android組件之組合方式創建密碼框組件
自定義Android組件之組合方式創建密碼框組件 Android中所有控件(也稱組件)都繼承自adnroid.view.View類,android.view.View
閱讀《Android 從入門到精通》(14)——時間選擇器
閱讀《Android 從入門到精通》(14)——時間選擇器 時間選擇器(TimePicker) java.lang.Object; android.view.View;
48.Android 標簽TextView的點擊技巧
48.Android 標簽TextView的點擊技巧 48.Android 標簽TextView的點擊技巧 Android 標簽TextView的點擊技巧 前言 Clic
運用安卓CreateOptionsMenu和onCreateContextMenu菜單,模擬微信聊天界面長按彈出菜單選項。,oncreateoptionsmenu
運用安卓CreateOptionsMenu和onCreateContex