任课老师:戴新宇 助教: 尚迪(shangd@nlp.nju.edu.cn) 胡光能(hugn@nlp.nju.edu.cn) 实验一 词法分析和语法分析 任课老师:戴新宇 助教: 尚迪(shangd@nlp.nju.edu.cn) 胡光能(hugn@nlp.nju.edu.cn) 2014年3月20日.

Slides:



Advertisements
Similar presentations
While 迴圈 - 不知重複執行次數
Advertisements

親愛的老師您好 感謝您選用本書作為授課教材,博碩文化準備本書精選簡報檔,特別摘錄重點提供給您授課專用。 說明: 博碩文化:
“八皇后”问题 崔萌萌 吕金华.
安 全 維 護 臺 東 林 區 管 理 處 消費安全 詐騙防範宣導 健康生活 毒家新聞 杜絕不明匯款及金融轉帳操作
健康選擇飲品 營養師 顏妤蓉 2017/3/13.
第三章 鏈結串列 Linked List.
编译原理上机实习
Introduction to Lex 電資三 B 盧逸峮
编译原理(H) 第一次习题课.
複習 struct score_Type{ int chinese,english; }; struct my_Type{
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
Linked List Operations
單向鏈結串列 Singly Linked Lists.
高级语言程序设计 主讲人:陈玉华.
第一章 C语言概述.
Compilers Flex & Bison 的安裝使用
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
2.2 语法分析器生成器YACC 分析器的构造步骤: 产生式→识别活前缀的DFA→分析表(+驱动器) YACC概述
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
快速排序法 (Quick Sort).
編譯環境介紹.
C 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
助教:胡光能,解定宝 编译原理讲师:戴新宇
Lexical analyzer generator
第12章 樹狀搜尋結構 (Search Trees)
C++ 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
编译原理与技术 2018/11/30 《编译原理与技术》讲义.
第三章 词法分析.
管理信息结构SMI.
词法&语法解析.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
编译原理与技术 词法分析 (2) 2018/12/30 《编译原理与技术》讲义.
THE C PROGRAMMING LANGUAGE
TinyOS开发环境安装 基于Ubuntu14.04.
《编译原理与技术》 期末复习 计算机科学与技术学院 郑启龙 李 诚 25/12/2018.
语法分析 本章内容 语法分析器:把词法分析生成的词法单元流翻译成语法分析树(parse tree)
第3,4次课 一个简单的语法制导翻译器 2.3~2.5.
SOA – Experiment 2: Query Classification Web Service
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言程序设计 主讲教师:陆幼利.
$9 泛型基础.
编译原理总结-1 第3~5章.
编译原理实践 13.语法分析程序的自动生成工具YACC.
JAVA 程式設計 資訊管理系 - 網路組.
C语言环境配置.
第7章 樹與二元樹(Trees and Binary Trees)
习题课 编译原理与技术 计算机科学与技术学院 李诚.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第一章 C语言概述 目录 什么是语言、程序 C语言的历史与发展 C语言的书写形式与程序结构 运行C语言的步骤与方法
第二章 类型、对象、运算符和表达式.
本节内容 结构体 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 函数嵌套调用的内存布局 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第4章 鏈結串列(Linked Lists) 4-1 動態記憶體配置-(6) 4-2 鏈結串列的基礎-(7)
实验二:添加Linux系统调用及熟悉常见系统调用
結構、檔案處理(Structure, File)
作業一: 安裝Linux於btrfs上 中正大學 作業系統實驗室 指導教授:羅習五
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
本节内容 导出表 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
编译原理实践 7.PL/0的词法分析程序构造.
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
编译原理实践 6.程序设计语言PL/0.
编译原理实践 --词法分析程序的自动生成器LEX
函式庫補充資料 1.
隨機函數.
Presentation transcript:

任课老师:戴新宇 助教: 尚迪(shangd@nlp.nju.edu.cn) 胡光能(hugn@nlp.nju.edu.cn) 实验一 词法分析和语法分析 任课老师:戴新宇 助教: 尚迪(shangd@nlp.nju.edu.cn) 胡光能(hugn@nlp.nju.edu.cn) 2014年3月20日

编译器模块分解图 词法分析 语法分析 C--源代码 字符 语法树 单元 汇编代码 语义分析 中间代码生成 机器代码生成 实验目的:实现类C(C--)语言的编译器 四个阶段:【词法分析和语法分析】,语义分析,中间代码生成,机器代码生成 http://www.stanford.edu/class/archive/cs/cs143/cs143.1128/lectures/00/Slides00.pdf

概要 提交说明 实验任务(必做 + 选做) 编译环境及过程 实验讲解 词法分析与flex 语法分析与bison Flex Bison 本次实验任务:输入:C--源文件;输出:C--语法分析树

提交说明 地址:ftp://114.212.190.181: 22 用户名和密码:upload upload 格式:学号+实验编号命名的压缩包 (zip/rar) 如:121220000_lab1.rar 截止日期:4月12日 晚上12:00之前 内容: 源程序(ex1.l, ex1.y; 额外的.c文件) 可执行程序(命名为 parser) 报告PDF(完成的功能点,编译步骤,实现方法,结点的数据结构表示;不超过3页) 备注:可重新提交 加后缀:121220000_lab1_1.rar 121220000_lab1_2.rar

实验任务 必做:(./parser test.cmm) 选做: 无错误:打印语法树 识别错误类型1: 词法错误 识别错误类型2: 语法错误 选做1:两种风格的注释://, /* */ 选做2:八进制数:012 选做3:十六进制:0xa, 0Xa, 0xA, 0XA 选做4:指数形式的浮点数:1E1, 01e1

if (a[1][2]==0) i=1 else i = 0; } int main() { int I = 1; int j = ~I; } int inc() { int i; i = i+1; } Error type 1 at line 4: Mysterious character '~' int main() { float a[10][2]; int i; a[5,3] = 1.5; if (a[1][2]==0) i=1 else i = 0; } Error type 2 at line 4: syntax error Error type 2 at line 5: syntax error

编译环境及过程 ./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 flexx -ly: lib of yacc 编译方法 Flex lex.yy.c ex1.l ex1.tab.c ex1.y Bison GCC parser 编译命令: flex ex1.l bison -d ex1.y gcc -o parser ex1.tab.c http://stackoverflow.com/questions/1553744/how-does-gcc-recognize-that-lfl-corresponds-to-flex-library -ll: lib of lex -lfl: lib of flexx -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

Flex: .l文件格式 %{ Declarations %} Definitions %% Rules //将保留字置于标识符{id}之前 subroutines

Flex: 一个简单的flex程序 flex test.l gcc lex.yy.c –lfl –o parser {comment} {comment2} {ws} Int Float struct return while if else {int} {float} {id} ";“ ",“ "=“ "<“ …… flex test.l gcc lex.yy.c –lfl –o parser ./parser test.cmm

Flex:你需要做的内容 id {letter}({letter}|{digit})* {id} { yytext, yyleng: 词素字符串 yylineno: %option yylineno yylval: 全局变量,当前词法单元的属性值 id {letter}({letter}|{digit})* {id} { printf("Line %d:(ID , %s)\n",yylineno,yytext); } {id} { //printf("Line %d:(ID , %s)\n",yylineno,yytext); yylval = (struct treeNode*)malloc(sizeof(struct treeNode)); yylval->lineno = yylineno; yylval->type = 1; yylval->tokentype = 26; yylval->name = malloc(strlen(yytext)+1); strcpy(yylval->name,yytext); return ID; } http://cs.nju.edu.cn/dxy/%E5%AE%9E%E9%AA%8C1.pdf

Bison: .y文件格式 %{ 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 http://cs.nju.edu.cn/dxy/%E9%99%84%E5%BD%95A.pdf Exp | MINUS EXP %prec UMINUS

Bison语法树创建与打印 多叉树的构建: struct Node* createNode(int arity, …); 递归层次的前序遍历 Exp : ID { $$ = createNode(1,$1); } Exp : MINUS EXP { $$ = createNode(2,$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/

Bison文法符号结点的数据结构 保存的信息: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

Warning!!! 任何形式的代码抄袭都是不能容忍的 一旦发现,抄袭者和被抄袭者均为0分