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

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

    四、 实验总结

    心得体会:

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

  • 相关阅读:
    fn project 试用之后的几个问题的解答
    fn project 扩展
    fn project 生产环境使用
    fn project 对象模型
    fn project AWS Lambda 格式 functions
    fn project 打包Function
    fn project Function files 说明
    fn project hot functions 说明
    fn project k8s 集成
    fn project 私有镜像发布
  • 原文地址:https://www.cnblogs.com/linweicong/p/5985469.html
Copyright © 2011-2022 走看看