编译原理作业~
没有按照dfa来做是我的错、、等我预习完了再改吧
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<map>
using namespace std;
#define lowcase (s2[j]>='a'&&s2[j]<='z')
#define upcase (s2[j]>='A'&&s2[j]<='Z')
#define number (s2[j]>='0'&&s2[j]<='9')
string s1,s2,s3;
void init(map<string,int> &x)
{
x["begin"]=1;
x["if"]=2;
x["then"]=3;
x["while"]=4;
x["do"]=5;
x["end"]=6;
x["+"]=13;
x["-"]=14;
x["*"]=15;
x["/"]=16;
x[":"]=17;
x[":="]=18;
x["<"]=19;
x["<>"]=20;
x["<>"]=21;
x["<="]=22;
x[">"]=23;
x[">="]=24;
x["="]=25;
x[";"]=26;
x["("]=27;
x[")"]=28;
x["#"]=0;
}
void trans(string &s)
{
int i=0;
int k=s.length();
while(i<k-1)
{
if(s[i]=='0'){s.erase(0,1);break;}
i++;
}
}
int pend(string &s)
{
int len=(int)s.length();
if((s[0]>='0'&&s[0]<='9'))
{
int i=0;
while((i<=len-1)&&(s[i]>='0'&&s[i]<='9')){i++;}
if(i==len){return 0;}
else if((s[i]<='z'&&s[i]>='a')||(s[i]<='Z'&&s[i]>='A')){return 1;}
else
{return 0;}
}
else return 0;
}
int main()
{
map<string,int>df;
init(df);
while(getline(cin,s1))
{
s2.clear();
s3.clear();
int i=0,j=0;
int len1=(int)s1.length();
while(i<len1)
{
while(s1[i]!=' '&&i<len1)
{
s2.append(s1,i,1);
i++;
}
if(s1[i]==' '){i++;}
if(!df[s2])
{
j=0;
int len2=(int)s2.length();
cout<<s2<<endl;
if(pend(s2)){printf("error\n");goto en;}
while(j<len2)
{
if(j<len2&&number)
while(j<len2&&number)
{s3.append(s2,j,1);j++;trans(s3);}
else if(lowcase||upcase)
while(j<len2&&((lowcase||upcase||number))){s3.append(s2,j,1);j++;}
else
while(j<len2&&(!(lowcase||upcase||number))){s3.append(s2,j,1);++j;}
int len3=(int)s3.length();
if(df[s3]&&len3)
cout<<'('<<s3<<','<<df[s3]<<')'<<endl;
else if(len3&&s3[0]<='9'&&s3[0]>='0')
cout<<'('<<11<<','<<s3<<')'<<endl;
else
cout<<'('<<10<<','<<s3<<')'<<endl;
s3.clear();
}
}
else{cout<<'('<<s2<<','<<df[s2]<<')'<<endl;}
s2.clear();
}
en:;
}
return 0;
}
/*
begin end
if then
x y
begin x:=9: if x>9 then x:=2*x+1/3; end #
00009
10x
*/