助教:胡光能,解定宝 编译原理讲师:戴新宇

Slides:



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

盈泰盛世精选 - 华泰并购投资基金 宝蓄财富 - 产品部. 产品基本要素 产品名称盈泰盛世精选华泰并购投资基金 管理人北京恒宇天泽投资管理有限公司 托管人国信证券股份有限公司 发行规模 1.2 亿元,以实际募集规模为准 人数限制 200 人上限 投资标的本基金委托将主要投向于华泰瑞联二期并 购基金中心(有限合合)(以企业登记的.
第1单元 操作系统概论 第一节 绪论 操作系统定义.
行程(process).
健康選擇飲品 營養師 顏妤蓉 2017/3/13.
任课老师:戴新宇 助教: 实验一 词法分析和语法分析 任课老师:戴新宇 助教: 2014年3月20日.
第一章 C语言概述 计算机公共教学部.
项目五——校园一卡通程序功能模块化设计 5-1项目显示查询和退出函数设计.
第三章 鏈結串列 Linked List.
编译原理上机实习
Introduction to Lex 電資三 B 盧逸峮
编译原理(H) 第一次习题课.
第8章 字元與字串處理 8-1 C語言的字元檢查函數 8-2 C語言的字串 8-3 字串的輸入與輸出 8-4 指標與字串
南京天石软件技术有限公司 陈锺 (QQ: Solaris 10 C编程 南京天石软件技术有限公司 陈锺 (QQ:
複習 struct score_Type{ int chinese,english; }; struct my_Type{
7 Intermediate Representation
高级语言程序设计 主讲人:陈玉华.
Compilers Flex & Bison 的安裝使用
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
2.2 语法分析器生成器YACC 分析器的构造步骤: 产生式→识别活前缀的DFA→分析表(+驱动器) YACC概述
chapter 1-Introduction
編譯環境介紹.
Lexical analyzer generator
编译与多文件.
第十一章 文件 文件概述 文件操作 文件操作实例 本章小结 作业: 练习:
程序讲解 第一题: 将指定文件的m行到n行字符写到显示屏上,m和n值从键盘输入。 运行时输入及结果: please enter m,n:
第12章 樹狀搜尋結構 (Search Trees)
第一章 C語言概論 本章投影片僅供本書上課教師使用,非經同意請勿拷貝或轉載.
Function.
第三章 词法分析.
第2次课 上下文无关文法
词法&语法解析.
编译原理与技术 词法分析 (2) 2018/12/30 《编译原理与技术》讲义.
Linux操作系统分析 中国科学技术大学计算机系 陈香兰(0512- )
陈海明 副教授 信息学院 计算机系 电子信息类非计算机专业选修课 程序设计实践 陈海明 副教授 信息学院 计算机系
THE C PROGRAMMING LANGUAGE
第9章 文件操作 文件 使用文件的目的 操作系统管理数据的基本单位 存储在外存储器上的数据的集合
TinyOS开发环境安装 基于Ubuntu14.04.
Linux核心編譯與模組管理 2013/01/19.
谭浩强 编著 中国高等院校计算机基础教育课程体系规划教材 C++程序设计.
语法分析 本章内容 语法分析器:把词法分析生成的词法单元流翻译成语法分析树(parse tree)
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第4讲 C++程序控制结构(二) 4.1 循环结构 4.2 转向控制 4.3 综合案例分析.
第二章 词法分析4 词法分析程序实现 构造词法分析器步骤 单词的形式化描述 词法分析程序的实现.
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
7.1 广义表的概念 广义表是n(n≥0)个数据元素组成的序列,其中每个数据元素或是单个数据元素(简称原子),或仍然是一个广义表 。
Oop8 function函式.
C標準輸出入函數庫 與 作業系統.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
本节内容 文件读写 视频提供:昆山爱达人信息技术有限公司.
第一章 C语言概述 目录 什么是语言、程序 C语言的历史与发展 C语言的书写形式与程序结构 运行C语言的步骤与方法
第二章 类型、对象、运算符和表达式.
本节内容 引用类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
实验二:添加Linux系统调用及熟悉常见系统调用
第四章 语法分析 南京大学计算机系 戴新宇
提昇教師專業會議(華人社區) 「教師專業行為表現」專題討論 學生和家長眼中的教師專業行為 日期:2005年10月29日 地點:香港教育學院C-Lp-01室 主講 :香港教育工作者聯會 韓湛恩老師.
作業一: 安裝Linux於btrfs上 中正大學 作業系統實驗室 指導教授:羅習五
编译原理 第一章 引 论 南京大学计算机科学与技术系 戴新宇.
第6章 嵌入式软件开发基础.
编译原理实践 7.PL/0的词法分析程序构造.
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
國立臺灣大學臺灣通識網推廣中心計畫 教育部通識教育資源平台建構與永續發展計畫
编译原理实践 --词法分析程序的自动生成器LEX
Introduction to the C Programming Language
C语言基础学习 从外行到入门.
Presentation transcript:

助教:胡光能,解定宝 编译原理讲师:戴新宇 hugn@nlp.nju.edu.cn 实验一 讲解 with pure C 助教:胡光能,解定宝 编译原理讲师:戴新宇 hugn@nlp.nju.edu.cn 2014年3月20日

Phases of a Compiler Lexical Analyzer Syntax Analyzer Symbol Table Char Stream Token Stream Syntax Tree Semantic Analyzer Intermediate Code Generator Code Generator Machine Code 实验目的:实现类C(C--)语言的编译器 四个阶段:【词法分析和语法分析】,语义分析,中间代码生成,机器代码生成 http://www.stanford.edu/class/archive/cs/cs143/cs143.1128/lectures/00/Slides00.pdf Symbol Table

Outline 提交说明 实验任务(必做 + 选做) 编译环境及过程 实验讲解 词法分析与flex 语法分析与bison 文法二义性消除 语法树创建与打印 文法符号结点的数据结构 语法解析的错误恢复 本次实验任务:输入:C--源文件;输出:C--语法分析树

提交说明 地址:ftp://114.212.190.181: 31 用户名和密码:upload 格式:学号命名的压缩包 (zip/rar) 内容: 源程序(ex1.l, ex1.y; 额外的.c文件) 可执行程序(命名为 parser) 报告PDF(完成的功能点,编译步骤,实现方法,结点的数据结构表示;不超过3页) 备注:可重新提交,加后缀 _02, _03

实验任务 必做: 选做: 预备:熟悉 C--文法和实验要求 错误类型1: 词法错误(词法未定义字符) 错误类型2: 语法错误(如[3,9]) 选做1:两种风格的注释://, /* */ 选做2:八进制数:012 选做3:十六进制:0xa, 0Xa, 0xA, 0XA 选做4:指数形式的浮点数:1E1, 01e1

编译环境及过程 ./parser test.c //测试命令 GNU Flex, GNU Bison, GCC, Linux Ubuntu sudo apt-get install flex sudo apt-get install bison 源文件{ex1.l, ex1.y}  可执行程序parser Flex: ex1.l  lex.yy.c Bison: ex1.y  ex1.tab.c GCC: *.c  parser ./parser test.c //测试命令

-ll: lib of lex -lfl: lib of flex -ly: lib of yacc 编译 方法 Flex lex.yy.c ex1.l Bison ex1.tab.c ex1.y GCC parser flex ex1.l bison -d ex1.y gcc -o parser ex1.tab.c -ll (-lfl) http://stackoverflow.com/questions/1553744/how-does-gcc-recognize-that-lfl-corresponds-to-flex-library -ll: lib of lex -lfl: lib of flex -ly: lib of yacc

Flex & Bison #include “ex1.tab.h” #include "lex.yy.c" %{ ex1.l Declarations #include “ex1.tab.h” %} Definitions (RegEx) %% Rules subroutines (e.g main) %{ ex1.y Declarations #include "lex.yy.c" %} Definitions (%Token) %% Productions subroutines http://dinosaur.compilertools.net/ http://www.stanford.edu/class/archive/cs/cs143/cs143.1128/handouts/050%20Flex%20In%20A%20Nutshell.pdf http://www.stanford.edu/class/archive/cs/cs143/cs143.1128/handouts/120%20Introducing%20bison.pdf

启动语法分析器 int main(int argc, char** argv){ if(argc <= 1) return 1; FILE* f = fopen(argv[1],"r"); if(!f) { perror(argv[1]); return 1; } yyrestart(f); //输入文件指针置为 yyin = f yyparse(); //main函数启动解析器 return 0; } 从main函数中启动语法解析器

Flex预定义变量 yytext, yyleng: 词素字符串 yylineno: %option yylineno yylval: 全局变量,当前词法单元的属性值 {id} { strncpy(id_lexeme, yytext, yyleng); yylval.pNode = createNode( …); return ID; } http://cs.nju.edu.cn/changxu/2%20compiler/projects/%E6%8C%87%E5%AF%BC%E6%94%BB%E7%95%A5%201.pdf %union { int val ; char* str; struct Node* pNode; }

保留字和标识符 %{ Declarations %} Definitions %% Rules //将保留字置于标识符{id}之前 subroutines

文法二义性: 操作符优先级与结合性 %{ Declarations %} Definitions //优先级与结合性 %% Productions subroutines %right ASSIGNOP %left AND %left RELOP %left PLUS MINUS %left STAR DIV %right NOT UMINUS %left DOT LB RB LP RP Exp | MINUS EXP %prec UMINUS

文法二义性: IF-ELSE配对 Stmt: IF LP Exp RP Stmt | IF LP Exp RP Stmt ELSE Stmt %nonassoc IFX %nonassoc ELSE Stmt: IF LP Exp RP Stmt %prec IFX | IF LP Exp RP Stmt ELSE Stmt

语法树创建与打印 多叉树的构建: struct Node* createNode(int arity, …); 递归层次的前序遍历 Exp : ID { $$ = createNode($1); } Exp : MINUS EXP { $$ = createNode($1,$2); } #include<stdarg.h> struct Node* createNode(int arity, …); 递归层次的前序遍历 void printNode(struct Node* root, int nLayer); printf http://www.cplusplus.com/reference/cstdarg/va_start/

文法符号结点的数据结构 保存的信息:struct Node{ … }; 结点类型: 非终结符,终结符(数, 标识符…) 结点名字: Exp,TYPE,ID 所在行号: %option yylineno 字符串属性值:TYPE.int,ID.lexeme 数值属性值:INT,FLOAT 多叉树孩子:int arity, struct Node* children[N]; //vector<Node*> -…(可扩展) Pure C implementation

yyerror(char* str){ printf(“syntax error\n”); } 语法解析的错误恢复产生式 Bison在当前状态对yylex()返回的token没有定义 时即发生了语法错误,调用yyerror: yyerror(char* str){ printf(“syntax error\n”); } Bison不断丢弃词法单元直至遇到同步 单元 (例如:分号,右括号 ) 机制:错误恢复产生式 Stmt: error SEMI 本科教学版:4.9.4 P175 http://oreilly.com/linux/excerpts/9780596155971/error-reporting-recovery.html

参考资料 Aho 编译原理: 斯坦福 编译原理: 指导攻略: 可变参数个数: 错误恢复: http://dinosaur.compilertools.net/ 斯坦福 编译原理: http://www.stanford.edu/class/archive/cs/cs143/cs143.1128/handouts/050%20Flex%20In%20A%20Nutshell.pdf http://www.stanford.edu/class/archive/cs/cs143/cs143.1128/handouts/120%20Introducing%20bison.pdf 指导攻略: http://cs.nju.edu.cn/changxu/2%20compiler/projects/%E6%8C%87%E5%AF%BC%E6%94%BB%E7%95%A5%201.pdf 可变参数个数: http://www.cplusplus.com/reference/cstdarg/va_start/ 错误恢复: http://oreilly.com/linux/excerpts/9780596155971/error-reporting-recovery.html