資源描述:
《詞法編譯器報(bào)告.docx》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、編譯原理——C語言詞法分析器學(xué)號(hào)姓名黎紅波1、實(shí)驗(yàn)內(nèi)容與要求基于C語言的字符集,編寫C語言的詞法分析器;要求能檢查出輸入程序中的不合法字符,輸出該非法字符并顯示所在行號(hào);要求輸出詞法分析后的結(jié)果,并顯示對應(yīng)Token所在程序中的行號(hào);要求能夠過濾掉注釋內(nèi)容;2、實(shí)驗(yàn)方法利用flex工具進(jìn)行分詞,寫出各種單詞分類的正則表達(dá)式,利用flex工具自帶的功能在linux下通過編寫.l文件生成相應(yīng)具有C語言詞法分析功能的程序;3、分析與設(shè)計(jì)單詞分類保留字:if
2、then
3、else
4、int
5、float
6、double
7、bool
8、char
9、printf
10、scanf
11、ret
12、urn
13、main
14、while
15、do
16、for
17、struct
18、void
19、break
20、const
21、static
22、auto
23、short
24、long
25、union
26、enum
27、typedef
28、unsigned
29、signed
30、extern
31、register
32、volatile
33、switch
34、case
35、goto
36、continue
37、default
38、sizeof
39、include標(biāo)識(shí)符:[a-z_A-Z][a-z_A-Z0-9]*常量:1)字符串常量:"[^"]+"2)整型常量:([-+]?[1-9][0-9]*)
40、03)浮點(diǎn)常量:[-+]?[0-9]*.[0-9]+4)字
41、符常量:'[^']+'特殊符號(hào):([=+-*/&!
42、%.])
43、([+-*/%<>=][=])限界符:[{}[](),;]注釋判斷://[^]*/*(.)**/利用yylineno來記錄程序分析時(shí)所在行號(hào),yytext記錄當(dāng)前正在分析的串;Analyse.l文件編寫思路:當(dāng)遇到上述分類中的匹配就輸出對于行號(hào)和正在分析的串,當(dāng)遇到空格、Tab及注釋就直接跳過;沒遇到一次’’則yylineno就增加1,如果都沒有匹配成功則最后可以輸出該字符不是C語言字符集里面的符號(hào)。4、實(shí)驗(yàn)結(jié)果
44、與分析對程序data.c進(jìn)行分析:data.c:#includeintmain(){inta=0;intb+=a;//這是注釋,編譯期間會(huì)被忽略itnc=3.14;c=a+b;d="helloworld";c='c';return0;}測試截圖如下:5、不足1、程序中略過了已#開頭的行,對include和宏定義沒有進(jìn)行分析;2、對于/**/格式的注釋,利用yylineno記錄行數(shù)時(shí)只能記錄在程序中的行號(hào),沒有包括注釋中所包括的行號(hào);6、源碼展示(僅展示.l文件里面的內(nèi)容)analyse.l:%{#include"stdio.h"#incl
45、ude"stdlib.h"%}INTEGER([-+]?[1-9][0-9]*)
46、0FLOAT[-+]?[0-9]*.[0-9]+STR"[^"]+"CHAR'[^']+'ID[a-z_A-Z][a-z_A-Z0-9]*SPEC([=+-*/&!
47、%.])
48、([+-*/%<>=][=])LIM[{}[](),;]%%#[^]*{}//[^]*{}/*(.)**/{}{INTEGER}{printf("Line%d:(Integer,%s)",yyline
49、no,yytext);}{FLOAT}{printf("Line%d:(Float,%s)",yylineno,yytext);}if
50、then
51、else
52、int
53、float
54、double
55、bool
56、char
57、printf
58、scanf
59、return
60、main
61、while
62、do
63、for
64、struct
65、void
66、break
67、const
68、static
69、auto
70、short
71、long
72、union
73、enum
74、typedef
75、unsigned
76、signed
77、extern
78、register
79、volatile
80、switch
81、case
82、goto
83、continue
84、def
85、ault
86、sizeof
87、include{printf("Line%d:(KeyWords,%s)",yylineno,yytext);}{STR}{printf("Line%d:(Str,%s)",yylineno,yytext);}{CHAR}{printf("Line%d:(Char,%s)",yylineno,yytext);}{ID}{printf("Line%d:(Id,%s)",yylineno,yytext);}{SPEC}{printf("Line%d:(Special,%s)",yylineno,yytext);}{L
88、IM}{printf("Line%d:(LimitDomain,%