zoukankan      html  css  js  c++  java
  • 实验一:词法分析实验报告

    一、实验目的

    (1)掌握词法分析程序的实现方法。

    (2)用C语言对一个简单语言的子集编制一个一遍扫锚的编译理解,掌握编译程序的实现方法和技术。

    (3)理解词法分析在编译程序中的作用。

    (4)加深对有穷自动机模型的理解。

    二、实验内容和要求

    1,词法分析程序的功能(输入,输出)。

    2,待分析的简单语言的词法。

    3,各种单词符号对应的种别码。

    三、实验方法、步骤及结果测试

    1.源程序名:压缩包文件(rar或zip)中源程序名cifa.c

    可执行程序名:cifa.exe

    2.原理分析及流程图

    3.主要程序段及其解释:

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

    运行结果:由于电脑问题,迟点贴结果

    四、 实验总结

    心得体会:

    这个词法分析程序让我初步了解到了编程软件是怎样进行编译的,更加深刻的体会到了编译原理对于计算机专业的重要性。

  • 相关阅读:
    校验规则,纯数字。几位有效数字,保留几位小数
    银行卡校验规则(Luhn算法)
    forEach兼容ie8
    node.js
    gulp
    observer
    webpack.config.js 配置
    内存泄漏(Memory Leak)
    cdn
    前端 各种插件的官网
  • 原文地址:https://www.cnblogs.com/linweicong/p/5985469.html
Copyright © 2011-2022 走看看