编译原理课程设计-词法分析器的设计及实现(C)

合集下载

编译原理课程设计-词法分析器

编译原理课程设计-词法分析器

计算机与信息学院编译原理课程设计实验报告专业班级计算机科学与技术专业08-4班学生姓名及学号胡义涛20082645课程教学班号0001任课教师王仲宾实验指导教师王仲宾实验地点逸夫楼5072010~2011 第三学年第一学期一、实验目的和要求:设计并实现一个C语言(或C++语言)的词法分析程序,加深对词法分析原理的理解。

二、试验设计和算法分析:实验原理:程序流程:置初值→调用扫描子程序→输出串结束→输出单词二元组→是→否→结束词法分析主程序示意图待分析的简单语言的词法(1) 关键字:begin if then while do end所有关键字都是小写。

(2)运算符和界符::= + - * / < > <= <> >= ; ( ) #(3)空格由空白、制表符和换行符组成。

词法分析程序的算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。

三、源代码:#include "stdio.h"#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;}}}elseif(isdigit(ch)) //ch是数字字符{while(isdigit(ch)) //ch是数字字符{sum=sum*10+ch-'0';ch=prog[p++];}ch=prog[p--];syn=11;}elseswitch(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'10':syn=12;token[0]='n';break;case'11':syn=12;token[0]='n';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(){printf("\n\n对应信息:\n""1.1-6为关键字\n""2.10-11为字符或常量\n""3.12-28为表示符\n");p=0;printf("\nplease 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();}四、实验结果及总结:输出:总结:通过该实验,主要有以下几方面收获:一、对实验原理有更深的理解。

编译原理中的词法分析器设计

编译原理中的词法分析器设计

编译原理中的词法分析器设计编译原理是计算机科学中的一门重要学科,其研究的主要方向是将高级语言转化为计算机能够执行的指令。

编译器是实现这种转化的程序,其中的词法分析器是编译器的核心组成部分之一。

本文将讨论词法分析器的设计。

概述词法分析器是编译器中的第一个阶段,它的主要任务是将输入的字符序列转化为有意义的单词序列(记号)。

单词序列是语法分析器后继处理的输入,因此词法分析器的正确性对于编译器的正确性至关重要。

词法分析器一般采用有限状态自动机(Finite State Automaton,FSA)作为基本的表示和实现模型。

有限状态自动机是一种对于有限的输入序列作出有限反应的计算模型,其在自然语言处理、文本解析、数据库搜索等领域都有广泛应用。

设计过程书写正规表达式词法分析器设计过程的第一步是书写正规表达式。

正规表达式是一种描述字符串模式的方式,它由字母表中的字符和元字符(用于表示特定语义)组成。

例如,用于匹配任意非负整数的正规表达式为``\d+'',其中``\d''表示数字字符,``+''表示前面字符的1次或多次重复。

正规表达式描述的语言可以通过正则语言的原理实现成有限状态自动机。

有限状态自动机可以由确定性有限状态自动机(Deterministic Finite Automaton,DFA)和非确定性有限状态自动机(Nondeterministic Finite Automaton,NFA)来实现。

DFA是状态转移函数为完全定义的FSA,也就是说,对于任何状态和输入字符,DFA都能确定一个下一状态;NFA是状态转移函数可能不完全定义的FSA。

从正规表达式到FSA将正规表达式转化为FSA是词法分析器设计中的一项重要工作。

具体实现中,可以采用Thompson构造算法或者子集构造算法。

Thompson构造算法是一种将正规表达式直接转化为等价NFA的算法,其基本思想是对正规表达式进行递归分解。

编译原理课程设计—词法分析器

编译原理课程设计—词法分析器

编译原理课程设计(一)——词法分析器1、题目编写程序实现一个简易的词法分析器。

2、实验目的对一段程序代码进行词法分析,将程序段中的关键字、标识符、常数、运算符、界符按照一定的种别编码分析出来。

3、环境及工具操作系统:windows XP ;使用工具:Microsoft Visual C++ 6.0; 编程语言:C 语言;4、分析程序输入:从文件中读入程序段;程序输出:由单词种别和单词符号的属性值组成的二元式;单词种别通常使用整数编码,编码方式可以有多种,在设计词法分析器之前应确定一种程序处理起来较方便的编码方式。

当一个种别中含有多个单词符号时,在分析出其属于哪个种别的时候应同时给出其单词符号属性,本程序为方便起见,采用单词符号本身来作为其属性,以标识同种别种的不同单词符号。

标识符及关键字的识别:字母开头的字母和数字组成的串是多数编程语言的标识符,所以我们的简易词法分析器中,将标识符定义为这种字母数字串。

当第一个字母为字母且紧接着的字符为数字或字母时,应将其串接在一起为一个单词,直到紧跟着的不在是字母数字时。

由于关键字通常为一个单词,则这样得到的串可能是标识符也可能是关键字,又因为一种语言的关键字通常是有限个,则我们可以构造一个存放所有关键字的表,查询关键字表,可以判断得到的串是否为关键字。

界符和运算符的识别:它们多为当个字符,建立两个分别存放界符合运算符的表,读取字符后,进行查表便可以得出它们的类型。

为方便词法分析器的设计,可以使用状态转换图,根据一种特定的编程语言先设计出其状态转换图才能更好将其用代码实现。

典型状态转换图结构如下:(a)有不含回路含分支的状态节点:对应if …else if …else …语句;(b)有含回路的状态节点:对应while …if …语句。

(b )5、状态转换图6、程序框架描述程序中编写了以下函数,各个函数实现的作用如下:1. GetChar():将下一输入的字符读入到全局变量ch中,搜素指示器前移一个字符的位置。

编译原理设计c语言的词法分析器

编译原理设计c语言的词法分析器

编译原理课程设计报告题目:学院:教师:姓名:学号:班级:评分:签字:编译原理课程设计一:设计c语言的词法分析器一、实验目的了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程,加深对词法原理的理解。

二、实验要求了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。

三、实验设计3.1.单词分类及表示3.1.1 C语言的子集分类(1)标识符:以字母开头的字母数字串(2)整数或浮点型。

(3)保留字:for,while,do,else,if,static,int,sizeof,break,continue(4)运算符:+,-,*,/,%,>,<,=,!=,==,<=,>=,!,&,&&,||;(5)界符:"(",")",",",":",";","{","}"3.1.2单词二元组(单词分类号、单词自身值)3.2 词法分析器的设计3.2.1算法设计3.2.1.1概要设计从文件中逐个读取字符,只要这五大类的状态序列则继续读取,否则回退字符,在对应类别进行查找,输出单元二次组至另一文件夹。

3.2.1.2状态图设计3.2.2输入输出设计输入:通过文件指针从文件中一个一个读取字符输出:输出单词二元组至文件。

格式为(种别码,值)3.2.3主要函数void Getchar(FILE *fp ) //读入一个字符void GetBC(FILE *fp)//读入一个非空字符void contacat()//连接字符int letter()//判断是否为字母int digit()//判断是否为字母void retract(FILE *fp,char *c)//回退int reserve (char **k)//处理保留字int sysmbol(identifier *id)//处理标识符,查找符号表并存放位置若没有则添加int constant(constnumber *con)//存入常数表,并返回它在常数表中的位置void Tofile(int num, int val, identifier *id, constnumber *con, FILE *fw)//写到文件void WordAnalyze(char **k,char *c, char **CODE, identifier *id, constnumber *con, FILE *fp, FILE *fw)//词法分析函数四、结果测试文件输入int main(){int a=1,b=3;if(a>1)b=b-2;}输出结果:结论:程序输出结果与期望输出结果相符。

编译原理课程设计-词法语法分析器

编译原理课程设计-词法语法分析器

编译原理课程设计Course Design of Compiling(课程代码3273526)半期题目:词法和语法分析器实验学期:大三第二学期学生班级:2014级软件四班学生学号:2014112218学生姓名:何华均任课教师:丁光耀信息科学和技术学院2017.6课程设计1-C语言词法分析器1.题目C语言词法分析2.内容选一个能正常运行的c语言程序,以该程序出现的字符作为单词符号集,不用处理c语言的所有单词符号。

将分析到的单词符号对应的二元组输出到文件中保存可以将扫描缓冲区和输入缓冲区合成一个缓冲区,一次性输入源程序后就可以进行预处理了 3.设计目的掌握词法分析算法,设计、编制并调试一个词法分析程序,加深对词法分析原理的理解4.设计环境(电脑语言环境) 语言环境:C 语言 CPU:i7HQ6700 内存:8G5.概要设计(单词符号表,状态转换图) 5.1 词法分析器的结构 词法分析程序的功能:输入:所给文法的源程序字符串。

输出:二元组(syn,token 或sum )构成的序列。

词法分析程序可以单独为一个程序;也可以作为整个编译程序的一个子程序,当需要一个单词时,就调用此法分析子程序返回一个单词.为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的全局变量及子程序:1) ch 存放最新读进的源程序字符 2) strToken 存放构成单词符号的字符串 3) Buffer 字符缓冲区4)struct keyType 存放保留字的符号和种别 5.2 待分析的简单词法 (1)保留字break 、case 、char 、const 、int 、do 、while …(2)运算符和界符= 、+、 -、 * 、/、%、,、;、(、)、?、# 5.3 各种单词符号对应的种别码单词符号种别码 单词符号 种别码 ID 0 sizeof 24INT 1static25 auto 2 struct 26 break 3switch27case 4 typedef 28 char 5 union 29 const 6 unsigned 30 continue 7 void31 default 8 volatile 32 do 9 while 33 double 10 = 34 else11+35源程序 输入缓冲区 预处理子程序 扫描缓冲区1 扫描缓冲区2 词法分析子程序返回一个单词 调用 数据enum 12 - 36extern 13 *37float 14 / 38for 15 % 39goto 16 , 40if 17 ; 41int 18 ( 42long 19 ) 43register 20 ? 44return 21 clear 45short 22 # 46signed 23 lettet(letter|digit)*47dight dight* 486.详细设计(数据结构,子程序)算法思想:首先设置3个变量:①strToken用来存放构成单词符号的字符串;②ch用来字符;③struct keyType用来存放单词符号的种别码。

编译原理 实验 词法分析器的设计

编译原理 实验 词法分析器的设计

数学与信息工程学院《编译原理》实验报告二实验名称:词法分析实验室:班级:姓名:学号:词法分析器的设计一、实验目的通过完成词法分析程序,了解词法分析的过程。

编制一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。

并依次输出各个单词的内部编码及单词符号自身值。

二、实验环境操作系统:window xp编写环境:visual c++编写语言:c语言分析语言:c语言三、实验内容对c语言进行简单的词法分析,把输入的字符串形式的源程序分割成一个个单词符号,其词法描述如下:(1)保留字:if、int、for、while、do、return、break、continue (2)标识符:用来表示各种名字,必须以字母,数字和下划线组成,且开头必须为字母或者下划线(3)数字:以0-9组成(4)运算符:+、-、*、/、=、>、<、>=、<=、!=(5)分隔符包括:,、;、{、}、(、)read()函数功能(1)滤空格空格在词法分析时是一种不可缺少的界符,而在语法分析时则是无用的,所以必须过滤(2)识别保留字,标示符主程序定义了一个以字符串为元素的一维数组remain,称保留字表。

对字母或者下划线开头的字母、数字、下划线字符串要查此表。

若查着则识别为保留字,若查不着,则认为是用户定义的标识符(3)识别数字,当扫描到数字串时,将其当做数字输出(4)识别运算符对两个字符组成的算符,如+、-、*、/、=、>、<、>=、<=、!=(5)识别分隔符(6)其他字符四、实验结果要分析的内容如下:程序输入/输出示例:如源程序为C语言。

输入如下一段:main(){int a,b;a = 10;b = a + 20;}要求:1识别保留字:if、int、for、while、do、return、break、continue2其他的都识别为标识符;3常数为无符号整形数;4运算符包括:+、-、*、/、=、>、<、>=、<=、!=5分隔符包括:,、;、{、}、(、)调试分析(实验中遇到的问题总结)调试中发现读入下一个字符后所在位置如果自动加1,当出现不满足条件是,这是已经跳过了那个不满足条件的字符了,所以下面的程序是在各个情况出现是分别处理是否将当前需要判断的位置加1,导致代码里面当前位置加1操作略显多了代码中无法识别一些应该有的符号,如点号和取地址符五、实验小结(心得体会)将保留字存到一个数组中,用一个函数循环顺序查找,可以有效的减少代码量,考虑到改程序只有8个保留字,所以没有使用二分查找,效率影响不大判断是否为数字字母时调用了,ctype.h下的isalpha()和isdigit()函数,方便直接,减少代码量附录:源代码#include <stdio.h>#include <fstream>#include <string.h>#include <ctype.h>int len,locate;int MAXLEN=10;int MAXDIG=9;char str[100];char remain[10][10]={"if","int","for","while","do","return","break","continue"};char getche(){return str[locate];}bool search(char *temp)//是否为保留字{int i;for (i=0;i<8;i++){if(strcmp(remain[i],temp) == 0){printf("%s %d\n",temp,1);return true;}}return false;}void read(){char temp[100];int cnt=0;char ch;while (ch=getche(),ch== ' '||ch==9||ch=='\0')//去除单词前面多余的空格和制表符{if(ch== '\0') return ; //如果读取结束还没有出现有用的字符则返回locate ++;}if(isalpha(ch)) //如果是英文开头的{{temp[cnt++]=ch;locate ++;}while (ch=getche(),isalpha(ch)||isdigit(ch)||ch=='_'); //读入到非字母数字下划线为止temp[cnt] = '\0';if(cnt > MAXLEN) printf("%s is too long\n",temp);else if(!search(temp)){printf("%s %d\n",temp,2);}}else if(isdigit(ch))//如果是数字开头,则必然不是标识符{do{temp[cnt++]=ch;locate ++;}while(ch = getche(),isdigit(ch));temp[cnt] = '\0';if(cnt > MAXDIG) printf("%s is biger than the max number\n",temp);elseprintf("%s %d\n",temp,3);}else if(ch == ',' || ch == ';'||ch == '('||ch==')'||ch=='{'||ch=='}') //如果是分隔符{printf("%c %d\n",ch,5);locate++;}else if(ch == '+'||ch == '-'||ch == '*'||ch == '/'||ch == '='||ch == '>'||ch == '<'||ch == '!')//运算符{temp[cnt++]=ch;if(ch == '+') //判断是否为++{locate++;ch = getche();if(ch == '+'){printf("++ 4\n");}}else if(ch == '-') //判断是否为--locate++;ch = getche();if(ch == '-'){printf("-- 4\n");}}else //否则的话,任意运算符后面都能跟上 ={locate++;ch = getche();if(ch=='=') //判断是否为两个字符构成的运算符{temp[cnt++] = ch;locate ++ ;}temp[cnt] ='\0';if(strcmp(temp,"!")==0)printf("! is error input!\n");elseprintf("%s %d\n",temp,4);}}else{printf("%c is error input!\n",ch);locate++;}}int main (){//freopen("d:\\datain.txt","r",stdin);//freopen("d:\\dataout.txt","w",stdout);int linecnt=0;while (gets(str)){printf("第%d行\n",++linecnt);len=strlen(str);locate = 0;while (locate < len){read();}}return 0; }。

编译原理课程设计-词法分析器的设计与实现

编译原理课程设计-词法分析器的设计与实现

课程设计(论文)任务书软件学院学院软件测试专业 2 班一、课程设计(论文)题目词法分析器的设计与实现二、课程设计(论文)工作自2014 年 6 月16 日起至2014 年6 月 21 日止。

三、课程设计(论文) 地点: 软件学院实训中心四、课程设计(论文)内容要求:1.本课程设计的目的进一步培养学生编译器设计的思想,加深对编译原理和应用程序的理解,针对编译过程的重点和难点内容进行编程,独立完成有一定工作量的程序设计任务,同时,强调好的程序设计风格,并综合使用程序设计语言、数据结构和编译原理的知识, 熟悉使用开发工具VC /JA V A/C#/.NET 。

2.课程设计的任务及要求1)课程设计任务:词法分析器的设计词法分析器的实现扫描器的设计与实现2)创新要求:在到达基本要求后,可进行创新要求。

3)课程设计论文编写要求(1)课程设计任务及要求(2)设计思路--工作原理、功能规划(3)详细设计---数据分析、算法思路、功能实现(含程序流程图、主要代码及注释)、界面等。

(4)运行调试与分析讨论---给出运行屏幕截图,分析运行结果,有何改进想法等。

(5)设计体会与小结---设计遇到的问题及解决办法,通过设计学到了哪些新知识,巩固了哪些知识,有哪些提高。

(6)报告按规定排版打印,要求装订平整,否则要求返工;(7)课设报告的装订顺序如下:封面---任务书---中文摘要---目录----正文---附录(代码及相关图片)(8)严禁抄袭,如有发现,按不及格处理。

4)课程设计评分标准:(1)学习态度:20分;(2)系统设计:20分;(3)编程调试:20分;(4)回答问题:20分;(5)论文撰写:20分。

5)参考文献:(1)张素琴,吕映芝. 编译原理[M]., 清华大学出版社(2)蒋立源、康慕宁等,编译原理(第2版)[M],西安:西北工业大学出版社6)课程设计进度安排1.准备阶段(4学时):选择设计题目、了解设计目的要求、查阅相关资料2.程序模块设计分析阶段(4学时):程序总体设计、详细设计3.代码编写调试阶段(8学时):程序模块代码编写、调试、测试4.撰写论文阶段(4学时):总结课程设计任务和设计内容,撰写课程设计论文学生签名:2014 年 6 月21 日课程设计(论文)评审意见(1)学习态度(20分):优()、良()、中()、一般()、差();(2)系统设计(20分):优()、良()、中()、一般()、差();(3)编程调试(20分):优()、良()、中()、一般()、差();(4)回答问题(20分):优()、良()、中()、一般()、差();(5)论文撰写(20分):优()、良()、中()、一般()、差();评阅人:职称:副教授2014 年 6 月26 日中文摘要词法分析器的工作是低级别的分析:将字符或者字符序列转化成记号.。

C语言词法分析器和C-语言语法分析器编译原理课程设计

C语言词法分析器和C-语言语法分析器编译原理课程设计

《编译原理课程设计》课程报告题目 C语言词法分析器和C-语言语法分析器学生姓名学生学号指导教师提交报告时间 2019 年 6 月 8 日C语言词法分析器1 实验目的及意义1.熟悉C语言词法2.掌握构造DFA的过程3.掌握利用DFA实现C语言的词法分析器4.理解编译器词法分析的工作原理2 词法特点及正则表达式2.1词法特点2.1.1 保留字AUTO, BREAK , CASE , CHAR , CONST , CONTINUE , DEFAULT , DO , DOUBLE , ELSE,ENUM , EXTERN , FLOAT , FOR , GOTO,IF , INT , LONG , REGISTER , RETURN,SHORT , SIGNED , SIZEOF , STATIC , STRUCT ,SWITCH , TYPEDEF , UNION , UNSIGNED , VOID,VOLATILE , WHILE,2.1.2 符号+ - * / ++ -- += -= *= < <= > >= == != = ; , ( ) [ ] { } /* */ :2.2 正则表达式whitespace = (newline|blank|tab|comment)+digit=0|..|9nat=digit+signedNat=(+|-)?natNUM=signedNat(“.”nat)?letter = a|..|z|A|..|ZID = letter(letter|digit|“_”)+CHAR = 'other+' STRING = “other+”3 Token定义3.2 tokenType类型代码4 DFA设计4.1 注释的DFA设计注释的DFA如下所示,一共分为5个状态,在开始状态1时,如果输入的字符为/, 则进入状态2,此时有可能进入注释状态,如果在状态2时,输入的字符为*,则进入注释状态,状态将转到3,如果在状态3时,输入的字符为*,则有可能结束注释状态,此时状态将转到状态4,如果在状态4时输入的字符为/,则注释状态结束,状态转移到结束状态。

编译原理课程设计报告C语言词法与语法分析器的实现

编译原理课程设计报告C语言词法与语法分析器的实现

编写原理课程设计报告题目:编译原理课程设计C语言词法和语法分析器的实现C-词法和语法分析器的实现1.课程设计目标(1)题目的实用性C语言具有完整语言的基本属性,写C语言的词法分析和语法分析对理解编译原理的相关理论和知识会起到很大的作用。

通过编写C语言词法和语法分析程序,可以对编译原理的相关知识:正则表达式、有限自动机、语法分析等有一个清晰的认识和掌握。

(2)C语言的词法描述①语言的关键词:else if int返回void while的所有关键字都是保留字,必须小写。

②特殊符号:+ - * / < <= > >= == != = ;, ( ) [ ] { } /* */③其他标记是ID和NUM,它们由以下正则表达式定义:ID =字母字母*NUM =数字数字*字母= a|..|z|A|..|Zdigit = 0|..|9注:ID表示标识符,NUM表示数字,letter表示字母,digit表示数字。

小写字母和大写字母是有区别的。

④它由空格、换行符和制表符组成。

空格通常会被忽略。

⑤用常用的C语言符号/*将注释括起来...*/.注释可以放在任何空白位置(也就是注释不能放在标记上),可以多行。

注释不能嵌套。

(3)规划目标能够正确分析程序的词法和语法。

2.分析和设计(1)设计理念a.词汇分析词法分析的实现主要使用有限自动机理论。

有限自动机可以用来描述识别输入字符串中模式的过程,因此也可以用来构造扫描程序。

词法分析器可以很容易地用有限自动机理论来设计。

b.语法分析语法分析采用递归下降分析法。

递归下降法是语法分析中最容易理解的方法。

其主要原理是根据每个非终结符的产生式结构为其构造相应的解析子程序,其中终结符生成匹配命令,非终结符生成过程调用命令。

这种方法被称为递归子例程下降法或递归下降法,因为语法递归的相应子例程也是递归的。

子程序的结构与产生式的结构几乎相同。

(2)程序流程图主程序流程图:词法分析:语法分析:词汇分析子流程图:语法分析子流程图:3.程序代码实现整个词法与语法程序设计在同一个项目中,包含八个文件,分别是main.cpp、parse.cpp、scan.cpp、util.cpp、scan.h、util.h、globals.h和parse.h,其中scan.cpp和scan.h是词法分析程序。

编译原理实验--词法分析器

编译原理实验--词法分析器

实验一词法分析器设计【实验目的】1.熟悉词法分析的基本原理,词法分析的过程以及词法分析中要注意的问题。

2.复习高级语言,进一步加强用高级语言来解决实际问题的能力。

3.通过完成词法分析程序,了解词法分析的过程。

【实验内容】用C语言编写一个PL/0词法分析器,为语法语义分析提供单词,使之能把输入的字符串形式的源程序分割成一个个单词符号传递给语法语义分析,并把分析结果(基本字,运算符,标识符,常数以及界符)输出。

【实验流程图】【实验步骤】1.提取pl/0文件中基本字的源代码while((ch=fgetc(stream))!='.'){int k=-1;char a[SIZE];int s=0;while(ch>='a' && ch<='z'||ch>='A' && ch<='Z'){if(ch>='A' && ch<='Z') ch+=32;a[++k]=(char)ch;ch=fgetc(stream);}for(int m=0;m<=12&&k!=-1;m++)for(int n=0;n<=k;n++){if(a[n]==wsym[m][n]) ++s;else s=0;if(s==(strlen(wsym[m]))) {printf("%s\t",wsym[m]);m=14;n=k+1;} }2.提取pl/0文件中标识符的源代码while((ch=fgetc(stream))!='.'){int k=-1;char a[SIZE]=" ";int s=0;while(ch>='a' && ch<='z'||ch>='A' && ch<='Z'){if(ch>='A' && ch<='Z') ch+=32;a[++k]=(char)ch;ch=fgetc(stream);}for(int m=0;m<=12&&k!=-1;m++)for(int n=0;n<=k;n++){if(a[n]==wsym[m][n]) ++s;else s=0;if(s==(strlen(wsym[m]))) {m=14;n=k+1;}}if(m==13) for(m=0;a[m]!=NULL;m++) printf("%c ",a[m]);3.提取pl/0文件中常数的源代码while((ch=fgetc(stream))!='.'){while(ch>='0' && ch<='9'){num=10*num+ch-'0';ch=fgetc(stream);}if(num!=0) printf("%d ",num);num=0;}4.提取pl/0文件中运算符的源代码int ch=fgetc(stream);while(ch!='.'){switch(ch){case'+': printf("+ ");break;case'-': printf("- ");break;case'*': printf("* ");break;case'/': printf("/ ");break;case'>': if(fgetc(stream)=='=')printf(">= "); else printf("> ");break;case'<': if(fgetc(stream)=='=')printf("<= "); else printf("< ");break;case':': printf(":= ");break;case'#': printf("# ");break;case'=': printf("= ");break;default: break;}ch=fgetc(stream);5.提取pl/0文件中界符的源代码int ch=fgetc(stream);while(ch!='.'){switch(ch){case',': printf(", ");break;case';': printf("; ");break;case'(': printf("( ");break;case')': printf(") ");break;default: break;}ch=fgetc(stream);}【实验结果】1.pl/0文件(222.txt)内容const a=10;var b,c;procedure p;beginc:=b+a;end;beginread(b);while b#0 dobegincall p;write(2*c);read(b)endend .2.实验运行结果【实验小结】1.了解程序在运行过程中对词法分析,识别一个个字符并组合成相应的单词,是机器能过明白程序,定义各种关键字,界符。

编译原理词法分析器语法分析课程设计范本

编译原理词法分析器语法分析课程设计范本

《编译原理词法分析器语法分析课程设计-《编译原理》课程设计院系信息科学与技术学院专业软件工程年级级学号 2723姓名林苾湲西南交通大学信息科学与技术学院12月目录课程设计1 词法分析器 (2)设计题目 (2)设计内容 (2)设计目的 (2)设计环境 (2)需求分析 (2)概要设计 (2)详细设计 (4)编程调试 (5)测试 (11)结束语 (13)课程设计2 赋值语句的解释程序设计 (14)设计题目 (14)设计内容 (14)设计目的 (14)设计环境 (14)需求分析 (15)概要设计 (16)详细设计 (16)编程调试 (24)测试 (24)结束语 (25)课程设计一词法分析器设计一、设计题目手工设计c语言的词法分析器(能够是c语言的子集)。

二、设计内容处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。

三、设计目的了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。

四、设计环境该课程设计包括的硬件和软件条件如下:.硬件(1)Intel Core Duo CPU P8700(2)内存4G.软件(1)Window 7 32位操作系统(2)Microsoft Visual Studio c#开发平台.编程语言C#语言五、需求分析.源程序的预处理:源程序中,存在许多编辑用的符号,她们对程序逻辑功能无任何影响。

例如:回车,换行,多余空白符,注释行等。

在词法分析之前,首先要先剔除掉这些符号,使得词法分析更为简单。

.单词符号的识别并判断单词的合法性:将每个单词符号进行不同类别的划分。

单词符号能够划分成5中。

(1)标识符:用户自己定义的名字,常量名,变量名和过程名。

(2)常数:各种类型的常数。

(3) 保留字(关键字):如if、else、while、int、float 等。

(4) 运算符:如+、-、*、<、>、=等。

编译原理课程设计-词法分析器和语法分析器

编译原理课程设计-词法分析器和语法分析器

编译原理课程设计报告院系专业年级学号姓名2013年12月 8日课程设计一:手工设计C语言的词法分析器一、设计内容手工设计c语言的词法分析器,结合状态转换图的原理完成对c语言源程序的基本单词的分析及提取,并设计相应的数据结构保存提取出来的单词。

以及对c语言中的保留字的处理策略,实现一个完整的C语言的词法分析器的编写。

二、设计目的通过本实验的设计更具体的理解词法分析器的工作机制。

同时更理解C语言的结构体系。

从而更深刻的透析编译原理过程。

三、设计平台1、硬件环境(1)Intel(R) Core(TM) i3-2310M CPU @2.10GHz 2.10GHz(2)内存4G2、软件环境(1)Window8 Professor(2)Visual C++6.0开发软件3、开发语言:C语言。

四、需求分析:词法分析程序又称词法分析器或词法扫描器。

可以单独为一个程序;也可以作为整个编译程序的一个子程序,当需要一个单词时,就调用此法分析子程序返回一个单词,这里,作为子程序词法分析器的结构:状态转换图的程序实现为便于程序实现,假设每个单词间都有界符或运算符或空格隔开,并引入下面的全局变量及子程序:1) ch 存放最新读进的源程序字符2) strToken存放构成单词符号的字符串3)Buffer 字符缓冲区4)struct keyType存放保留字的符号和种别五、概要设计保留字表的设计结构:基本功能状态转换:六、详细设计1.GETCHAR 读一个字符到 ch中2.GETBC 读一个非空白字符到ch中3.CONCAT 把CHAR 中字符连接到strToken 之后4.LETTER 判断CHAR 中字符是否为字母5.DIGIT 判断ch中字符是否为数字6.RESERVE 用strToken中的字符串查找保留字表,并返回保留字种别码,若返回零,则非保留字7.RETRACT 把CHAR 中字符回送到缓冲区源程序:#include "stdio.h"#include "stdlib.h"#include "conio.h"#include "string.h"#define N 47 //保留字个数char ch='\0'; //存放最新读进的源程序字符char strToken[20]="\0"; //存放构成单词符号的字符串char buffer[257]="\0"; //字符缓冲区/*------------保留字结构-------------*/struct keyType{char keyname[256];int value;}Key[N]={{"$ID",0},{"$INT",1},{"auto",2},{"break",3},{"case",4},{"char",5},{"const",6},{"continue",7},{"default",8},{"do",9},{"double",10},{"else",11},{"enum",12},{"extern",13},{"float",14},{"for",15},{"goto",16},{"if",17},{"int",18},{"long",19},{"register",20},{"return",21},{"short",22},{"signed",23},{"sizeof",24},{"static",25},{"struct",26},{"switch",27},{"typedef",28},{"union",29},{"unsigned",30},{"void",31},{"volatile",32},{"while",33},{"=",34},{"+",35},{"-",36},{"*",37},{"/",38},{"%",39},{",",40},{";",41},{"(",42},{")",43},{"?",44},{"clear",45},{"#",46}};/*-------------子过程-------------*/void GetChar() //读一个字符到ch中{ int i;if(strlen(buffer)>0){ch=buffer[0];for(i=0;i<256;i++)buffer[i]=buffer[i+1];}elsech='\0';}void GetBC() //读一个非空白字符到ch中{ int i;while(strlen(buffer)){i=0;ch=buffer[i];for(;i<256;i++)buffer[i]=buffer[i+1];if(ch!=' '&&ch!='\n'&&ch!='\0') break;}}void ConCat() //把ch连接到strToken之后{ char temp[2];temp[0]=ch;temp[1]='\0';strcat(strToken,temp);}bool Letter() //判断ch是否为字母{ if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z')return true;elsereturn false;}bool Digit() //判断ch是否为数字{ if(ch>='0'&&ch<='9')return true;elsereturn false;}int Reserve() //用strToken中的字符查找保留字表,并返回保留字种别码,若返回0,则非保留字{ int i;for(i=0;i<N;i++)if(strcmp(strToken,Key[i].keyname)==0)return Key[i].value;return 0;}void Retract() //把ch中的字符回送到缓冲区{ int i;if(ch!='\0') {buffer[256]='\0';for(i=255;i>0;i--)buffer[i]=buffer[i-1];buffer[0]=ch;}ch='\0';}/*----------词法分析器------------*/keyType ReturnWord(){ strcpy(strToken,"\0");int c;keyType tempkey;GetBC();if(ch>='A'&&ch<='Z'||ch>='a'&&ch<='z') {。

编译原理课程设计-词法分析器的设计及实现(C)

编译原理课程设计-词法分析器的设计及实现(C)

词法分析器的设计一.设计说明及设计要求一般来说,编译程序的整个过程可以划分为五个阶段:词法分析、语法分析、中间代码生成、优化和目标代码生成。

本课程设计即为词法分析阶段。

词法分析阶段是编译过程的第一个阶段。

这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。

如保留字(关键字或基本字)、标志符、常数、算符和界符等等。

二.设计中相关关键字说明1.基本字:也称关键字,如C语言中的if , else , while , do ,for,case,break, return 等。

2.标志符:用来表示各种名字,如常量名、变量名和过程名等。

3.常数:各种类型的常数,如12,6.88,和“ABC”等。

4.运算符:如+ ,- , * , / ,%, < , > ,<= , >= 等。

5.界符,如逗点,冒号,分号,括号,# ,〈〈,〉〉等。

三、程序分析词法分析是编译的第一个阶段,它的主要任务是从左到右逐个字符地对源程序进行扫描,产生一个个单词序列,用以语法分析。

词法分析工作可以是独立的一遍,把字符流的源程序变为单词序列,输出在一个中间文件上,这个文件做为语法分析程序的输入而继续编译过程。

然而,更一般的情况,常将词法分析程序设计成一个子程序,每当语法分析程序需要一个单词时,则调用该子程序。

词法分析程序每得到一次调用,便从源程序文件中读入一些字符,直到识别出一个单词,或说直到下一个单词的第一个字符为止。

四、模块设计下面是程序的流程图五、程序介绍在程序当前目录里建立一个文本文档,取名为infile.txt,所有需要分析的程序都写在此文本文档里,程序的结尾必须以“@”标志符结束。

程序结果输出在同一个目录下,文件名为outfile.txt,此文件为自动生成。

本程序所输出的单词符号采用以下二元式表示:(单词种别,单词自身的值)如程序输出结果(57,"#")(33,"include")(52,"<")(33,"iostream") 等。

编译原理实验词法分析器与语法分析器实现

编译原理实验词法分析器与语法分析器实现

编译原理实验词法分析器与语法分析器实现词法分析器与语法分析器是编译器的两个重要组成部分,它们在编译过程中扮演着至关重要的角色。

词法分析器负责将源代码转化为一个个标记(token)序列,而语法分析器则根据词法分析器生成的标记序列构建语法树,验证源代码的语法正确性。

本实验旨在实现一个简单的词法分析器和语法分析器。

实验一:词法分析器实现在实现词法分析器之前,需要定义所需词法项的规则。

以C语言为例,常见的词法项包括关键字(如int、if、for等)、标识符、运算符(如+、-、*、/等)、常量(如整数、浮点数等)和分隔符(如括号、逗号等)。

接下来,我们来实现一个简单的C语言词法分析器。

1. 定义词法项的规则在C语言中,关键字和标识符由字母、数字和下划线组成,且首字符不能为数字。

运算符包括各种数学运算符和逻辑运算符。

常量包括整数和浮点数。

分隔符包括括号、逗号等。

2. 实现词法分析器的代码下面是一个简单的C语言词法分析器的实现代码:```pythondef lexer(source_code):keywords = ['int', 'if', 'for'] # 关键字列表operators = ['+', '-', '*', '/'] # 运算符列表separators = ['(', ')', '{', '}', ',', ';'] # 分隔符列表tokens = [] # 标记序列列表current_token = '' # 当前标记for char in source_code:if char.isspace(): # 如果是空格,则忽略continueelif char.isalpha(): # 如果是字母,则可能是关键字或标识符的一部分current_token += charelif char.isdigit(): # 如果是数字,则可能是常量的一部分current_token += charelif char in operators or char in separators: # 如果是运算符或分隔符,则当前标记结束if current_token:tokens.append(current_token)current_token = ''tokens.append(char)else: # 如果是其他字符,则当前标记结束if current_token:tokens.append(current_token)current_token = ''return tokens```以上代码通过遍历源代码的字符,根据定义的规则生成一个个标记,存储在`tokens`列表中。

编译原理课程设计报告——词法分析器

编译原理课程设计报告——词法分析器

精选课程设计任务书引言 (4)第一章概述 (5)1.1设计内容 (5)1.2设计要求 (5)第二章设计的基本原理 (6)2.1 (6)2.2 (6)第三章程序设计 (7)3.1 总体方案设计 (7)3.2 各模块设计 (8)第四章程序测试 (9)4.1一般测试4.2出错处理测试第五章结论 (10)参考文献 (10)附录程序清单 (11)引言《编译原理》是国内外各高等院校计算机科学技术类专业,特别是计算机软件专业的一门重要专业课程。

该课程系统地向学生介绍编译程序的结构、工作流程及编译程序各组成部分的设计原理和实现技术。

由于该课程理论性和实践性都比较强,内容较为抽象复杂,涉及到大量的软件设计算法,因此,一直是一门比较难学的课程。

为了使学生更好地理解和掌握编译技术的基本概念、基本原理和实现方法,实践环节非常重要,只有通过上机进行程序设计,才能使学生对比较抽象的教学内容产生具体的感性认识,增强学生综合分析问题、解决问题的能力,并对提高学生软件设计水平大有益处。

编译原理涉及词法分析,语法分析,语义分析及优化设计等各方面。

词法分析阶段是编译过程的第一个阶段,是编译的基础。

这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。

词法分析程序实现这个任务。

词法分析程序可以使用 Lex 等工具自动生成。

从左到右逐个字符对构成源程序的字符串进行扫描,依据词法规则,识别出一个一个的标记(token ),把源程序变为等价的标记串序列。

执行词法分析的程序称为词法分析器,也称为扫描器。

词法分析是所有分析优化的基础,涉及的知识较少,如状态转换图等,易于实现。

本次课程设计,我的选题是词法分析, C++ 代码实现。

第一章概述1.1 设计内容对 C 语言的一个子集设计并实现一个简单的词法分析器,掌握利用状态转换图设计词法分析器的基本方法。

1.2设计要求利用该词法分析器完成对源程序字符串的词法分析。

编译原理实验-词法分析器的设计与实现

编译原理实验-词法分析器的设计与实现
break;
case ':':
syn=39;
word[m++]=ch;
break;
case ',':
syn=44;
word[m++]=ch;
break;
//逻辑运算符
case '&':
word[m++]=ch;
ch=input[p++];
if(ch=='&')
{
syn=20;
word[m++]=ch;
void scaner(void);
//获取输入串
void init()
{
int i=0;
printf("\n please input a string(end with '#'):\n");
do{
scanf("%c",&ch);
input[i++]=ch;
}while(ch!='#');
}
//判断是不是关键字
南华大学
计算机科学与技术学院
实验报告
(2018~2019学年度第二学期)
课程名称
编译原理
实验名称
词法分析器的设计与实现
姓名
学号
专业
班级
地点
教师
1.实验目的及要求
实验目的
加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。
{

(完整)编译原理实验报告(词法分析器 语法分析器)

(完整)编译原理实验报告(词法分析器 语法分析器)

编译原理实验报告实验一一、实验名称:词法分析器的设计二、实验目的:1,词法分析器能够识别简单语言的单词符号2,识别出并输出简单语言的基本字。

标示符。

无符号整数.运算符.和界符。

三、实验要求:给出一个简单语言单词符号的种别编码词法分析器四、实验原理:1、词法分析程序的算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号.2、程序流程图(1)主程序(2)扫描子程序3、各种单词符号对应的种别码五、实验内容:1、实验分析编写程序时,先定义几个全局变量a[]、token[](均为字符串数组),c,s( char型),i,j,k(int型),a[]用来存放输入的字符串,token[]另一个则用来帮助识别单词符号,s用来表示正在分析的字符.字符串输入之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,结束分析程序,若否则通过int digit(char c)、int letter(char c)判断其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的判断可以在switch语句中进行,还要通过函数int lookup(char token[])来判断标识符和保留字。

2 实验词法分析器源程序:#include 〈stdio.h〉#include <math.h>#include <string。

h>int i,j,k;char c,s,a[20],token[20]={’0’};int letter(char s){if((s〉=97)&&(s〈=122)) return(1);else return(0);}int digit(char s){if((s〉=48)&&(s<=57)) return(1);else return(0);}void get(){s=a[i];i=i+1;}void retract(){i=i-1;}int lookup(char token[20]){if(strcmp(token,"while")==0) return(1);else if(strcmp(token,"if")==0) return(2);else if(strcmp(token,"else”)==0) return(3);else if(strcmp(token,"switch”)==0) return(4);else if(strcmp(token,"case")==0) return(5);else return(0);}void main(){printf(”please input string :\n");i=0;do{i=i+1;scanf("%c",&a[i]);}while(a[i]!=’#’);i=1;j=0;get();while(s!=’#'){ memset(token,0,20);switch(s){case 'a':case ’b':case ’c':case ’d':case ’e’:case ’f’:case 'g’:case ’h':case 'i':case ’j':case 'k’:case ’l':case 'm’:case 'n':case ’o':case ’p':case ’q’:case 'r’:case 's’:case 't’:case ’u’:case ’v’:case ’w’:case ’x':case ’y':case ’z’:while(letter(s)||digit(s)){token[j]=s;j=j+1;get();}retract();k=lookup(token);if(k==0)printf("(%d,%s)”,6,token);else printf("(%d,—)",k);break;case ’0':case ’1’:case ’2':case ’3':case '4’:case '5’:case ’6':case ’7’:case ’8’:case '9’:while(digit(s)){token[j]=s;j=j+1;get();}retract();printf(”%d,%s",7,token);break;case '+':printf(”(’+',NULL)”);break;case ’-':printf("(’-',null)");break;case ’*':printf(”('*’,null)");break;case '<':get();if(s=='=’) printf(”(relop,LE)”);else{retract();printf("(relop,LT)");}break;case ’=':get();if(s=='=’)printf("(relop,EQ)");else{retract();printf(”('=',null)”);}break;case ’;':printf(”(;,null)");break;case ' ’:break;default:printf("!\n”);}j=0;get();} }六:实验结果:实验二一、实验名称:语法分析器的设计二、实验目的:用C语言编写对一个算术表达式实现语法分析的语法分析程序,并以四元式的形式输出,以加深对语法语义分析原理的理解,掌握语法分析程序的实现方法和技术.三、实验原理:1、算术表达式语法分析程序的算法思想首先通过关系图法构造出终结符间的左右优先函数f(a),g(a)。

编译原理课程设计_词法分析器设计

编译原理课程设计_词法分析器设计

编译方法课程设计词法分析器设计学院:计算机与信息工程学院专业:软件工程学号:姓名:指导教师:职称:设计报告日期:二О一二年十二月目录1设计概述 (2)1.1设计题目 (2)1.2 设计目的 (3)1.3 设计任务内容: (3)1.4 设计时间 (3)2 设计环境与工具 (3)3设计要求 (3)4分析与概要设计 (4)5算法描述与框图 (4)6 源程序清单 (6)7 软件测试 (10)7.1 设计的测试题目 (10)7.2测试结果截图 (10)8 总结 (10)8 参考文献 (11)1设计概述1.1设计题目词法分析器的设计与实现。

1.2 设计目的词法分析是编译程序第一个阶段的工作,它的任务是对输入的字符串形式的源程序进行扫描,在扫描的同时,根据源语言的词法规则识别具有独立意义的单词。

本设计是C++高级程序语言,数据结构和变异原理中词法分析原理等知识的综合运用。

掌握生成词法分析器的方法,加深对词法分析原理的理解,掌握设计,编制并调试词法分析程序的思想和方法。

1.3 设计任务内容:1、格式输入:将C++语言的源代码从文本文档中读入。

处理:对输入框中的代码进行词法分析,分离出关键字、标示符、数值、运算符和界符。

输出:在文本文档中输出每个单词对应的编码和值。

2、编译对象声明和其他标记赋值语句分支结构语句循环语句1.4 设计时间2012年12月23日至2012年12月28日2 设计环境与工具Windows7环境下使用 C++语言。

3设计要求1、使用任何一种编程语言编制一个词法分析程序。

2、该程序能够识别的单词有5类:(1)关键字:"long", "float", "static", "char", "short", "switch", "int", "const", "if", "then", "else", "for", "while", "break"。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

词法分析器的设计一.设计说明及设计要求一般来说,编译程序的整个过程可以划分为五个阶段:词法分析、语法分析、中间代码生成、优化和目标代码生成。

本课程设计即为词法分析阶段。

词法分析阶段是编译过程的第一个阶段。

这个阶段的任务是从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词(也称单词符号或符号)。

如保留字(关键字或基本字)、标志符、常数、算符和界符等等。

二.设计中相关关键字说明1.基本字:也称关键字,如C语言中的if , else , while , do ,for,case,break, return 等。

2.标志符:用来表示各种名字,如常量名、变量名和过程名等。

3.常数:各种类型的常数,如12,6.88,和“ABC”等。

4.运算符:如+ ,- , * , / ,%, < , > ,<= , >= 等。

5.界符,如逗点,冒号,分号,括号,# ,〈〈,〉〉等。

三、程序分析词法分析是编译的第一个阶段,它的主要任务是从左到右逐个字符地对源程序进行扫描,产生一个个单词序列,用以语法分析。

词法分析工作可以是独立的一遍,把字符流的源程序变为单词序列,输出在一个中间文件上,这个文件做为语法分析程序的输入而继续编译过程。

然而,更一般的情况,常将词法分析程序设计成一个子程序,每当语法分析程序需要一个单词时,则调用该子程序。

词法分析程序每得到一次调用,便从源程序文件中读入一些字符,直到识别出一个单词,或说直到下一个单词的第一个字符为止。

四、模块设计下面是程序的流程图五、程序介绍在程序当前目录里建立一个文本文档,取名为infile.txt,所有需要分析的程序都写在此文本文档里,程序的结尾必须以“@”标志符结束。

程序结果输出在同一个目录下,文件名为outfile.txt,此文件为自动生成。

本程序所输出的单词符号采用以下二元式表示:(单词种别,单词自身的值)如程序输出结果(57,"#")(33,"include")(52,"<")(33,"iostream") 等。

程序的功能:(1)能识别C语言中所有关键字(共32个)(单词种别分别为1 —32 ,详情见程序代码相关部分,下同)(2)能识别C语言中自定义的标示符(单词种别为33)(3)能识别C语言中的常数(单词种别为0)(4)能识别C语言中几乎所有运算符(单词种别分别为41 —54)(5)能识别C语言中绝大多数界符(单词种别分别为55 —66)六、运行结果输入文件infile.txt运行结果(输出文件outfile.txt)七、设计体会八、附录部分(程序代码)提示:文件的打开和读写函数:FILE *fp,*out; //定义文件指针fp=fopen("infile.txt","r"))如果打开文件"infile.txt"失败,则函数返回NULL,即fp=NULL,第二个参数“r”表示以只读方式打开,如果为”w”,则以可写方式打开调用fgetc(fp)这个函数一次从fp所指向的文件读取一个字符char ch=fgetc(fp);想文件写字符的函数为fprintf(FILE * fp,写进的内容)比如下面的调用fprintf(outfile,"abcd\n")是把字符串“abcd”写到文件outfile的末尾,并且在后面加上了一个换行标志文件读写完成后要用函数fclose(fp)关闭源代码#include "stdio.h"#include "string.h"#include "ctype.h"void analzid(FILE *output,char *p){int i=0;int count=0;if (isalpha(p[0])){if (strcmp(p,"if")==0) {fprintf(output,"(3,if)\n");}else if(strcmp(p,"then")==0) {fprintf(output,"(4,then)\n");}else if(strcmp(p,"else")==0) {fprintf(output,"(5,else)\n");}else if(strcmp(p,"while")==0) {fprintf(output,"(6,while)\n");}else if(strcmp(p,"do")==0) {fprintf(output,"(7,do)\n");}else if(strcmp(p,"begin")==0) {fprintf(output,"(8,begin)\n");}else if(strcmp(p,"end")==0) {fprintf(output,"(9,end)\n");}else if(strcmp(p,"long")==0) {fprintf(output,"(10,long)\n");}else if(strcmp(p,"switch")==0) {fprintf(output,"(11,switch)\n");}else if(strcmp(p,"case")==0) {fprintf(output,"(12,case)\n");}else if(strcmp(p,"enum")==0) {fprintf(output,"(13,enum)\n");}else if(strcmp(p,"register")==0) {fprintf(output,"(14,register)\n");}else if(strcmp(p,"typedef")==0) {fprintf(output,"(15,typedef)\n");}else if(strcmp(p,"char")==0) {fprintf(output,"(16,char)\n");} else if(strcmp(p,"extern")==0) {fprintf(output,"(17,extern)\n");} else if(strcmp(p,"return")==0) {fprintf(output,"(18,return)\n");} else if(strcmp(p,"union")==0) {fprintf(output,"(19,union)\n");}else if(strcmp(p,"const")==0) {fprintf(output,"(20,const)\n");}else if(strcmp(p,"float")==0) {fprintf(output,"(21,float)\n");}else if(strcmp(p,"short")==0) {fprintf(output,"(22,short)\n");}else if(strcmp(p,"unsigned")==0) {fprintf(output,"(23,unsigned)\n");} else if(strcmp(p,"continue")==0) {fprintf(output,"(24,continue)\n");} else if(strcmp(p,"for")==0) {fprintf(output,"(25,for)\n");}else if(strcmp(p,"signed")==0) {fprintf(output,"(26,signed)\n");} else if(strcmp(p,"void")==0) {fprintf(output,"(27,void)\n");}else if(strcmp(p,"default")==0) {fprintf(output,"(28,default)\n");} else if(strcmp(p,"goto")==0) {fprintf(output,"(29,goto)\n");}else if(strcmp(p,"sizeof")==0) {fprintf(output,"(30,sizeof)\n");} else if(strcmp(p,"volatile")==0) {fprintf(output,"(43,volatile)\n");} else if(strcmp(p,"auto")==0) {fprintf(output,"(44,auto)\n");}else if(strcmp(p,"double")==0) {fprintf(output,"(45,double)\n");} else if(strcmp(p,"int")==0) {fprintf(output,"(46,int)\n");}else if(strcmp(p,"struct")==0) {fprintf(output,"(47,struct)\n");} else if(strcmp(p,"break")==0) {fprintf(output,"(48,break)\n");}else if(strcmp(p,"static")==0) {fprintf(output,"(49,static)\n");} else {fprintf(output,"(1,%s)\n",p);}}else{for(;i<(int)strlen(p);i++) if(isdigit(p[i])) count++;if (count==(int)strlen(p)){fprintf(output,"(2,%s)\n",p);}elseif (p[0]=='_'&&(isalpha(p[1]))){fprintf(output,"(1,%s)\n",p);}else {fprintf(output,"%s 未定义\n",p);}}}void analzsy(FILE *outfile,char *p){if (strcmp(p,"=")==0) {fprintf(outfile,"(37,=)\n");}else if(strcmp(p,"+")==0) {fprintf(outfile,"(31,+)\n");}else if(strcmp(p,"-")==0) {fprintf(outfile,"(32,-)\n");}else if(strcmp(p,"*")==0) {fprintf(outfile,"(33,*)\n");}else if(strcmp(p,"/")==0) {fprintf(outfile,"(34,/)\n");}else if(strcmp(p,"(")==0) {fprintf(outfile,"(52,()\n");}else if(strcmp(p,")")==0) {fprintf(outfile,"(53,))\n");}else if(strcmp(p,"[")==0) {fprintf(outfile,"(55,[)\n");}else if(strcmp(p,"]")==0) {fprintf(outfile,"(56,])\n");} else if(strcmp(p,"{")==0) {fprintf(outfile,"(57,{)\n");} else if(strcmp(p,"}")==0) {fprintf(outfile,"(58,})\n");} else if(strcmp(p,"<<")==0) {fprintf(outfile,"(59,<<)\n");} else if(strcmp(p,">>")==0) {fprintf(outfile,"(60,>>)\n");} else if(strcmp(p,"'")==0) {fprintf(outfile,"(61,')\n");} else if(strcmp(p,"#")==0) {fprintf(outfile,"(62,#)\n");} else if(strcmp(p,".")==0) {fprintf(outfile,"(64,.)\n");} else if(strcmp(p,"*")==0) {fprintf(outfile,"(33,*)\n");} else if(strcmp(p,"/")==0) {fprintf(outfile,"(34,/)\n");} else if(strcmp(p,"%")==0) {fprintf(outfile,"(40,%)\n");} else if(strcmp(p,",")==0) {fprintf(outfile,"(64,,)\n");} else if(strcmp(p,":")==0) {fprintf(outfile,"(65,:)\n");} else if(strcmp(p,";")==0) {fprintf(outfile,"(54,;)\n");} else if(strcmp(p,">")==0) {fprintf(outfile,"(36,>)\n");} else if(strcmp(p,"<")==0) {fprintf(outfile,"(35,<)\n");} else if(strcmp(p,">=")==0) {fprintf(outfile,"(39,>=)\n");} else if(strcmp(p,"<=")==0) {fprintf(outfile,"(38,<=)\n");} else if(strcmp(p,"==")==0) {fprintf(outfile,"(41,==)\n");} else if(strcmp(p,"!=")==0) {fprintf(outfile,"(42,!=)\n");} else if(strcmp(p," ")==0) ;else if(strcmp(p,"\n")==0) ;else {fprintf(outfile,"%s 未定义\n",p);}}void main(){FILE *fp,*out;int i=0,x=0,y=0;int EA=0;char ch,str[10000],idstr[10],systr[2];if((fp=fopen("infile.txt","r"))==NULL){printf("Can not open infile!\n");exit(0);}if((out=fopen("outfile.txt","w"))==NULL){printf("Can not open outfile!\n");exit(0);}ch=fgetc(fp);while(ch!=EOF){str[i]=ch;str[i+1]='\0';i++;ch=fgetc(fp);}i=0;while(1){if(str[i]=='@') break;elseif((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')||(str[i]>='0'&&str[i]<='9')||(str[i]=='_')){idstr[x]=str[i];idstr[x+1]='\0';x++;i++;EA=1;}else{x=0;if((strlen(idstr)!=0)&&(EA)) analzid(out,idstr);idstr[x]='\0';if(str[i]<'0'||(str[i]>'9'&&str[i]<'A')||(str[i]>'Z'&&str[i]<'a')||str[i]>'z'){if(str[i]!='!'&&str[i]!='='&&str[i]!='<'&&str[i]!='>'){systr[y]=str[i];systr[y+1]='\0';analzsy(out,systr);i++;}elseif((str[i]=='!'&&str[i+1]=='=')||(str[i]=='='&&str[i+1]=='=')|| (str[i]=='>'&&str[i+1]=='=')||(str[i]=='<'&&str[i+1]=='=')|| (str[i]=='<'&&str[i+1]=='<')||(str[i]=='>'&&str[i+1]=='>')) {systr[y]=str[i];systr[y+1]=str[i+1];systr[y+2]='\0';analzsy(out,systr);i++;i++;}else{systr[y]=str[i];systr[y+1]='\0';analzsy(out,systr);i++; }}}}printf("-----全部结果已经存入outfile.txt文档-----\n");fprintf(out,"--------完成--------");fclose(fp);fclose(out);}。

相关文档
最新文档