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

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

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

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

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

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

南华大学计算机科学与技术学院实验报告(2023~2023学年度第二学期)课程名称编译原理实验名称词法分析器的设计与实现姓名学号专业班级地点教师实验目的及规定实验目的加深对词法分析器的工作过程的理解;加强对词法分析方法的掌握;可以采用一种编程语言实现简朴的词法分析程序;可以使用自己编写的分析程序对简朴的程序段进行词法分析。实验规定对单词的构词规则有明确的定义;编写的分析程序可以对的辨认源程序中的单词符号;辨认出的单词以<种别码,值>的形式保存在符号表中,对的设计和维护符号表;对于源程序中的词法错误,可以做出简朴的错误解决,给出简朴的错误提醒,保证顺利完毕整个源程序的词法分析;实验环节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);i