zoukankan      html  css  js  c++  java
  • 词法分析实验报告_219范楚广

    实验一、词法分析实验

    商业软件3班  范楚广  219

    一、        实验目的

     

    编制一个词法分析程序。通过设计一个编译词法分析程序,实现对词法分析转换的理解,加深对转换过程的认识,通过这个软件把理论知识运用到实际之中。

    二、        实验内容和要求

    输入:源程序字符串

    输出:二元组(种别,单词本身

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

     

    1. 1.      源程序名:词法分析_219范楚广.c

    可执行程序名:词法分析_219范楚广.exe

    1. 2.      原理分析及流程图

       #include <stdio.h>

    #include <string.h>

    char prog[80],token[8],ch;

    int syn,p,m,n,sum;

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

    scaner();

    main()

    {p=0;

    printf("\n 请输入一个字符串以#号结束:\n");

    do{

    scanf("%c",&ch);

    prog[p++]=ch;

    }while(ch!='#');

    p=0;

    do{

    scaner();

    switch(syn)

    {case 11:printf("( %-10d%5d )\n",sum,syn);

    break;

    case -1:printf("你输入了一个错误的字符串\n");

    getch();

    exit(0);

    default: printf("( %-10s%5d )\n",token,syn);

    break;

    }

    }while(syn!=0);

    getch();

    }

    scaner()

    { sum=0;

    for(m=0;m<8;m++)token[m++]=NULL;

    ch=prog[p++];

    m=0;

    while((ch==' ')||(ch=='\n'))ch=prog[p++];

    if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

    { while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

    {token[m++]=ch;

    ch=prog[p++];

    }

    p--;

    syn=10;

    for(n=0;n<6;n++)

    if(strcmp(token,rwtab[n])==0)

    { syn=n+1;

    break;

    }

    }

    else if((ch>='0')&&(ch<='9'))

    { while((ch>='0')&&(ch<='9'))

    { sum=sum*10+ch-'0';

    ch=prog[p++];

    }

    p--;

    syn=11;

    }

    else switch(ch)

    { case '<':token[m++]=ch;

    ch=prog[p++];

    if(ch=='=')

    { syn=22;

    token[m++]=ch;

    }

    else

    { syn=20;

    p--;

    }

    break;

    case '>':token[m++]=ch;

    ch=prog[p++];

    if(ch=='=')

    { syn=24;

    token[m++]=ch;

    }

    else

    { syn=23;

    p--;

    }

    break;

    case '+': token[m++]=ch;

    ch=prog[p++];

    if(ch=='+')

    { syn=17;

    token[m++]=ch;

    }

    else

    { syn=13;

    p--;

    }

    break;

    case '-':token[m++]=ch;

    ch=prog[p++];

    if(ch=='-')

    { syn=29;

    token[m++]=ch;

    }

    else

    { syn=14;

    p--;

    }

    break;

    case '!':ch=prog[p++];

    if(ch=='=')

    { syn=21;

    token[m++]=ch;

    }

    else

    { syn=31;

     

    p--;

    }

    break;

    case '=':token[m++]=ch;

    ch=prog[p++];

    if(ch=='=')

    { syn=25;

    token[m++]=ch;

    }

    else

    { syn=18;

    p--;

    }

    break;

    case '*': syn=15;

    token[m++]=ch;

    break;

    case '/': syn=16;

    token[m++]=ch;

    break;

    case '(': syn=27;

    token[m++]=ch;

    break;

    case ')': syn=28;

    token[m++]=ch;

    break;

    case '{': syn=5;

    token[m++]=ch;

    break;

    case '}': syn=6;

    token[m++]=ch;

    break;

    case ';': syn=26;

    token[m++]=ch;

    break;

    case '\"': syn=30;

    token[m++]=ch;

    break;

    case '#': syn=0;

    token[m++]=ch;

    break;

    case ':':syn=17;

    token[m++]=ch;

    break;

    default: syn=-1;

    break;

    }

    token[m++]='\0';

    }

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

    1、输入的字符串用数组

     printf("\n 请输入一个字符串以#号结束:\n");

    do{

    scanf("%c",&ch);

    prog[p++]=ch;

    }while(ch!='#');

    2、当前字符是属于哪个范围就分配到哪个字符数组里面去

    { sum=0;

    for(m=0;m<8;m++)token[m++]=NULL;

    ch=prog[p++];

    m=0;

    while((ch==' ')||(ch=='\n'))ch=prog[p++];

    if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))

    { while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))

    {token[m++]=ch;

    ch=prog[p++];

    }

    1. 4.      运行结果及分析

     

     

    四、        实验总结

    对于词法分析的输入,有些不懂。通过用字符数组的方式储存来解决。

    通过词法分析的实验更够更好地理解编译的原理。

  • 相关阅读:
    log4j学习
    数据库索引
    php 通过exec 创建git分支失败
    Nginx 常用全局变量 及Rewrite规则详解
    Jetbrains phpstorm pycharm 免费授权注册码
    Nginx return 关键字配置小技巧
    PHP 加密 和 解密 方法
    Nginx 禁用IP IP段
    Yii2 捕获错误日志
    transform 实现响应式绝对居中
  • 原文地址:https://www.cnblogs.com/Fanchuguang/p/5955803.html
Copyright © 2011-2022 走看看