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

📄 词法分析.cpp

📁 词法分析和赋值语句的翻译程序设计
💻 CPP
字号:
#include<iostream.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int j,k,flag,number,status;

char ch;
char words[50];//临时存放字符串

FILE *fp;

void Scan();//从文件中读取字符并检查词法

void main()
{
	int i=0;
	if ((fp=fopen("input.txt","r"))==NULL) //以只读方式打开文件
  cout << "找不到文件input.txt,请创建文件并输入程序:" << endl;
 
 else
 { 
	 Scan();
     fclose(fp); //关闭文件
 }

 
 
}


void Scan()//从文件中读取字符并检查词法
{
    char *keywords[13] = {"void","main","if","then","break","int",
         "char","float","include","for","while","printf",
         "scanf"};   //存储关键字
    number = 0;   //临时存储数字
    status = 0;  //标记状态
    j      = 0;

while((ch=fgetc(fp))!=EOF)
{
if(ch==' '||ch=='\n'||ch=='\t')continue;//跳过空格或换行或制表符

if ((ch >= 'A') && (ch <= 'z' ))//如果是字母
{
while ((ch >= 'A') && (ch <= 'z' ))//将连续的字符存储为字符串
{
words[j++]=ch;
ch=fgetc(fp);
}
  fseek(fp,-1L,1);//回退一个字符
  words[j]='\0';  //字符串结束
 
 
for (k = 0; k < 13; k++)
if (strcmp (words,keywords[k]) == 0)//判断是否为关键字
switch(k)
{
case 0:{
 flag = 1;
 status = 1;
 break;
}
case 1:{
 flag = 2;
 status = 1;
 break;
}
case 2:{
 flag = 3;
 status = 1;
 break;
}
case 3:{
 flag = 4;
 status = 1;
 break;
}
case 4:{
 flag = 5;
 status = 1;
 break;
}
case 5:{
 flag = 6;
 status = 1;
 break;
       }
case 6:{
 flag = 7;
 status = 1;
 break;
       }
case 7:{
 flag = 8;
 status = 1;
 break;
       }
case 8:{
 flag = 9;
 status = 1;
 break;
       }
case 9:{
 flag = 10;
 status = 1;
 break;
       }
case 10:{
 flag = 11;
 status = 1;
 break;
}
case 11:{
 flag = 12;
 status = 1;
 break;
}
case 12:{
 flag = 13;
 status = 1;
 break;
}


 

   if (status==0)//若不是关键字,则为普通字符串
     flag = 100;
 
} 
}

else if ((ch >= '0') && (ch <= '9'))//如果是数字
{
number = 0;
while ((ch >= '0' ) && (ch <= '9' ))//将连续的数字用一个整数number存储
{
number = number*10+(ch-'0');
ch     = fgetc(fp);
}
flag = 200;

fseek(fp,-1L,1);//回退一个字符

}

else switch (ch)//若是符号
{
case '=':{
 
     words[j++] = ch;
     words[j]   = '\0';
     ch         = fgetc(fp);//读取下一个字符
     if (ch == '=')//判断是否是==
     {
    words[j++] = ch;
    words[j]   = '\0';
 
    flag       = 401;
     }
     else
     {
    fseek(fp,-1L,1);//回退一个字符
    flag       = 402;
     }
   break;
 }
case'>':{

       words[j++] = ch;
       words[j]   = '\0';
  
       ch         = fgetc(fp);
   if (ch == '=')//判断是否是>=
   {
       words[j++] = ch;
       words[j]   = '\0';
       flag       = 403;
   }
   else
   {
       fseek(fp,-1L,1);
       flag       = 404;
   }
  break;
}
case'<':{
  
        words[j++] = ch;
        words[j]   = '\0';
        ch         = fgetc(fp);
    if (ch == '=')//判断是否是<=
 {
    words[j++] = ch;
    words[j]   = '\0';
    flag       = 405;
 }
        else
{
    fseek(fp,-1L,1);
    flag       = 406;
}
    break;
}
case'!':{
   
       words[j++] = ch;
       words[j]   = '\0';
       ch         = fgetc(fp);
     if (ch == '=')//判断是否是!=
     {
       words[j++] = ch;
       words[j]   = '\0';
       flag       = 407;
     }
     else
     {
    fseek(fp,-1L,1);
       flag       = 408;
     }
    break;
}
case'+':{
  
      words[j++] = ch;
      words[j]   = '\0';
      ch         = fgetc(fp);
     if (ch == '=')//判断是否是+=
     {
    words[j++] = ch;
    words[j]   = '\0';
    flag       = 409;
     }
     else if (ch == '+')//判断是否是++
     {
    words[j++] = ch;
    words[j]   = '\0';
    flag       = 410;
     }
     else
     {
 fseek(fp,-1L,1);
 flag       = 411;
     }
   break;
}
case'-':{
 
   words[j++] = ch;
   words[j]   = '\0';
   ch         = fgetc(fp);
   if (ch == '=')//判断是否是-=
   {
words[j++] = ch;
words[j]   = '\0';
flag       = 412;
   }
   else if( ch == '-')//判断是否是--
   {
words[j++] = ch;
words[j]   = '\0';
flag       = 413;
   }
   else
   {
    fseek(fp,-1L,1);
 flag       = 414;
   }
   break;
}
case'*':{
 
      words[j++] = ch;
      words[j]   = '\0';
      ch         = fgetc(fp);
      if (ch == '=')//判断是否是*=
      {
   words[j++] = ch;
   words[j]   = '\0';
   flag       = 415;
      }
     else
     {
   fseek(fp,-1L,1);
   flag       = 416;
     }
   break;
 }
case'/':{
 
       words[j++] = ch;
       words[j]   = '\0';
       ch         = fgetc(fp);
       if (ch == '=')//判断是否是/=
       {
       words[j++] = ch;
       words[j]   = '\0';
       flag       = 417;
       }
       else
       {
       fseek(fp,-1L,1);
       flag       = 418;
       }
  break;
}
case';':{
  words[j]   = ch;
  words[j+1] = '\0';
  flag       = 501;
  break;
 }
case'(':{
  words[j]   = ch;
  words[j+1] = '\0';
  flag       = 502;
  break;
 }
case')':{
  words[j]   = ch;
  words[j+1] = '\0';
  flag       = 503;
  break;
}
case'[':{
  words[j]   = ch;
  words[j+1] = '\0';
  flag       = 504;
  break;
 }
case']':{
  words[j]   = ch;
  words[j+1] = '\0';
  flag       = 505;
  break;
 }
case'{':{
  words[j]   = ch;
  words[j+1] = '\0';
  flag       = 506;
  break;
 }
case'}':{
  words[j]   = ch;
  words[j+1] = '\0';
  flag       = 507;
  break;
 }
case':':{
  words[j]   = ch;
  words[j+1] = '\0';
  flag       = 508;
  break;
}
case'"':{
  words[j] = ch;
  words[j+1] = '\0';
  flag = 509;
  break;
}
case'%':{
  
       words[j++] = ch;
       words[j]   = '\0';
       ch         = fgetc(fp);
       if (ch == '=')//判断是否是%=
       {
       words[j++] = ch;
       words[j]   = '\0';
       flag       = 510;
       }
       else
       {
       fseek(fp,-1L,1);
       flag       = 511;
       }
     break;
}
case',':{
 words[j] = ch;
 words[j+1] = '\0';
 flag = 512;
 break;
}
case'#':{
 words[j] = ch;
 words[j+1] = '\0';
 flag = 513;
 break;
}
case'@':{
 words[j] = '@';
 words[j+1] = '\0';
 flag = 514;
 break;
}
default:{
 flag = -1;
 
 break;
}
}
j=0;
  if(flag<100)//输出关键字
    cout<<"(关键字"<<","<<words<<")"<<endl;
  else if(flag==100)//输出字符或字符串
    cout<<"(标示符"<<","<<words<<")"<<endl;
  else if(flag==200)//输出数字
 cout<<"(数字"<<","<<number<<")"<<endl;
  else if(flag<500)//输出字符或字符串
    cout<<"(运算符"<<","<<words<<")"<<endl;
  else if(flag<600)//输出字符或字符串
    cout<<"(界符"<<","<<words<<")"<<endl;
  else if(flag==-1)
   cout<<"(Error"<<","<<flag<<")"<<endl;//输出错误信息
  else
   cout<<"("<<flag<<","<<words<<")"<<endl;

}

}

⌨️ 快捷键说明

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