一.前言

某属于在校大学生,几天前老师布置了一个编译原理作业,将词法分析–部分实现,头疼,众所周之,编译原理是计算机专业中最令人头疼的课程,听懂已经很不容易了,TMD让我用C语言实现 ,头大。经过几个小时写了一个大概,已经完成了老师的初步要求。废话不多说。直接干!!

二.要求及内容

一、授课内容:
(一) 授课科目:编译原理
(二) 授课内容:实验一 词法分析
(三) 授课类型:实 验
(四) 授课时间:4学时(计划)
二、教学目的要求:
1.目的:通过设计、编制、调试一个具体的词法分析程序加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
2.要求:
(1)选择在国际国内有代表性的高级程序设计语言的源程序作为词法分析对象。
(2)根据数学要求和学生具体情况,从上列语言之一中选取一个适当大小的子集,可以选取一类典型单词,也可以尽可能使各种类型的单词都能兼顾到。
三、教学设想:
1.教学方法设想:先以例子讲解,然后学生动手实验,实验为主。
2.教具运用设想:多媒体。
四、教学过程:
1. 题目 试用直接分析方法编制C语言子集的词法分析程序。其BNF定义如下:
〈PASCAL子集程序〉::=〈变量说明〉BEGIN〈语句表〉ENG。
〈变量说明〉::=〈空〉| VAR〈变量表〉:〈类型〉
〈变量表〉::=〈变量〉|〈变量表〉,〈变量〉
〈类型〉::=〈标识符〉
〈语句表〉::=〈语句〉|〈语句表〉〈语句〉
〈语句〉::=〈赋值语句〉|〈条件语句〉|〈WHILE语句〉|〈复合语句〉|〈过程定义〉
〈赋值语句〉::=〈变量〉::=〈算术表达式〉
〈条件语句〉::=〈IF〉〈布尔表达式〉THEN〈语句〉ELSE〈语句〉
〈WHILE语句〉::=WHILE〈布尔表达式〉DO〈语句〉
〈复合语句〉::=BEGIN〈语句表〉END
〈过程定义〉::=PROCEDURE〈标识符〉〈参数表〉BEGIN〈语句表〉END
〈参数表〉::=〈空〉|(〈标识符表〉)
〈标识符表〉::=〈标识符〉|〈标识符表〉,〈标识符〉
〈算术表达式〉::=〈项〉|〈算术表达式〉+〈项〉
〈项〉::=〈初等量〉|〈项〉*〈初等量〉
〈初等量〉::=〈无符号数〉|〈变量〉|(〈算术表达式〉)
〈布尔表达式〉::=〈算术表达式〉〈关系符〉〈算术表达式〉
〈变量〉::=〈标识符〉
〈标识符〉::=〈字母〉|〈标识符〉〈字母〉|〈标识符〉〈数字〉
〈无符号数〉::=〈数字〉|〈无符号数〉〈数字〉
〈关系符〉::=〈 = |〈 〉| 〉
〈字母〉::=A | B| C| D| E | F| G | H | I | J | K | L| M | N | O | P|Q | R |S | T| U| V| W| X| Y| Z
〈数字〉::=0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
〈空〉::=
词法分析是编译程序的第一个处理阶段。这里所谓直接分析方法,即自左至右扫描源程序,一旦发现有独立意义的字符串时,立即将其改造成长度统一的最小语法单位,同时查填各类单词表格并做一些语法检查,为以后的语法分析提供方便。
具体的处理过程是,在扫描字符串时,一旦识别出关键字(K)、标识符(I)、常数(C)和界符(P)中之一,即以单词形式(剔去多余的空白符)输出。每次调用词法分析程序,它均能自动继续扫描下去,形成下一个单词,直至整个源程序全部扫描完毕,习惯年成相应的单词串。
各类单词均有相同的结构和长度。每个单词由两部分组成: (t, i)
其中t表示单词种类。共分四类,即K类、I类、C类和P类。每类对应一种表格,分别存放该类各个不同的单词。I为指向该类表格一个特定项目的指针。因此,(t, i)唯一地确定了一个单词。
K,P两种表格的内容取决于所选语言的子集,而I,C两种表格则是根据临时输入的源程序字符串形成的。
2.算法 词法分析程序在扫描过程中,依次从源程序驱除源字符,并根据第一个字符(有时还需多读一个字符)判断属于K,I,C,P中的哪一类单词,确定单词的t和i 。在词法分析过程中,K、P两表是固定不变的(由语言来确定),源程序字符串只能从其中选取。I、C两表是在分析过程中不断形成的。其词法分析的算法如图2-7-2所示。
为了防止实习良过大,达不到实习的目的,实习时采用的数据结构在不同程度上均应作适当的简化,所选的关键字(K)和界符表(P)
如表2-7-1和表2-7-2所示

关键字表包括九个代表性的关键字。界符表包括关系运算符三种(其中小于等于和不等于均系由两个字符组成的符合字符),算术运算符和分隔符各两种,圆括号一对,加上赋值号共十一种。这两个表的内容表明,PASCAL语言的赋值语句、条件语句、WHILE型循环语句、复合语句过程及变量说明均可作为源程序例子输入给词法分析程序。标识符表中的每一项包含一个标识符。常数表中的每一项包含一个整常数。后两表都是在词法分析过程中产生的。
三.说明
本程序是对C语言进行词法分析,对老师的要求进行了改编
ci 常数表
k 关键字表
id 标识符表
p 界符表
实现功能(在基本功能之上):
1.可以分析小数
2.可以循环
3. 可以识别标识符
附图:


四.实现

#include <stdio.h>
#include<math.h>
#define keylen 10
#define identlen 10
#include<stdlib.h>
typedef struct {char ty;int point;
} outreco;
char flag_a;
int flag=1;//标志位,1为继续,0为不继续
int cip=0,ip=0,pint=0,i,j,l,m,errors=0;
char char1;
double ci[10]={0,0,0,0,0,0,0,0,0,0};
char k[10][10]={"begin","while","for","if","else","long","case","do","main","int"},id[10][10]={""},token[10]={' '},instring[80];
char p[11][3]={"<=","<>","<","(","*","==","=","+",")",";",","};
outreco outtoken;
void GetChar()
{char1=instring[pint];pint++;
}void error()
{errors=1;printf("error!\n");system("PAUSE");// pint++;
}void lexical()//词法分析 {double num;int l,m=0,_num,b,i,len=0;for(i=0;i<identlen;i++) token[i]='\0';errors=0;GetChar();while(char1==' ') GetChar(); //过滤空格
if(char1>='a'&&char1<='z'||char1>='A'&&char1<='Z'||char1=='_')
{while(char1>='a'&&char1<='z'||char1>='0'&&char1<='9'||char1>='A'&&char1<='Z'||char1=='_'){if(m<identlen){token[m]=char1;m++;}GetChar();}   //end of whilepint--;l=0;b=0;while(l<keylen && !b)//属于关键字情况 {b=1;i=0;while(i<identlen && b)if( k[l][i]==token[i]) i++;else b=0;if(!b) l++;}  //end of whileif(l<keylen){outtoken.ty='k';outtoken.point=l+1;}else  //属于标识符的情况{l=0;b=0;while(l<ip && !b){b=1;i=0;while(i<identlen && b)if( id[l][i]==token[i]) i++;else b=0;if(!b) l++;}  //end of whileif(l<ip){outtoken.ty='i';outtoken.point=l+1;}else if(l>=ip)//标识符表中没有此标识符 {for(m=0;m<identlen;m++)id[ip][m]=token[m];ip=ip+1;outtoken.ty='i';outtoken.point=l+1;}}}  //end of if characterelse if(char1 >='0'&&char1<='9'||char1=='.'){num=0;_num=0;//存放小数部分 while(char1 >='0'&&char1<='9'){num=num*10+char1-'0';        //整数 token[m++]=char1;GetChar();}if(char1=='.'){GetChar();while(char1 >='0'&&char1<='9'){_num=_num*10+char1-'0';        //小数部分 len++;token[m++]='.';token[m++]=char1;GetChar();}pint--;num=num+_num/(pow(10,len));}l=-1;do{l++;}while(l<cip && num!=ci[l]);if(l==cip)  //识别出一个新的数{ci[l]=num;cip++;}outtoken.ty='c';outtoken.point=l+1;}  //识别实数的过程结束else if( char1=='<'||char1=='('||char1=='*'||char1=='='||char1=='+'||char1==')'||char1==';'||char1==','){outtoken.ty='p';token[m++]=char1;switch(char1){case '<':GetChar();if(char1!='='&&char1!='>'){           outtoken.point=3;pint--;}else {if(char1=='=') outtoken.point=1;else  outtoken.point=2 ;token[m++]=char1;}break;case '(':outtoken.point=4;break;case '*':outtoken.point=5;break;case '=':GetChar();if(char1=='='){    token[m++]=char1;outtoken.point=6;}else{outtoken.point=7;pint--;}break;case '+':outtoken.point=8;break;case ')':outtoken.point=9;break;case ';':outtoken.point=10;break;case ',':outtoken.point=11;break;}//end of switch} //end of if pelse  error();} // end of lexicalvoid main(){//int i;ip=0;cip=0;pint=0;printf("\t******************按@键退出*********************************\n");
printf("\tK:");
for(i=0;i<10;i++)printf("%6s",k[i]);
printf("\n");
printf("\t**************************************************************\n");
printf("\tP:");
for(i=0;i<11;i++)printf("%5s",p[i]);
printf("\n");
printf("\t**************************************************************\n");
printf("source, input!\n");//scanf("%s",instring);gets(instring);
//          pint=0;
//          if(instring[pint]=='@'){//              break;
//           }do{lexical();if(!errors){printf("(%c,%2d)\n",outtoken.ty,outtoken.point);//以二元组的形式输出单词printf("识别的单词为:%s\n",token);}}while(instring[pint]!='\0');system("PAUSE");while(1){//ip=-1;//cip=0;//pint=0;
//          printf("continue?y/n:\n");
//          scanf("%c",&flag_a);
//          getchar();
//          if(flag_a=='y')
//          {//              flag=1;
//          }
//          else
//          {//              flag=0;
//              break;
//          } system("CLS");printf("\t******************按@键退出*********************************\n");printf("\tK:"); for(i=0;i<10;i++)printf("%6s",k[i]);printf("\n");   printf("\t**************************************************************\n");printf("\tP:"); for(i=0;i<11;i++)printf("%5s",p[i]);printf("\n");   printf("\t**************************************************************\n");printf("\ti:"); for(i=0;i<10;i++)printf("%6s",id[i]);printf("\n");   printf("\t**************************************************************\n");printf("\tC:"); for(i=0;i<cip;i++)printf("%6g",ci[i]);printf("\n");   printf("\t**************************************************************\n");printf("source, input!\n");//scanf("%s",instring);for(i=0;i<80;i++) instring[i]='\0';//fflush(stdin);//清除缓存区让gets可以读取键盘输入的数据 gets(instring);pint=0;if(instring[pint]=='@'){break;}do{lexical();if(!errors){printf("(%c,%2d)\n",outtoken.ty,outtoken.point);//以二元组的形式输出单词printf("识别的单词为:%s\n",token);}}while(instring[pint]!='\0');system("PAUSE");}}

编译原理中词法分析--部分实现相关推荐

  1. 编译原理中词法分析的递归下降分析法实例--能被5整除的二进制数---c语言实现

    一.前言 又到了一周一度的编译原理实验课,一次实验课上完了,又是大学生必备技能-写实验报告.行了,废话不多说,我直接展现,如何实现编译原理中词法分析的递归下降分析法实例–能被5整除的二进制数的思路.作 ...

  2. 编译原理画出c语言中注释的转化图,编译原理节词法分析DFANFA及其转换.ppt

    编译原理节词法分析DFANFA及其转换 Step4 寻找可合并状态 ε ε 0 1 2 0 5 0 1 6 1 3 4 7 ε ε 0 8 9 1 1 0 10 11 0 0 1 1 1 0 12 1 ...

  3. 编译原理 C-Minus词法分析(FLEX)

    C–源代码词法分析 文章目录 C--源代码词法分析 一.实现目标 二.C-Minus语法 三.Flex Flex简介 Flex正则表达式 Flex安装与使用 Flex文件编写 定义 规则 用户代码 四 ...

  4. 编译原理——java 词法分析【有穷自动机实现】

    编译原理--实验1 实验要求 1) 基于词法规则设计词法分析器(20分) 画出确定的有穷自动机(确定化),并提供必要的文字说明.提交状态转换图.doc 2) 词法分析程序的编程实现(80分) (1) ...

  5. 【编译原理】词法分析程序设计(lex)

    编译原理与技术实验一 实验目的: 掌握词法分析程序的设计与实现方法 掌握词法分析的工作内容 实验环境: (1)VMware Workstation 15 Player 虚拟机 (2)Ubuntu 18 ...

  6. 编译原理3 - 词法分析

    目录 正则表达式 (Regular Expression, RE) 正则表达式的定义 正则定义 有穷自动机 (Finite Automata, FA) 概念 FA模型 FA的表示 匹配原则 有穷自动机 ...

  7. 编译原理:词法分析概述

    //放暑假了,大三了.开学就要学编译原理.微机原理.操作系统三门大课qnq //true true beginning 词法分析概述 首先搞清楚词法分析在编译程序中的位置以及作用: 源程序 经过词法分 ...

  8. [编译原理学习]词法分析

    此前一直没能系统完整地学过编译原理,只有很粗浅的理解,虽然其实对工作里的任务也没啥影响,但总觉得缺了一大块知识,加上对所谓程序员三大浪漫(编译器,操作系统,图形学)的向往,所以最近跟着网易云课堂推出的 ...

  9. 编译原理中中间代码生成---C语言实现

    一.前言 今天有点累,就不想废话了.直接进入正题吧.(新增)第二次实验课还是这个内容,不过新增了一个功能和再处理了一下其他bug. 二.内容 一.授课内容: (一) 授课科目:编译原理 (二) 授课内 ...

最新文章

  1. 企业Shell实战-MySQL分库分表备份脚本
  2. Android 绿豆通讯录【 SQLite数据库(增删改查、展示数据) + ListView数据展示控件(展示所有数据) 】
  3. ubuntu 12.04解决Broadcom STA无线网卡驱动安装失败解决
  4. PyTorch基础-Adam优化器使用-06
  5. 8idmp导入oracle 11g,11g导入8i的dmp文件问题
  6. nginx,excel模板下载
  7. 每天学一点flash(14) as3.0 处理xml (官方)
  8. 华为云大数据存储的冗余方式是三副本_华为TaurusDB技术解读(转载)
  9. python netifaces模块 获取本机IP,网关等信息
  10. ajax success function_【java 基础】java-回调函数(结合jquery.ajax)
  11. A星寻路算法(A* Search Algorithm)
  12. python多线程执行_一个Python多线程运行实例
  13. 【2019杭电多校第五场1007=HDU6630】permutation 2(打表找规律+分情况讨论)
  14. 图解设计模式:行为型模式之责任链模式
  15. android httpclient post 参数,Android HttpClient GET或者POST请求基本使用方法
  16. 前端数据可视化之使用 canvas、svg、zrender画图
  17. 游戏研发人才学校培养、企业需求与个人快速成长,华科校友分享了这些实用观点
  18. Skyscrapers (easy version)
  19. 前有刘德华,后有腾格尔和光头李进,明星为何都热衷于线上演唱会
  20. 大屏可视化解决方案:公安大数据平台建设

热门文章

  1. 2,列表渲染指令v-for以及过滤和排序---vue教程
  2. 机器学习笔记六之神经网络的学习
  3. 讨论群问题:Linux 下的批量操作,第2种很赞
  4. 刘小乐教授 - 生物信息学云论坛第三场报告会
  5. 施一公:如何提高英文的科研写作能力
  6. 和在c语言,?和:在C语言中的详解
  7. 伸展树(Splay tree)图解与实现
  8. 第60课 比特超市 《小学生C++趣味编程》
  9. python删除连续相同字符_Python 删除连续出现的指定字符的实例
  10. c语言中行号大小调整,给自己的程序加上行号