有如下算术运算文法:
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
#include<bits/stdc++.h>
using namespace std;
void test(string tmp)
{
if(tmp.size()!=0)
{
if(tmp[0]=='0'&&tmp[1]=='x')//十六进制
{
int flag=0;
for(int j=0;j<tmp.size();j++)
{
if(tmp[j]=='.')
{
flag=1;
}
else if(tmp[j]>'g'&&tmp[j]!='x')
{
flag=2;
break;
}
else
{
}
}
if(flag==1)
{
cout<<"十六进制实数"<<tmp<<"\n";
}
else if(flag==0)
{
cout<<"十六进制整数"<<tmp<<"\n";
}
else
{
cout<<"错误数据"<<tmp<<"\n";
}
}
else if(tmp[0]=='0'&&tmp[1]>='0')//八进制
{
int flag=0;
for(int j=0;j<tmp.size();j++)
{
if(tmp[j]=='.')
{
flag=1;
}
else if(tmp[j]>='8')
{
flag=2;
break;
}
else
{
}
}
if(flag==1)
{
cout<<"八进制实数"<<tmp<<"\n";
}
else if(flag==0)
{
cout<<"八进制整数"<<tmp<<"\n";
}
else
{
cout<<"错误数据"<<tmp<<"\n";
}
}
else//十进制
{
int flag=0;
for(int j=0;j<tmp.size();j++)
{
if(tmp[j]=='.')
{
flag=1;
}
else if(tmp[j]>='a')
{
flag=2;
break;
}
else
{
}
}
if(flag==1)
{
cout<<"十进制实数"<<tmp<<"\n";
}
else if(flag==0)
{
cout<<"十进制整数"<<tmp<<"\n";
}
else
{
cout<<"错误数据"<<tmp<<"\n";
}
}
}
}
bool demo(char c)
{
char a[6]={'(',')','+','-','*','/'};
for(int i=0;i<6;i++)
{
if(a[i]==c)
{
return true;
}
}
return false;
}
int main()
{
string str;//输入的字符串
getline(cin,str);
string tmp;
int n=str.size();
for(int i=0;i<n;i++)
{
if(str[i]==' ')
{
continue;
}
else if((str[i]>='a'&&str[i]<='z')||(str[i]>='0'&&str[i]<='9')||str[i]=='.'||str[i]=='x')
{
tmp+=str[i];
}
else if(demo(str[i]))
{
if(tmp.size()!=0)
{
test(tmp);
}
tmp="";//临时存储string置空
cout<<"运算符"<<str[i]<<"\n";
}
}
test(tmp);
return 0;
}