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

📄 ll1_recognizer.cpp

📁 编译原理LL(1)语法分析 从文法开始,一直做到了符号表的实现
💻 CPP
字号:
#include "stdafx.h"
#include "LL1_Recognizer.h"



void LL1_Recognizer::lldriver()
{
	sym_stack.push(g->start_symbol);
	cout<<"Push: "<<g->GetStr(g->start_symbol)<<endl;
	list<TOKEN>::iterator pos=tlist->begin(); //装入开始符
	terminal a; //TOKEN中的终极符信息
	nonterminal X; //产生式中的相应符号
	pair<nonterminal,terminal> p_temp;
	int j;
	vector<symbol>::reverse_iterator v_it;
	if(pos == tlist->end()) return;
	while( !sym_stack.empty() ) //表不空时工作
	{
		a=pos->value;
		X=sym_stack.top();
		//当X是非终极符,通过LL1表找到(X,a)对应的产生式并弹出X,压入产生式右部.
		if( g->is_nonterminal(X) )  
		{
			if(a.first == Id || a.first == Intc) a=make_pair(a.first,-1);
			p_temp=make_pair(X,a);
			if( LL_Table.find(p_temp) == LL_Table.end() ) error(pos,X);
			else 
			{
				cout<<"Pop: "<<g->GetStr(X)<<endl;
				sym_stack.pop();
				j=LL_Table[p_temp];
				
				for(v_it=g->productions[j].rhs.rbegin();v_it != g->productions[j].rhs.rend(); v_it++)
				{ sym_stack.push(*v_it); cout<<"Push: "<<g->GetStr(*v_it)<<endl; }
			}
		}
		//当X是终极符,如果非空则检查匹配并弹出,如果是空则直接弹出
		else if (g->is_terminal(X) && (g->match(X,a) || X.first == $) )
		{
			if (X.first == $) cout<<"Pop: $"<<endl;
			else cout<<"Match: "<<g->GetStr(X)<<" , "<<g->GetStr(a)<<endl;
			sym_stack.pop();
			token_pos = pos;
			if( X.first != $ ) pos++;
		}
		//如果X是动作符号,则运行相应的动作函数.
		else if ( g->is_action_symbol(X) )
		{
			cout<<"Call: "<<g->GetStr(X)<<endl;
			sym_stack.pop();
			//Call Semantic Routine corresponding to X;
			act.call_action(X,token_pos);
		}
		else error(pos,X);
	}
	//当TOKEN指针指向文件尾,说明语法分析成功.
	if(pos == tlist->end()) cout<<"Cheer! Accept!"<<endl<<endl;
	else error(pos,X);
}

void LL1_Recognizer::error(list<TOKEN>::iterator pos,nonterminal X)
{
	//如果TOKEN序列结束而分析未结束,则显示少的部分,即产生式中的X
	if(pos == tlist->end())
		cerr<<"Maybe lose "<<g->GetStr(X)<<endl; 
	else
		//如果TOKEN序列未结束,说明不匹配,将不匹配的(X,a)显示.
		cerr<<"There's an error here: ("<<pos->line<<") "<<g->GetStr(pos->value)<<' '<<g->GetStr(X)<<endl;
	exit(1);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -