词法分析器

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


char input[255];//输入的字符串
char word[10];//存放单个的word
int p_input,p_tokenm,syn,num,m,row;
char ch;//读到的当前字符
char* rwtab[6]={"begin","if","then","while","do","end"};
void scaner();

void main(){
    int over= 1;
    row =1;
    printf("请输入字符串,以#结束。\n");
    scanf("%[^#]s",input);
    p_input =0;
    do{
        num =0 ;
        scaner();
        switch(syn)
        {
        case 11 :printf("(%d,%d)\n",syn,num);break;
        case -1:printf("End\n");break;      
        //case 0:return ;
        default: printf("(%d,%s)\n",syn,word);break;
        }

    }while(syn!=-1);
    return ;
}

void scaner()
{
    int i;

    for(i=0;i<8;i++)//初始化
        word[i] = ' ';
    ch = input[p_input++];
    while(ch==' '||ch=='\n')//去除空格和换行
    {
        ch=input[p_input];
        p_input++;
    }
    if(ch=='#')//判断是否输入结束
    {
        syn = 0;
        return ;
    }

    if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')//判读是否为变量
    {
            m=0;
            while(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'||ch>='0'&&ch<='9')
            {
                word[m++]= ch;
                ch= input[p_input++];
            }
            word[m++]='\0';
            for(i=0;i<6;i++)//判断该单词是否是关键字
            {
                if(strcmp(word,rwtab[i])==0)
                {
                    syn = i+1;
                    break;
                }
            }
            if(i==6)//说明不是关键字,则把syn设置为变量的syn
                syn = 10;
    }
    else if(ch>='0'&&ch<='9')//判断数字
    {
        num = 0;//存放数字
        while(ch>='0'&&ch<='9')
        {
            num= num*10+ch-'0';
            ch = input[p_input++];
        }
        syn = 11;
        p_input--;
    }
    else  switch(ch)//其他符号
    {
        case ':':if(input[p_input+1]=='=')
                 {
                     word[0]=':';word[1]='=';word[2]='\0';
                     syn = 18;
                     p_input++;
                 }else
                 {
                     word[0] = ':';word[1]='\0';
                     syn = 17;
                 }break;
        case '<':if(input[p_input+1]=='>')
                 {
                     word[0]='<';word[1]='>';word[2]='\0';
                     syn = 21;
                     p_input++;
                 }else if(input[p_input+1]=='=')
                 {
                     word[0]='<';word[1]='=';word[2]='\0';
                     syn = 22;
                     p_input++;
                 }else 
                 {
                     word[0] = '<';word[1]='\0';
                     syn = 20;
                 }break;
         case '>':if(input[p_input+1]=='=')
                 {
                     word[0]='>';word[1]='=';word[2]='\0';
                     syn = 24;
                     p_input++;
                 }else
                 {
                     word[0] = '>';word[1]='\0';
                     syn = 23;
                 }break;
        case'*':syn=13;word[0]=ch;word[1]='\0';break;
        case'/':syn=14;word[0]=ch;word[1]='\0';break;
        case'+':syn=15;word[0]=ch;word[1]='\0';break;
        case'-':syn=16;word[0]=ch;word[1]='\0';break;
        case'=':syn=25;word[0]=ch;word[1]='\0';break;
        case';':syn=26;word[0]=ch;word[1]='\0';break;
        case'(':syn=27;word[0]=ch;word[1]='\0';break;
        case')':syn=28;word[0]=ch;word[1]='\0';break;
        case'#':syn=0;word[0]=ch;word[1]='\0';break;
        case'\n':syn = -2;break;
        default: syn=-1;word[0]='\0';break;
    }
}













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值