201506110097-试验一实验报告

格式说明:排版时注意按此模板的字体,字号和行距。

报告提交和打印输出时请去掉此框。

实验一、词法分析实验

专业:商业软件工程一班   姓名:黄大贞  学号:201506110097

一、        实验目的

 

      设计、编制、调试一个词法分析子程序-识别单词,加深对词法分析原理的理解。

 

二、        实验内容和要求

1、待分析的简单的词法

(1)保留字:if,else, for, while, do, int ,read, write,real,char

(2)纯单分界符:+ — * () {} ; : ,

(3)双分界符:> < = ! ,&&,||

2 、实现功能:

(1)在命令行中输入源程序文件名(包括文件名路径)

(2)输入目标文件名(包括文件名路径)

(3)调用所编词法分析代码将分析结果写入目标文件代码(编译完成) 三、词法分析程序的算法思想:算法的基本任务是从源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,分析与代码中相应的单词符号。

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

 

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

可执行程序名:×××.exe

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

主要总体设计问题。

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

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

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

 

#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("please input string:\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();

}

 

  1. 2.      运行结果及分析

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

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

 

 

一、        实验总结

通过编译原理的这次程序实验,在自已动手体验的情况下,更加透彻地理解了词法分析的过程,以及该算法。对于以后由模型向程序代码的转化能力上,有了很大的锻炼。以后我会更加专心的研究计算机知识,不断将现实中遇到的实际问题,向程序方面转变,做到灵活运用所学知识。

转载于:https://www.cnblogs.com/qq157049540/p/5961121.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值