实验一 词法分析

更新时间:2023-03-09 05:43:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验一 词法分析 有如下算术运算文法: 1) E->E+T 2) E->E-T 3) E->T 4) T->T*F 5) T->T/F 6) T->F 7) F->(E) 8) F->I 9) I->十进制实数|十进制整数|十六进制实数| 十六进制整数|八进制实数|八进制整数 10) 十进制实数-> (0|(1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9) *).(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9) * 11) 八进制实数-> 0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7)* .(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7) * 12) 十六进制实数 -> 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)* .(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f)(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f) * 13) 十进制整数-> 0 | (1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9) * 14) 八进制整数-> 0(0|1|2|3|4|5|6|7)(0|1|2|3|4|5|6|7) * 15)十六进制整数-> 0x(0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f) (0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f) * 单词分类: 运算符 :+ - * / ( ) 常数: 十进制实数 十进制整数 十六进制实数 十六进制整数 八进制实数 八进制整数 1. 实验目的 实现一个词法分析程序,将输入字符串流分解成 单词流供语法分析使用。 2. 实验要求 输入算术运算式,输出分解后的单词流,例如: 输入(0124.3+0x35a.4f)*12 输出: 运算符 ( 八进制实数 0124.3 运算符 + 十六进制实数 0x35a.4f 运算符 ) 运算符 * 十进制整数 12 注意: ? 输入可以是键盘输入,也可以是文件输入 ? 如果单词输入错误,必须有提示,例如: 输入 12a+45*013468-0x23a3 输出 错误数据12a 运算符 + 十进制整数 45 运算符 * 错误数据 0123468 运算符 - 十六进制整数 0x23a3 3.实验代码 #include #include using namespace std; void f(char *t) { int j; bool ss=0,is8=0,is10=0,is16=0; for(j=0;j=0&&t[j]-'0'<10)||(t[j]-'a'>=0&&t[j]-'a'<6)) c++; if(ss&&c==strlen(t)-3) is16=1; if(!ss&&c==strlen(t)-2) is16=1; if(is16&&ss) cout<<\十六进制实数 \ else if(is16) cout<<\十六进制整数 \ else cout<<\错误数据 \ return; } if(t[0]=='0'&&t[1]!='.'&&t[1]!='\\0') { int cc=0; for(j=1;j=0&&t[j]-'0'<8) cc++; if(ss&&cc==strlen(t)-2) is8=1; if(!ss&&cc==strlen(t)-1) is8=1; if(is8&&ss) cout<<\八进制实数 \ else if(is8) cout<<\八进制整数 \ else cout<<\错误数据 \ return; } if(t[0]-'0'>=0&&t[j]-'0'<10) { int ccc=0; for(j=1;j=0&&t[j]-'0'<10) ccc++; if(ss&&ccc==strlen(t)-2) is10=1; if(!ss&&ccc==strlen(t)-1) is10=1; if(is10&&ss) cout<<\十进制实数 \ else if(is10) cout<<\十进制整数 \ else cout<<\错误数据 \ return; } if(t[0]!=0) cout<<\错误数据 \ return; } int main() { char s[100],temp[100]; while(gets(s)) { int i; int k=0; int flag=0; if(s[0]=='+' || s[0]=='-'|| s[0]=='*'|| s[0]=='/'|| s[0]=='('|| s[0]==')') flag=1; for(i=0;i0) { f(temp); if(s[i]!=' ') 符 \ cout<<\运算 k=0; } else { if(s[i]!=' ') cout<<\运算 符 \ } } } temp[k]='\\0'; f(temp); } return 0; }

本文来源:https://www.bwwdw.com/article/1m4p.html

Top