a simplified C to Java Compiler

Slides:



Advertisements
Similar presentations
邱锡鹏 复旦大学计算机科学技术学院 Text Books  “Dragon book”  Compilers: Principles, Techniques, and Tools (2nd Edition)  Alfred V. Aho;Monica S.
Advertisements

6. 6 Overloading methods and constructors 6
基本概論 Basic concepts.
翰林版國文第三冊第六課 《迢迢牽牛星》 設計者:郭宜幸.
毛峰教授 北京师范大学教授,博士生导师 国家社科基金项目专家 北京华文教育顾问
‘‘色彩計畫 期末作業’’ 企業色彩識別系統分析 4950Z003 陳美菱 4971C001 林立婷 指導老師:呂裕文.
编译原理上机实习
第4章 VHDL设计初步.
Principles and Applications of the Database
各位领导、各位专家上午好! 对你们的到来,双多公司全体干部员工表示热烈的欢迎.
第4章 JavaScript脚本语言基础 4.1 JavaScript简介 4.2 JavaScript语法基础
14 JavaScript语言基础 JavaScript是一种轻量级、解释型的Web开发语言。所谓轻量级,就是语言的体系结构不是很庞杂,例如,没有C、Java等语言中的类、内存管理、系统管理等高深的知识范畴;所谓解释型,就是语言在浏览器或服务器等环境中直接被解释执行,不需要对源代码进行编译操作。
光隆家商 優質化計畫 簡報 校 長 楊瑞明 教務主任 高美麗
程設一.
定期定額該積極還是穩健 積極型獲利高,穩健型風險低 財富想倍增,就要選擇波動愈大的積極型基金,愈
新世代計算機概論 第14章 程式語言.
Introduction to Lex 電資三 B 盧逸峮
! 温故知新 上下文无关文法 最左推导 最右推导 自上而下 自下而上 句柄 归约 移进-归约冲突 移进-归约分析 递归下降预测分析
基隆區創意發展校園 簡報 光隆家商校長 楊瑞明 光隆教務主任 高美麗
C# 程式設計 第一部分 第1-4章 C# 程式設計 - 南華大學資管系.
程設一.
程式設計實作.
Operating System Concepts 作業系統原理 Chapter 3 行程觀念 (Process Concept)
7 Intermediate Representation
基于双数组Trie(Double-Array Trie)的词典查询算法
物件導向程式設計 (Object-Oriented rogramming)
2.2 语法分析器生成器YACC 分析器的构造步骤: 产生式→识别活前缀的DFA→分析表(+驱动器) YACC概述
陳維魁 博士 儒林圖書公司 第七章 參數的傳遞 陳維魁 博士 儒林圖書公司.
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
指令集架構 計算機也跟人類一樣,需要提供一套完整的語言讓人們跟它充分溝通,以完成正確的計算工作。
第一次随堂作业(10.16) 请用扩展的 BNF 描述 C语言里语句的结构; 请用扩展的 BNF 描述 C++语言里类声明的结构;
EBNF 请用扩展的 BNF 描述 C语言里语句的结构; 请用扩展的 BNF 描述 C++语言里类声明的结构;
编译原理与技术 类型检查 2018/11/21 《编译原理与技术》-类型检查.
實作輔導 日期: 3/11 09:10~16:00 地點:臺北市立大學 臺北市中正區愛國西路一號 (中正紀念堂站7號出口)
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
第3章 語法入門 第一個Java程式 文字模式下與程式互動 資料、運算 流程控制.
助教:胡光能,解定宝 编译原理讲师:戴新宇
課程名稱:資料庫系統 授課老師:李春雄 博士
程序设计期末复习 黎金宁
C 語言簡介 - 2.
第3章 變數、常數與資料型態 3-1 C語言的識別字 3-2 變數的宣告與初值 3-3 指定敘述 3-4 C語言的資料型態
條件判斷指令 -if 指令 -switch 指令 迴圈指令 - for 迴圈 - while迴圈 - break、continue 指令
第2次课 上下文无关文法
词法&语法解析.
重點 資料結構之選定會影響演算法 選擇對的資料結構讓您上天堂 程式.
Visual Basic 6.0 ——程序设计.
Java程序设计 第2章 基本数据类型及操作.
第3章 認識處理元.
陳維魁 博士 儒林圖書公司 第五章 控制結構 陳維魁 博士 儒林圖書公司.
資料結構 Data Structures Fall 2006, 95學年第一學期 Instructor : 陳宗正.
第3章 Java語法的JSP程式 3-1 Java語言的基礎 3-2 JSP程式的基本架構 3-3 Java的變數與資料型態
105-1 Data Structure Exam /12/27.
软件工程 第四章 软件设计 软件过程设计技术与工具.
软件设计任务 从工程管理的角度来看,软件设计分两步完成。 概要设计,将软件需求转化为数据结构和软件的系统结构。
中国科学技术大学计算机系 陈香兰 2013Fall 第七讲 存储器管理 中国科学技术大学计算机系 陈香兰 2013Fall.
为全面推进深化医药卫生体制改革,积极稳妥推进公立医院 改革,逐步建立我国医院评审评价体系,促进医疗机构加强自身 建设和管理,不断提高医疗质量,保证医疗安全,改善医疗服务, 更好地履行社会职责和义务,提高医疗行业整体服务水平与服务 能力,满足人民群众多层次的医疗服务需求,在总结我国第一周 期医院评审和医院管理年活动等工作经验的基础上,我部印发了.
有效執行 邁向成功的階梯 ( 摘錄自李開復先生著作 :做最好的自己 ).
学生干部角色的定位与转换 肖志文 2013年9月16日.
Linked Lists Prof. Michael Tsai 2013/3/12.
陳維魁 博士 儒林圖書公司 第三章 變數與繫結 陳維魁 博士 儒林圖書公司.
考前总结 背景 必要性 作用 新旧版交替面临一些问题 从教学目标和要求说起 知识梳理 可能有助于提高考试成绩 或者让知识掌握得更好.
開放電腦計劃 報告人:陳鍾誠 2011 年 8 月 20 日 台灣開源人年會 COSCUP 2011 – 中研院
习题课 编译原理与技术 计算机科学与技术学院 李诚.
Create and Use the Authorization Objects in ABAP
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A Lab7.
Go 语言编程 —— 平台研发部 吴植民.
第6章 详细设计 Detailed Design
C# 匿名委派 + Lambda + Func 建國科技大學 資管系 饒瑞佶.
编译原理 第一章 引 论 南京大学计算机科学与技术系 戴新宇.
陳維魁 博士 儒林圖書公司 第六章 領域與範圍 陳維魁 博士 儒林圖書公司.
Presentation transcript:

a simplified C to Java Compiler Compiler Term Project MilkTea a simplified C to Java Compiler NTUCSIE, B86506010 吳介元 B86506054 林軒田

Scanner 我們的 Scanner 使用 flex 製作 特別的地方有: 字串部分是採用Hand Coding,原因是若採用flex來處理,須表示成regular expression,而且有escape character要處理(如:\\、\“ ),所以該部分的code是自己處理的。 字元部分也可處理escape character

Scanner(continue) 關於 Identifier 部份,為了解決 Parser 所出現的 Conflict, 我們使用 Semantic-Feedback Scanning,即在 Scanning 時依目前 Semantic 的狀況回傳不同的資訊,區分為IDENTIFIER、FIDENTIFIER、TIDENTIFIER,code節錄如下:

Scanner(continue) [a-zA-Z_]+[a-zA-Z0-9_]* { yylval.StringValue = new TString(yytext); if (IsTypeName(yylval.StringValue)) return TIDENTIFIER; else if (IsFuncName(yylval.StringValue)) return FIDENTIFIER; else return IDENTIFIER; }

Scanner(continue) System support functions 由 scanner 直接判斷讀入,以節省在 Symbol Table 中搜尋與判斷的時間,如 printint, printfloat, malloc 等,但缺點是擴展性較差。

Parser Parser 使用 bison 製作,由於使用 LR-parsing,在幾個常見的 C 語法會出現 Conflict,列舉如下: If-then-else,即 Dangling-else 的問題。在 bison(yacc)中提供了使用 precedence 的標準作法。即讓有 ELSE (需 shift)的 Rule 優先序高於無 ELSE (需 reduce)的來解決。

Parser(continue) Struct Dec List, Func Dec List, GlobalVar Dec List, Func Body List的區塊,由於可能有相近的開頭(struct IDENTIFIER)而使 parser 無法 lookahead 出其屬於哪一種而出現 reduce/reduce conflict。即如下的 Grammar: Program : StructDecList FuncDecList GlobalVarDecList FuncBodyList StructDecList: Lambda | StructDecList StructDec … 不是一個 LR Grammar,所以我們把它 Modify 成如下的 Grammar:

Parser(continued) 但如此 Semantic 時需作 check 以確定 Program 是照著我們預期的順序寫成。 Program: InfoList InfoList: Lambda | InfoList Info Info: StructDec | FuncDec | GlobalVarDec | FuncBody 但如此 Semantic 時需作 check 以確定 Program 是照著我們預期的順序寫成。

Parser(continued) 由於允許 Pointer 宣告的存在,因此如下的語法會出現 Conflict Complex* x; A*b; 用標準 C 語法宣告可以避開這個問題,另外我們在 scanner 中作了 IDENTIFIER 類別的判斷也可以讓我們對 Semantics 的定義更輕鬆。 struct Complex* x;

Semantics Semantics 端可以分為三個部份,首先是 SymbolTable 的建立與操作。 我們的 Symbol Table 使用自訂的 Hash Table,在每個 Scope 中有自己的 Symbol Table 來作區別,因此 Variable binding 的動作可以透過 Display 式的尋找而得到。 而 Type、GlobalVar、FuncDec則置於 GlobalSymbTbl 中,並同時供 Scanner 作 IDENTIFIER 類別的判斷。 Symbol Table 所存的 Symbol Attribute 是以 Object-oriented 的架構配合 RTTI 來判斷該 Attribute 屬於哪一種 Symbol

Semantics(continued) Type 則可透過 Symbol Table 中的 Key 來找到,一樣使用 Object-oriented 和 RTTI。值得注意的是我們把一個 Type 的 Pointer Attribute 掛在 Original Type 的一個欄位中(可以當作 Original Type 的,Primitive Type/Struct Type 則被稱為 TypeWithPointer) Array Type 則存有其 Base 和 Length,但不允許有 Pointer

Semantics(continued) 第二部份是 Expression。我們的 Expression 作法如下: 利用了 Java VM 的特性,以 Stack Variable 來當作運算暫存值存放的地方,因此不用寫入多餘的 Local Variable。 要達成這樣的作法,每個 Expression SubTerm 得在適當的時間被載入Stack(即已確定要取其值的時候)。被載入的時機,不外乎是 Do Operation 的時候,為了達成這樣的目的,我們 Modify 了 Action Symbol 的位置:

Semantics(continued) Add: Exp1 + { Exp1 need to be generated here } Exp2 { Exp2 generated, do add } 但如此還有一個問題,如果 Exp1 和 Exp2 的 Type 不同而 Exp1 要作 Type Coercion 呢?這時 do add 就必須把 Exp1 Swap 上來、do coercion、Swap 回去、do add。 因此,每個 Expression Record 會帶有這個 Expression 的狀態(Var、Owner on Stack 的Field、Array Info on Stack 的 ArrayPos、Value on Stack)以讓其後的 Expression 判斷是否要載入(或在 Assignment 中要 Load)

Semantics(continued) 但在 C 中,值得注意的是 Assignment 被視為 Expression,即在 JVM 中,作完 Assign 還需要留一份值在 Stack 上,因此我們 Modify 了 Assign 的動作如下: Make sure the location of assgnment is known Dup the location of assignment Do assign Do load

Semantics(continued) 還有,C 中的 Logic Expression 有作 Short-cut Evaluation,所以 Evaluate Logic Expression 的動作實際上應被展成判斷的程式碼。這部份需要大量的 if 和 label 來配合。 第三部份是 Control Structure。為了避免 Code 排列的問題,我們所有的 Control Structure 的 Code Generation 順序都與其在 C 中的書寫順序相同,大致結構如下:

Semantics(continued) if(Exp) State Exp==0 ….EndIf State EndIf: if(Exp) State1 else State2 Exp==0 …. EndIf State1 EndIf: …. EndElse StartElse: State2 EndElse:

while(Exp) State do State while(Exp) StartWhile(continue): Exp==0 …. EndWhile State …. StartWhile EndWhile(break): do State while(Exp) StartDo(continue): State Exp!=0 …. StartDo EndDo(break):

Semantics(continue) switch(E1) Lstate for(E1;E2;E3) State Check: E2 …. StartFor/EndFor UpDate(continue): E3 …. Check StartFor: State …. UpDate EndFor(break): switch(E1) Lstate Branched as many if’s break to end of switch

Semantics 其他有關特殊的 Semantics 設計有 Object Allocation as in C Copy initializer of structures similar to C Struct Type Pointer accessing