• 词法分析


    #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 ",input);

    while(over<1000&&over!=-1)

    {

    oneword=scaner();

    printf("种别码:%d, 单词符号:%s) ",oneword->typenum,oneword->word);

    over=oneword->typenum;

    }

    }

    //需要用到的自编函数参考实现

    //从输入缓冲区读取一个字符到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 concat()

    {

    token[p_token]=ch;

    p_token=p_token+1;

    token[p_token]='';

    }

    //判断是否字母

    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 '':

    myword->typenum=1000;

    myword->word="OVER";

    return(myword);

    break;

    default:

    myword->typenum=-1;

    myword->word="ERROR";

    return(myword);

    }

    }

    }

  • 相关阅读:
    【Office】将一个excel文件中的表移动至另一个excel中
    【 DB_Oracle】impdp/expdp导入导出dmp文件
    【DB_Oracle】设置Oracle的监听和服务随 Linux开机自启
    【DB_Oracle】Centos中安装oracle11g R2
    【 DB_Oracle】Linux下启动Oracle服务和监听程序
    【OS_Linux】VMware中给CentOS磁盘扩容
    【 OS_Linux】WinSCP实现Windows与Linux间文件的传输
    【DB_Oracle】windows下安装Oracle 11g
    鼠标键盘失灵对策(Windows8.1)
    UNIX 高手的另外 10 个习惯
  • 原文地址:https://www.cnblogs.com/maijinjun/p/4861040.html
Copyright © 2020-2023  润新知