1、 /false表示当前字符未处于注释中。 while(cinf.read(&cur_c,sizeof(char) /从文件读一个字符 switch(in_comment) case false: if(old_c=/ & cur_c=*) /进入多行注释 i-; /去除已存入扫描缓冲区的字符 in_comment=true; else if(old_c=) /进入行注释p=1; /去除已存入扫描缓冲区的字符 else n) /发现续行 i-; else if(cur_c=A cur_cstdlib.hconio.hconst short WORDLEN=20;struct code_val c
2、har code;char valWORDLEN;/单词编码表const char code=ac=+$*,;()#/DFA列字符const char COL_CHAR=a0=+*,;()# /状态转换矩阵(DFA)const int DFA11=/strlen()=11 1,2,3,4,5,6,7,8,9,10,0,11,11,0,12,0,0,0,0,13,0,0,0,0,0,0,11,11, 0,12,0/预处理函数原型/扫描函数原型code_val scanner(char *);/主函数void main() char buf4048=/扫描缓冲区/预处理/显示bufcout/单词识
3、别 code_val t;/临时变量 do t=scanner(buf);/调用一次扫描器获得一个单词二元式 coutt.codet.valacz)c=09/ const char COL_CHAR= for(int i=0;iexit(0); /程序终止运行 /预处理函数void pro_process(char *buf) ifstream cinf( int i=0;char old_c=/计数器,前一个字符,当前字符。/状态标志,false表示当前字符未处于注释中。cur_c,sizeof(char)/从文件读一个字符)/进入注释/去除已存入扫描缓冲区的字符) /去除续行符,包括后续换
4、行符。 else ) cur_c+=32; if(cur_c= | cur_c=) cur_c=/空格 bufi+=cur_c ;)/离开注释/保留前一个字符 bufi=输入内容在source.txt中,如下:egin/*S=2*3.14*R*R+2*3.14*R*H*/14*r*(r+h) kmoiulEnd NULc NULi r, NULi hi s NUL= NULx 2* NULx 314( NUL$ NUL+ NUL) NULi kmoiul NUL# NUL实验三在自上而下预测分析控制程序的基础上,根据文法规则进行语法分析,如字串是句子,写出文法的最左推导。根据表达式文法的预测分
5、析表,对输入的符号串进行分析。输入的符号串需是单词二元式。若产生式匹配,则输出产生式。X 存放当前栈顶符号的工作单元,当X是终结符时,读入下一个符号;当X是非终结符时,判断其是否为#,若不是,则判断其MX,a是否是产生式(匹配),匹配则逆序出栈,然后按最左推导输出。具体代码如下:for(i=strlen(pMlin(X)col(t.code)-1;i=0;i)stack+top=*(pMlin(X)col(t.code)+i);XpMlin(X)col(t.code)t.codet.val; /读一个单词的二元式 char stack20=,Eint top=1; /栈赋初值 char X=
6、/用于显示,并非必要。stepstackXt.code /用于显示,并非必要。j) /用于显示,并非必要。 while(1) for(i=0;=top;i+) coutstacki;/用于显示,并非必要。 X=stacktop-; /出栈+j /用于显示,并非必要。 /用于显示,并非必要。 if(X=) if(X=t.code)couttAccbreak; /跳出循环 elsecout /end of if(X=) if(isT(X) /是否是终结符 if (X= t.code) cinf /读下一单词二元式Err in T continue;/end of if(isT(X) if(isNT
7、(X) /是否是非终结符 if(Mlin(X)col(t.code)=-1) cout elsefor(i=strlen(pMlin(X)col(t.code)-1;i-) stack+top=*(pMlin(X)col(t.code)+i);/end of if(isNT(X)Err in main( )/end of while/end of mainint lin(char c) /将EDTSF分别转换为01234 for(int i=0;(int)strlen(NT); if(c=NTi)return i;Err in lin( ) int col(char c) /将+* ()ixy
8、#分别转换为01234567or(int i=0;(int)strlen(T);i+)if(c=Ti)return i;Err in col( )bool isNT(char c) /是否是非终结符for(int i=0;i+) if(c=NTi)return true;return false;bool isT(char c) /是否是终结符(不包括)(int)strlen(T)-1;i+)if(c=Ti)return true;文件lex_r.txt输入数据,如下:i a + nul i b # nul结果输出至文件par_r.txt,如下:step stack X t.code0) #E
9、 i1) # E iE-TD #DT i2) #D T iT-FS #DSF i3) #DS F iF-i #DSi i4) #DS i i #DS +5) #D S +S- #D +6) # D +D-+TD #DT+ +7) #DT + +8) #D T i9) #DS F i10) #DS i i #DS #11) #D S # #D #12) # D # # #13) # # Acc实验四 在LR语法分析器的控制程序的基础上,添加语义栈,在对字符串进行分析的同时,也翻译字符串。当action /读一单词 int action; /输出时使用的计数器,并非必要。状态栈符号栈输入符号/ doj+ /输出
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1