999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Lex和Yacc解釋程序實現方法

2013-06-13 11:33:08劉麗娜楊純輝
微處理機 2013年1期
關鍵詞:定義程序規則

劉麗娜,楊純輝,張 靜

(1.中國電子科技集團公司第四十七研究所,沈陽110032 2.空軍駐遼寧地區軍事代表室,沈陽110034)

1 引言

計算機程序輸入通常有一些特定的結構,每一個計算機程序的輸入都會被定義成可接受的“輸入語言”。輸入語言可以是復雜的可編程語言,也可以是簡單的數字。但是,輸入工具總是會受到不同程度的限制,使用起來十分困難,而且經常是伴隨著大量的語法檢查。

Lex和Yacc可以幫助我們編寫程序轉換結構化輸入。Lex使用一系列對可能標記的描述產生一個能識別那些標記的C例程,這些描述稱為Lex規范;Yacc使用特定的語法規則解釋Lex得到的標記并且生成一棵語法樹,語法樹把各種標記當作分級結構,生成編譯器原代碼,對語法樹進行深度遍歷生成原代碼。

2 Lex和Yacc語法規則介紹

2.1 Lex語法規則

Lex使用的技術是有限狀態自動機(FSA),它包括一個開始狀態以及一個或多個結束狀態或接受狀態。Lex把正則表達式翻譯成模擬FSA的一個計算機程序。它使正則表達式匹配輸入的字符串并且把它們轉換成對應的標記,標記通常是代表字符串或簡單過程的數值。

在圖1中,狀態0是開始狀態,狀態2是接受狀態。當讀入字符時,狀態機就進行狀態轉換。當讀入第一個字母時,程序就轉換到狀態1,如果后面讀入的也是字母或數字,程序就繼續保持在狀態1;如果讀入的字符不是字母或數字,程序就轉換到狀態2,即接受狀態。每一個FSA都表現為一個計算機程序。

圖1 有限狀態自動機

通常,Lex上的每個字符串對應一個動作,動作返回一個代表被匹配的字符串的標記給后面的剖析器(Yacc)使用。Lex的輸入文件分成三個段,段間用%%來分隔。

------定義------

%%

------規則------

%%

------子程序------

規則段是必須存在的,如果我們不指定任何規則,默認動作就是匹配任意字符然后直接輸出到輸出文件。默認的輸入文件和輸出文件分別是stdin和stdout。當Lex讀完輸入文件后就會調用函數yywrap。如果返回1表示程序的工作已經完成,否則返回0。yylex是Lex掃描器的入口。

下面的例子是使用Lex實現字數統計的Lex定義:

%{

int wordCount=0;

int number=0;

int w_space=0;

%}

chars[A -za-z—’。”]

numbers([0-9])+

delim["" ]

whitespace{delim}+

words{chars}+

%%

接下來就是Lex規則的實現:

{words}{wordCount++;}

{whitespace}{w_space++;}

{numbers}{number++;}

%%

最后一段就是C代碼的實現:

void main()

{

yylex();

printf("No.of words:%d ",wordCount);

}

int yywrap()

{

return 1;

}

2.2 Yacc語法規則

Yacc為描述計算機程序的輸入提供了通用的工具,它是基于BNF(Backus-Naur form)文法規則的。Yacc的內部有兩個棧,一個分析棧和一個內容棧。分析棧中保存著終結符和非終結符,并且代表當前剖析狀態;內容棧是一個YYSTYPE元素的數組,對應于分析棧中每一個元素保存的值。

Yacc程序實際上是有關語法規則的說明書,它也是由定義部分、規則部分和子程序三部分組成的。Yacc程序的定義部分類似于Lex程序的定義部分,只是在其后可帶有Yacc聲明,其中包括詞法單詞、語法變量、優先級和結合性信息;規則部分由語法規則和相應的動作組成;子程序部分可以包括在前面規則部分用到的子程序定義。接下來是main主程序,它調用yyparse子程序來對輸入進行語法分析,yyparse反復地調用yylex子程序來獲得輸入單詞,在語法出錯時可通過yyerror子程序來處理,當Yacc發現一個解析錯誤時,默認動作是調用yyerror,然后從yylex中返回一個值或1。

下面的例子是使用Yacc實現網表分析的Yacc定義:

變量定義部分:

%{

char*version;

%}

%token EDIF EDIFVERSION

%start edif

%%

規則部分:

edif:EDIF edifVersion{"Edif Version is"%s,version};

%%

子程序部分:

#include"lex.yy.c"

void parse()

{

yyparse();

}

3 Lex和Yacc的調試過程

Lex有很多方便調試的工具,不同版本的Lex其特征可能各不相同。通常的調用方法如下:$lex<filename.lex>,通過命令行參數“-d”,Lex會在 lex.yy.c中生成調試狀態,通過設置變量yy_flex_debug可以打開或關閉flex中調試信息的輸出;“-t”寫入lex.yy.c程序來代替標準輸出;“-v”提供一個兩行的統計匯總;“-n”不打印-v的匯總。輸出信息包括應用規則和相應的匹配文字。如果Lex和Yacc一起使用,需要在Yacc輸入文件中增加下面的代碼:

extern int yy_flex_debug;

int main(void){

yy_flex_debug=1;

yyprase();}

Yacc允許包含有調試的工具,這個特性可能隨Yacc版本的不同而不同。通常的調用方法如下:$yacc_d <filename.y>。通過定義YYDEBUG并且把它設置成非零值,Yacc就會在y.tab.c中生成調試狀態代碼,這也需要在命令行指定參數“-t”。如果設置了YYDEBUG,通過設置yydebug可以打開或者關閉調試信息的輸出;命令行參數“-v”保存剖析狀態,狀態保存在文件y.output中。

#define YYDEBUG 1

%%

int main(void){

#if YYDEBUG

yydebug=1;

#endif

yylex();}

圖2顯示了Lex和Yacc使用的整個流程,首先指定Lex所有的模式匹配規則(bas.l)和Yacc的全部語法規則(bas.y),然后對這兩個文件進行編譯,最后將這兩個文件連接起來,組成可執行程序bas.exe。

Yacc讀入bas.y中的語法描述后生成一個剖析器,即 y.tab.c 中的函數 yyparse,bas.y 中包含的是一系列的標記聲明。Lex讀入bas.l中正則表達式的說明,包含文件y.tab.h,然后生成詞匯解釋器,即文件lex.yy.c中的函數yylex。最后這個解釋器和剖析器被連接到一起組成一個可執行程序bas.exe。

圖2 由Lex和Yacc構建的編譯器

4 結束語

Lex和Yacc工具的出現,大大簡化了編寫編譯器的工作,使用Lex和Yacc無論是構建程序的一部分,還是構建輔助編程的工具,都是方便有效的,是目前UNIX系統上使用的重要的、功能強大的工具。

[1]呂映芝,張素琴,蔣維杜,等.編譯原理[M].北京:清華大學出版社,1998.

[2]John R.Levine,Tony Mason 著.Lex與 Yacc[M].楊作梅,張旭東,等譯.北京:機械工業出版社,2003.

猜你喜歡
定義程序規則
撐竿跳規則的制定
數獨的規則和演變
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
讓規則不規則
Coco薇(2017年11期)2018-01-03 20:59:57
“程序猿”的生活什么樣
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
TPP反腐敗規則對我國的啟示
成功的定義
山東青年(2016年1期)2016-02-28 14:25:25
創衛暗訪程序有待改進
中國衛生(2015年3期)2015-11-19 02:53:32
修辭學的重大定義
當代修辭學(2014年3期)2014-01-21 02:30:44
主站蜘蛛池模板: www成人国产在线观看网站| 一级毛片在线直接观看| 一级爆乳无码av| 成人另类稀缺在线观看| 一级不卡毛片| 欧美怡红院视频一区二区三区| 中文字幕有乳无码| 亚洲欧美另类视频| 精品综合久久久久久97超人| 免费无码又爽又黄又刺激网站| 在线色综合| 亚洲欧洲日韩久久狠狠爱| 喷潮白浆直流在线播放| 色综合婷婷| 亚洲三级视频在线观看| 国产在线观看成人91| 亚洲日本中文字幕天堂网| 国产亚洲视频在线观看| 免费高清毛片| 国产成人1024精品下载| 国产美女主播一级成人毛片| 亚洲人成高清| 大学生久久香蕉国产线观看| 97色婷婷成人综合在线观看| www.99在线观看| 精品亚洲欧美中文字幕在线看| 这里只有精品在线播放| 婷婷伊人五月| 亚洲欧美另类中文字幕| 麻豆精品国产自产在线| 亚洲人成网站在线观看播放不卡| 久青草免费在线视频| 乱人伦99久久| 国产菊爆视频在线观看| 亚洲婷婷在线视频| 中文字幕精品一区二区三区视频| 中文字幕欧美日韩高清| 精品国产99久久| 亚洲av日韩av制服丝袜| 亚洲Aⅴ无码专区在线观看q| 亚洲国产成人久久精品软件| 久久国产乱子| 91久久国产热精品免费| 777国产精品永久免费观看| 国产成人资源| 成人va亚洲va欧美天堂| 国产精品亚洲五月天高清| 国产精品久线在线观看| 亚洲大尺度在线| 国产在线观看一区二区三区| 国产乱人伦偷精品视频AAA| 91在线播放免费不卡无毒| 免费人成在线观看成人片| 亚洲无码不卡网| 国产欧美日韩专区发布| 91免费精品国偷自产在线在线| 都市激情亚洲综合久久| 美女一区二区在线观看| 99精品福利视频| 亚洲综合色在线| yjizz视频最新网站在线| 久久99国产综合精品女同| 制服丝袜一区二区三区在线| 欧美激情首页| 亚洲v日韩v欧美在线观看| 久久综合色天堂av| 国产亚洲成AⅤ人片在线观看| 在线va视频| 国产99视频免费精品是看6| 国产在线观看99| 免费Aⅴ片在线观看蜜芽Tⅴ| 四虎成人精品在永久免费| 国产日本一区二区三区| 国产一级做美女做受视频| 天天色天天综合| 毛片免费高清免费| 国产综合精品一区二区| 国产成人精品优优av| 2021天堂在线亚洲精品专区| 国产亚洲精品yxsp| 亚洲精品视频网| 亚洲A∨无码精品午夜在线观看|