zoukankan      html  css  js  c++  java
  • 0916 编程实验一 词法分析程序

    #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;
    }
    printf(" 按#可推出程序");
    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 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;
    }


    /*数字转换成二进制
    char *dtb()
    {
    return NULL;
    }
    */

    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);
    }
    }
    }

  • 相关阅读:
    垂死挣扎还是涅槃重生 -- Delphi XE5 公布会归来感想
    自考感悟,话谈备忘录模式
    [每日一题] OCP1z0-047 :2013-07-26 alter table set unused之后各种情况处理
    Java实现 蓝桥杯 算法提高 p1001
    Java实现 蓝桥杯 算法提高 拿糖果
    Java实现 蓝桥杯 算法提高 拿糖果
    Java实现 蓝桥杯 算法提高 求arccos值
    Java实现 蓝桥杯 算法提高 求arccos值
    Java实现 蓝桥杯 算法提高 因式分解
    Java实现 蓝桥杯 算法提高 因式分解
  • 原文地址:https://www.cnblogs.com/14fzf/p/4825203.html
Copyright © 2011-2022 走看看