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

📄 lian.c

📁 用 c++写的编译器
💻 C
📖 第 1 页 / 共 2 页
字号:
					    s[length-i1]='\0';
					    strcpy(s,c1);
						 return 'i';
					}
				}
				break;
			case 17:
				c=nextchar(&i1,s);
				if(digit(c))
					state=18;
				else
				{
                       strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
					return 'i';
				}
				break;
			case 18: 
				if(i1==length-1)
					state=19;
				else
				{
					c=nextchar(&i1,s);
					if(digit(c))
						state=18;
					else
					{
                        strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
						return 'i';
					}
				}
				break;
			case 19:
				      strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
                     	return 'i';
			case 20:
                      strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
				return  'i';
			case 21:
                     strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
				return 'i';
			case 22:
				if(i1==length-1)
					state=25;
				else
				{
					c=nextchar(&i1,s);
					if(c=='+')
						state=26;
					else
					{
                      strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
						return '+';
					}
				}
				break;
			case 23:
				if(i1==length-1)
					state=27;
				else
				{
					c=nextchar(&i1,s);
					if(c=='=')
						state=28;
					else
					{
                       strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
						return '-';
					}
				}
				break;
			case 24:
				      c=nextchar(&i1,s);
				      strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
				       return '{';
			case 25:
                       c=nextchar(&i1,s);
                       strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
				return 'i';
			case 26:
                        c=nextchar(&i1,s);
                         strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
				return '&';
			case 27:
                        c=nextchar(&i1,s);
                      strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
				return '-';
			case 28:
                    c=nextchar(&i1,s);
                     strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
	            return 'i';
			case 29:
                       c=nextchar(&i1,s);
                      strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
			        	return '*';
			case 30:
                       c=nextchar(&i1,s);
                      strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
			        	return '}';
           case 31:
                       c=nextchar(&i1,s);
                      strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
			        	return '(';
	       case 32:
                       c=nextchar(&i1,s);
                      strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
			        	return ')';
	       case 33:
                       c=nextchar(&i1,s);
                      strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
			        	return '[';
         	case 34:
                       c=nextchar(&i1,s);
                      strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
			        	return ']';
             case 35:
                       c=nextchar(&i1,s);
                      strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
			        	return '/';
			case 36:
                       c=nextchar(&i1,s);
                      strcpy(c1,&s[i1]);
					   s[length-i1]='\0';
					   strcpy(s,c1);
			        	return ';';	

			default:
				return '0';
		}
	}
 }
	return '$';
}
/*int printf1(char s[],struct TTT ttt[],int i1,int k2)
{
	int case1,th,k1;
	char s4[10];
	k2=i1;
		th=to_next(s,i1,k2);
		for(case1=0;case1<14;case1++)
		{
			if(strcmp(s,ttt[case1].f)==0)
				th=30;
		}
		switch(th)
		{
			case 0:
				printf("编译错误\n");
				break;
			case 2:
				printf("小于等于号\n");
				break;
			case 3:
				printf("不等于号\n");
				break;
			case 4:
				printf("小于号\n");
				break;
			case 5:
				printf("等于号\n");
				break;
			case 7:
				printf("大于等于号\n");
				break;
			case 8:
				printf("大于号\n");
				break;
			case 11:
				printf("标识符");
				i1--;
				for(k1=0;k1<=i1;k1++)
                s4[i1]=s[i1];
				printf("%s",s4);
                strcpy(s4,"i");
				break;
			case 19:
				printf("浮点数\n");
                 i1--;
				for(k1=0;k1<=i1;k1++)
                s4[i1]=s[i1];
				printf("%s",s4);
                strcpy(s4,"i");
				break;
			case 20:
				printf("整数\n");
                 i1--;
				for(k1=0;k1<=i1;k1++)
                s4[i1]=s[i1];
				printf("%s",s4);
                strcpy(s4,"i");
				break;
			case 21:
				printf("定点数\n");
                 i1--;
				for(k1=0;k1<=i1;k1++)
                s4[i1]=s[i1];
				printf("%s",s4);
                strcpy(s4,"i");
				break;
			case 24:
				printf("括号\n");
                 i1--;
                s4[i1]=s[i1];
				printf("%c",s4[i1]);
				break;
			case 25:
				printf("加号\n");
                    i1--;
                s4[i1]=s[i1];
				printf("%c",s4[i1]);
				break;
			case 26:
				printf("加等号\n");
				break;
			case 27:
				printf("减号\n");
                   i1--;
                s4[i1]=s[i1];
				printf("%c",s4[i1]);
				break;
			case 28:
				printf("减等号\n");
				break;
			case 29:
				printf("关键字\n");
                  i1--;
				for(k1=0;k1<=i1;k1++)
                s4[i1]=s[i1];
				printf("%s",s4);
                strcpy(s4,"i");
				break;
			case 30:
				printf("乘号\n");
                  i1--;
                s4[i1]=s[i1];
				printf("%c",s4[i1]);
				break;
			default:
				printf("不合法符号\n");
				break;
		}
		k2=i1;
		return k2;
}*/
void setnull(struct zhan *p)
{
	p->top=-1;
}

void push(struct zhan *p,char x)
{
	p->top++;
	p->str[p->top]=x;
	p->str[p->top+1]='\0';	
}

char pop(struct zhan *p)
{
	char b;
	b=p->str[p->top];
	p->str[p->top]='\0';
	p->top--;
	return b;
}
void wenfa(char *s,struct zhan *p,struct liu *p1,struct TTT ttt[])
{
	int m=0,d=0,a=0,i=0,j=0,of=1,t=0,k2=0,xunhuan=1,k;
	char w,c;
	char s2[15]="#SERTYFAMOPKXQ";
	char s3[22]="#ia+-*/()ftebwr;<&=$";	
	char s4[43]="";
	while(xunhuan==1)
	{
	   c=to_next(s,ttt);
		p1->liu1[k2++]=c;
		if(p1->liu1[k2-1]=='$')
		{
			p1->liu1[k2]='\0';
			xunhuan=0;
		}
	
	}
	k=strlen(p1->liu1);
	printf("%-8s",p->str);
	printf("%-6s",s);
	printf("\n");
	while(p->str[p->top]!='$')
	{
	
		if(p->str[p->top]=='#'||p->str[p->top]=='i'||p->str[p->top]=='='||p->str[p->top]=='+'||p->str[p->top]=='-'||p->str[p->top]=='('||p->str[p->top]==')'||p->str[p->top]=='a'||p->str[p->top]=='*'||p->str[p->top]=='/'||p->str[p->top]=='f'||p->str[p->top]=='t'||p->str[p->top]=='e'||p->str[p->top]=='b'||p->str[p->top]=='w'||p->str[p->top]=='r'||p->str[p->top]==';'||p->str[p->top]=='<'||p->str[p->top]=='&'||p->str[p->top]=='$')
		{
			if((p->str[p->top])==p1->liu1[m])			
			  {
				printf("%-8s",p->str);
				for(t=0;t<m;t++)
					printf(" ");
				for(t=m;t<k;t++)
					printf("%c",p1->liu1[t]);
				printf("\n");
				pop(p);
				m++;
			  }
			   else
			   {
				  of=0;
				  break;
			   }
		}
		else
		{
			while((s2[i]!=p->str[p->top])&&(i<15))
				i++;
			while((s3[j]!=p1->liu1[m])&&(j<20))
				j++;
			if((strcmp(table[i][j],"#")==0)||(j==22))
			{
				of=0;
				break;
			}
			if((strcmp(table[i][j],"#")!=0)&&(j!=22))
			{				
				d=strlen(table[i][j]);
				strcpy(s4,table[i][j]);
				printf("%-8s",p->str);
				for(t=0;t<m;t++)
					printf(" ");
				for(t=m;t<k;t++)
					printf("%c",p1->liu1[t]);				
				w=pop(p);
				if(strcmp(table[i][j],"#")!=0)
					printf("    %c->%s",w,table[i][j]);
				printf("\n");
				for(a=d-1;a>=0;a--)
					push(p,s4[a]);		
			}						
		}		
		i=0;
		j=0;		
	}
	if(of==1)
		printf("LL(1)分析成功\n");
	else
		printf("此算法无法运算\n");
        printf("\n\n");
}

main()
{	
	struct zhan *p;
	struct liu *p1;
    char s[MAX];
	char h;
	int /*ph=1*/xunhuan=1;
	struct TTT ttt[14]={"if","else","for","while","long","int","float","double","char","switch","case","do","return","break"};
    do
	{
		p1=malloc(sizeof(struct liu));
        p=malloc(sizeof(struct zhan));
	       setnull(p);
        push(p,'$');
	    push(p,'S');
		printf("请输入字符:");
	    gets(s);
        strcat(s,"$");
	    wenfa(s,p,p1,ttt);
		printf("是否测试下一个单词,是输入y,不是输入n:");
        h=getchar();
		getchar();
		printf("\n\n");
	}while(h=='y');
}

⌨️ 快捷键说明

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