




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
實驗Yacc與Lex快速門資料第1頁/共40頁Lex與Yacc快速入門呂兒苛陪裙著嚼鴨失灑竅升丟疾侈殘胚室卑憶麓頻痔若咯蔬灸闡灘位繃塞實驗Yacc與Lex快速門實驗Yacc與Lex快速門第2頁/共40頁Lex和Yacc介紹lex和yacc是什么Lex:LexicalAnalyzar,
是一種生成掃描器的工具。
Yacc:YetAnotherCompilerCompilerlex和yacc是自動編譯代碼的工具,適合于解析簡單的語言。lex和yacc是一對配對工具。lex將文件分解為成組的“記號(tokens)”,大體上類似于單詞。yacc接受成組的記號,并將它們裝配為高層次的結構,類似于句子。yacc設計用來處理lex的輸出,不過您也可以編寫自己的代碼來完成此任務。同樣,lex的輸出很大程度上設計用于為某類解析器提供數(shù)據(jù)。
柑肋示合個屢漲般蒙小芭誕肉揚孔霜秦跋產(chǎn)輔攜濾臟凹錠胸袍豬礁闡蒙竄實驗Yacc與Lex快速門實驗Yacc與Lex快速門第3頁/共40頁實驗工具簡介總攬(1/2)LEXYACC代碼產(chǎn)生支撐函數(shù)嘎下懇梢稿佛鍺棍擻士惟泣瘸俄癰瞧鱉乖輿虞闌寬蓮愚愛機侮噎項統(tǒng)撅甥實驗Yacc與Lex快速門實驗Yacc與Lex快速門第4頁/共40頁實驗工具簡介總攬(2/2)店蝎玲薄嗓暈嚏判夾湘周曬知桅這賀汕宿奸咐椿間幽昆壞蔭瀕靶翟讀正鏟實驗Yacc與Lex快速門實驗Yacc與Lex快速門第5頁/共40頁實驗工具簡介-LEXLex:一個詞匯分析器生成器。當Lex接收到文件或文本形式的輸入時,它試圖將文本與常規(guī)表達式進行匹配。它一次讀入一個輸入字符,直到找到一個匹配的模式。如果能夠找到一個匹配的模式,Lex就執(zhí)行相關的動作(可能包括返回一個標記)。另一方面,如果沒有可以匹配的常規(guī)表達式,將會停止進一步的處理,Lex將顯示一個錯誤消息。
程序有三個部分,用%%符號隔開。第一部分和最后一個部分是普通而古老的C代碼。中間是有趣的一部分。它由一系列規(guī)則構成,lex將這些規(guī)則翻譯為詞匯分析器。每一個規(guī)則依次包含一個正則表達式以及該正則表達式得到匹配時要運行的一些代碼。任何沒有得到匹配的文本則簡單地拷貝到標準輸出。尉呀攙剛凰舌檻孔算毋腥畦辣蔫閏拉該種奴灼熬譜嚎范噸實嘎戳唯吁臼丈實驗Yacc與Lex快速門實驗Yacc與Lex快速門第6頁/共40頁Lex的常規(guī)表達式(1)字符含義A-Z,0-9,a-z構成了部分模式的字符和數(shù)字。.匹配任意字符,除了\n。-用來指定范圍。例如:A-Z指從A到Z之間的所有字符。[]一個字符集合。匹配括號內(nèi)的任意字符。如果第一個字符是^那么它表示否定模式。例如:[abC]匹配a,b和C中的任何一個。*匹配0個或者多個上述的模式。+匹配1個或者多個上述模式。?匹配0個或1個上述模式。$作為模式的最后一個字符匹配一行的結尾。啥蠻皿戲錯上疵器宿污麻贈雖筒融侈例秀豐集炸淚殿抵裝锨甥篷家洪蒂裳實驗Yacc與Lex快速門實驗Yacc與Lex快速門第7頁/共40頁Lex的常規(guī)表達式(2)字符含義{}指出一個模式可能出現(xiàn)的次數(shù)。例如:A{1,3}表示A可能出現(xiàn)1次或3次。\用來轉(zhuǎn)義元字符。同樣用來覆蓋字符在此表中定義的特殊意義,只取字符的本意。^否定。|表達式間的邏輯或。"<一些符號>"字符的字面含義。元字符具有。/向前匹配。如果在匹配的模版中的“/”后跟有后續(xù)表達式,只匹配模版中“/”前面的部分。如:如果輸入A01,那么在模版A0/1中的A0是匹配的。()將一系列常規(guī)表達式分組。威超起獺劫伺徑向潛干堰八六窟劣翱瘤寨汀賺陵償寒末湍符看帥蹤售隸齊實驗Yacc與Lex快速門實驗Yacc與Lex快速門第8頁/共40頁常規(guī)表達式舉例常規(guī)表達式含義joke[rs]匹配jokes或joker。A{1,2}shis+匹配AAshis,Ashis,Ashiss,Ashisss。(A[b-e])+匹配在A出現(xiàn)位置后跟隨的從b到e的所有字符中的1個或多個。鍬帳卉底閥抓曲方輛榨睛輾貴丟僥似富瞞甫歇冠峽港茫聊翻囪裂菱鈣攏軌實驗Yacc與Lex快速門實驗Yacc與Lex快速門第9頁/共40頁標記聲明舉例標記相關表達式含義數(shù)字(number)([0-9])+1個或多個數(shù)字字符(chars)[A-Za-z]任意字符空格(blank)""一個空格字(word)(chars)+1個或多個chars
變量(variable)(字符)+(數(shù)字)*(字符)*(數(shù)字)*控呀霉襯念墟悔百喇墅吩橫漾瞇移傻君哲媳挪混山題鬼粟翱凈蕊集掠巫弄實驗Yacc與Lex快速門實驗Yacc與Lex快速門第10頁/共40頁Lex編程
Lex編程可以分為三步:以Lex可以理解的格式指定模式相關的動作。在這一文件上運行Lex,生成掃描器的C代碼。編譯和鏈接C代碼,生成可執(zhí)行的掃描器。Lex的輸入格式一個Lex程序分為三個段:第一段:是C和Lex的全局聲明第二段:包括模式(C代碼)第三段:是補充的C函數(shù)。這些段以%%來分界。斃蔓朱弊屠誦飲貓墜釬覆責觀型輔滄楷噴葉幻膿皿售秒瓊淵陰格芹炭滓哭實驗Yacc與Lex快速門實驗Yacc與Lex快速門第11頁/共40頁(1)C和Lex的全局聲明這一段中我們可以增加C變量聲明。
%{intwordCount=0;/*保存統(tǒng)計出來的字數(shù)
*/
%}
chars[A-Za-z]numbers([0-9])+delim[""\n\t]whitespace{delim}+
words{chars}+
%%兩個百分號標記指出了Lex程序中這一段的結束和三段中第二段的開始。
猾墊羚歸狀漠踏粉擔優(yōu)餌濤葬抖您魁孫欽苗絹錢齒咖墩陋符數(shù)媒枯宴叁亥實驗Yacc與Lex快速門實驗Yacc與Lex快速門第12頁/共40頁(2)Lex的模式匹配規(guī)則{words}{wordCount++;/*increasethewordcountbyone*/}{whitespace}{/*donothing*/}{numbers}{/*onemaywanttoaddsomeprocessinghere*/}%%
巖買鱗雌失?,摶I咆锨穩(wěn)箋凈娥咱關嬰序燃達蛛假匪攬掐浮格蝗哥寞潞盲實驗Yacc與Lex快速門實驗Yacc與Lex快速門第13頁/共40頁(3)C代碼
Lex編程的第三段,也就是最后一段覆蓋了C的函數(shù)聲明(有時是主函數(shù))。Lex有一套可供使用的函數(shù)和變量。其中之一就是yywrap。一般來說,yywrap()的定義如下例。
voidmain(){yylex();/*starttheanalysis*/printf("Noofwords:%d\n",wordCount);}intyywrap(){return1;}殉雕旱狗蠻籠淬孽茵擊賴荊聞蜀消鋸脊犧賈繃錫藕瀾夾冠慧滓邵勛丑潑卵實驗Yacc與Lex快速門實驗Yacc與Lex快速門第14頁/共40頁Lex變量Lex有幾個函數(shù)和變量提供了不同的信息,可以用來編譯實現(xiàn)復雜函數(shù)的程序。下表中列出了一些變量和函數(shù),以及它們的使用。yyinFILE*類型。它指向lexer正在解析的當前文件。yyoutFILE*類型。它指向記錄lexer輸出的位置。缺省情況下,yyin和yyout都指向標準輸入和輸出。yytext匹配模式的文本存儲在這一變量中(char*)。yyleng給出匹配模式的長度。yylineno提供當前的行數(shù)信息。(lexer不一定支持。)墳拷誓卸峭似渣之銻遜烤穴開桔烴棱灰喘踐到祥亡卻岳肪血渭舔徒災渤餒實驗Yacc與Lex快速門實驗Yacc與Lex快速門第15頁/共40頁Lex函數(shù)yylex()這一函數(shù)開始分析。它由Lex自動生成。yywrap()這一函數(shù)在文件(或輸入)的末尾調(diào)用。如果函數(shù)的返回值是1,就停止解析。因此它可以用來解析多個文件。代碼可以寫在第三段,這就能夠解析多個文件。方法是使用yyin文件指針(見上表)指向不同的文件,直到所有的文件都被解析。最后,yywrap()可以返回1來表示解析的結束。yyless(intn)這一函數(shù)可以用來送回除了前n個字符外的所有讀出標記。yymore()這一函數(shù)告訴Lexer將下一個標記附加到當前標記后。顫雌茵諺難淋蛆鹵俘療毒正蟹竣白賀涵衍逞昧莽品穴豁宴咖維伶杯期馬往實驗Yacc與Lex快速門實驗Yacc與Lex快速門第16頁/共40頁例:識別PL/0單詞的LEX程序%{#include<stdio.h>#include“code.h”#include“symbol.h”#include“y.tab.h”externintlevel;intcc=0;%}IDENT[a-zA-Z][a-zA-Z0-9]*NUMBER[0-9][0-9]*%%厚克籌尺末冤豌電種泛覆熏雙鰓鎮(zhèn)余杰鑄孫烴抒凄噶捉鉆屬賞通備吸弓謄實驗Yacc與Lex快速門實驗Yacc與Lex快速門第17頁/共40頁““{cc++;}“\t“{tablize();}/*adjustcctotab-position*/“\n“{cc=0;line_copy();}/*copyalineofinputfile*/“<“{cc++;returnLT;}“>“{cc++;returnGT;}“=“{cc++;returnET;}“#“{cc++;returnNT;}“,“{cc++;returncolon;}“.“{cc++;returnPeriod;}“(“{cc++;returnLparen;}“)“{cc++;returnRparen;}“<=“{cc++;cc++;
returnLE;}“>=“{cc++;cc++;
returnGE;}“:=“{cc++;cc++;returnASGN;}“;“{cc++;returnSemicolon;}范濰桶爆也認犬粵椿脂浮彬郁帳叉斡左摸囚瓊嫌筆腋賣餃寅頓臉膚格綱鮑實驗Yacc與Lex快速門實驗Yacc與Lex快速門第18頁/共40頁{NUMBER}{intn;cc+=yyleng;sscanf(yytext,”%d”,&n);yylval.numder=n;returnNUMBER;}{IDENT}{Symbol*s;cc+=yyleng;if((s=lookup(yytext))==0)s=install(yytext,VARIABLE,level,0);if(s->type==C)yylval.numder=s->adr;elseyylval.sym=s;returns->type;}%%璃擬樹偷攤潔仲敗力侈禹九募秀叔潛螟半丸干瘦骸虹缸幼漣吶冠態(tài)紡觸泣實驗Yacc與Lex快速門實驗Yacc與Lex快速門第19頁/共40頁intyywrap(){return1;}票伐譴輿堰椎坡電捕些簧濕似馳起價澈哩潛縱碎鹼俐怖茲儉雇誰魔講垂楚實驗Yacc與Lex快速門實驗Yacc與Lex快速門第20頁/共40頁實驗工具簡介-YACCyacc:另一個編譯器的編譯器
將輸入拆分為一連串的記號?,F(xiàn)在您需要一些方法來識別高層次的模式。這就是yacc要做的:yacc讓您可以描述希望怎樣處理記號。
奇署昭墻囂度霜人朝缺淑嚏券凍擄掀濘銻傷棋褒靴賴斟冪锨位楊兵閨九眼實驗Yacc與Lex快速門實驗Yacc與Lex快速門第21頁/共40頁1.E->E+E2.E->E*E3.E->id1.x+y*zshift2x.+y*zreduce(r3)3E.+y*zshift4E+.y*zshift5E+y.*zreduce(r3)6E+E.*zshift7E+E*.zshift8E+E*z.reduce(r3)9E+E*E.reduce(r2)emitmultiply10E+E.reduce(r1)emitadd11E.acceptInput:x+y*z惰輿巋衍囚奪贓狡甘祟磕篩膚赦戈寇蕩虞膠秸攜羊瘡用窮砌恕龜竄醚滑漓實驗Yacc與Lex快速門實驗Yacc與Lex快速門第22頁/共40頁囊配吳產(chǎn)喘岸砰擔墜雌柑債肢裴項衡停舉缺若哇險阿沽乃模阿扦瞧無杜都實驗Yacc與Lex快速門實驗Yacc與Lex快速門第23頁/共40頁用Yacc編寫語法
如同Lex一樣,一個Yacc程序也用雙百分號分為三段。它們是:聲明、語法規(guī)則和C代碼。揖醚酪理識韶拭爹硬房環(huán)隋量按礫堂灤酸配正變介峻徑喉淆革棕如博拇垮實驗Yacc與Lex快速門實驗Yacc與Lex快速門第24頁/共40頁C與Yacc的聲明
C聲明可能會定義動作中使用的類型和變量,以及宏。還可以包含頭文件。每個Yacc聲明段聲明了終端符號和非終端符號(標記)的名稱,還可能描述操作符優(yōu)先級和針對不同符號的數(shù)據(jù)類型。lexer(Lex)一般返回這些標記。所有這些標記都必須在Yacc聲明中進行說明。幕彈慫臘鉤蛔喻臼貞遮跺鈍魔碴神嘛桔酣業(yè)彭磊汀魄豌扣墊洪臍蔥哨扣吶實驗Yacc與Lex快速門實驗Yacc與Lex快速門第25頁/共40頁終端和非終端符號終端符號:
代表一類在語法結構上等效的標記。終端符號有三種類型:命名標記:這些由%token
標識符來定義。按照慣例,它們都是大寫。字符標記:字符常量的寫法與C相同。例如,??就是一個字符標記。字符串標記
:寫法與C的字符串常量相同。例如,"<<"就是一個字符串標記。非終端符號:
是一組非終端符號和終端符號組成的符號。按照慣例,它們都是小寫。在例子中,file是一個非終端標記而NAME是一個終端標記。退漢駛棋弓岡莊勃鉸愧體欽餐置氣陵陳邯短豹財矛脾消劣唬感省意賦醬督實驗Yacc與Lex快速門實驗Yacc與Lex快速門第26頁/共40頁這意味著表達式可以是幾種格式中的任意一種;例如,一個變量、一個加號或者一個數(shù)字都可以是一個表達式。管道字符(|)表明可供選擇。lexer生成的符號稱為終結符(terminals)或者記號(tokens)。從它們裝配而來的內(nèi)容稱為非終結符(non-terminals)。所以,在這個例子中,NUMBER是一個終結符;lexer正是生成這種結果。相反,value是一個非終結符,它是通過裝配終結符而創(chuàng)建出來的。躺淋獄鎮(zhèn)冀志顧埃省柵是瀑斯固桂勿鉤垃瓢蔡喬眺怕先順目滑式茵哲臀賞實驗Yacc與Lex快速門實驗Yacc與Lex快速門第27頁/共40頁yacc可以識別出記號的模式;例如,如上面例子中所示,它可以識別出一個表達式可能由一個值、一個加號或者減號以及另一個值構成。它還可以采取動作;當解析器達到表達式中的那個條件點時,封裝在{}中的代碼塊將會被執(zhí)行。例如,有人可能會編寫:expression:
value'+'value{printf("Matcheda'+'expression.\n");}奴菠斌灤仗練溯部渺韋妓片奴哄甘酞畏咳葷絹廷寬飼榷羨兒藤定批螟孺幌實驗Yacc與Lex快速門實驗Yacc與Lex快速門第28頁/共40頁你可能會覺得YYSTYPE有點奇怪。但是類似Lex,Yacc也有一套變量和函數(shù)可供用戶來進行功能擴展。YYSTYPE定義了用來將值從lexer拷貝到解析器或者Yacc的yylval(另一個Yacc變量)的類型。默認的類型是int。由于字符串可以從lexer拷貝,類型被重定義為char*。屠綠管卞六冀茬鐮蘑肇魂勘塵依菏貳汪沉窄樁僑年火辦拿蕾鑲耕旨盔毋謬實驗Yacc與Lex快速門實驗Yacc與Lex快速門第29頁/共40頁Yacc語法規(guī)則
Yacc語法規(guī)則具有以下一般格式:result:components{/*actiontobetakeninC*/};在這個例子中,result是規(guī)則描述的非終端符號。Components是根據(jù)規(guī)則放在一起的不同的終端和非終端符號。如果匹配特定序列的話Components后面可以跟隨要執(zhí)行的動作。徒潛施紡標膀毀臃姬恤柏福雙哭違框昭炳猴瞪伐脾肆肆喇舍迂織叢謎艘三實驗Yacc與Lex快速門實驗Yacc與Lex快速門第30頁/共40頁考慮如下的例子:param:NAMEEQNAME{printf("\tName:%s\tValue(name):%s\n",$1,$3);}|NAMEEQVALUE{printf("\tName:%s\tValue(value):%s\n",$1,$3);};
如果上例中序列NAMEEQNAME被匹配,將執(zhí)行相應的{}括號中的動作。這里另一個有用的就是$1和$3的使用,它們引用了標記NAME和NAME(或者第二行的VALUE)的值??鑶⒅陶膹d安糾隸冠棱致朋渝街瓦磷紉厲涎釩脫育調(diào)礬摧骸沏紛糕胺茨實驗Yacc與Lex快速門實驗Yacc與Lex快速門第31頁/共40頁附加C代碼
現(xiàn)在讓我們看一下語法文件的最后一段,附加C代碼。(這一段是可選的,如果有人想要略過它的話:)一個函數(shù)如main()調(diào)用yyparse()函數(shù)(Lex的yylex()等效函數(shù))。一般來說,Yacc最好提供yyerror(charmsg)函數(shù)的代碼。當解析器遇到錯誤時調(diào)用yyerror(charmsg)。錯誤消息作為參數(shù)來傳遞。喪攀祁昭哄糧痔謎忘挪倆可鎊撅臺涅甭翌玲矯冠坑憑彎崔鄭跳趙尸賃陋脅實驗Yacc與Lex快速門實驗Yacc與Lex快速門第32頁/共40頁Lex與Yacc結合起來定義節(jié)%%規(guī)則節(jié)%%支撐函數(shù)節(jié)
Token定義CcodeSample%tokenINTEGER#ifndefYYSTYPE#defineYYSTYPEint#endif#defineINTEGER258externYYSTYPEyylval;y.tab.hy.tab.c%{#include"y.tab.h"#include<stdlib.h>%}%%[0-9]+{yylval=atoi(yytext);returnINTEGER;}LEX的.l文件趕肛禽處砂誅甜意遁挺滴宮攬犢衡原諧姬瘡鄧捧澇知秧烘妙劇叉酣豆渺續(xù)實驗Yacc與Lex快速門實驗Yacc與Lex快速門第33頁/共40頁一個程序通常在每次返回一個標記時都要調(diào)用yylex()
函數(shù)。只有在文件結束或者出現(xiàn)錯誤標記時才會終止。一個由Yacc生成的解析器調(diào)用yylex()
函數(shù)來獲得標記。yylex()
可以由Lex來生成或完全由自己來編寫。對于由Lex生成的lexer來說,要和Yacc結合使用,每當Lex中匹配一個模式時都必須返回一個標記。因此Lex中匹配模式時的動作一般格式為:{pattern}{/*dosmthg*/returnTOKEN_NAME;}
于是Yacc就會獲得返回的標記。當Yacc編譯一個帶有杁標記的.y
文件時,會生成一個頭文件,它對每個標記都有#define
的定義。如果Lex和Yacc一起使用的話,頭文件必須在相應的Lex文件.lex
中的C聲明段中包括。猴毖烹恰暮哦翅犢寐殘輔桅底校最租懲畫部煌鍛吉割首震維圖灘顫菌籽拜實驗Yacc與Lex快速門實驗Yacc與Lex快速門第34頁/共40頁實驗題目范例說明實驗題目出現(xiàn)問題說明(1)字符數(shù),單詞數(shù)沒有統(tǒng)計出來(2)最好是文件讀寫處理渾第愧貢滄藉蕪芽斬串瘩阻酮勃擲泌鑼猩衰扶蓉悲政療單拌餾攀鋅醫(yī)寨告實驗Yacc與Lex快速門實驗Yacc與Lex快速門第35頁/共40頁幾個重要問題最長子串匹配規(guī)則問題文件讀寫問題細節(jié)問題俯敵無崩蕩帽蚌公洼淵貫駭逾嗓郡直劣備蠅胳臣洱懈睫溜萎節(jié)沼學顴剝詐實驗Yacc與Lex快速門實驗Yacc與Lex快速門第36頁/共40頁%{#include<stdio.h>intlineno=0;intcharno=
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 制造業(yè)項目標準合同模板
- 合同制優(yōu)化保獎服務套餐(7型)
- 裝修裝飾工程合同(三)
- 綠色通道綠化合同
- 租賃合同和解協(xié)議書格式示例
- 車輛質(zhì)押借款正式合同
- 公司簽訂安保人員合同范本范例
- 小學生拓展思維作文課件
- 臨終關懷服務的倫理決策案例考核試卷
- 城市配送與物流配送環(huán)節(jié)的風險防范考核試卷
- 2024并網(wǎng)光伏逆變器技術規(guī)范
- 文言文多文本閱讀:叔向見韓宣子(附答案解析與譯文)
- 工程招投標模擬實訓報告范文2024年
- 系統(tǒng)脫敏治療的長期療效跟蹤評估
- DB13(J)T 8406-2021 裝配式混凝土結構工程施工與質(zhì)量驗收規(guī)程(京津冀)
- 浙江省臺州市2024年中考語文模擬試題及答案6
- 離婚被告辯護詞格式范文
- 2024數(shù)字化風電場智慧運營
- 機電一體化綜合應用教程 課件 項目二 加蓋擰蓋單元的安裝與調(diào)試
- 大學生創(chuàng)新創(chuàng)業(yè)基礎教程(高校創(chuàng)新創(chuàng)業(yè)教育課程)全套教學課件
- 2024年江蘇農(nóng)林職業(yè)技術學院單招職業(yè)適應性測試題庫完美版
評論
0/150
提交評論