• 0917 词法分析


    #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(); //词法扫描函数,获得关键字

    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("单词符号:%s 种别码:%d ",oneword->word,oneword->typenum); //打印种别码和单词自身的值

    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]='';//一个单词结束

    }

    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;

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

    myword->typenum=13;

    myword->word="+";

    return(myword);

    break;

    case '-':

    myword->typenum=14;

    myword->word="-";

    return(myword);

    break;

    case '*':

    myword->typenum=15;

    myword->word="*";

    return(myword);

    break;

    case '/':

    myword->typenum=16;

    myword->word="/";

    return(myword);

    break;

    case ':': m_getch();

    if(ch=='='){

    myword->typenum=18;

    myword->word=">=";

    return(myword);

    }

    retract();

    myword->typenum=17;

    myword->word=":";

    return(myword);

    break;

    case '<': m_getch();

    if(ch=='='){

    myword->typenum=21;

    myword->word="<=";

    return(myword);

    }

    else if(ch=='>'){

    myword->typenum=22;

    myword->word="<>";

    return(myword);

    }

    retract();

    myword->typenum=20;

    myword->word="<";

    return(myword);

    break;

    case '>': m_getch();

    if(ch=='='){

    myword->typenum=24;

    myword->word=">=";

    return(myword);

    }

    retract();

    myword->typenum=23;

    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=0;

    myword->word="OVER";

    return(myword);

    break;

    default:

    myword->typenum=-1;

    myword->word="ERROR";

    return(myword);

    }

    }

    }

  • 相关阅读:
    学习规划
    一位十年的老司机告诉你什么是编程思想
    React开发
    一个简单的ipfs音乐播放器的实现
    React错误总结(三)
    React错误总结解决方案(二)
    mongoid模糊查询
    Rails accepts_nested_attributes_for表单嵌套的利器
    route_path
    "constantize" and "with_indifferent_access" method
  • 原文地址:https://www.cnblogs.com/jjy520/p/4860885.html
Copyright © 2020-2023  润新知