zoukankan      html  css  js  c++  java
  • 实验一报告

    一、        实验目的

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

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

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

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

    二、        实验内容和要求

    1,待分析的简单语言的词法

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

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

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

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

    可执行程序名:CIFAFEN.exe

    2.      原理分析及流程图

    主要总体设计问题。

    (包括存储结构,主要算法,关键函数的实现等)

    词法分析主程序示意图

     

    主要算法:

    1.先应用数组存放关键字。

    2.利用if,switch进行分析单词符号。

    3.最后输出单词对应的种别码。

    关键函数的实现:

    1.*定义I/O库所用的某些宏和变量*/
    2. /*定义字符串库函数*/
    3./*提供有关屏幕窗口操作函数*/
    4./*分类函数*/

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

    实现主要功能的程序段,重要的是程序的注释解释。

    主要程序共分为三大块,分别是标示符、数字、符号。

    void scaner(){
    m=0;
    sum=0;
    for(n=0;n<8;n++)
    token[n]='\0';
    ch=prog[p++];
    while(ch==' ')
    ch=prog[p++];
    if(isalpha(ch)) /*ch为字母字符*/
    {
    while(isalpha(ch)||isdigit(ch)) /*ch 为字母字符或者数字字符*/
    {
    token[m++]=ch;
    ch=prog[p++];}
    token[m++]='\0';
    ch=prog[p--];
    syn=10;
    for(n=0;n<6;n++)
    if(strcmp(token,rwtab[n])==0) /*字符串的比较*/
    {
    syn=n+1;
    break;}}
    else
    if(isdigit(ch)) /*ch是数字字符*/
    {
    while(isdigit(ch)) /*ch是数字字符*/
    {
    sum=sum*10+ch-'0';
    ch=prog[p++];}
    ch=prog[p--];
    syn=11;}
    else
    switch(ch)//识别符号的函数
    {
    case'<':m=0;token[m++]=ch;ch=prog[p++];
    if(ch=='>'){
    syn=21;
    token[m++]=ch;}
    else if(ch=='='){
    syn=22;
    token[m++]=ch;}
    else{
    syn=20;
    ch=prog[p--];}
    break;
    case'>':m=0;token[m++]=ch;ch=prog[p++];
    if(ch=='='){
    syn=24;
    token[m++]=ch;}
    else{
    syn=23;
    ch=prog[p--];}
    break;
    case':':m=0;token[m++]=ch;ch=prog[p++];
    if(ch=='='){
    syn=18;
    token[m++]=ch;}
    else{
    syn=17;
    ch=prog[p--];}
    break;
    case'+':syn=13;token[0]=ch;break;
    case'-':syn=14;token[0]=ch;break;
    case'*':syn=15;token[0]=ch;break;
    case'/':syn=16;token[0]=ch;break;
    case'=':syn=25;token[0]=ch;break;
    case';':syn=26;token[0]=ch;break;
    case'(':syn=27;token[0]=ch;break;
    case')':syn=28;token[0]=ch;break;
    case'#':syn=0;token[0]=ch;break;
    default:syn=-1;}}

    1. 4.      运行结果及分析

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

      

    源代码:

    #include<stdio.h> /*定义I/O库所用的某些宏和变量*/
    #include<string.h> /*定义字符串库函数*/
    #include<conio.h> /*提供有关屏幕窗口操作函数*/
    #include<ctype.h> /*分类函数*/
    char prog[80]={'\0'},
    token[8]; /*存放构成单词符号的字符串*/
    char ch;
    int syn, /*存放单词字符的种别码*/
    n,
    sum, /*存放整数型单词*/
    m,p; /*p是缓冲区prog的指针,m是token的指针*/
    char *rwtab[6]={"begin","if","then","while","do","end"};
    void scaner(){
    m=0;
    sum=0;
    for(n=0;n<8;n++)
    token[n]='\0';
    ch=prog[p++];
    while(ch==' ')
    ch=prog[p++];
    if(isalpha(ch)) /*ch为字母字符*/
    {
    while(isalpha(ch)||isdigit(ch)) /*ch 为字母字符或者数字字符*/
    {
    token[m++]=ch;
    ch=prog[p++];}
    token[m++]='\0';
    ch=prog[p--];
    syn=10;
    for(n=0;n<6;n++)
    if(strcmp(token,rwtab[n])==0) /*字符串的比较*/
    {
    syn=n+1;
    break;}}
    else
    if(isdigit(ch)) /*ch是数字字符*/
    {
    while(isdigit(ch)) /*ch是数字字符*/
    {
    sum=sum*10+ch-'0';
    ch=prog[p++];}
    ch=prog[p--];
    syn=11;}
    else
    switch(ch)
    {
    case'<':m=0;token[m++]=ch;ch=prog[p++];
    if(ch=='>'){
    syn=21;
    token[m++]=ch;}
    else if(ch=='='){
    syn=22;
    token[m++]=ch;}
    else{
    syn=20;
    ch=prog[p--];}
    break;
    case'>':m=0;token[m++]=ch;ch=prog[p++];
    if(ch=='='){
    syn=24;
    token[m++]=ch;}
    else{
    syn=23;
    ch=prog[p--];}
    break;
    case':':m=0;token[m++]=ch;ch=prog[p++];
    if(ch=='='){
    syn=18;
    token[m++]=ch;}
    else{
    syn=17;
    ch=prog[p--];}
    break;
    case'+':syn=13;token[0]=ch;break;
    case'-':syn=14;token[0]=ch;break;
    case'*':syn=15;token[0]=ch;break;
    case'/':syn=16;token[0]=ch;break;
    case'=':syn=25;token[0]=ch;break;
    case';':syn=26;token[0]=ch;break;
    case'(':syn=27;token[0]=ch;break;
    case')':syn=28;token[0]=ch;break;
    case'#':syn=0;token[0]=ch;break;
    default:syn=-1;}}
    main()
    {

    p=0;
    printf("请输入字符与符号:\n");
    do {
    ch=getchar();
    prog[p++]=ch;
    }while(ch!='#');

    p=0;
    do{
    scaner();
    switch(syn){
    case 11: printf("(%d,%d)\n",syn,sum);break;
    // case -1: printf("\n ERROR;\n");break;
    default: printf("(%d,%s)\n",syn,token);
    }
    }while(syn!=0);
    //getch();
    }

    四.实验总结

       本次实验难度较大,本人经过许多次的试验才得出正确的结果,期间更是有同学们的倾囊相助,经过这次实验,我对于编译原理这门课的认识又多了许多,今后会更加努力

     

     

     

  • 相关阅读:
    软件工程第二次结对作业
    实验 6:OpenDaylight 实验——OpenDaylight 及 Postman 实现流表下发
    实验 5:OpenFlow 协议分析和 OpenDaylight 安装
    实验 4:Open vSwitch 实验——Mininet 中使用 OVS 命令
    软件工程第一次作业
    实验 3:Mininet实验——测量路径的损耗率
    软件工程个人总结
    2020 SDN第七次上机实验
    软件工程实践第4次作业-结对编程之实验室程序实现
    2020 SDN第六次上机实验
  • 原文地址:https://www.cnblogs.com/linbolinbo/p/5961428.html
Copyright © 2011-2022 走看看