词法分析

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define _KEY_WORD_END "waiting for your expanding"
typedef struct {
    int typenum;
    char *word;
}WORD;
char input[255];
char token[255] = "";
int p_input;
int P_token;
char ch;
char* rwtab[] = {"begin","if","then","while","do","end",_KEY_WORD_END};

WORD* scaner();
void main(){
    int over = 1;
    WORD* oneword = new WORD;
    printf("Enter Your words(end with #):");
    scanf("%[^#]s",input);
    p_input = 0;
    printf("Your words:\n%s\n",input);
    while (over<1000&&over!=-1)
    {
        oneword = scaner();
        if(oneword->typenum<1000)
            printf("(%d,%s)",oneword->typenum,oneword->word);
        over = oneword->typenum;
    }
    printf("\npress # to exit");
    scanf("%[^#]s",input);
}
//从输入缓冲区读取一个字符到ch
char m_getch(){
    ch = input[p_input];
    p_input = p_input + 1;
    return(ch);
}
//去掉空白符号
void getbc(){
    while(ch ==' '|| ch == 10){
        ch = input[p_input];
        p_input = p_input + 1;
    }
}
//拼接单词
void contact(){
    token[P_token] = ch;
    P_token = P_token + 1;
    token[P_token]  = '\0';
}
//判断是否为字母
int letter(){
    if(ch >= 'a' && ch <= 'z' || ch>='A' && ch <= 'Z') return 1;
    else return 0;
}
//判断是否是数字
int digit(){
    if (ch >= '0' && ch <= '9')
    {
        return 1;
    }
    else return 0;
}
//检索关键字表格
int reserve(){
    int i = 0;
    while (strcmp(rwtab[i],_KEY_WORD_END))
    {
        if (!strcmp(rwtab[i],token))
        {
            return i + 1;
        }
        i = i+1;
    }
    return 10;
}

//回退一个字符
void retract(){
    p_input = p_input - 1;
}
//数字转换为二进制
char* dtb(){
      return NULL;
}

WORD* scaner(){
    WORD* myword = new WORD();
    myword->typenum = 10;
    myword->word = "";
    P_token = 0;
    m_getch();
    getbc();
    if (letter())
    {
        while (letter()||digit())
        {
            contact();
            m_getch();
        }
        retract();
        myword->typenum = reserve();
        myword->word = token;
        return(myword);
    }
    else if (digit())
    {
        while (digit())
        {
            contact();
            m_getch();
        }
        retract();
        myword->typenum = 20;
        myword->word = token;
        return(myword);
    }
    else switch(ch){
        case '=' : m_getch();
                   if (ch == '=')
                   {
                       myword->typenum = 39;
                       myword->word = "==";
                       return (myword);
                   }
                   retract();
                   myword->typenum = 21;
                   myword->word = "=";
                   return(myword);
                   break;
        case '+':myword->typenum = 22;
                 myword->word = "+";
                   return(myword);
                   break;
        case'-':myword->typenum = 23;
                 myword->word = "-";
                 return(myword);
                 break;
        case'*':myword->typenum = 24;
                myword->word = "*";
                   return(myword);
                   break;
        case '/':myword->typenum = 25;
                 myword->word = "/";
                  return(myword);
                   break;              
        case '(':myword->typenum = 26;
            myword->word = "(";
            return(myword);
            break;
        case ')':myword->typenum = 27;
            myword->word = ")";
            return(myword);
            break;

        case '[':myword->typenum = 28;
            myword->word = "[";
            return(myword);
            break;
        case ']':myword->typenum = 29;
            myword->word = "]";
            return(myword);
            break;
        case '{':myword->typenum = 30;
            myword->word = "{";
            return(myword);
            break;
        case '}':myword->typenum = 31;
            myword->word = "}";
            return(myword);
            break;
        case ',':myword->typenum = 32;
            myword->word = ",";
            return(myword);
            break;
        case ':':myword->typenum = 33;
            myword->word = ":";
            return(myword);
            break;
        case ';':myword->typenum = 34;
            myword->word = ";";
            return(myword);
            break;
        case '>' : m_getch();
            if (ch == '=')
            {
                myword->typenum = 37;
                myword->word = ">=";
                return (myword);
            }
            retract();
            myword->typenum = 35;
            myword->word = ">";
            return(myword);
                   break;   
        case '<' : m_getch();
            if (ch == '=')
            {
                myword->typenum = 38;
                myword->word = "<=";
                return (myword);
            }
            retract();
            myword->typenum = 36;
            myword->word = "<";
            return(myword);
        case '!' : m_getch();
            if (ch == '=')
            {
                myword->typenum = 40;
                myword->word = "!=";
                return (myword);
            }
            retract();
            myword->typenum = -1;
            myword->word = "ERROR";
            return(myword);
                   break;   
        case '\0':myword->typenum = 1000;
                      myword->word = "OVER";
                     return(myword);
            break;
        default: myword->typenum = -1;
                     myword->word = "ERROR";
                     return(myword);       
    }

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值