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

📄 lrparser.c

📁 词法分析器代码,用c语言编写 词法分析器代码,用c语言编写
💻 C
字号:
# include <stdio.h>
# include <string.h>
# include <ctype.h>
char prog[80],token[8];
char ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};
main()
{
  p=0;
  printf("\n please input string: \n");
  do
    {
	scanf("%c",&ch);
	prog[p]=ch;
	p++;
    }while(ch!='#');

  p=0;
  do
   {
     scaner();
     lrparser();
/*    
     switch(syn)
      {
	case 11:   //输出(数的二元组);
		   break;
        case -1:   //输出(错误);
		   break;
	default:  //输出(其他单词二元组);
      }  
*/   
   }while(syn!=0)  //syn=0表示语法定义的结束.
  getch();
}
scaner()
{
	for(n=0;n<8;n++)
	{
		token[n]=NULL;
	}
	ch=prog[p++];
	while(ch==' ')
	{
		ch=prog[p++];
	}
	if(isalpha(ch))
	{
		m=0;
		while(isalpha(ch)||isdigit(ch))
		{
			token[m++]=ch;
			ch=prog[p++];
		}
		token[m++]='\0';
		p--;
		syn=10;
		for(n=0;n<6;n++)
		{
			if(strcmp(token,rwtab[n])==0)
			{
				syn=n+1;
				break;
			}
		}
	}
	else if(isdigit(ch))
	{
		sum=0;
		while(isdigit(ch))
		{
			sum=sum*10+ch-'0';
			ch=prog[p++];
		}
		p--;
		syn=11;
	}
	else
		switch(ch)
	{
		case '<': 
			m=0;token[m++]=ch;
			ch=prog[p++];
			if(ch=='>')
			{
				syn=21;
				token[m++]=ch;
			}
			else if(ch=='=')
			{
				syn=22;
				token[m++]=ch;
			}
			else
			{
				syn=20;
				p--;
			}
			break;
		case '>':
			m=0;token[m++]=ch;
			ch=prog[p++];
			if(ch=='=')
			{
				syn=24;token[m++]=ch;
			}
			else
			{
				syn=23;
				p--;
			}
			break;
		case ';':
			m=0;token[m++]=ch;
			ch=prog[p++];
			if(ch=='=')
			{
				syn=18;
				token[m++]=ch;
			}
			else
			{
				syn=25;
				p--;
			}
			break;
		case '+': 
			syn=13;
			token[0]=ch;
			break;
		case '-':
			syn=14;
			token[0]=ch;
			break;
		case '*':
			syn=15;
			token[0]=ch;
			break;
		case '/':
			syn=16;
			token[0]=ch;
			break;
		case '=':
			syn=25;
			token[0]=ch;
			break;
		case ';':
			syn=26;
			token[0]=ch;
			break;
		case '(':
			syn=27;
			token[0]=ch;
			break;
		case ')':
			syn=28;
			token[0]=ch;
			break;
		case '#':
			syn=0;
			token[0]=ch;
			break;
		default:
			syn=-1;

	}

}

lrparser()
{
	if(syn==1)
	{
		//读入下个单词符号
		yucu();  //调用yucu函数
		if(syn==6)
		{
		   //读入下个单词符号
			if(syn==0 && (kk==0))
			{
				printf("success\n");   //输出success
			}
		}
		else 
		{
			if(kk!=1) 
			{
			    printf("Error!!  Missing 'end'in the statement!\n");	//输出缺少end错误;
				kk=1;
			}
		}
	}
	else
	{
		 printf("Error!! 'begin' is required\n");   //输出‘begin’错误信息。
		 kk=1;
	}
	return ;
}

yucu()
{
	statement();   //调用statement();
	
	while(syn==26)
	{
		//读入下个单词符号
	    statement();	//调用statement()函数。
	}
	return ;
}

statement()
{
	if(syn=10)
	{
		//读入下个单词符号,
		if(syn==18)
		{
			//读入下个单词符号。
			expresssion();  //调用expression()函数
		}
		else
		{
			printf("Error!! ':=' is required!\n");  //输出附值号错误;
			kk=1;
		}
		return;
	}
}

expression()
{
	term();  //调用term函数;
	while(syn==13 || syn==14)
	{
		//读入下个单词符号
		term();  //调用term函数
	}
	return;
}	

term()
{
	factor();  //调用factor函数
	while(syn==15 || syn==16)
	{
		//读入下个单词符号
		factor(); //调用factor函数
	}
	return;
}
factor()
{
	if(syn==10 || syn==11)
	{
		//读入下个单词符号
	}
	else if(syn==27)
	{
		//读入下个单词符号
		expression();   //调用expression()函数
		if(syn==28)
		{
			//读入下个单词符号

		}
		else
		{
		  printf("Error!! ')' is required!\n");	//输出‘)’错误;
		  kk=1;
		}
	}
	else
	{
		printf("Error !!Something wrong with the expression!\n"); //输出表达式错误;
		kk=1;
	}
	return ;
}

⌨️ 快捷键说明

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