资源描述:
《词法分析实验报告》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、编译原理实验一姓名:朱彦荣学号:20132184专业:软件工程2实验题目:词法分析完成语言:C/C++上级系统:VC++6.0日期:2015/11/7词法分析设计题目:手工设计c语言的词法分析器(可以是c语言的子集)设计内容:处理c语言源程序,过滤掉无用符号,判断源程序中单词的合法性,并分解出正确的单词,以二元组形式存放在文件中。设计目的:了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。结果要求:课程设计报告。完成日期:第十五周提交报告一.分析要想手工设计词法分析器,实现C语言子集的识别,就要明白什么是
2、词法分析器,它的功能是什么。词法分析是编译程序进行编译时第一个要进行的任务,主要是对源程序进行编译预处理(去除注释、无用的回车换行找到包含的文件等)之后,对整个源程序进行分解,分解成一个个单词,这些单词有且只有五类,分别是标识符、保留字、常数、运算符、界符。以便为下面的语法分析和语义分析做准备。可以说词法分析面向的对象是单个的字符,目的是把它们组成有效的单词(字符串);而语法的分析则是利用词法分析的结果作为输入来分析是否符合语法规则并且进行语法制导下的语义分析,最后产生四元组(中间代码),进行优化(可有可无)之后最终生成目标代码。可见词法分析是
3、所有后续工作的基础,如果这一步出错,比如明明是‘<=’却被拆分成‘<’和‘=’就会对下文造成不可挽回的影响。因此,在进行词法分析的时候一定要定义好这五种符号的集合。下面是我构造的一个C语言子集。第一类:标识符letter(letter
4、digit)*无穷集第二类:常数(digit)+无穷集第三类:保留字(32)autobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforgotoifintlongregisterreturnshortsignedsizeofstaticst
5、ructswitchtypedefunionunsignedvoidvolatilewhile第四类:界符‘/*’、‘//’、(){}[]""'等第五类:运算符<、<=、>、>=、=、+、-、*、/、^、等对所有可数符号进行编码:<$,0>...<+,33><-,34><*,35>,36><<,37><<=,38><>,39><>=,40><=,41><==,42><;,44><(,45><),46><^,47><,,48><",49><',50><#,51><&,52><&&,53><
6、,
7、54><
8、
9、,55><%,56><~,57><<<,58>左移<>>,59>右移<[,60><],61><{,62><},63><,64><.,65>,66><:,67>"[","]","{","}"<常数99,数值><标识符100,标识符指针>上述二元组中左边是单词的符号,右边为其种别码,其中常数和标识符有点特别,因为是无穷集合,因此常数用自身来表示,种别码为99,标识符用标识符符号表的指针表示(当然也可用自身显示,比较容易观察),种别码100。根据上述约定,一旦见到了种别码syn=63,就唯一确定了‘}’这个单词。下面是一
10、些变量的约定://全局变量,保留字表staticcharreserveWord[32][20]={"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","
11、unsigned","void","volatile","while"};//界符运算符表,根据需要可以自行增加staticcharoperatorOrDelimiter[36][10]={"+","-","*","/","<","<=",">",">=","=","==","!=",";","(",")","^",",",""","'","#","&","&&","
12、","
13、
14、","%","~","<<",">>","[","]","{","}","\",".","?",":","!"};staticcharIDentifierTbl
15、[1000][50]={""};//标识符表charresourceProject[10000];//输入的源程序存放处,最大可以存放10000个字符