編譯器開發系列--Ocelot語言1.抽象語法樹

来源:http://www.cnblogs.com/joey-hua/archive/2016/12/17/6189404.html
-Advertisement-
Play Games

從今天開始研究開發自己的編程語言Ocelot,從《自製編譯器》出發,然後再自己不斷完善功能並優化。 編譯器前端簡單,就不深入研究了,直接用現成的一款工具叫JavaCC,它可以生成抽象語法樹,抽象語法樹是生成中間代碼的關鍵,而中間代碼又是生成後端代碼的關鍵。 整個編譯器代碼採用java語言編寫,主要功 ...


從今天開始研究開發自己的編程語言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.縮進表示該節點被前一個節點引用。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.獲取jQuery mobile 文件,訪問jQuerymobile網站下載 (貌似使用jquery mobile後,jquery會自動在網頁中添加一些class類,第一次知道的我是被嚇呆的!!) 2.需要使用數據屬性,數據屬性是HTML5引入的,以data-開頭 比如data-role可以用於定 ...
  • fullpage.js 是一個基於jquery 的插件,它能夠輕鬆的製作出高大上的全屏網站,主要功能有; 1.支持滑鼠滾動 2.支持前進後退和鍵盤控制 3.多個回調函數 4.支持 CSS3 動畫 5.可設置滾動寬度、背景顏色、滾動速度、迴圈選項、回調、文本對齊方式等等。 實現的原理: 1. 視窗大小 ...
  • (未給Fragment的佈局設置BackGound) 之前關於Android中Fragment的概念以及創建方式,我專門寫了一篇博文《Android中Fragment的兩種創建方式》,就如何創建Fragment混合佈局做了詳細的分析,今天就來詳細說道說道Fragment與宿主Activity之間是如 ...
  • 設計思路:給UIView增加一個分類 所有的視圖都可以根據需要來進行紅點顯示 ...
  • 在OC當中自動計算行高主要調用系統的 - (--boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSString *, id> *) ...
  • GridView 可以指定顯示的條目的列數。 listview一般顯示的條目的列數都是一列 如果是列表(單列多行形式)的使用ListView,如果是多行多列網狀形式的優先使用GridView android:numColumns=”auto_fit” //GridView的列數設置為自動 GridV ...
  • 現在二維碼的應用越來越普及,二維碼掃描也成為手機應用程式的必備功能了。本文將基於 Xamarin.Android 平臺使用 ZXing.Net.Mobile 做一個簡單的 Android 條碼掃描示常式序。 1、新建一個 Xamarin.Android 應用: 閱讀全文 ...
  • 苦心人天不負, 為了項目終於把 iOS 10 跳轉系統設置的方法給搞定了, 很欣慰. http://www.cnblogs.com/lurenq/p/6189580.html iOS 10 跳轉系統設置的欄位 電池電量 Prefs:root=BATTERY_USAGE 通用設置 Prefs:root ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...