Intoduction of YACC 電子四乙 B9942305 李昀融.

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

計算機程式語言實習課.
行程(process).
08 CSS 基本語法 8-1 CSS 的演進 8-2 CSS 樣式規則與選擇器 8-3 連結HTML 文件與CSS 樣式表
编译原理上机实习
File Access 井民全製作.
TQC+ JAVA全國教師研習會 PLWeb 程式設計練習平台 簡介.
C語言中可變参數的用法——va_list、va_start、va_arg、va_end参數定義
Hadoop 單機設定與啟動 step 1. 設定登入免密碼 step 2. 安裝java step 3. 下載安裝Hadoop
Introduction to Lex 電資三 B 盧逸峮
臺北市立大學 資訊科學系(含碩士班) 賴阿福
程式設計概論 1.1 程式設計概論 程式語言的演進 物件導向程式 程式開發流程 1.2 C++開發工具
Compilers Flex & Bison 的安裝使用
Visual C++ introduction
2.2 语法分析器生成器YACC 分析器的构造步骤: 产生式→识别活前缀的DFA→分析表(+驱动器) YACC概述
JDK 安裝教學 (for Win7) Soochow University
第1章 認識Arduino.
第八章 利用SELECT查詢資料.
客戶端的檔案上傳 HtmlInputFile檔案控制項 上傳單一檔案 同時上傳多個檔案.
助教:胡光能,解定宝 编译原理讲师:戴新宇
Lexical analyzer generator
C語言簡介 日期 : 2018/12/2.
Function.
類別(class) 類別class與物件object.
SQL Stored Procedure SQL 預存程序.
ASP.NET基本設計與操作 建國科技大學 資管系 饒瑞佶 2007年.
安裝JDK 安裝Eclipse Eclipse 中文化
词法&语法解析.
编译原理与技术 词法分析 (2) 2018/12/30 《编译原理与技术》讲义.
2017 Operating Systems 作業系統實習 助教:陳主恩、林欣穎 實驗室:720A.
雲端運算的基石(2) 虛擬化技術實作(XP篇─上)
檔案與磁碟的基本介紹.
第二章 SPSS的使用 2.1 啟動SPSS系統 2.2 結束SPSS系統 2.3 資料分析之相關檔案 2.4 如何使用SPSS軟體.
雲端計算.
第十章 指针.
程式設計實習課(四) ----C 函數運用----
第一單元 建立java 程式.
Ch20. 計算器 (Mac 版本).
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
雲端計算.
網頁資料知多少? 事 實 ? 謠言?.
挑戰C++程式語言 ──第8章 進一步談字元與字串
Oop8 function函式.
如何使用Gene Ontology 網址:
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
引用檔案.
C qsort.
Flash 8:開口中 從Y:\ 複製『開口中.fla』到 D:\ 更改名稱為:s3x99 (你的班號) 雙按開啟檔案 2019年5月7日
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 类型、对象、运算符和表达式.
挑戰C++程式語言 ──第7章 輸入與輸出.
流程控制:Switch-Case 94學年度第一學期‧資訊教育 東海大學物理系.
MiRanda Java Interface v1.0的使用方法
函數應用(二)與自定函數.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
挑戰C++程式語言 ──第9章 函數.
Chapter 15 檔案存取 LabVIEW中的檔案存取函數也可將程式中的資料儲存成Excel或Word檔。只要將欲存取的檔案路徑位址透過LabVIEW中的路徑元件告訴檔案存取函數後,LabVIEW便可將資料存成Excel或Word檔;當然也可以將Excel或Word檔的資料讀入LabVIEW的程式中。
2018 Operating Systems 作業系統實習 助教:林欣穎 實驗室:720A.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
What is “this”? 在物件導向程式設計中,類別的定義就是在說明如果創建了“這個物件”的話,它會具有那些屬性與功能,以及這些功能是如何實現的。 而所謂的“這個物件”就以 this 來表示。 當我們在JavaScript與jQuery中寫 script 程式(函式)時,“誰”呼叫這個函式,這個“誰”就是該函式中所謂的.
作業系統實習課(二) -Scheduler-Related System Calls-
開發Java程式語言的工具 JDK.
String類別 在C語言中提供兩種支援字串的方式 可以使用傳統以null結尾的字元陣列 使用string類別
本节内容 指针类型 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
编译原理实践 --词法分析程序的自动生成器LEX
Introduction to the C Programming Language
Unix指令4-文字編輯與程式撰寫.
Develop and Build Drives by Visual C++ IDE
隨機函數.
InputStreamReader Console Scanner
Presentation transcript:

Intoduction of YACC 電子四乙 B9942305 李昀融

YACC YACC 代表 Yet Another Compiler Compiler。 YACC 的 GNU 版叫做 Bison。 它是一種工具,將任何一種編譯程式語言的所有 語法翻譯成針對此種語言的 YACC 語法解析器。 它用巴科斯範式(BNF, Backus Naur Form)來書寫。 按照慣例,YACC 檔有 .y 尾碼。

YACC 圖中所表示的是使用lex及YACC的一般工作流程。 首先看到YACC會讀入一個.y檔案,這裡.y檔案的 內容就是我們使用類似BNF語法定義的語法規則, YACC會分析這些語法規則後,幫我們產生可以用 來解析這些規則的程式碼,一般名稱預設為y.tab.c 產生的程式碼中最重要的的函式叫作yyparse。 lex也會讀入一個.l的檔案,這個檔案裡面定義的是 如何從文字流裡解出token的規則,使用的方法是 常規表示式(regular expression) 。

YACC lex也會讀入一個.l的檔案,這個檔案裡面定義的是如何 從文字流裡解出token的規則,使用的方法是常規表示 式(regular expression) 。 在圖的左側中間我們還可以看到有一個叫作y.tab.h的檔 案從YACC產生出來並餵給lex作輸入,這個檔案是 YACC根據在讀入的.y檔裡面所定義的token代號所產生 出來的一個header,這樣YACC及lex產生出來的程式碼 裡面就可以使用共通定義的代碼而不必各寫個的。 lex分析過.l檔案後也會產生一個一般預設叫作lex.yy.c的 原始碼檔案,裡頭最重要的一個函式叫作yylex。

YACC 最後,我們把YACC產生出來的y.tab.c還有lex產生 出來的lex.yy.c,以及其它我們自己撰寫的原始碼 檔案一起拿來編譯再作連結,最後產生出來的就 是一個可以用來解析我們定義的語法的解析器工 具。以上是整個lex及YACC的使用流程概觀

YACC語法 YACC 語法檔包括這一語法規範。 這包含了序列匹配時你想要做的事。以英語為例。 這一套標記可能是:名詞, 動詞, 形容詞等等。 為了使用這些標記造一個語法正確的句子, 你的結構必須符合一定的規則。 一個簡單的句子可能是名詞+動詞或名詞+動詞+名 詞。

建立YACC編譯器 2.1編寫一個 .y 的語法檔 (同時說明 C 在這裡要進行的動作)。 2.說明語法: 2.1編寫一個 .y 的語法檔 (同時說明 C 在這裡要進行的動作)。 2.2編寫一個詞法分析器來處理輸入並將標記傳 遞給解析器。 這可以使用 Lex 來完成。 2.3編寫一個函數,通過調用yyparse()來開始解 析。 2.4編寫錯誤處理常式(如 yyerror())。 3.編譯 Yacc 生成的代碼以及其他相關的原始檔案。 4.將目標檔鏈結到適當的可執行解析器庫。

C與 YACC的聲明 C 聲明可能會定義動作中使用的類型和變數,以 及巨集。還可以包含頭檔。 每個 YACC聲明段聲明了終端符號和非終端符號 (標記)的名稱,還可能描述操作符優先順序和 針對不同符號的資料類型。lexer(Lex)一般返回這 些標記。所有這些標記都必須在YACC聲明中進行 說明。 在檔解析的例子中我們感興趣的是這些標記: name, equal sign, 和age。Name 是一個完全由字元 組成的值。Age 是數字。

C與 YACC的聲明 於是聲明段就會像這樣: % #typedef char* string; /*  to specify token types as char* */    #define YYSTYPE string /*  a Yacc variable which has the value of returned token */  %}  %token NAME EQ AGE  %%

實作 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;

實作 開一個 “.txt”檔 將下列文字複製貼上後 改名為 “lex.as.l” %{ #include "y.tab.h" %} %% [0-9]+"."[0-9]+ { sscanf(yytext,"%lf",&yylval); return NUMBER; } [0-9]+ { sscanf(yytext,"%lf",&yylval); return NUMBER; } [ \t] ; [\n] { return '\n'; } . { return yytext[0]; } int yywrap() { return 1; }

實作 開一個 “.txt”檔 將下列文字複製貼上後 改名為 “yacc.as.y” %{ #define YYSTYPE double extern int yylex(); void yyerror(char*); %} %token NUMBER %% lines : | lines expression '\n' { printf(" = %lf\n", $2); } ;

實作 續上頁 expression : term { $$ = $1; } : factor { $$ = $1; } | term '*' factor { $$ = $1 * $3; } | term '/' factor { $$ = $1 / $3; }

實作 續上頁 factor : NUMBER { $$ = $1; } | group { $$ = $1; } ; group : '(' expression ')' { $$ = $2; } %% void yyerror(char* msg) { printf("error\n") ; exit(1) ; } int main(int argc, char** argv) yyparse(); return 0;

實作 1.執行 -> com ->cd c:\gnuwin32\bin 2. bison yacc.as.y -d 3.上述程式碼執行完 會在 c:\gnuwin32\bin 產生yacc.as.tab.c yacc.as.tab.h 4. flex lex.as.l 5.上述程式碼執行完 會在 c:\gnuwin32\bin 產生lex.yy.c 6.將c:\gnuwin32\bin 中的yacc.as.tab.h改名為 y.tab.h 7.cc lex.yy.c yacc.as.c 8.上述程式碼執行完 會在 c:\gnuwin32\bin 產生a.exe 即為本yacc產生的計算程式

實作 參考網頁 Lex與yacc學習實例 http://www.linuxsir.org/bbs/thread186941.html; ycaa與lex快速入門 http://www.ibm.com/developerworks/cn/linux/sdk/lex /index.html#resources 很讚的遊戲編譯器 http://good-ed.blogspot.tw/2010/04/lexyacc.html

實作圖