zoukankan      html  css  js  c++  java
  • 20160930 词法分析程序


    #include<stdio.h> //包含库所用的某些宏和变量
    #include<stdlib.h> //包含库
    #include<string.h> //包含字符串处理库
    #define _KEY_WOED_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_WOED_END}; //C语言关键字
    WORD * scaner(); //词法扫描函数,获得关键字
    main()
    {
    int over=1;
    WORD *oneword;
    oneword=(WORD *)malloc(sizeof(WORD));
    printf("输入源代码(以#结束):"); //读入源程序字符串到缓冲区,以#结束,允许多行输入
    scanf("%[^#]s",input);
    p_input=0;
    printf("你输入的代码:%s\n\n",input);
    while(over<1000&&over!=-1)
    {
    oneword=scaner();
    printf("种别码:%d, 单词符号:%s)\n",oneword->typenum,oneword->word);
    over=oneword->typenum;
    }
    }
    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 concat()
    {
    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;
    for(i=0;i<7;i++)
    {
    if(!strcmp(rwtab[i],token))
    {
    return i+1;
    }
    i=i+1;
    }
    return 10;
    }
    void retract()
    {
    p_input=p_input-1;
    }
    WORD *scaner()
    {
    WORD *myword;
    myword=(WORD *)malloc(sizeof(WORD));
    myword->typenum=10;
    myword->word="";
    p_token=0;
    m_getch();
    getbc();
    if(letter())
    {
    while(letter()||digit())
    {
    concat();
    m_getch();
    }
    retract();
    myword->typenum=reserve();
    myword->word=token;
    return(myword);
    }
    else if(digit())
    {
    while(digit())
    {
    concat();
    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 '>':
    myword->typenum=35;
    myword->word=">";
    return(myword);
    break;
    case '<':
    myword->typenum=36;
    myword->word="<";
    return(myword);
    break;
    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);
    }
    }
    }

  • 相关阅读:
    hibernate.cfg.xml
    java util 巧用
    Ant
    WEB文件上传二 (Struts 文件上传)
    web文件上传一学习记录 (简单的web浏览器可读文件的上传,servlet 文件上传)
    long类型的时间转为n秒前n分钟前n小时前或者日期
    各种String类型的时间转long型,long转String
    Android 内容提供者(ContentProvider)的简单实用
    sql性能优化总结(转)
    数据添加到DataTable
  • 原文地址:https://www.cnblogs.com/linweicong/p/5924524.html
Copyright © 2011-2022 走看看