实验一 词法分析器

一、实验目的
  (1)理解词法分析在编译程序中的作用;
  (2)加深对有限自动机模型的理解;
  (3)掌握词法分析程序的实现方法和技术。
  
二、开发语言及实现平台或实验环境
      操作系统:Win7;
      开发工具:codeblocks 10.05 ;
     内存:512M
      CPU:p(D)2.8hz
  
实验内容  
   输入:根据教学要求和学生具体情况,从具有代表性的高级程序设计语言中,选取一个适当大小的子集,例如可以选取一类典型单词,也可以尽可能使各种类型的单词都能兼顾到。
   
   输出:单词串的输出形式,所输出的每一单词均按形如(CLASS,VALUE)的二元式编码。对于变量和常数,CLASS字段为相应的类别码,VALUE字段则是该标识符、常数的具体值或在其符号表中登记项的序号(要求在变量名表登记项中存放该标识符的字符串;常数表登记项中则存放该常数的二进制形式)。对于关键字和分隔符,采用一词一类的编码形式。由于采用一词一类的编码方式,所以仅需在二元式的CLASS字段上放置相应的单词的类别码,VALUE字段则为“空”。不过,为便于查看由词法分析程序所输出的单词串,要求在CLASS字段上直接放置单词符号串本身。
   

 

描述语言的文法
关键字:   本程序识别的关键字为int  float  char main if else switch case printf return ,仅当单独出现以上标识符时识别为关键字,对于inta,ifb等识别为标识符。 
标识符:   一个标识符必须以字母开头,后面接上字母和数字,否则产生报错信息,程
                 序停止词法分析,输出相关错误信息
                 如: 正确:abc, abc123, 等,错误:123abc
操作符:   本程序识别的操作符为:   +  -  /  *  |  & = < >  
分隔符:   本程序识别的分隔符为:   (  )  {  }  ;  : ,  “
数字:     识别的数字遵循以下文法规则:
          digit       0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
          intnumber  digit+      
          exponent    (E|e) ( + | - |  ) digit+
          fraction    . digit+realnumber  digit+ exponent | digit+ fraction ( exponent |  )
          例如:正确: 123, 123E2, 123.3123.3E4
                错误: 123A,123E, 123.A . 123.3A, 123.3E
    <标识符>→<字母><字母数字串>
    <字母数字串>→<字母><字母数字串>|<数字><字母数字串>|ε
    <无符号整数>→<数字>|<数字><无符号整数>
    <运算符>→ + | - | * | / | =
    <界符>→ , | ; | ( | ) | { | }
五、单词分类码表
  

实验一 词法分析器_第1张图片

 

六、状态转换图及状态矩阵
  由描述无符号常数的正规文法构造状态转换图如下:

实验一 词法分析器_第2张图片




实验一 词法分析器_第3张图片


七、源程序
要求:1、在此只写出核心的算法程序,要求有必要的注释;代码字体使用courier new,并且代码必须放在文本框中,要求文本框边框无颜色。
    2、全部的源程序,与实验报告放在同一文件夹下,文件夹命名原则为
      计科1101班11150001王一,注意没有任何空格

#include 
#include
#include
#include
using namespace std;
#define num 5
#define num0 3
#define num1 9
char *KeyWords[num]= {"begin","end","if","then","else" }; //关键字
char ope[num0]= {'<','=','>'}; //操作符
char edgesign[num1]= {';',',','(',')','"','{','}'}; //分隔符不含换行,空格
int t; //用作判断是否为两位操作符的标记
int zhuanhuan(int a) //十进制转二进制 快速转换
{
    int n,i,len,pow2;
    char tag[1000];
    memset(tag,'0',sizeof(tag));
    pow2=1;
    for(i=0;pow2<=a;i++)
    pow2<<=1;
    tag[i]='\0';
    len=i-1;
    while(a>0)
    {
        if(a>=pow2)
        {
            tag[len-i]='1';
            a-=pow2;
        }
        i--;
        pow2>>=1;
    }
    a=atoi(tag);
   // printf("%d\n",a);
    return a;
}
int Key(char *word) //确定是否为关键字
{
    for(int i=0; i< num; i++)
        if(!strcmp(KeyWords[i],word))
        {
            printf("(%d,\"%s\")\n",i+1,word);return 1;
        }
    return 0;
}
int yun(char word) //确定是否为操作符
{
    for(int i=0; i')
            printf("(11,\"%c%c\")\n",word1,word2);
        else if(word1=='>'&&word2=='=')
            printf("(13,\"%c%c\")\n",word1,word2);
    }
    else if(yun(word1)&&!yun(word2)&&(t>1))  //判断是否为一位操作符
    {
        for(int i=0; i

 

 

八、调试过程及实验结果

要求:  要给出2-3个不同的测试用例,并且给出输出结果。

 

 input1.txt                                    input2.txt

                                             

 

九、总结与体会

   通过此次实验,让我了解到如何设计、编制并调试词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的手工方式的相关原理,使用某种高级语言(例如C++语言)直接编写此法分析程序。另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。


 
  
 
  
 
 

你可能感兴趣的:(杂项,编译原理)