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

📄 lian.c

📁 用 c++写的编译器
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define MAX 100
char *table[14][20]={"#","i","a","+","-","*","/","(",")","f","t","e","b","w","r",";","<","&","=","$",
                     "S","i=E","a","#","#","#","#","#","#","fESO","#","","#","wES","r(i=EP","","#","#","#","", 
        		     "E","TR","#","#","#","#","#","TR","#","#","#","eC","b","#","#","","#","#","#","",
				     "R","","#","ATR","ATR","#","#","#","","#","#","","eS","#","#","","#","#","","",
				     "T","FY","#","#","#","#","#","FY","#","#","#","","#","#","#","","#","#","","",
				     "Y","","#","","","MFY","MFY","#","","#","#","","eS","#","#","","#","#","=E","",
				     "F","i","#","#","#","#","#","(E)","#","#","","#","#","#","#","","#","#","#","",
				     "A","#","#","+","-","#","#","#","#","#","#","","#","#","#","","#","#","","",
				     "M","#","#","#","#","*","/","#","#","#","#","","#","#","#","","#","#","#","",
				     "O","#","SB","#","#","#","#","#","#","#","#","eS","#","#","#","","#","#","#","",
				     "P","#","#","#","#","#","#","#","#","#","#","","#","#","#",";K","#","#","#","",
				     "K","i<EX","#","#","#","#","#","#","#","#","#","","#","#","#","","","#","#","",
				     "X","#","#","#","#","#","#","#","#","#","#","","#","#","#",";Q","#","#","#","",
				     "Q","i&)S","#","#","#","#","#","#","#","#","#","","#","#","#","","#","","#",""};

struct zhan
{
	char str[50];
	int top;
}; 
struct TTT
{
	char f[50];
};
struct liu
{
	char liu1[50];
};

recover()
{
	printf("编译错误!");
}

int fail(int start)
{
   switch(start)
   {
		case 0: start=9;break;
		case 9: start=12;break;
		default:
			printf("编译错误!");
   }
   return start;
}

int digit(char c)
{
	if(('0'<=c)&&(c<='9'))
		return 1;
	else 
		return 0;
}

int letter(char c)
{
	if(('a'<=c&&c<='z')||('A'<=c&&c<='Z'))
		return 1;
	else
		return 0;
}

char nextchar(int *k,char s[])
{
	(*k)++;
	return(s[*k]);
}
char guanjianzi(int x)
{
	switch(x)
	{
	  case 0:
		  return 'f';
	  case 1:
		  return 'e';
	  case 2:
		  return 'r';
	  case 3:
		  return 'w';
	  default:
		  return '0';
		  }
}


char to_next(char s[],struct TTT ttt[])
{		
	int state=0,start=0,length=0,i1=-1,k1,x=0,case1,x1;
	int control=1;
	char c,b;
	char c1[50],c2[50];
	length=strlen(s);
	while(s[0]!='$')
	{
	   while(control)
	   {
		switch(state)
		{
			case 0:
				c=nextchar(&i1,s);
				if(c==' '||c=='\t'||c=='\n')
				{
                          c=nextchar(&i1,s);
				        	strcpy(c1,&s[i1]);
					       s[length-i1]='\0';
					       strcpy(s,c1);
						   i1=-1;
				        	state=0;
				}
				else 
				{
					if(c=='<')
						state=1;
					else 
					{
						if(c=='=')
							state=5;
						else
						{
							if(c=='>')
								state=6;
							else
							{
								if(c=='+')
									state=22;
								else
								{
									if(c=='-')
										state=23;
									else
									{
										if(c=='{')
											state=24;
										else
										{
											if(c=='}')
												state=30;
											else
											{
												if(c=='(')
													state=31;
												else
												{
													if(c==')')
														state=32;
													else
													{
														if(c=='[')
															state=33;
														else
														{
															if(c==']')
																state=34;
															else
															{

											                   if(c=='*')
												                 state=29;
											                   else
															   {
																   if(c=='/')
																        state=35;
																   else
																   {
																	   if(c==';')
																		   state=36;
																	   else
																	   {
											                              state=fail(state);
											                              i1=-1;
																	   }
																   }
															   }
															}
														}
													}
												}
											}
										}	
									}
								}
							}							
						}
					}
				}
				break;
			case 1:
				if(i1==length-1)
					state=4;
				else
				{
					c=nextchar(&i1,s);
					if(c=='=')
						state=2;
					else 
					{
						if(c=='>')
							state=3;
						else
						{
                           strcpy(c1,&s[i1]);
					       s[length-i1]='\0';
					       strcpy(s,c1);
							control=0;
							return '<';
						}
					}					
				}
				break;
			case 2:
				c=nextchar(&i1,s);
                       strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
				return 'i';
			case 3:
                         c=nextchar(&i1,s); 
                       strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
				return 'i';
			case 4:
                      c=nextchar(&i1,s);
                       strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
				return '<';
			case 5:
                       c=nextchar(&i1,s);
                       strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
				return '=';
			case 6:
				if(i1==length-1)
					state=8;
				else
				{
					c=nextchar(&i1,s);
					if(c=='=') 
						state=7;
					else 
					{
                        strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
						control=0;
						return 'i';
					}
				}					
				break;
			case 7:
                      c=nextchar(&i1,s);
                       strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
				return 'i';
			case 8: 
				c=nextchar(&i1,s);
				strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
				return 'i';
			case 9:
				c=nextchar(&i1,s);
				if(letter(c)) 
					state=10;
				else 
				{
					state=fail(state);
					i1=-1;
				}
				break;
			case 10:
				if(i1==length-1)
					state =11;
				else
				{
					c=nextchar(&i1,s);
					if(letter(c)||digit(c)) 
						state=10;			
					else
					{
						for(k1=0;k1<i1;k1++)
                             c2[k1]=s[k1];
						c2[k1]='\0';
                          strcpy(c1,&s[i1]);
					       s[length-i1]='\0';
					       strcpy(s,c1);
						for(case1=0;case1<14;case1++)
						{
			                if(strcmp(c2,ttt[case1].f)==0)
							{
				                 x1=0;
						      	break;
							}
							else
							{
								x++;
								x1=1;
							}
						}
						if(x1==0)
						{
							b=guanjianzi(x);
							return b;
						}
                        else
						{
						    control=0;
						    return 'i';
						 }
					}			
				}
				break;
			case 11:
                       strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
				return 'i';
			case 12:
				c=nextchar(&i1,s);
				if(digit(c)) 
					state=13;
				else 
				{
                      strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
					return 'i';
				}
				break;
			case 13:
				if(i1==length-1)
					state=20;
				else
				{
					c=nextchar(&i1,s);
					if(digit(c)) 
						state=13;
					else
					{
						if(c=='.')
							state=14;
						else 
						{
							if(c=='E'||c=='e')
								state=16;
							else
							{
								strcpy(c1,&s[i1]);
					          s[length-i1]='\0';
					          strcpy(s,c1);
								return 'i';
							}
						}
					}
				}
				break;
			case 14:
				c=nextchar(&i1,s);
				if(digit(c))
					state=15;
				else
				{
                      strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
					return 'i';
				}
				break;
			case 15:
				if(i1==length-1)
					state=21;
				else
				{
					c=nextchar(&i1,s);
					if(digit(c))
						state=15;
					else 
					{
						if(c=='E'||c=='e')
							state=16;
						else
						{
                            strcpy(c1,&s[i1]);
					        s[length-i1]='\0';
					        strcpy(s,c1);
							return 'i';
						}
					}
				}
				break;
			case 16:
				c=nextchar(&i1,s);
				if(digit(c)) 
					state=18;
				else 
				{
					if(c=='+'||c=='-')
						state=17;
					else
					{
                        strcpy(c1,&s[i1]);

⌨️ 快捷键说明

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