编译原理中的词法分析器

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>


//定义关键字
char *Key[20]={"main","unsigned","break","return","void","case",
            "float","char","for","while","continue","if","default",
            "do","int","switch","double","long","else"};
char Word[20],ch;   //存储识别出的单词流


int IsAlpha(char c)
{
    if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))
        return 1;
    else return 0;
}
//判断是否为字母


int IsNum(char c)
{
    if(c>'0'&&c<'9')
        return 1;
    else return 0;
}
//判断是否为数字


int IsKey(char *Word)
{
    int m,i;
    for(i=0;i<20;i++)
    {
        if((m=strcmp(Word,Key[i]))==0)
        {
            return 1;
        }
    }
    return 0;
}
//识别关键字函数


void scanner(FILE *fp)
{
    char Word[100]={'\0'};
    char ch;
    int i,c;
    ch=fgetc(fp);   //获取字符,指针自动指向下一个字符


    if(IsAlpha(ch))     //字母
    {
      Word[0]=ch;
      ch=fgetc(fp);
      i=1;
      while(IsNum(ch)||IsAlpha(ch))
      {
          Word[i]=ch;
          i++;
          ch=fgetc(fp);
      }
      Word[i]='\0';
      fseek(fp,-1,1);   //回退
      c=IsKey(Word);    //判断关键字
      if(c==0)
        printf("%s\t,\t\n标识符\n",Word);
      else
        printf("%s\t,\t保留字\n\n",Word);
    }


    else if(IsNum(ch))  //数字
    {
        Word[0]=ch;
        ch=fgetc(fp);
        i=1;
        while(IsNum(ch)){
            Word[i]=ch;
            i++;
            ch=fgetc(fp);
        }
        Word[i]='\0';
        fseek(fp,-1,1);
        printf("%s\t,\t常量\n\n",Word);
    }


    else    //不是字母和数字
    {
        Word[0]=ch;
        switch(ch)
        {
        case '{':printf("%s\t,\t界限符\n\n",Word);break;
        case '}':printf("%s\t,\t界限符\n\n",Word);break;
        case '[':printf("%s\t,\t界限符\n\n",Word);break;
        case ']':printf("%s\t,\t界限符\n\n",Word);break;
        case '(':printf("%s\t,\t界限符\n\n",Word);break;
        case ')':printf("%s\t,\t界限符\n\n",Word);break;
        case ',':printf("%s\t,\t界限符\n\n",Word);break;
        case ';':printf("%s\t,\t界限符\n\n",Word);break;
        case '+':
            ch=fgetc(fp);
            Word[1]=ch;
            if(ch=='=')
                printf("%s\t,\t运算符\n\n",Word);  //+=
            else if(ch=='+')
                printf("%s\t,\t运算符\n\n",Word);  //++
            else if(ch=='!')
                printf("%s\t,\t运算符\n\n",Word);  // !+
            else{
                fseek(fp,-1,1);
                printf("%s\t,\t运算符\n\n",Word);  //+
            }
            break;
        case '-':
            ch=fgetc(fp);
            Word[1]=ch;
            if(ch=='=')
                printf("%s\t,\t运算符\n\n",Word);  //-=
            else if(ch=='-')
                printf("%s\t,\t运算符\n\n",Word);  //--
            else{
                fseek(fp,-1,1);
                printf("%s\t,\t运算符\n\n",Word);  //-
            }
            break;
        case '*':printf("%s\t,\t运算符\n\n",Word);break;
        case '/':printf("%s\t,\t运算符\n\n",Word);break;
        case '>':
            ch=fgetc(fp);
            Word[1]=ch;
            if(ch=='=')
                printf("%s\t,\t运算符\n\n",Word);     //>=
            printf("%s\t,\t运算符\n\n",Word);
            break;
        case '<':
            ch=fgetc(fp);
            Word[1]=ch;
            if(ch=='=')
                printf("%s\t,\t运算符\n\n",Word);     //<=
            else printf("%s\t,\t运算符\n\n",Word);
            break;
        case '!':printf("%s\t,\t运算符\n\n",Word);break;
        case '&':
            ch=fgetc(fp);
            Word[1]=ch;
            if(ch=='&')
                printf("%s\t,\t运算符\n\n",Word);
            break;
        case '|':
            ch=fgetc(fp);
            Word[1]=ch;
            if(ch=='|')
                printf("%s\t,\t运算符\n\n",Word);
            break;
        default:printf("无法识别字符!\n\n",Word);break;
        }
    }
}


int main()
{
    char in_fn[30];  //文件路径
    FILE *fp;
    printf("\n请输入源文件名(包括路径和后缀名):");
    gets(in_fn);
    if((fp=fopen(in_fn,"r"))==NULL){
        exit(0);
    }
        //读取文件内容,并返回文件指针,该指针指向文件的第一个字符s
    printf("\n**********词法分析结果如下**********\n");
    while(!feof(fp)){
        ch=fgetc(fp);
        if(ch==' '||ch=='\t'||ch=='\n'){} //忽略空格、空白、换行
        else {


            fseek(fp,-1,1);


            scanner(fp);
        }
    }
    return 0;

}


可识别标识符、关键字、数字和符号,需要输入文档名称

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值