📄 yyparse.cpp
字号:
int inputsymbol=0;
int cstate=0;
stack<Sym> symStack;//符号栈
stack<SV> valStack;//语义值栈
Sym st;//用作分析时的临时栈顶元素存储变量
st.symbol=0;
st.state=0;
SV val;
symStack.push(st);//语义值栈必须要和符号栈同步
valStack.push(val);
inputsymbol=readToken();
while(1)
{
st=symStack.top();
int col=signalTable[inputsymbol];
int result=searchTable(st.state,col);
if(result==E)//出错
{
cout<<"Compile Error!"<<endl;
return 0;
}
if(result==ACCEPT)
{
cout<<"Compile sucessfully!"<<endl;
return 1;
}
if(result<0)//负数表示为归约项目
{
result*=-1;
int n=producerN[result];//取得该号产生式右部符号数量,以作弹栈用
for(int i=0;i<n;i++)
{
symStack.pop();
u[n-i]=valStack.top();
valStack.pop();
}
runaction(result);//执行语义动作
//再将产生式左部的符号压栈,语义值一同压栈
st.symbol=pLeftSection[result];
st.state=searchTable(symStack.top().state,signalTable[st.symbol]);
symStack.push(st);
//将产生式左部符号的语义值入栈。这个值在runaction()中已经修改
valStack.push(u[0]);
}
else
{
st.symbol=inputsymbol;
st.state=result;
symStack.push(st);
SV tu;
if(yyval.ival==0)
getvalue(inputsymbol,tu);
else tu=yyval;
valStack.push(tu);
inputsymbol=readToken();
}
}
}
void main()
{
pair<int,int> tp;
tp.first=30019;
tp.second=23;
signalTable.insert(tp);
tp.first=30004;
tp.second=4;
signalTable.insert(tp);
tp.first=30002;
tp.second=2;
signalTable.insert(tp);
tp.first=30026;
tp.second=40;
signalTable.insert(tp);
tp.first=30011;
tp.second=11;
signalTable.insert(tp);
tp.first=40001;
tp.second=45;
signalTable.insert(tp);
tp.first=30024;
tp.second=38;
signalTable.insert(tp);
tp.first=30023;
tp.second=35;
signalTable.insert(tp);
tp.first=30010;
tp.second=10;
signalTable.insert(tp);
tp.first=30013;
tp.second=13;
signalTable.insert(tp);
tp.first=30015;
tp.second=15;
signalTable.insert(tp);
tp.first=30000;
tp.second=0;
signalTable.insert(tp);
tp.first=30005;
tp.second=5;
signalTable.insert(tp);
tp.first=30016;
tp.second=16;
signalTable.insert(tp);
tp.first=30021;
tp.second=27;
signalTable.insert(tp);
tp.first=30020;
tp.second=26;
signalTable.insert(tp);
tp.first=30025;
tp.second=39;
signalTable.insert(tp);
tp.first=30028;
tp.second=42;
signalTable.insert(tp);
tp.first=30012;
tp.second=12;
signalTable.insert(tp);
tp.first=30022;
tp.second=29;
signalTable.insert(tp);
tp.first=30009;
tp.second=9;
signalTable.insert(tp);
tp.first=30006;
tp.second=6;
signalTable.insert(tp);
tp.first=30027;
tp.second=41;
signalTable.insert(tp);
tp.first=30001;
tp.second=1;
signalTable.insert(tp);
tp.first=30003;
tp.second=3;
signalTable.insert(tp);
tp.first=30014;
tp.second=14;
signalTable.insert(tp);
tp.first=30018;
tp.second=21;
signalTable.insert(tp);
tp.first=30007;
tp.second=7;
signalTable.insert(tp);
tp.first=30017;
tp.second=17;
signalTable.insert(tp);
tp.first=30008;
tp.second=8;
signalTable.insert(tp);
tp.first=35003;
tp.second=22;
signalTable.insert(tp);
tp.first=35007;
tp.second=30;
signalTable.insert(tp);
tp.first=35011;
tp.second=34;
signalTable.insert(tp);
tp.first=35015;
tp.second=44;
signalTable.insert(tp);
tp.first=35002;
tp.second=20;
signalTable.insert(tp);
tp.first=35006;
tp.second=28;
signalTable.insert(tp);
tp.first=35010;
tp.second=33;
signalTable.insert(tp);
tp.first=35014;
tp.second=43;
signalTable.insert(tp);
tp.first=35001;
tp.second=19;
signalTable.insert(tp);
tp.first=35005;
tp.second=25;
signalTable.insert(tp);
tp.first=35009;
tp.second=32;
signalTable.insert(tp);
tp.first=35013;
tp.second=37;
signalTable.insert(tp);
tp.first=35000;
tp.second=18;
signalTable.insert(tp);
tp.first=35004;
tp.second=24;
signalTable.insert(tp);
tp.first=35008;
tp.second=31;
signalTable.insert(tp);
tp.first=35012;
tp.second=36;
signalTable.insert(tp);
string filename;
cout<<"Please input the file name:"<<endl;
cin>>filename;
fin.open(filename.c_str());
if(fin.fail())
{
cout<<"Cannot open the file "<<filename<<endl;
return;
}
parse();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -