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

    实验一、词法分析实验

    商软二班 张智恒 201506110172

    一、        实验目的

     

         编制一个词法分析程序

    二、        实验内容和要求

    编写一个词法分析程序,使其能够识别对应的单词符号,并以(单词符号        种别码)的形式输出。

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

     

    1. 1.      源程序名:压缩包文件(rarzip)中源程序名 zzh.c

    可执行程序名:zzh.exe

    1. 2.      主要程序段及其解释:

    # include<stdio.h>

    # include<stdlib.h>

    # include<string.h>

    int panduan(char tmp[])

    {

        char b[6][10] = {"begin", "if", "then", "while", "do", "end", };

        int k = 0;

        while(k < 6)                 // 临时变量tmp 与 字符串b[k] 进行比较

        {

            if(strcmp(tmp, b[k]) == 0)

            {

                printf("<%s, %d> ", tmp, k+1);

                return 0;

            }

            k++;

        }

        printf("<%s, 10> ", tmp);

        return 0;

    }

    void cifafenxi(char a[])

    {

        int i = 0, j = 0;

        char tmp[10];

        int flag = 0;

        while(a[i] != '')

        {

            if(a[i] >= 'a' && a[i] <= 'z')        // 判断标识符

            {

                tmp[j] = a[i];

                j++;

                while((a[i+1] >= 'a' && a[i+1] <= 'z') || (a[i+1] >= '0' && a[i+1] <= '9'))

                {

                    i++;

                    tmp[j] = a[i];

                    j++;

                }

                tmp[j] = '';

                j = panduan(tmp);

            }

            if(a[i] >= '0' && a[i] <= '9')        // 判断数字

            {

                tmp[j] = a[i];            

                j++;

                while(a[i+1] >= '0' && a[i+1] <= '9')

                {

                    i++;

                    tmp[j] = a[i];

                    j++;

                }

                tmp[j] = '';

                printf("<%s, 11> ", tmp);

                j = 0;

            }

            switch(a[i])        // 判断符号

            {

            case '+':printf("<+, 13> ");break;

            case '-':printf("<-, 14> ");break;

            case '*':printf("<*, 15> ");break;

            case '/':printf("</, 16> ");break;

            case ':':

                {

                    if(a[i+1] == '=')

                        printf("<:=, 18> ");

                    else

                        printf("<:, 17> ");

                }break;

            case '<':

                {

                    if(a[i+1] == '=')

                        printf("<<=, 21> ");

                    else if(a[i+1] == '>')

                        printf("<<>, 22> ");

                    else

                        printf("<<, 20> ");

                }break;

            case '>':

                {

                    if(a[i+1] == '=')

                        printf("<>=, 24> ");

                    else

                        printf("<>, 23> ");

                }break;

            case '=':printf("<=, 25> ");break;

            case ';':printf("<;, 26> ");break;

            case '(':printf("<(, 27> ");break;

            case ')':printf("<), 28> ");break;

            case '#':printf("<#, 0> ");break;

            }

        

            i++;

        }

    }

    int main(void)

    {

        char a[300];

        printf("input : ");

        gets(a);

        cifafenxi(a);

        return 0;

    }

    1. 3.      运行结果及分析

    一般必须配运行结果截图,结果是否符合预期及其分析。

       (截图需根据实际,截取有代表性的测试例子)

     

     

     

     

     

    四、        实验总结

    1.很有难度,在机房里憋了几个小时,还是搞不定,主要是在数字那一块数字方面该程序是没有负数的,很多地方其实也都不算完美通过与同学的交流,掌握了主要方法后发现其原理十分简单,把每一种类型都分开出来特殊处理就可以了

    词法分析是编译的第一个阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,

    初次做词法分析时无从下手,后经过看书查资料对其慢慢理解, 勉强是做出了一个不太好的成品 ,

    对于编译程序的学习,我会更加用心的,毕竟我觉得确实有难度,但它确实很有用,比如编译程序

    的结构要如何简洁清晰条理化,编译程序的效率等等的实际问题

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    Atom | 编辑器Atom的使用小结
    离散数学 | ∅ 与 {∅} 出现在离散数学幂集合中
    Excel | 如何用Excel实现证件照底色调换
    Awesome图标 | 如何在某些编辑软件中使用Font Awesome字体图标
    将SSH的秘钥每次输入的密码去掉
    用canvas 画一个水位波纹上升下降的进度球
    解决Enter passphrase for key '/Users/mac/.ssh/id_rsa':的问题
    vue 注册全局过滤器
    解决vue的父组件打开子组件弹窗只走一次mounted的问题
    forEach终止循环的方法
  • 原文地址:https://www.cnblogs.com/lk666/p/5960799.html
Copyright © 2011-2022 走看看