• 实验一 词法分析实验


    商软一班  刘畅   201506110126

     

    一、 实验目的

    通过设计一个词法分析程序,对词法进行分析,加强对词法的理解,掌握对程序设计语言的分解和理解。

    二、 实验内容和要求

    在原程序中输入源代码

    • 对字符串表示的源程序  
    • 从左到右进行扫描和分解
    • 根据词法规则
    • 识别出一个一个具有独立意义的单词符号
    • 以供语法分析之用
    • 发现词法错误,则返回出错信息

    在源程序中,自动识别单词,把单词分为五种,并输出对应的单词种别码。

    1. 识别关键字:main if int for while do return break continue,该类的单词码为1.
    2. 识别标识符:表示各种名字,如变量名、数组名、函数名等,如char ch, int syn, token,sum,该类的单词码为2.
    3. 运算符:+、-、*、/、=、>、<、>=、<=、!=
    4. 分隔符:,、;、{、}、(、)
    5. 常数,如123,4587

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

    输出形式:

    • 二元式

    – (单词种别,单词自身的值)

    • 单词种别,表明单词的种类,语法分析需要的重要信息

    – 整数码

    • 关键字、运算符、界符:一符一码
    • 标识符:10, 常数:11
    • 单词自身的值

    – 标识符token、常数sum

    – 关键字、运算符、界符token

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

    1. 源程序名:词法分析.c 词法分析.exe

    可执行程序名:编译原理 实验报告.exe

    1. 原理分析及流程图   
    2.  主要程序段及其解释:实现主要功能的程序段,重要的是程序的注释解释。
        1 #include <stdio.h>
        2 #include <string.h>
        3 
        4 char string[80],simbol[8],ch;
        5 int wordID,index,m,n,sum;
        6 char *rwtab[6]={"begin","if","then","while","do","end"};
        7 
        8 void scaner(void);
        9 
       10 main()
       11 {
       12     int index=0;
       13    // printf("\n lease inindexut a string(end with '#'):\n");
       14  printf("Please input string (end#):");
       15 
       16     do{
       17             scanf("%c",&ch);
       18             string[index++]=ch;
       19     }while(ch!='#');
       20 
       21     index=0;
       22     do{
       23             scaner();
       24             switch(wordID)
       25             {
       26                 case 11:
       27                     printf("( %-10d%5d )\n",sum,wordID);
       28                 break;
       29 
       30                 case -1:
       31                     printf("you have inindexut a wrong string\n");
       32                     //getch();
       33                     return 0;
       34                 break;
       35 
       36                 default:
       37                 printf("( %-10s%5d )\n",simbol,wordID);
       38                 break;
       39             }
       40         }while(wordID!=0);
       41     //getch();
       42  return 0;
       43  }
       44 
       45 void scaner(void)
       46 {
       47     sum=0;
       48 
       49     for(m=0;m<8;m++)
       50         simbol[m++]= NULL;
       51 
       52         ch=string[index++];
       53         m=0;
       54 
       55     while((ch==' ')||(ch=='\n'))
       56         ch=string[index++];
       57 
       58     if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A')))
       59      {
       60         while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9')))
       61         {
       62             simbol[m++]=ch;
       63             ch=string[index++];
       64         }
       65 
       66         index--;
       67         wordID=10;
       68 
       69         for(n=0;n<6;n++)
       70         if(strcmp(simbol,rwtab[n])==0)
       71         {
       72             wordID=n+1;
       73             break;
       74         }
       75      }
       76      else if((ch>='0')&&(ch<='9'))
       77      {
       78         while((ch>='0')&&(ch<='9'))
       79         {
       80             sum=sum*10+ch-'0';
       81             ch=string[index++];
       82         }
       83         index--;
       84         wordID=11;
       85     }
       86     else
       87     {
       88         switch(ch)
       89         {
       90         case '<':
       91             simbol[m++]=ch;
       92             ch=string[index++];
       93             if(ch=='=')
       94             {
       95                 wordID=22;
       96                 simbol[m++]=ch;
       97             }
       98             else
       99             {
      100                 wordID=20;
      101                 index--;
      102             }
      103         break;
      104 
      105         case '>':
      106             simbol[m++]=ch;
      107             ch=string[index++];
      108             if(ch=='=')
      109             {
      110                 wordID=24;
      111                 simbol[m++]=ch;
      112             }
      113             else
      114             {
      115                 wordID=23;
      116                 index--;
      117             }
      118         break;
      119 
      120         case '+':
      121             simbol[m++]=ch;
      122             ch=string[index++];
      123             if(ch=='+')
      124             {
      125                 wordID=17;
      126                 simbol[m++]=ch;
      127             }
      128             else
      129             {
      130                 wordID=13;
      131                 index--;
      132             }
      133         break;
      134 
      135         case '-':
      136             simbol[m++]=ch;
      137             ch=string[index++];
      138             if(ch=='-')
      139             {
      140                 wordID=29;
      141                 simbol[m++]=ch;
      142             }
      143             else
      144             {
      145                 wordID=14;
      146                 index--;
      147             }
      148         break;
      149 
      150         case '!':
      151             ch=string[index++];
      152             if(ch=='=')
      153             {
      154                 wordID=21;
      155                 simbol[m++]=ch;
      156             }
      157             else
      158             {
      159                 wordID=31;
      160                 index--;
      161             }
      162         break;
      163 
      164         case '=':
      165             simbol[m++]=ch;
      166             ch=string[index++];
      167             if(ch=='=')
      168             {
      169                 wordID=25;
      170                 simbol[m++]=ch;
      171             }
      172             else
      173             {
      174                 wordID=18;
      175                 index--;
      176             }
      177         break;
      178 
      179         case '*':
      180             wordID=15;
      181             simbol[m++]=ch;
      182         break;
      183 
      184         case '/':
      185             wordID=16;
      186             simbol[m++]=ch;
      187         break;
      188 
      189         case '(':
      190             wordID=27;
      191             simbol[m++]=ch;
      192         break;
      193 
      194         case ')':
      195             wordID=28;
      196             simbol[m++]=ch;
      197         break;
      198 
      199         case '{':
      200             wordID=5;
      201             simbol[m++]=ch;
      202         break;
      203 
      204         case '}':
      205             wordID=6;
      206             simbol[m++]=ch;
      207         break;
      208 
      209         case ';':
      210             wordID=26;
      211             simbol[m++]=ch;
      212         break;
      213 
      214         case '\"':
      215             wordID=30;
      216             simbol[m++]=ch;
      217         break;
      218 
      219         case '#':
      220             wordID=0;
      221             simbol[m++]=ch;
      222         break;
      223 
      224         case ':':
      225             wordID=17;
      226             simbol[m++]=ch;
      227         break;
      228 
      229         default:
      230             wordID=-1;
      231         break;
      232         }
      233     }
      234         simbol[m++]='\0';
      235 }
    3.    运行结果及分析

    输入源代码:begin x:2; end#

    符合个字符的单词码

        实验总结

    学会编写一个简单的词法分析程序,利用词法分析程序分析源代码,逐个单词进行分析拆分,把标识符,保留字区分,并且能识别出空格,并把数据能从文件中读出来.

  • 相关阅读:
    oracle 监听静态注册举例解析
    oracle监听动态注册与静态注册
    oracle startup mount nomount 区别
    RAC的时间同步问题
    RAC环境TNS-12541报错处理
    Oracle参数修改是否需要重启等
    面试提纲
    Dubbo是什么
    为什么要用dubbo,dubbo和zookeeper关系
    Java的参数传递是「按值传递」还是「按引用传递」?
  • 原文地址:https://www.cnblogs.com/126lc/p/5961280.html
Copyright © 2020-2023  润新知