Introduction to Lex 電資三 B 盧逸峮

Slides:



Advertisements
Similar presentations
C/C++ 程序设计 吉林财经大学 管理科学与信息工程学院 李艳东 : Tel :
Advertisements

While 迴圈 - 不知重複執行次數
主讲:王幸民 理学院计算机基础教学部.
河內塔(Hanoi)問題.
基础模块 模块一 程序设计基础 (一)开发环境部分.
a simplified C to Java Compiler
授课教师:江星玲 1.
為什麼要讀書?.
Word高级应用——制作毕业论文 Word高级应用——制作毕业论文 6..
第 2 章 初探 C++.
程序设计基础 贺辉 图书馆三楼办公室(进馆左侧上楼)
第一章 C语言概述 计算机公共教学部.
第4章 种群和群落.
陶板屋 組員:陳婷 劉峻愷 趙崇佑 陳鵬如.
熊貓 設計者:鄧澤怡 班別:6B2 學校:華德學校.
我国的宗教政策 第七课第三框.
编译原理上机实习
你 今 天 累 吗 ? 坪山高级中学心理教师 张婧乔.
任务2: 通报的写作.
1、利比亚简介; 2、当今局势; 3、争议人物:卡扎菲; 4、中国的对策。
新世代計算機概論 第14章 程式語言.
远程教育站点管理 及齐鲁先锋平台的使用 平阴县党员干部现代远程教育中心.
你的潜能是无限的 ——高三心理辅导.
Intoduction of YACC 電子四乙 B 李昀融.
第八章 符号表 符号表的作用: 一致性检查和作用域分析; 辅助代码生成..
高级语言程序设计 主讲人:陈玉华.
Compilers Flex & Bison 的安裝使用
Chapter 1 用VC++撰寫程式 Text book: Ivor Horton.
C的發展史 C程式初體驗 C程式設計基本注意事項 上機實習課程
2.2 语法分析器生成器YACC 分析器的构造步骤: 产生式→识别活前缀的DFA→分析表(+驱动器) YACC概述
第四章 函数和递归.
C 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
助教:胡光能,解定宝 编译原理讲师:戴新宇
Last Lecture Revisited
Lexical analyzer generator
C++ 程式設計— 語言簡介 台大資訊工程學系 資訊系統訓練班.
Function.
编译原理专题实验 2013 西安交通大学.
词法&语法解析.
进程操作.
编译原理与技术 词法分析 (2) 2018/12/30 《编译原理与技术》讲义.
作業系統實習課(四) -檔案管理- 實驗室:720A 助教:鄧執中.
编译技术 授课:胡静.
Visual Basic 6.0 ——程序设计.
Instructor:Po-Yu Kuo 教師:郭柏佑
第六章 安全衛生工作守則 6-1 前 言  6-2 訂定依據相關法令規定  6-3 工作守則製作程序及製作前應注意事項  6-4 如何訂定適合需要之安全衛生工作守則  6-5 結 論.
第1章 MATLAB操作基础 1.1 绪论 1.2 MATLAB概述 1.3 MATLAB的运行环境与安装 1.4 MATLAB集成环境 1.5 MATLAB帮助系统.
編譯程式設計 期末專題說明 V1.1 May 2004.
電子音樂 通訊系 B 楊穎穆.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
Name1..hour //加班時數 name2..hour //請假時數
C语言环境配置.
Introduction to the C Programming Language
Instructor:Po-Yu Kuo 教師:郭柏佑
教 材 介 紹 靈活組合 愉快學習.
项目1 C程序设计起步 学习目标: 通过该项目你可以知道: C语言的用途。 C语言的基本符号和关键字。 C语言程序的结构及特点。
第一章 C语言概述 目录 什么是语言、程序 C语言的历史与发展 C语言的书写形式与程序结构 运行C语言的步骤与方法
中五級電腦科 PASCAL檔案處理.
Introduction to the C Programming Language
第二章 基本数据类型 ——数据的表示.
第八节 算术运算符和算术表达式.
第1章 MATLAB操作基础 1. 1 MATLAB概述 1. 2 MATLAB的运行环境与安装 1. 3 MATLAB集成环境 1
三 顺序结构程序设计 厦大附中信息技术.
code::blocks 與GLUT 程式開發
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
第 2 章 初探 Java.
编译原理实践 --词法分析程序的自动生成器LEX
——彻底变革算法与程序设计的教学方式 湖北省水果湖高级中学 伍先军.
Introduction to the C Programming Language
编译原理 中南大学软件学院 陈志刚.
Presentation transcript:

Introduction to Lex 電資三 B9944205 盧逸峮

LEX YACC yacc(Yet Another Compiler Compiler),是Unix/Linux上一個用來生成編譯器的編譯器(編譯器代碼生成器)。yacc生成的編譯器主要是用C語言寫成的語法解析器(Parser),需要與詞法解析器Lex一起使用,再把兩部份產生出來的C程序一併編譯。yacc本來只在Unix系統上才有,但目前已普遍移植往Windows及其他平台 在 電腦科學裡面,lex是一個產生詞法分析器(lexical analyzer) ("掃描器"(scanners)或者"lexers")的程式。[1][2] Lex常常與yacc 語法分析器產生程式(parser generator)一起使用。 Lex(最早是埃里克·施密特和Mike Lesk製作)是許多UNIX系統的標準詞法分析器(lexical analyzer)產生程式,而且這個工具所作的行為被詳列為POSIX標準的一部分。 Lex讀進一個代表詞法分析器規則的輸入字串流,然後輸出以C語言實做的詞法分析器原始碼。

Lex 的常規表達式 Lex 的常規表達式 常規表達式是一種使用元語言的模式描述。表達式由符號組成。符號一般是字符和數字,但是 Lex 中還有一些具有特殊含義的其他標記。 下面兩個表格定義了 Lex 中使用的一些標記並給出了幾個典型的例子。 用 Lex 定義常規表達式

字符 含義 A-Z, 0-9, a-z 構成了部分模式的字符和數字。 . 匹配任意字符,除了 \n。 - 用來指定範圍。例如:A-Z 指從 A 到 Z 之間的所有字符。 [ ] 一個字符集合。匹配括號內的任意 字符。如果第一個字符是 ^ 那麼它表示否定模式。例如: [abC] 匹配 a, b, 和 C中的任何一個。 * 匹配0個或者多個上述的模式。 + 匹配1個或者多個上述模式。 ? 匹配0個或1個上述模式。 $ 作為模式的最後一個字符匹配一行的結尾。

字符 含義 { } 指出一個模式可能出現的次數。 例如: A{1,3} 表示 A 可能出現1次或3次。 \ 用來轉義元字符。同樣用來覆蓋字符在此表中定義的特殊意義,只取字符的本意。 ^ 否定。 | 表達式間的邏輯或。 "<一些符號>;" 字符的字面含義。元字符具有。 / 向前匹配。如果在匹配的模版中的「/」後跟有後續表達式,只匹配模版中「/」前面的部分。如:如果輸入 A01,那麼在模版 A0/1 中的 A0 是匹配的。 ( ) 將一系列常規表達式分組。

標記聲明舉例 標記 相關表達式 含義 數字(number) ([0-9])+ 1個或多個數字 字符(chars) [A-Za-z] 任意字符 空格(blank) " " 一個空格 字(word) (chars)+ 1個或多個 chars 變量(variable) (字符)+(數字)*(字符)*(數字)*

Lex 編程可以分為三步 以 Lex 可以理解的格式指定模式相關的動作。 在這一文件上運行 Lex,生成掃瞄器的 C 代碼。 編譯和鏈接 C 代碼,生成可執行的掃瞄器。 注意: 如果掃瞄器是用 Yacc 開發的解析器的一部分,只需要進行第一步和第二步。關於這一特殊問題的幫助請閱讀 Yacc 和 將 Lex 和 Yacc 結合起來部分。 現在讓我們來看一看 Lex 可以理解的程序格式。一個 Lex 程序分為三個段:第一段是 C 和 Lex 的全局聲明,第二段包括模式(C 代碼),第三段是補充的 C 函數。 例如, 第三段中一般都有 main() 函數。這些段以%%來分界。 那麼,回到字數統計的 Lex 程序,讓我們看一下程序不同段的構成。

lex檔案的結構 lex的檔案結構故意設計的與yacc的檔案格式相似;檔案分成三個區塊, 均以一個只有兩個百分比符號(%)的單行來分隔,如下: 定義區塊 %% 規則區塊 C程式碼區塊

C 和 Lex 的全局聲明 這一段中我們可以增加 C 變量聲明。這裡我們將為字數統計程序聲明一個整型變量,來保存程序統計出來的字數。我們還將進行 Lex 的標記聲明。 字數統計程序的聲明 %{ int wordCount = 0; %} chars [A-za-z] numbers ([0-9])+ delim [" "\n\t] whitespace {delim}+ words {chars}+ %% 兩個百分號標記指出了 Lex 程序中這一段的結束和三段中第二段的開始。

Lex 的模式匹配規則 讓我們看一下 Lex 描述我們所要匹配的標記的規則。(我們將使用 C 來定義標記匹配後的動作。)繼續看我們的字數統計程序,下面是標記匹配的規則。 字數統計程序中的 Lex 規則 [code] {words} { wordCount++; /* increase the word count by one*/ } {whitespace} { /* do nothing*/ } {numbers} { /* one may want to add some processing here*/ } %% [/code]

C 代碼 Lex 編程的第三段,也就是最後一段覆蓋了 C 的函數聲明(有時是主函數)。注意這一段必須包括 yywrap() 函數。 Lex 有一套可供使用的函數和變量。 其中之一就是 yywrap。一般來說,yywrap() 的定義如下例。我們將在 高級 Lex 中探討這一問題。 字數統計程序的 C 代碼段 void main() { yylex(); /* start the analysis*/ printf(" No of words: %d\n", wordCount); } int yywrap() { return 1; }

實作 撰寫一個Lex程式,該程式會將C語言做以下轉換: PROGRAM 1 VAR 2 BEGIN 3 END 4 END. 5 INTEGER 6 FOR 7 READ 8 WRITE 9 TO 10 DO 11 ; 12 : 13 ' 14 := 15

Resources Google directory of lexer and parser generators. Flex homepage: http://www.gnu.org/software/flex Lex/yacc Win32 port: http://www.monmouth.com/~wstreett/lex-yacc/lex-yacc.html

1. 安裝 MinGW-5. 1. 6. exe 在 C:\MinGW 網址:http://www. mingw. org/ 2 1.安裝 MinGW-5.1.6.exe 在 C:\MinGW 網址:http://www.mingw.org/ 2.安裝 flex-2.5.4a-1.exe 在 C:\GnuWin32 網址:http://gnuwin32.sourceforge.net/packages/flex.htm 3.安裝 bison-2.4.1-setup.exe 在 C:\GnuWin32 網址:http://gnuwin32.sourceforge.net/packages/bison.htm 4.複製C:\GnuWin32\lib裡的 (a) charset.alias (b) libfl.a (c) liby.a 到C:\MinGW\lib 5.設環境變數 Path C:\MinGW\bin; C:\GnuWin32\bin; #define yywrap() 1

How to use Cd C:\GnuWin32\bin flex.exe scal.l gcc lex.yy.c -lfl a.exe < data0.txt

lex檔案的範例 %% PROGRAM printf("1"); VAR printf("2"); BEGIN printf("3"); END printf("4"); END. printf("5"); INTEGER printf("6"); FOR printf("7"); READ printf("8"); WRITE printf("9"); TO printf("10"); DO printf("11"); ; printf("12"); : printf("13"); ' printf("14"); := printf("15");

參考 http://www.lslnet.com/linux/f/docs1/i36/big5267662.htm http://zh.wikipedia.org/wiki/Lex http://zh.wikipedia.org/zh-tw/Yacc