C语言词法分析器

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define LEN 180

int syn,p,m,n;
char token[10],ch;
char *keyword[32]={"double","int","struct","break","else","long","switch","case",
"enum","register","typedef","char","extern","return","union","const","float","short",
"unsigned","continue","for","signed","void","default","goto","sizeof","volatile",
"do","auto","while","static","if"};

struct wordline//定义结构体
{
 char word[10];
 int line;
 struct wordline *next;
};

struct wordline *creat(struct wordline *head,char token[10],int numofLine)//建立链表
{
 struct wordline *p1;
 p1=(struct wordline*)malloc(sizeof(struct wordline));
 head->next=p1;
 strcpy(p1->word,token);
 p1->line=numofLine;
 p1->next=NULL;
 return (p1);
}

Pickword(char str[LEN])
{
 for (m=0;m<10;m++)token[m++]='/0';
 ch=str[p++];
 m=0;
 while((ch==' ')||(ch=='/n')||(ch=='/t'))ch=str[p++];
 if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
 {
  while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))||(ch=='_')||(ch=='.'))
  {
   token[m++]=ch;
   ch=str[p++];
  }
  p--;
  syn=33;
  for(n=0;n<32;n++)
   if(strcmp(token,keyword[n])==0)
   {
    syn=n+1;
    break;
   }
 }
 else if ((ch>='0')&&(ch<='9'))
 {
  while((ch>='0')&&(ch<='9'))
  {
   token[m++]=ch;
   ch=str[p++];
  }
  p--;
  syn=34;
 }
 else switch (ch)
 {
case'+':token[m++]=ch;
 ch=str[p++];
 if (ch=='+')
 {
  syn=36;
  token[m++]=ch;
 }
 else
 {
  syn=35;
  p--;
 }
 break;
case '-':token[m++]=ch;
 ch=str[p++];
 if(ch=='-')
 {
  syn=38;
  token[m++]=ch;
 }
 else
 {
  syn=37;
  p--;
 }
 break;
case ':':token[m++]=ch;
 ch=str[p++];
 if(ch=='=')
 {
  syn=44;
  token[m++]=ch;
 }
 else
 {
  syn=43;
  p--;
 }
 break;
case '<':token[m++]=ch;
 ch=str[p++];
 if(ch=='>')
 {
  syn=46;
  token[m++]=ch;
 }
 else if (ch=='=')
 {
  syn=47;
  token[m++]=ch;
 }
 else
 {
  syn=45;
  p--;
 }
 break;
case '>':token[m++]=ch;
 ch=str[p++];
 if(ch=='=')
 {
  syn=49;
  token[m++]=ch;
 }
 else
 {
  syn=48;
  p--;
 }
 break;
case '*':token[m++]=ch;
 ch=str[p++];
 if(ch=='/')
 {
  syn=40;
  token[m++]=ch;
 }
 else
 {
  syn=39;
  p--;
 }
 break;
case '/':token[m++]=ch;
 ch=str[p++];
 if(ch=='*')
 {
  syn=42;
  token[m++]=ch;
 }
 else
 {
  syn=41;
  p--;
 }
 break;
case '=':token[m++]=ch;
 ch=str[p++];
 if(ch=='=')
 {
  syn=51;
  token[m++]=ch;
 }
 else{
  syn=50;
  p--;
 }
 break;
case '!':token[m++]=ch;
 ch=str[p++];
 if(ch=='=')
 {
  syn=59;
  token[m++]=ch;
 }
 else
 {
  syn=58;
  p--;
 }
 break;
case ';':token[m++]=ch;
 syn=52;
 break;
case '(':token[m++]=ch;
 syn=53;
 break;
case ')':token[m++]=ch;
 syn=54;
 break;
case '{':token[m++]=ch;
 syn=55;
 break;
case '}':token[m++]=ch;
 syn=56;
 break;
case '#':token[m++]=ch;
 syn=57;
 break;
case '&':token[m++]=ch;
 ch=str[p++];
 if(ch=='&&')
 {
  syn=61;
  token[m++]=ch;
 }
 else
 {
  syn=60;
  p--;
 }
 break;
case '%':token[m++]=ch;
 syn=62;
 break;
case '[':token[m++]=ch;
 syn=63;
 break;
case ']':token[m++]=ch;
 syn=64;
 break;
case '|':token[m++]=ch;
 ch=str[p++];
 if(ch=='|')
 {
  syn=66;
  token[m++]=ch;
 }
 else
 {
  syn=65;
  p--;
 }
 break;
case '"':token[m++]=ch;
 syn=67;
 break;
case ',':token[m++]=ch;
 syn=68;
 break;
default :
 if(ch=='/0')
 {
  syn=0;
 }
 else
 {
  token[m++]=ch;
  syn=-1;
 }
 break;
 }
 token[m++]='/0';
}

main(){
 char chr[10],chr1;
 FILE *fp,*fw; char filename[80],str[LEN],fileget[80];
 int numofLine=0;
 struct wordline *head,*end;
 system("color 1E");
 
 printf("*******************************欢迎使用此软件*********************************/n/n/n/n");
 printf("★★★★★★★★★★★★★★★此软件为C语言词法分析器★★★★★★★★★★★★★/n");
 printf("其功能为:从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。同时输出各单词所在的行号,且具有保存输出内容的功能。/n/n/n/n/n");
    printf("是否开始读入源程序?/n""请按“1”开始输入或按其他键退出!!/n");
    chr1=getchar();
 if(chr1=='1')
  system("CLS");
 else
  exit(1);
l1: printf("请输入源文件所在路径/n");
 numofLine=0;
 scanf("%s",filename);
 if ((fp=fopen(filename,"r"))==NULL)
 {
  printf("打开文件失败!!/n""请按“1”重新输入或按其他键退出!!/n");
  getchar();
  chr1=getchar();
  if(chr1=='1') goto l1;
  else
   exit(1);
 }
 system("CLS");
 while(!feof(fp))
 {
  fgets(str,LEN,fp);
  numofLine++;
  printf("line%-8d%s",numofLine,str);
 }
 printf("/n");
 fclose(fp);
 getchar();
 printf("是否打印各行信息??/n""是请按“1”继续,按“2”清屏重新读取其他源文件,按其他键退出/n");
 chr1=getchar();
 if (chr1=='2'){
  system("CLS");
  goto l1;
 }
 else if (chr1!='1') exit(1);
 fp=fopen(filename,"r");
 numofLine=0;
    printf("( word        line)/n");
 head=end=(struct wordline*)malloc(sizeof(struct wordline));
 while(!feof(fp))
 {
  p=0;
  fgets(str,LEN,fp);
  numofLine++;
  do{
   Pickword(str);
   if(syn==0) break;
   switch(syn)
   {
   case -1:
    break;
   default: printf("( %-10s%5d )/n",token,numofLine);
    end=creat(end,token,numofLine);
    break;
   }
  }while(1);
 }
 fclose(fp);
 printf("是否将输入内容保存/n""是按“1”继续,按“2”清屏重新读取其他源文件,按其他键退出/n");
 getchar();
 chr1=getchar();
 if (chr1=='2')
 {
      system("CLS");
   goto l1;
 }
 else if (chr1!='1') exit(1);
l2: printf("请输入保存的文件名/n");
 scanf("%s",fileget);
 if ((fw=fopen(fileget,"at+"))==NULL)
 {
  printf("无法打开%s/n",fileget);
  printf("是否重新输入?/n""是按“1”,否按其他键退出/n");
  getchar();
  chr1=getchar();
  if (chr1=='1')
   goto l2;
  else
   exit(1);
 }
 head=head->next;
 while(head!=NULL)
 {
  itoa(head->line, chr, 10);
  fputs(head->word,fw);
  fputs("  line=",fw);
  fputs(chr,fw);
  fputs("/n",fw);
  head=head->next;
 }
 
 fclose(fw);
 printf("保存完毕是否清屏继续操作/n""是按“1”继续,否按其他键退出/n");
 getchar();
 chr1=getchar();
 if(chr1=='1')
 {
  system("CLS");
  goto l1;
 }
 else
  exit(1);
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值