⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 yyparse.cpp

📁 语法分析器lex和词法分析器yacc的C++语言实现 1.Lex (1)Lex输入文件的解析 (2)正规表达式的解析 (3)一个正规表达式到NFA的转换算法实现 (4)多个NFA的合并
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -