预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共33页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

南华大学计算机科学与技术学院实验报告(~第二学期)课程名称编译原理实验名称词法分析器设计与实现姓名学号专业班级地点教师实验目及规定实验目加深对词法分析器工作过程理解;加强对词法分析办法掌握;可以采用一种编程语言实现简朴词法分析程序;可以使用自己编写分析程序对简朴程序段进行词法分析。实验规定对单词构词规则有明拟定义;编写分析程序可以对的辨认源程序中单词符号;辨认出单词以<种别码,值>形式保存在符号表中,对的设计和维护符号表;对于源程序中词法错误,可以做出简朴错误解决,给出简朴错误提示,保证顺利完毕整个源程序词法分析;实验环节1.词法分析规则<标记符>::=<字母>|<标记符><字母>|<标记符><数字><常数>::=<数字>|<数字序列><数字><数字序列>::=<数字序列><数字>|<数字>|<.><字母>::=a|b|c|……|x|y|z<数字>::=0|1|2|3|4|5|6|7|8|9<运算符>::=<关系运算符>|<算术运算符>|<逻辑运算符>|<位运算符>|<赋值运算符><算数运算符>::=+|-|*|/|...|--<关系运算符>::=<|>|!=|>=|<=|==<逻辑运算符>::=&&||||!<位运算符>::=&|||!<赋值运算符>::==|+=|-=|/=|*=<分界符>::=,|;|(|)|{|}|:|//|/**/<保存字>::=main|if|else|while|do|for|...|void2.单词符号编码单词符号种别码单词符号种别码main0>26if1>=27else2<28while3<=29do4!30for5!=31switch6=32case7==33int8(34double9)35float10{36long11}37void12;38+13:39+=14|40++15||41-16数字42-=17标记符43--18,44&19//45&&20/**/46#21*22*=23/24/=253.状态转换图2字母非字母与数字1字母与数字0空白4数字非数字数字38/611+10=12!13=15其他3418<其他171921......&;,({},:)33其他2220=其他>1614+其他79*/=其他54.算法分析①词法分析器工作第一步是输入源程序文本。为了更好地对单词符号辨认,把输入串预解决一下。预解决重要滤掉空格,跳过注释、换行符等。②对预解决后输入串依次扫描单个字符,使用if-while嵌套语句和switchcase语句判断字符类型,详细辨认办法可看状态转换图。有时为了拟定词性,需要超前扫描,若超前扫描字符对辨认当前单词无用处,则需要退还给输入串,以备辨认下一单词字符时使用。③若读入字符与单词符号编码表字符匹配不上,则报错,并输出出错行数。对辨认处单词符号以(单词符号,种别码)二元式形式输出。实验内容流程图程序变量与函数阐明input全局字符数组,用来存储输入串word全局字符数组,用来存储获取到单词符号,限定长度为8ch全局字符变量,用来存储最新读入字符syn全局整型变量,表达单词符号编码p全局整型变量,表达当前字符在input数组位置m全局整型变量,表达最新读入字符在word数组下标line全局整型变量,当前行数keyword全局字符数组,存储核心字init()获取输入串isKey()判断核心字函数,若参数数组中是核心字,则把syn置为该核心字相应编码并返回1,否则返回0isLetter()判断字母函数,若参数字符是字母,则返回1,否则返回0isDigit()判断数字函数,若参数字符是数字,则返回1,否则返回0isSpace()判断空白符函数,若参数字符是空格、TAB或换行符,则返回1,否则返回0scaner()扫描输入串函数,对读出字符进行判断,若是单词符号表中符号,则将syn置为相应编码源程序#include<stdio.h>#include<string.h>charinput[1000];//输入串charword[8];//获取到单词charch;intsyn;//种别码intp;intm;intline;//行数//核心字charkeyword[][8]={"main","if","else","while","do","for","switch","case","int","double","float","long","void"};voidscaner(void);//获取输入串voidinit(){inti=0;printf("\npleaseinputastring(endwith'#'):\n");do{scanf("%c",&ch);input[i++]=ch;}while(ch!='#');}//判断是不是核心字intisKey(char*st