哈工大威海编译原理实验报告
《编译原理》 试验报告 班级: 学号: 姓名: 试验一 词法扫描器设计 一 试验目的 通过设计调试词法分析程序,实现从源程序中分出各种单词的方法;加深对课堂教学的理解;提高词法分析方法的实践实力。 二 试验内容 设计一个简洁的类C语言的词法扫描器。 三 试验要求 (一) 程序设计要求 (1) 依据附录给定的文法,从输入的类C语言源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、分隔符五大类;文法见最终附录。 (2) 供应源程序输入界面; (3) 词法分析后可查看符号表和TOKEN串表; (4) 保存符号表和TOKEN串表(如:文本文件); (5) 遇到错误时可显示提示信息,然后跳过错误部分接着进行分析。 (二)试验报告撰写要求 (1) 系统功能(包括各个子功能模块的功能说明); (2) 开发平台(操作系统、设计语言); (3) 设计方案; 1) 主数据流图; 2) 主要子程序的流程框图(若有必要); 3) 模块结构图; 4) 主要数据结构:符号表、TOKEN串表等。 (4) 详细设计过程(包括主控程序、各个功能模块的详细实现)。 1. 系统功能: 依据附录给定的文法,从输入的类C语言源程序中,识别出各个具有独立意义的单词,即关键字、标识符、常数、运算符、分隔符五大类。然后输出本源程序的符号表显示在dos界面和存放在文本文件中。本程序以如下源程序(语法分析的例子)示范: 源程序; int a; int b; int c; a=2; b=1; if (a>b) c=a+b; else c=a-b; 子功能模块有: 关键字处理过程;字母的处理过程;数字的处理过程;整个词法分析处理过程;运算符处理过程以及主程序。 2. 开发平台(操作系统、设计语言); Windows 7,Microsoft Visual C++ 6.0 3. 设计方案: (1) 主流程图: 起先 读入文件 CiFaFenXi()函数进行词法分析 关闭文件流 结束 (2) 主要子程序的流程框图: 推断 是否注释子模块①: 起先 输入文件,读完文件 是否为注释? N Y 不处理 接着推断 模块① 推断是否是字符子模块②: 起先 是否为字符? N Y 接着别的推断 字符临时赋值给字符串变量 读取下一字符 是否为字符或者数字? Y N 字符串变量是否是关键字? Y 将变量 类型2输出到DOS界面并写入文件 将变量 类型1输出到DOS界面并写入文件 结束 模块② 推断是否为数字或者运算符子模块③: 起先 是否为运算符? 是否为数字? N Y Y 将数字赋给变量 对每一个运算符做相应的处理 读取下一变量 输入小数|指数|小数点 Y N 将变量 类型3写入结果 模块③ 试验结果: Test.txt内容: Token.txt文件内容: 四 试验总结: 通过词法分析试验,首先我相识到词法分析就是将字符序列转换为单词(Token)序列的过程。词法分析器一般以函数的形式存在,供语法分析器调用。词法分析阶段是编译过程的第一个阶段,这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后依据构词规则识别单词(也称单词符号或符号)。并且对符号表有了肯定的理解,符号表是: 1、编译过程中编译程序不断汇合和反复查证出现在源程序中各种名字的属性和特征信息等有关信息。 这些信息通常记录在一张或几张符号表中。 2、符号表的每一项有两部分: 一部分是名字(标识符);一部分是名字属性(标识符的有关信息)。 3、编译过程中,每当扫描器(词法分析器)识别出一个名字后,编译程序就查阅符号表,看其是否在符号表中。 假如它是一个新名字就将它填进表里。 它的有关信息将在词法分析和语法-语义分析过程中接连填入表中。 4、符号表是边填边用。 附录:类C语言的词法文法 id® Letter int10® Num int10 | Num OP® +| - |* |/ |>| = |b) c=a+b; else c=a-b; 三 试验要求 (一) 程序设计要求 (1)给出主要数据结构:分析栈、符号表; (2)将扫描器作为一个子程序,每次调用返回一个TOKEN; (3)程序界面:表达式输入、语法分析的表示结果(文件或者图形方式); (