編譯原理課程設(shè)計報告C語言詞法分析器_第1頁
編譯原理課程設(shè)計報告C語言詞法分析器_第2頁
編譯原理課程設(shè)計報告C語言詞法分析器_第3頁
編譯原理課程設(shè)計報告C語言詞法分析器_第4頁
編譯原理課程設(shè)計報告C語言詞法分析器_第5頁
已閱讀5頁,還剩8頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、編譯原理課程設(shè)計報告題目名稱c語言詞法分析器班 級24020802學(xué) 號 姓 名指導(dǎo)教師 編寫時間2010/12/10目 錄1.課程設(shè)計題目名稱- 2 -2.課程設(shè)計目的與任務(wù)- 2 -3.設(shè)計思想和實現(xiàn)方法- 3 -4.程序說明- 3 -5.程序運(yùn)行結(jié)果和測試報告- 4 -6.存在問題及分析- 6 -7.總結(jié)及體會- 6 -參考文獻(xiàn)- 6 -附件一- 7 -附件二- 11 -1. 課程設(shè)計題目名稱使用工具實現(xiàn)c/c+語言詞法分析器2. 課程設(shè)計目的與任務(wù)a) 人數(shù):1人b) 時間:一周c) 輸入:c/c+源代碼文件,即后綴為c/cpp的文件。d) 輸出:后綴為tok的文本性文件。e) 實現(xiàn)功

2、能:完成c/c+語言的詞法分析器(c語言詞法記號及其含義詳見附件一)詞法記號含義lb“”lp“(”rb“”rp“)”plus“+”- 2 -3. 設(shè)計思想和實現(xiàn)方法詞法分析器的作用如下:1. 讀入源程序字符序列2. 對源程序進(jìn)行預(yù)處理,如刪除注釋和回車換行符,宏展開等3. 識別源程序中的單詞符號,創(chuàng)建符號表并在相應(yīng)的符號表中登錄信息4. 輸出單詞符號序列對于此題,我們可以選擇使用c+人工編寫詞法分析代碼來實現(xiàn),也可以使用lex編程來自動生成詞法分析器。相對于lex編程,第一種方案的有著思路簡單,實現(xiàn)方便的優(yōu)點,但隨著詞法分析的深入,代碼編寫的復(fù)雜度和重復(fù)度逐漸上升,為詞法分析的實現(xiàn)增加許多困難

3、;而使用lex編程則克服了這一困難,若需要增加一種識別模式,僅僅需要增加的是對此模式的正則表達(dá)式的編寫以及識別后的動作編寫。lex是一種生成掃描器的工具,我們可以通過編寫lex文件來實現(xiàn)識別文本中的詞匯模式的程序。lex編程可以分為三步:1. 以lex可以理解的格式制定模式相關(guān)的動作。2. 在這一文件上運(yùn)行l(wèi)ex,生成掃描器的c/c+代碼。3. 編譯和鏈接c代碼,生成可執(zhí)行的掃描器。我要做的就是編寫c語言詞法的正則表達(dá)式,以及需要識別的各種詞法記號和匹配后需要執(zhí)行的動作即可,其他的操作都可以交給lex來執(zhí)行。(詳細(xì)源代碼見附件二)4. 程序說明一個標(biāo)準(zhǔn)的lex程序分為三個段:第一段:定義部分

4、全局聲明部分起始于“%”符號,終止于“%”符號,其間可以包括include語句、聲明語句在內(nèi)的c語句。例如:% #include stdio.hint linenum;%第二段:規(guī)則部分規(guī)則部分起始于“%”符號,終止于“%”符號,其間則是詞法規(guī)則。詞法規(guī)則由模式和動作兩部分組成。模式部分可以由任意的正則表達(dá)式組成,動作部分由c語言語句組成,這些語句用來對所匹配的模式進(jìn)行相應(yīng)處理。需要注意的是,lex將識別出來的單詞存放在yytext字符數(shù)據(jù)中,因此該數(shù)組的內(nèi)容就代表了所識別出來的單詞的內(nèi)容。例如:%delim tn ws delim+number digit+(.digit+)?(e+-?di

5、git+)? ws /*忽略空格符、制表符、換行符的操作*/number fprintf(yyout,%st/number(常數(shù))n,yytext);%在上述代碼中,“ws delim+”代表識別空格符、制表符、換行符的規(guī)則,“ws /*忽略空格符、制表符、換行符的操作*/”就代表對識別出的“ws”進(jìn)行操作,即忽略空格符、制表符、換行符。第三段:是補(bǔ)充的用戶自定義函數(shù)。例如:int yywrap() return 1;int main(int argc, char *argv) yyin = fopen(input.c,r); yyout = fopen(output.tok,w); prin

6、tf(input.c文件分析完畢,結(jié)果保存在output.tok文件n); fprintf(yyout,/c語言詞法分析n/2402080216n/楊凱n/2010/12/10nn/詞法分析如下:n); yylex(); return 0;上述代碼就是一個用戶自定義的函數(shù),此函數(shù)實現(xiàn)的功能是:打開input.c文件進(jìn)行詞法分析,并將結(jié)果輸出到output.tok文件中。5. 程序運(yùn)行結(jié)果和測試報告使用lex編程,命名為mylexer.l,使用parser generator 2編譯生成mylexer.c、mylexer.h和mylexer.v文件,在microsoft visual c+6.0

7、中新建一個工程,命名為test,將mylexer.c加入到source files,將mylexer.h加入到header files,配置好環(huán)境變量后編譯運(yùn)行,運(yùn)行結(jié)果如下圖所示。用來測試的c語言文件名為input.c,經(jīng)詞法分析后輸出的文件命名為output.tok。由結(jié)果可知,順利完成詞法分析任務(wù)。圖1 編譯運(yùn)行運(yùn)行結(jié)果圖2 input.c文件截圖圖3 output.tok文件截圖6. 存在問題及分析詞法分析的正則表達(dá)式編寫有些不是很全面,比如說識別常數(shù)“number”的正則表達(dá)式就無法識別8進(jìn)制、16進(jìn)制數(shù)據(jù)。識別某些詞法記號的正則表達(dá)式編寫的不是很嚴(yán)謹(jǐn),比如說在識別c語言預(yù)處理定義語

8、句的正則表達(dá)式僅僅只能識別出預(yù)處理語句,而無法進(jìn)行預(yù)處理包含的頭文件的詞法分析。用戶自定義程序編寫的較為簡陋,若能美化一下,人機(jī)交互將會更美好。對lex編程還不是很了解,對詞法分析器的作用以及工作原理的理解還有待提高。7. 總結(jié)及體會在拿到本次課程設(shè)計題目后,對完成此次課程設(shè)計的兩種主流方案進(jìn)行了一些思考,用c+語言直接編寫詞法分析程序從思路上來說會比較容易些,也曾試著寫過一些代碼,但在寫代碼的過程中,慢慢地就暴露出直接編寫詞法分析程序的一些問題,比如說代碼的重復(fù)度很高,代碼里充斥著大量的ifswitch語句,極大地增加了代碼的復(fù)雜度,從而促使我選擇使用lex編程來自動生成詞法分析器的方案。使

9、用lex編程就簡化了代碼的編寫,從而將注意力放在識別詞法記號的正則表達(dá)式的編寫和識別后所執(zhí)行的動作的編寫上。本次課程設(shè)計也暴露了我在編譯原理學(xué)習(xí)中的一些不足,比如對正規(guī)式的含義和編寫還有一些疑問,對詞法分析器的作用和工作原理理解的不是很清等等,通過課程設(shè)計很好的復(fù)習(xí)了編譯原理課程中的詞法分析部分,對自己理解詞法分析有很大的幫助。參考文獻(xiàn)1 陳意云、張昱,編譯原理(第二版),高等教育出版社 2 毛紅梅,編譯原理 學(xué)練考,清華大學(xué)出版社3 霍林,編譯技術(shù)課程設(shè)計與上機(jī)指導(dǎo),重慶大學(xué)出版社附件一c語言詞法記號及其含義表詞法記號含義lb“”lp“(”rb“”rp“)”plus“+”minus“-”mu

10、lt“*”div“/”mod“%”plusa“+=”minusa“-=”mula“*=”diva“/=”moda“%=”ls“”lsa“=”not“!”bitand&bitor|xorcompland“&”or“|”lt“”le“”ge“=”eq“=”ne“!=”assign“=”dot“.”ms-laraposinc+posdec-preinc+predec-unaryminus-unaryplus+dereferece*address&comma“,”sc;identifier標(biāo)識符asm“asm”auto“auto”bool“bool”break“break”case“case”catc

11、h“catch”char“char”class“class”const“const”const_cast“const_cast”continue“continue”default“default”delete“delete”do“do”double“double”dynamic_cast“dynamic_cast”else“else”enum“enum”explicit“explicit”extern“extern”false“false”float“float”for“for”friend“friend”goto“goto”if“if”inline“inline”int“int”log“l(fā)o

12、g”long“l(fā)ong”mutable“mutable”namespace“namespace”new“new”operator“operator”private“private”protected“protected”public“public”register“register”reinterpret_cast“reinterpret_cast”return“return”short“short”signed“signed”sizeof“sizeof”static“static”static_cast“static_cast”struct“struct”switch“switch”temp

13、late“template”this“this”throw“throw”true“true”try“try”typedef“typedef”typeid“typeid”typename“typename”union“union”unsigned“unsigned”using“using”virtual“virtual”void“voidvolatile“volatilewchar_t“wchar_t”whilewhileinteger_literal整數(shù),包括十進(jìn)制、八進(jìn)制(以0開頭)、十六進(jìn)制(以0x或0x開頭)real_literal實數(shù)string字符串character字符附件二myl

14、exer.l源代碼%#include #include #include int yywrap();%/*正規(guī)定義(規(guī)則聲明)*/delim tn ws delim+letter a-za-z digit 0-9 identifier letter(letter|digit)* error_id (digit)+(letter)+number digit+(.digit+)?(e+-?digit+)? comment (/*(*/|*)*/)|(/(.)*n)string (.)*character (|)*pun (|)|,|;|=)ari_op (+|-|*|/)rel_op (|=|=|

15、!=) log_op (!|&|)binary_pos_op (identifier(+|-|+=)|-=|*=|/=|%=)binary_pre_op (+|-)identifier)pre_treatment (#(.)+n)%ws /*忽略空格符、制表符、換行符的操作*/ /空格處理comment /*注釋*/ /空格處理 auto|_bool|break|case|char|_complex|const|continue|default|do|double|else|enum|extern|float|for|goto|if|_imaginar|inline|int|long|regi

16、ster|restrict|return|short|signed|sizeof|static|structswitch|typedef|union|unsigned|void|volatile|while fprintf(yyout,%st/keyword(關(guān)鍵字)n,yytext);/c語言32個關(guān)鍵字的識別number fprintf(yyout,%st/number(常數(shù))n,yytext);/數(shù)字的識別identifier fprintf(yyout,%st/identifier(標(biāo)識符)n,yytext);/標(biāo)識符的識別error_id fprintf(yyout,%st/erro

17、r_id(開頭為數(shù)字的錯誤標(biāo)識符)n,yytext);/開頭為數(shù)字的錯誤標(biāo)識符的識別string fprintf(yyout,%st/string(字符串常量)n,yytext);/字符串識別character fprintf(yyout,%st/char_(char型變量)n,yytext);/字符變量識別pun fprintf(yyout,%st/punction(特殊符號)n,yytext);/特殊符號識別ari_op fprintf(yyout,%st/arithmetic operators(算術(shù)運(yùn)算符)n,yytext);/ 算術(shù)運(yùn)算符識別rel_op fprintf(yyout,%st/relational operators(關(guān)系運(yùn)算符)n,yytext);/關(guān)系運(yùn)算符識別pre_treatment fprintf(yyout,%st/pre_tratement(預(yù)處理定義)n,yytext);/預(yù)處理識別binary_pos_op fprintf(yyout,%st/binary_pos_op(雙目向后運(yùn)算符)n,yytext);/binary_pre_op fprintf(yyout,%st/binary_pre_op(雙目向前運(yùn)算符)n,yytext);/雙目運(yùn)算符的識別log_op fprintf(yyout,%

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論