输入:3+4*6 输出:27(当然中间包括 LR(1)语法分析过程
程序提供主要为了给大家提供一些方便,你懂得。。。呵呵
如有问题,QQ:718561468
来自:大连理工大学软件学院
#include
using namespace std;
#include
#include
#include
#include
string AnalyzeChart[16][11]=
{//LR 文法的分析表
"e1",
"s5",
"e1",
"s4",
"e2",
"e1",
"1",
"2",
"3",
"e1",
"e1",
"e3",
"s6",
"e1",
"e3",
"e2",
"acc",
"error", "error", "error",
"s7",
"e1",
"e6",
"r2",
"s8",
"r2",
"s9",
"e6",
"r4",
"r4",
"r4",
"r4",
"e6",
"e6",
"r2",
"r4",
"r2",
"r4",
"error", "error", "error",
"error", "error", "error",
"s5",
"e1",
"e1",
"s4",
"e2",
"e1",
"10",
"2",
"3",
"e1",
"e1",
"e5",
"r6",
"r6",
"r6",
"r6",
"s5",
"e1",
"e1",
"e1",
"e1",
"e3",
"s4",
"r6",
"e2",
"r6",
"error", "error", "error",
"e1",
"error", "11",
"3",
"3",
"s5",
"e1",
"e1",
"s4",
"e2",
"e1",
"error", "12",
"e1",
"e1",
"s5",
"e1",
"e1",
"e1",
"e1",
"s5",
"e1",
"e1",
"e1",
"e1",
"s4",
"s4",
"e2",
"e1",
"e1",
"e1",
"error", "error", "13",
"error", "error", "14",
"e3",
"s6",
"e1",
"e3",
"s15",
"r3",
"error", "error", "error",
"s9",
"e1",
"e6",
"r1",
"s8",
"r1",
"s9",
"e6",
"r7",
"s8",
"r7",
"s9",
"e6",
"r3",
"r3",
"r3",
"r3",
"e6",
"r8",
"r8",
"r8",
"r8",
"e6",
"r5",
"r5",
"e6",
"e6",
"e6",
"e6",
"e6",
"r1",
"r7",
"r3",
"r8",
"r5",
"r1",
"r7",
"r3",
"r8",
"r5",
"error", "error", "error",
"error", "error", "error",
"error", "error", "error",
"error", "error", "error",
"error", "error", "error",
"r5",
"r5",
};
stack digit;
queue digit1;
queue inputid;
char *FinalSymbol[6]=
{
"i","+","*","(",")","#"//终结符
};
char *UnfinalSymbol[5]=
{
"E","E'","T","T'","F"//非终结符
};
stack ufstack;//状态栈
void initialize()
{
ufstack.push('0');
inputid.push(0);
}
char * keyword[6] = {"for","if","then","else","while","do"};
int flag1=-1,flag2=-1;
typedef struct sign
{
int line;
int token;
char temp[10];
int i;
};
void reset(sign & s)
{
s.i = 0;
memset(s.temp,'$',10);
s.token = -1;
}
bool is_key_word(sign & s)
{
int i,r;
for(i=0;i<6;i++)
{
r = memcmp(s.temp,keyword[i],s.i);
if(r == 0)
{
s.token = i+1;
return true;
break;
}
}
return false;
}
bool is_id(sign & s)
{
int i;
bool b = false;
if( (s.temp[0]>='a' && s.temp[0]<='z') | (s.temp[0]>='A' && s.temp[0]<='Z') )
else
b = true;
return b;
for(i=1;i
='a' && s.temp[i]<='z')
|
(s.temp[i]>='A' && s.temp[i]<='Z')
|
(s.temp[i]>='0' && s.temp[i]<='9'))
;
else
{
b = false;
return b;
}
}
return b;
}
bool is_num(sign & s)
{
digit.push(0);
bool b = true;
char c;
int state = 12;
for(int i=0;icase 12:
{
}
case 13:
{
}
case 14:
{
}
case 15:
{
}
case 16:
{
}
case 17:
{
if(c>='0' && c<='9' || c=='-')
{
state = 13;
}
else
return false;
break;
if(c>='0' && c<='9') state = 13;
else if(c=='.') state=14;
else if(c=='E' || c=='e') state=16;
else return false;
break;
if(c>='0' && c<='9') state=15;
else return false;
break;
if(c>='0' && c<='9') state=15;
else if(c=='E' || c=='e') state=16;
else return false;
break;
if(c=='+' || c=='-') state=17;
else if(c>='0' && c<='9') state=18;
else return false;
break;
if(c>='0' && c<='9') state=18;
else return false;
break;
if(c>='0' && c<='9') state=18;
else return false;
break;
}
case 18:
{
}
}
}
return b;
}
int handle(sign & s)
{
s.temp[s.i] = '\0';
if(strlen(s.temp)==0)
return 0;
if(is_key_word(s))
{
cout<<"("<
}
else
{
}
n=n*10+(s.temp[i]-'0');
i++;
}
if(n1!=0)
n=n/n1;
// cout<
}
else if(ch=='-')
{
handle(mark);
cout<<"(14,"<
')
{
handle (mark);
cout<<"(23,"<inputid.push(18);
}
else
{
handle(mark);
cout<<"(25,"<