实验一  简单词法分析程序设计

 

一、实验目的

了解词法分析程序的基本构造原理,掌握词法分析程序的手工构造方法。

二、实验内容

1、了解编译程序的词法分析过程。

2、根据PASCAL语言的说明语句形式,用手工方法构造一个对说明语句进行词法分析的程序。该程序能对从键盘输入或从文件读入的形如:

“const count=10,sum=81.5,char1=’f’,string1=”hj”, max=169;”

的常量说明串进行处理,分析常量说明串中各常量名、常量类型及常量值,并统计各种类型常量个数。

三、实验要求

1、输入的常量说明串,要求最后以分号作结束标志;

2、根据输入串或读入的文本文件中第一个单词是否为“const”判断输入串或文本文件是否为常量说明内容;

3、识别输入串或打开的文本文件中的常量名。常量名必须是标识符,定义为字母开头,后跟若干个字母,数字或下划线;

4、根据各常量名紧跟等号“=”后面的内容判断常量的类型。其中:字符型常量定义为放在单引号内的一个字符;字符串常量定义为放在双引号内所有内容;整型常量定义为带或不带+、- 号,不以0开头的若干数字的组合;实型常量定义为带或不带+、- 号,不以0开头的若干数字加上小数点再后跟若干数字的组合;

5、统计并输出串或文件中包含的各种类型的常量个数;

6、以二元组(类型,值)的形式输出各常量的类型和值;

7、根据常量说明串置于高级语言源程序中时可能出现的错误情况,模仿高级语言编译器对不同错误情况做出相应处理。

四、运行结果

1、输入如下正确的常量说明串:

const count=10,sum=81.5,char1=‘f’,max=169,str1=“h*54 2..4S!AAsj”, char2=‘@’,str2=“aa!+h”;

输出:

count(integer,10)

sum(float,81.5)

char1(char, ‘f’)

max(integer,169)

str1(string,“h*54  2..4S!AAsj”)

char2(char, ‘@’)

str2(string,“aa!+h”)

int_num=2;  char_num=2; string_num=2; float_num=1.

2、输入类似如下的保留字const错误的常量说明串:

Aconstt count=10,sum=81.5,char1=‘f’;

输出类似下面的错误提示信息:

It is not a constant declaration statement!

Please input a string again!

3、输入类似如下含常量名或常量值错误的常量说明串:

const count=10,12sum=81.5,char1=‘ff’,max=0016;

输出类似下面的错误提示信息:

count(integer,10)

12sum(Wrong! It is not a identifier!)

char1(Wrong! There are  more than one char in ‘’.)

max(Wrong! The integer can’t be started with ‘0’.)

int_num=1;  char_num=0; string_num=0; float_num=0.

4、其他类型的错误处理情况(略)。

五、提示

本实验重点有三个:一是作为常量名的标识符的识别;二是如何根据“=”后出现的内容来判断常量类型;三是对各种错误的处理。难点是对整型和实型常量的判断必须综合考虑多种可能情况。

建议:1、用指针或数组与指针相结合来处理输入的常量说明串;2、对整型和实型常量处理时,重点考虑常数中‘0’的位置。

六、分析与讨论

1、若考虑用E或e的科学计数法来表示整数和实数,应该如何实现?

2、若考虑布尔型常量,且规定其值只能为true或false,应该如何实现?

3、如何对手工构造的词法分析程序做进一步的优化,以提高代码质量和运行效率?

#include<ctype.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define  N 80
#define  M 16

void check_const();
void measure_iden();
void measure_string();
void measure_digit();
void measure_char();

char cha;

int ci=0,cf=0,cc=0,cs=0;

char *p0,*t0,*p1,*t1, *p2,*str,*p3,*t3="const",*digi,*flo;

void main()
{

printf("Please input string: \n");

p0=(char *)malloc(N*sizeof(char));
 p1=(char *)malloc(M*sizeof(char));
 p2=(char *)malloc(M*sizeof(char));
 p3=(char *)malloc(M*sizeof(char));
 
 gets(p0);
 printf("\n");
 check_const();
 
/* 开始处理输入串 p0  */
 while(*(p0)==' '||*(p0)==',')  /*从串p0中取标识符,并将其作为常量名存放到串p1中 */
    {
  p0++;
  if(*(p0)==' '||*(p0)==',')
   continue;
  else
  {
  measure_iden();      //*p0=="="
  if(!isdigit(*p0)&&*p0!='\"'&&*p0!='\'')//注意'和"做字符表示时用\'和\"
  {
   system("cls");
   printf("\n Const data is wrong . Exit !");
   exit(0);
     }
  else if(*p0=='\"')   /* 处理字符串常量 */
  { 
   p0++;
   measure_string();
  }
  else if(isdigit(*p0))  /* 处理数字 */
  {
   measure_digit();
  }
  else if(*p0=='\'') //处理字符常量
  {
   p0++;
   measure_char();
  }
 }
 }
 if(*p0!=';')
 {
  system("cls");
  printf("\n This centence is wrong . Exit !");
  exit(0);
 }
 else
 {
  printf("int_num=%d;  char_num=%d; string_num=%d; float_num=%d.\n",ci,cc,cs,cf);
 }
}

/*    检查输入串是否以"'const"开头   */
void check_const()
{
 while(*p0!=' ') 
 {
  if(*p0==*t3)
  {
   p0++;
   t3++;
  }
  else
  {
   printf("This string isn't a const declaration!");
   exit(0);
  }
 }
}

void measure_iden()
{
 if (*p0!='_'&&(!isalpha(*p0)))
 {
  system("cls");
  printf("\n Const name is wrong . Exit !");
  exit(0);
    }
 else if (*p0=='_'||isalpha(*p0))
 {
  t1=p1;
  while(*p0!='=')
  {
   *p1=*p0;
   p0++;
   p1++;
  }
  *p1='\0';
//  printf("%s\n",p0);
  p0++;
 }
 printf("%s",t1);
}

void measure_string()
{
 str=p2; 
 while(*(p0)!='\"')
 {
  *p2=*p0;
  if(*(p0)==';')//丢了个分号,直接输出String  data is wrong. Exit
  {
   system("cls");
   printf("\n String  data is wrong. Exit !");
   exit(0);
  }
  p0++;
  p2++;
 }
 *p2='\0';
 p0++;
 cs++;
 printf("(string,\"%s\")\n",str);
}

void measure_digit()
{
 char *jud;
 int mark=0;
 jud=p0;
   
 for(;*(jud)!=','&&*(jud)!=';';jud++)
 {
  if(*jud=='.')
  {
   mark=1;
   break;
  }
 }
 if(mark==0)
 {
  digi=p2;
  while(*p0!=','&&*p0!=';')
  {

*p2=*p0;
   p0++;
   p2++;
  }
  *p2='\0';
  ci++;
  printf("(integer,%s)\n",digi);
 }
 if(mark==1)
 {
  flo=p2;
  while(*p0!=','&&*p0!=';')
  {
   *p2=*p0;
   p0++;
   p2++;
  }
  *p2='\0';
  cf++;
  printf("(float,%s)\n",flo);
 }
}

void measure_char()
{
 char *jud;
 jud=p0;
 if(*(jud+1)=='\''&&*(jud)!='\'')
 {
  cha=*p0;
  p0=p0+2;
  cc++;
 }
 else
 {
  system("cls");
  printf("\n char data is wrong. Exit !");
  exit(0);
 }
 printf("(char,'%c')\n",cha);
}

实验一  简单词法分析程序设计相关推荐

  1. 实验13 简单FTP 程序设计

    实验13简单FTP 程序设计 实验目的:设计一个简单的FTP 客户端,支持用户登录,浏览目录列表,上传 文件和下载文件的功能. 实验内容: 程序的伪代码如下: (假定FTP 用户名为user_name ...

  2. 编译原理实验一:词法分析程序设计与实现

    一.实验内容 假定一种高级程序设计语言中的单词主要包括关键字begin.end.if.else.switch.case:标识符:整型常数:实型常数:六种关系运算符:一个赋值符和四个算术运算符,试构造能 ...

  3. 编译原理实验代码c语言,编译原理实验 简单词法分析(含源代码和实验结果)

    可直接运行 原创!! 附录一 实验报告样式 <编译原理>实验报告 实验2 简单词法分析 姓名 陈婷婷 学号 1009050121 班级 计科1001班 时间: 2012/4/5 地点:文波 ...

  4. C语言程序设计实验14,C语言程序设计——实验.doc

    实验一:VC++集成环境及C程序的运行.调试方法 一.实验目的 了解VC++6.0集成环境: 掌握使用VC++6.0编写程序及运行和调试的方法: 二.实验环境 硬件环境:PC:软件环境:VC++6.0 ...

  5. c语言词法分析程序实验报告,实验一词法分析程序设计与实现

    实验一 词法分析程序设计与实现 一.实验目的: 加深对词法分析器的工作过程的理解:加强对词法分析方法的掌握:能够采用一种编程语言实现简单的词法分析程序:能够使用自己编写的分析程序对简单的程序段进行词法 ...

  6. 广州软件学院C语言——实验3 最简单C程序设计1

    实验3 最简单C程序设计1 一.实验目的: 理解算法的特性: 掌握用传统流程图表示算法的方法: 掌握结构化程序设计方法 二.实验内容 一.单选题 1.下列数据中属于"字符串常量"的 ...

  7. 编译原理词法分析程序设计

    编译原理词法分析程序设计 1.   课程设计目的: 结合讲授内容,设计与实现一个简单词法分析器,通过设计编制调试一个具体的词法分析程序,加深对词法分析程序的功能及实现方法的理解.并掌握在对程序设计语言 ...

  8. 2018-2019-1 20165318 20165322 20165326 实验四 外设驱动程序设计

    实验四 外设驱动程序设计 实验内容 任务一 任务二 问题及解决方法 参考链接 实验内容 任务一 学习资源中全课中的"hqyj.嵌入式Linux应用程序开发标准教程.pdf"中的第十 ...

  9. c#语言程序设计上机实验,《C#语言程序设计》实 验 报 告

    <<C#语言程序设计>实 验 报 告>由会员分享,可在线阅读,更多相关<<C#语言程序设计>实 验 报 告(20页珍藏版)>请在人人文库网上搜索. 1. ...

最新文章

  1. 2018会考计算机成绩查询入口,2018年山东会考成绩查询时间及入口
  2. 使用crontab自动化调度jupyter notebook定时运行
  3. JZOJ 3.25 1419——【汕头市选2012初中组】排序(sort)
  4. session无法传值解决方案!
  5. 智能电源分配PDU应用
  6. Spring boot配置类
  7. leetcode 1008. Construct Binary Search Tree from Preorder Traversal | 1008. 前序遍历构造二叉搜索树(Java)
  8. SX1301吞吐量是SX1276/8的多少倍?
  9. IDC报告:阿里云领跑中国数据库市场年度份额首超传统厂商
  10. VS2010项目的部署与安装
  11. bzoj4514 [Sdoi2016]数字配对 费用流
  12. Android项目运行junit测试类时出现错误Internal Error (classFileParser.cpp:3494)的解决办法...
  13. javascript面向对象技术基础
  14. smarty编译,缓存原理
  15. 车辆维修管理系统mysql_数据库课设计 汽车修理管理系统.doc
  16. 坐标转换-大地转高斯平面平面坐标转换
  17. 虚拟机xfs文件系统因根分区爆满损坏修复
  18. 深度学习——激活函数(激励函数)理论学习
  19. xss.haozi.me弹窗练习0x00-0x10
  20. 微信热修复框架Tinker集成和使用,爬了很多坑后。带你成功跑通项目!

热门文章

  1. python替代技术,Python超级方法和调用替代品
  2. vue 滚动条_轻量级 React.js 虚拟美化滚动条组件RScroll
  3. h3c 路由器 刷第三方固件_图文版*许迎果 第201期 双11路由器型号推荐之刷机路由篇...
  4. idea装python插件_学习idea2020手动安装python插件的实现方法
  5. python中迭代器和生成器的区别
  6. 重新实践《轻量级DJANGO》这本书
  7. 第四章 分治策略 4.1 最大子数组问题 (暴力求解算法)
  8. 修改python默认的编码方式
  9. 京东商城确认购买jingdong.com域名
  10. iOS之深入解析WKWebView的WebKit源码调试与分析