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

📄 sintactico.h

📁 Compiler with latex grammar
💻 H
字号:
#ifndef SINTACTICO_H
#define SINTACTICO_H

#include "Lexico.h"

#define S 101
#define E 102
#define T 103
#define F 104
#define G 105
#define I 106
#define O 107
#define A 108
#define AC 109

#define SIMBDOL 110
//Lo q viene a continuacion debe estar en el lexico
#define EX      111
#define TXT_IMP 112
#define DOL     113
#define RESERV  114
#define SQRT    115
#define FRAC    116
#define STACKREL 117
#define OPEN_KEY  118 
#define CLOSE_KEY  119
#define OPEN_BAR   120
#define CLOSE_BAR   121

class Sintactico{

	private:

		stack<int> Pila;
		stack<int> Entrada;
		
		int Accion;

		Automata* lexico;

		int ** matriz;
		
		Token* tmp;
		
		Tabla_Simbolos *EntradaT;
	
	protected:

		int PosX(int);
	public:

		Sintactico(/*Automata **/);
		~Sintactico();
		//bool Analisis(string::iterator);
		bool Analisis();
	//	bool Gramatica(int);
		//void ManejaErrores();

};

Sintactico::Sintactico(/*Automata* lexico*/)
{
	/*
	EntradaT = lexico->getTabla_Simbolos();
	EntradaT->Empilar(Entrada);*/
	int tabla[][20]={
	/*desplazamiento positivo reduccion negativos
	/*Esta x txt_imp dol reserv sqrt frac stack  {    }   [   ]   $   S   E  T  G  F  I   A  O*/
	/*0*/  0,  0,    2,   0,     0,   0,   0,    0,   0,  0,  0,  0,  1,  0, 0, 0, 0, 0,  0, 0,
	/*1*/  0,  0,    0,   0,     0,   0,   0,    0,   0,  0,  0,  AC, 0,  0, 0, 0, 0, 0,  0, 0,	
 	/*2*/  0,  5,   -4,   6,    10,  11,  12,   13,  -4,  0,  0,  0,  0,  3, 4, 8, 7, 9,  0, 0,
	/*3*/  0,  0,   14,   0,     0,   0,   0,    0,   0,  0,  0,  0,  0,  0, 0, 0, 0, 0,  0, 0,
	/*4*/ 17,  5,   -4,   6,    10,  11,  12,   13,  -4,  0,  0,  0,  0, 15, 4, 8, 7, 9, 16, 0,	
	/*5*/ -5, -5,   -5,  -5,    -5,  -5,  -5,   -5,  -5,  0, -5,  0,  0,  0, 0, 0, 0, 0,  0, 0,
	/*6*/ -6, -6,   -6,  -6,    -6,  -6,  -6,   -6,  -6,  0, -6,  0,  0,  0, 0, 0, 0, 0,  0, 0,
	/*7*/ -7, -7,   -7,  -7,    -7,  -7,  -7,   -7,  -7,  0, -7,  0,  0,  0, 0, 0, 0, 0,  0, 0,
	/*8*/ -8, -8,   -8,  -8,    -8,  -8,  -8,   -8,  -8,  0, -8,  0,  0,  0, 0, 0, 0, 0,  0, 0,
	/*9*/ -9, -9,   -9,  -9,    -9,  -9,  -9,   -9,  -9,  0, -9,  0,  0,  0, 0, 0, 0, 0,  0, 0,
	/*10*/ 0,  0,    0,   0,     0,   0,   0,  -17,   0, 19,  0,  0,  0,  0, 0, 0, 0, 0,  0,18,
	/*11*/ 0,  0,    0,   0,     0,   0,   0,   13,   0,  0,  0,  0,  0,  0, 0,20, 0, 0,  0, 0,
	/*12*/ 0,  0,    0,   0,     0,   0,   0,   13,   0,  0,  0,  0,  0,  0, 0,21, 0, 0,  0, 0,
	/*13*/ 0,  5,   -4,   6,    10,  11,  12,   13,  -4,  0,  0,  0,  0, 22, 4, 8, 7, 9,  0, 0,
	/*14*/ 0,  0,    0,   0,     0,   0,   0,    0,   0,  0,  0,  -2, 0,  0, 0, 0, 0, 0,  0, 0,
	/*15*/ 0,  0,   -3,   0,     0,   0,   0,    0,  -3,  0,  0,  0,  0,  0, 0, 0, 0, 0,  0, 0,
	/*16*/-14,-14,  -14, -14,   -14, -14, -14,  -14, -14,  0,-14,  0,  0,  0, 0, 0, 0, 0,  0, 0,
	/*17*/ 0,  5,    0,   6,    10,  11,  12,   13,   0,  0,  0,  0,  0,  0,23, 8, 7, 9,  0, 0,	
	/*18*/ 0,  0,    0,   0,     0,   0,   0,   13,   0,  0,  0,  0,  0,  0, 0,24, 0, 0,  0, 0,
	/*19*/ 0,  5,    0,   6,    10,  11,  12,   13,   0,  0,  0,  0,  0,  0,23, 8, 7, 9,  0, 0,
	/*20*/ 0,  0,    0,   0,     0,   0,   0,   13,   0,  0,  0,  0,  0,  0, 0,26, 0, 0,  0, 0,
	/*21*/ 0,  0,    0,   0,     0,   0,   0,   13,   0,  0,  0,  0,  0,  0, 0,27, 0, 0,  0, 0,
	/*22*/ 0,  0,    0,   0,     0,   0,   0,    0,  28,  0,  0,  0,  0,  0, 0, 0, 0, 0,  0, 0,
	/*23*/-15,-15,  -15, -15,   -15, -15, -15,  -15, -15,  0,-15,  0,  0,  0, 0, 0, 0, 0, 16, 0,
	/*24*/-11,-11,  -11, -11,   -11, -11, -11,  -11, -11,  0,-11,  0,  0,  0, 0, 0, 0, 0,  0, 0,
	/*25*/ 17,  0,    0,   0,     0,   0,   0,    0,   0,  0, 29,  0,  0,  0, 0, 0, 0, 0, 16, 0,
	/*26*/-12,-12,  -12, -12,   -12, -12, -12,  -12, -12,  0,-12,  0,  0,  0, 0, 0, 0, 0,  0, 0,
	/*27*/-13,-13,  -13, -13,   -13, -13, -13,  -13, -13,  0,-13,  0,  0,  0, 0, 0, 0, 0,  0, 0,
	/*28*/-10,-10,  -10, -10,   -10, -10, -10,  -10, -10,  0,-10,  0,  0,  0, 0, 0, 0, 0,  0, 0,
	/*29*/ 0,  0,    0,   0,     0,   0,   0,  -16,   0,  0,  0,  0,  0,  0, 0, 0, 0, 0,  0, 0,
	};
	
	//int ir_A[][7]={};

	matriz = new int*[30];  
	for(int i=0;i<30;i++){
		matriz[i] = new int[20];
		for(int j=0;j<20;j++)
			matriz[i][j] = tabla[i][j];}
//	cout<<matriz[23][3];
}
	
Sintactico::~Sintactico(){
	
	for(int i=0;i<29;i++)
		delete(matriz[i]);

}

int Sintactico::PosX(int n){

	switch(n){

		case EX:		return 0;
		case TXT_IMP:	return 1;
		case DOL:		return 2;
		case RESERV:	return 3;
		case SQRT:		return 4;
		case FRAC:		return 5;
		case STACKREL:	return 6;
		case OPEN_KEY:	return 7;
		case CLOSE_KEY:	return 8;
		case OPEN_BAR:	return 9;
		case CLOSE_BAR:	return 10;
		case SIMBDOL:	return 11;
		case S:			return 12;
		case E:			return 13;
		case T:			return 14;
		case G:			return 15;
		case F:			return 16;
		case I:			return 17;
		case A:			return 18;
		case O:			return 19;
	}

return 25;
}
/*bool Sintactico::Gramatica(int produccion){
	switch(produccion)
	{
			
	}

}
*/

bool Sintactico::Analisis()
{	
	Pila.push(0);
	
	
	//Pasar De la tabla de simbolos a la Pila Entrada para trabajar con esta
	//Tienes q hacer algo +/- asi
	//while(tabla_simbolos!= Fin)
	//		Entrada.push(Tabla->token->tipo)

	//En el lexico obviamente tienes q hacer un automata para reconoder TXT_IMP texto implicito
	//cosa  en el Lexico  en la Tabla de Simbolos pones Token->Agregar("134-8.73",TXT_IMP,linea de mierda)	
	//Falta implementar eso, a continuacion es lo q debe tener la Pila de Entrada MARICA
	//Estas dos pilas de entradas las hice para probar

/*
	$\prod_{a}^\infty{134-c}$
	Que sintacticamente viene a ser lo mismo que
	$\prod_{128}^\infinity{134-8.73}$
	Que son tus dos entradas cojudas q hiciste en tu MAIN
*/
	Entrada.push(SIMBDOL);
	Entrada.push(DOL);
	Entrada.push(CLOSE_KEY);
	Entrada.push(TXT_IMP);
	Entrada.push(OPEN_KEY);
	Entrada.push(RESERV);
	Entrada.push(TXT_IMP);
	Entrada.push(CLOSE_KEY);
	Entrada.push(TXT_IMP);
	Entrada.push(OPEN_KEY);
	Entrada.push(RESERV);
	Entrada.push(DOL);
/*	
	//esta corresponde a 
	//$\frac {a}{b}$
	Entrada.push(SIMBDOL);
	Entrada.push(DOL);
	Entrada.push(CLOSE_KEY);
	Entrada.push(TXT_IMP);
	Entrada.push(OPEN_KEY);
	Entrada.push(CLOSE_KEY);
	Entrada.push(TXT_IMP);
	Entrada.push(OPEN_KEY);
	Entrada.push(FRAC);
	Entrada.push(DOL);
*/	
	Accion=matriz[Pila.top()][PosX(Entrada.top())];
	cout<<Accion<<"\n";
	//Quiza pueda ir un control de error

	while((Accion!=AC||Pila.empty())&&Accion!=0){
	
		//Accion=matriz[Pila.top()][PosX(Entrada.top())];

		if(Accion>=0){		

			Pila.push(Entrada.top());
			Pila.push(Accion);
			Entrada.pop();
			Accion=matriz[Pila.top()][PosX(Entrada.top())];
			cout<<Accion<<"\n";
		}

		if(Accion<0)//De una Vez con la gramatica nomas
		{	
			Accion=abs(Accion);
			int tmp;
			switch(Accion){
			
			case 1://S'->S
					break;
			case 2://S->dol E dol
				
				Pila.pop();
				if(Pila.top()==DOL)
				{	Pila.pop();Pila.pop();
					if(Pila.top()==E)
					{	Pila.pop();Pila.pop();
						if(Pila.top()==DOL)
						{	Pila.pop();
							tmp=Pila.top();
							Pila.push(S);
							Pila.push(matriz[tmp][PosX(S)]);
							break;
						}//Control de Errores
						else break;
					}
				}
			break;


		case 3:	//E	->T E
			Pila.pop();
			if(Pila.top()==E)
			{	Pila.pop();Pila.pop();
				if(Pila.top()==T)
				{
					Pila.pop();
					tmp=Pila.top();
					Pila.push(E);
					Pila.push(matriz[tmp][PosX(E)]);
					break;
				}
				else break;
			}
			break;

		case 4:	//E->EPS (Vacio)
			tmp=Pila.top();
			Pila.push(E);
			Pila.push(matriz[tmp][PosX(E)]);

			break;
			
		case 5:	//T->txt_imp
			Pila.pop();
			if(Pila.top()==TXT_IMP)
			{	Pila.pop();
			//	cout<<"entra";
				tmp=Pila.top();
				Pila.push(T);
				Pila.push(matriz[tmp][PosX(T)]);
					//Accion=matriz[Pila.top()][PosX(Entrada.top())];
						break;

			}
			break;
		case 6:	//T->reserv		

			Pila.pop();
			if(Pila.top()==RESERV)
			{	Pila.pop();
				tmp=Pila.top();
				Pila.push(T);
				Pila.push(matriz[tmp][PosX(T)]);
					//Accion=matriz[Pila.top()][PosX(Entrada.top())];
						break;
			}
		case 7:	//T->F
			Pila.pop();
			if(Pila.top()==F)
			{	Pila.pop();
				tmp=Pila.top();
				Pila.push(T);
				Pila.push(matriz[tmp][PosX(T)]);
					//Accion=matriz[Pila.top()][PosX(Entrada.top())];
						break;
			}
			break;
		case 8:	//T->G	

			Pila.pop();
			if(Pila.top()==G)
			{	Pila.pop();
				tmp=Pila.top();
				Pila.push(T);
				Pila.push(matriz[tmp][PosX(T)]);
					//Accion=matriz[Pila.top()][PosX(Entrada.top())];
						break;
			}
			break;
		case 9:	//T->I
			Pila.pop();
			if(Pila.top()==I)
			{	Pila.pop();
				tmp=Pila.top();
				Pila.push(T);
				Pila.push(matriz[tmp][PosX(T)]);
					//Accion=matriz[Pila.top()][PosX(Entrada.top())];
						break;
			}
			break;
		case 10: //G-{E}
			Pila.pop();
			if(Pila.top()==CLOSE_KEY)
			{	Pila.pop();Pila.pop();
				if(Pila.top()==E)
				{	Pila.pop();Pila.pop();
					if(Pila.top()==OPEN_KEY)
					{	Pila.pop();
						tmp=Pila.top();
						Pila.push(G);
						Pila.push(matriz[tmp][PosX(G)]);
						//Accion=matriz[Pila.top()][PosX(Entrada.top())];
						break;
					}
					else
						//Control de Errores
						break;
				}
			}

			break;
		case 11://F->sqrt O G
			Pila.pop();
			if(Pila.top()==G)
			{	Pila.pop();Pila.pop();
				if(Pila.top()==O)
				{	Pila.pop();Pila.pop();
					if(Pila.top()==SQRT)
					{	Pila.pop();
						tmp=Pila.top();
						Pila.push(F);
						Pila.push(matriz[tmp][PosX(F)]);
						//Accion=matriz[Pila.top()][PosX(Entrada.top())];
						break;
					}
					else
						//Control de Errores
						break;
				}
			}

			break;
		case 12://F->frac G G
			Pila.pop();
			if(Pila.top()==G)
			{	Pila.pop();Pila.pop();
				
				if(Pila.top()==G)
				{	Pila.pop();Pila.pop();
					if(Pila.top()==FRAC)
					{	Pila.pop();
						tmp=Pila.top();
						Pila.push(F);
						Pila.push(matriz[tmp][PosX(F)]);
						//Accion=matriz[Pila.top()][PosX(Entrada.top())];
						break;
					}
					else break;
						//Control de Errores
						
				}
			}
			break;

		case 13://F->stackrel G G

			Pila.pop();
			if(Pila.top()==G)
			{	Pila.pop();Pila.pop();
				if(Pila.top()==G)
				{	Pila.pop();Pila.pop();
					if(Pila.top()==STACKREL)
					{	Pila.pop();
						tmp=Pila.top();
						Pila.push(F);
						Pila.push(matriz[tmp][PosX(F)]);
						//Accion=matriz[Pila.top()][PosX(Entrada.top())];
						break;
					}
					else
						//Control de Errores
						break;
				}
			}

			break;
		case 14://I->T A
			Pila.pop();
			if(Pila.top()==A)
			{	Pila.pop();Pila.pop();
				if(Pila.top()==T)
				{
					Pila.pop();
					tmp=Pila.top();
					Pila.push(I);
					Pila.push(matriz[tmp][PosX(I)]);
					//Accion=matriz[Pila.top()][PosX(Entrada.top())];
						break;
				}
				else break;
			}
			break;

		case 15://A->x T

			Pila.pop();
			if(Pila.top()==T)
			{	Pila.pop();Pila.pop();
				if(Pila.top()==EX)
				{
					Pila.pop();
					tmp=Pila.top();
					Pila.push(A);
					Pila.push(matriz[tmp][PosX(A)]);
					//Accion=matriz[Pila.top()][PosX(Entrada.top())];
						break;
				}
				else break;
			}
			break;
		case 16://O->[ T ]
			
			Pila.pop();
			if(Pila.top()==CLOSE_KEY)
			{	Pila.pop();
				if(Pila.top()==E)
				{	Pila.pop();
					if(Pila.top()==OPEN_KEY)
					{	Pila.pop();
						tmp=Pila.top();
						Pila.push(S);
						Pila.push(matriz[tmp][G]);
						//Accion=matriz[Pila.top()][PosX(Entrada.top())];
						break;
					}
					else
						//Control de Errores
						break;
				}
			}

			break;

		case 17://O->EPS
			break;

			}//swtich
		Accion=matriz[Pila.top()][PosX(Entrada.top())];
		cout<<Accion<<"\n";
		}//if	
	}//WHILE
	if(Accion==AC){
		cout<<"Expresion bien escrita";
			return true;}
	else
		cout<<"Expresion mal escrita";
		return false;
}


#endif

⌨️ 快捷键说明

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