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

📄 word.c

📁 词法分析 1 试验目的 设计,编制并调试一个此法分析程序,加深对此法分原理的理解. 2 试验要求 1)待分析的简单语言的词法 * 关键字: begin if then whi
💻 C
字号:
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
/*; Programmed by 刘宏发,200631000315   hugo.working@gmail.com        */
/*;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
/*; 版本信息                                                          */
/*; 词法分析器 Ver 1.12 - 2008-10-22                          */
/*;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NULL 0
#define XOX 8000
#define WORD 14



char prog[XOX],token[10];
char ch;
int syn,p,m,n,sum;
char *rwtab[WORD]={"begin","if","then","while","do","end","break","main","int","char","printf","scanf","else","default"};//待增加

main(){
	FILE *fp=NULL;
	int temp;

	printf("\n --------词法分析器: --------\n");//*将改为文件读取*/
	printf("\n 请选择:\n \t 1-手动输入; \n \t 2-预文件测试;\n");
	scanf("%d",&temp);
	if(temp==2){
		if((fp=fopen("test.c","r"))==NULL){
			if((fp=fopen("test.c","w+"))==NULL){
				printf("文件建立错误!");
				exit(0);
				}
			}	
		p=0;
		while(p<XOX){                                             //prog[p]!=EOF
			prog[p++]=fgetc(fp);                         /*输入到缓冲prog[p++]中*/
		};
	fclose(fp);
	}
	else if(temp==1)
	{
		p=0;
		printf("请以'@'做未结束符\n");
		do{
			ch=getchar();
			prog[p++]=ch;
			//prog[p++]=getchar();
		}while(ch!='@');


	}

	
	p=0;
	do{
		scaner();
		switch(syn){
		case 1000: printf("(注释)\n");break;/*注释*/
		case 11: printf("(%d,%d)\n",syn,sum);break;/*输出(数的二元组);*/
		case -1: printf("(未定义)\n");/*输出(错误);*/break;
		default :printf("(%d,%s)\n",syn,token);/*输出(其他单词二元组);*/
		}
	}while(syn!=0);
	getch();
	system("pause");
}


scaner()
{
 for(n=0;n<8;n++)
  token[n]=NULL;
  m=0;
  ch=prog[p++];
  while(ch==' '||ch=='\n')ch=prog[p++];

  if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A'))/*ch是字母/数字字符*/
  {
   while((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')||(ch<='9'&&ch>='0'))
   {
    token[m++]=ch;
    ch=prog[p++];
    }
   token[m++]='\0';
   ch=prog[--p];
   syn=10;
   for(n=0;n<6;n++)
       if(strcmp(token,rwtab[n])==0)
       {
        syn=n+1;/*给出syn值*/
        break;
        }
    }
   else
       if((ch<='9'&&ch>='0'))
         {
          sum=0;
          while((ch<='9'&&ch>='0'))
          {
           sum=sum*10+ch-'0';
           ch=prog[p++];
           }
           ch=prog[--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;
                          ch=prog[--p];
                          }
          break;
          case '>':token[m++]=ch;
                   ch=prog[p++];
                   if(ch=='=')
                   {
                   syn=24;
                   token[m++]=ch;
                    }
                   else
                   {
                    syn=23;
                    ch=prog[--p];
                    }
          break;
          case ':':token[m++]=ch;
                   ch=prog[p++];
                   if(ch=='=')
                   {
                    syn=18;
                    token[m++]=ch;
                    }
                    else
                    {
                     syn=17;
                     ch=prog[--p];
                     }
          break;
		  case '+':m=0;token[m++]=ch;
                   ch=prog[p++];
                   if(ch=='+')
                   {
                    syn=33;
                    token[m++]=ch;
                    }
                    else
                         {
                          syn=13;
                          ch=prog[--p];
                          }
          break;
		  case '-':m=0;token[m++]=ch;
                   ch=prog[p++];
                   if(ch=='-')
                   {
                    syn=43;
                    token[m++]=ch;
                    }
                    else
                         {
                          syn=14;
                          ch=prog[--p];
                          }
          break;
          case '*':syn=15;token[0]=ch;break;
          case '/':	m=0;token[m++]=ch;ch=prog[p++];/*读下一个字符*/
						if(ch=='*'){             /*处理"/**"类注释*/
						do{
							ch=prog[p++];/*读下一个字符;*/
							if(ch=='*'){
								ch=prog[p++];/*读下一个字符;*/
								if(ch=='/'){
									syn=1000;/*注释*/
									break;}
							}
			
						}while(1);

						}
						else if(ch=='/'){     /*处理"//"类注释*/
							do{
							ch=prog[p++];/*读下一个字符;*/
							if(ch=='\n')
							{
								syn=1000;/*注释*/
								break;}
							
			
						}while(1);
						


		  }
						else
					{
					syn=16;
					p=p-1;//回退一个字符
						}
					break;
		  case '++':syn=33;token[0]=ch;break;//++
		  case '--':syn=43;token[0]=ch;break;//--
          case ':=':syn=18;token[0]=ch;break;
		  case '~':syn=19;token[0]=ch;break;
		  case '!':syn=20;token[0]=ch;break;
          case '<>':syn=21;token[0]=ch;break;
          case '<=':syn=22;token[0]=ch;break;
          case '>=':syn=24;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=29;token[0]=ch;break;
          case '(':syn=30;token[0]=ch;break;
          case ')':syn=31;token[0]=ch;break;
		  case '[':syn=39;token[0]=ch;break;
		  case ']':syn=40;token[0]=ch;break;
		  case '{':syn=41;token[0]=ch;break;
		  case '}':syn=42;token[0]=ch;break;
		  case ',':syn=44;token[0]=ch;break;
		  case '#':syn=45;token[0]=ch;break;
          case '@':syn=0;token[0]=ch;break;
          default:syn=-1;
          }
      }



			




⌨️ 快捷键说明

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