词法分析器实验报告_第1页
词法分析器实验报告_第2页
词法分析器实验报告_第3页
词法分析器实验报告_第4页
词法分析器实验报告_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精品文档 1欢迎下载 词法分析器实验报告 词法分析器设计 一 一 实验目的 实验目的 对 C 语言的一个子集设计并实现一个简单的词法分析器 掌握利用 状态转换图设计词法分析器的基本方法 利用该词法分析器完成对 源程序字符串的词法分析 输出形式是源程序的单词符号二元式的 代码 并保存到文件中 二 实验内容二 实验内容 1 设计原理 词法分析的任务 从左至右逐个字符地对源程序进行扫描 产生一个个单 词符号 理论基础 有限自动机 正规文法 正规式 词法分析器 Lexical Analyzer 又称扫描器 Scanner 执行词法分析的 程序 2 词法分析器的功能和输出形式 功能 输入源程序 输出单词符号 程序语言的单词符号一般分为以下五种 关键字 标识符 常数 运算符 界符 3 输出的单词符号的表示形式 单词种别用整数编码 关键字一字一种 标识符统归为一种 常数一种 各种符号各一种 4 词法分析器的结构 精品文档 2欢迎下载 预处理子程序 扫描器 输入缓冲区 扫描缓冲区 单词符号 列表 输入 5 状态转换图实现 012 34 5 6 7 8 9 1011 12 错错误误 错错误误 开开始始字字符符 字字符符 数数字字 数数字字 数数字字 字字符符 数数字字 其其他他 其其他他 其其中中2 4 5 7 8 9 11是是结结束束状状态态 三 程序设计三 程序设计 1 总体模块设计 精品文档 3欢迎下载 用来存储目标文件名 string file name 提取文本文件中的信息 string GetText 获得一个单词符号 从位置 i 开始查找 并且有一个引用参数 j 用来返 回这个单词最后一个字符在 str 的位置 string GetWord string str int i int 这个函数用来除去字符串中连续的空格和换行 int DeleteNull string str int i 判断 i 当前所指的字符是否为一个分界符 是的话返回真 反之假 bool IsBoundary string str int i 判断 i 当前所指的字符是否为一个运算符 是的话返回真 反之假 bool IsOperation string str int i 此函数将一个 pair 数组输出到一个文件中 void OutFile vector pair v 此函数接受一个字符串数组 对它进行词法分析 返回一个 pair 型数组 vector pair analyst vector vec 精品文档 4欢迎下载 此函数判断传递的参数是否为关键字 是的话 返回真 反之返回假 bool IsKey string str 2 各模块设计 1 首先根据上面单词符号表及 ID 和 NUM 的正规定义式 构造出状态转 换图 2 定义相关的变量和数据结构 关键字作为特殊标识符处理 把它们 预先安排在一张表格中 称为关键字表 当扫描程序识别出标识符时 查关键 字表 如能查到匹配的单词 则该单词为关键字 否则为一般标识符 关键字 表为一个字符串数组 其描述如下 char KEY WORDS 7 main int char if else for whi le 用以存放单词符号二元式的数据结构可如下定义 class Word Analyzer public char Content MAXLENGTH int val void print 3 按照编译程序一遍扫描的要求 把词法分析器 Scaner 作为一个独立 的子程序来设计 通过对 Scaner 的反复调用识别出所有的单词符号 4 当 Scaner 识别出一个单词符号时 则将该单词符号的二元式写入到 输出文件中 若 Scaner 无法识别出一个单词符号时 则调用错误处理程序 PrintError 显示当前扫描到的字符及其所在行 列位置 并跳过该字符重新 开始识别单词符号 精品文档 5欢迎下载 四 程序代码四 程序代码 include include include include using namespace std 用来存储目标文件名 string file name 提取文本文件中的信息 string GetText 获得一个单词符号 从位置 i 开始查找 并且有一个引用参数 j 用来返回这个单词最后一个字符在 str 的位 置 string GetWord string str int i int 这个函数用来除去字符串中连续的空格和换行 第一个参数为目标字符串 第二个参数为开始位置 返回值为连续的空格和换行后的第一个有效字符在字符串的位置 int DeleteNull string str int i 判断 i 当前所指的字符是否为一个分界符 是的话返回真 反之假 bool IsBoundary string str int i 精品文档 6欢迎下载 判断 i 当前所指的字符是否为一个运算符 是的话返回真 反之假 bool IsOperation string str int i 此函数将一个 pair 数组输出到一个文件中 void OutFile vector pair v 次函数将参数 str digit 添加到 temp 中 void add string str int digit vector pair temp 此函数接受一个字符串数组 对它进行词法分析 返回一个 pair 型数组 vector pair analyst vector vec 此函数判断传递的参数是否为关键字 是的话 返回真 反之返回假 bool IsKey string str int main cout n cout 编译原理课程设计 词法编译器 ver 1 0 n cout n cout endl 精品文档 7欢迎下载 string com1 string com2 n string fileline GetText int begin 0 end 0 vector array do begin DeleteNull fileline begin string nowString nowString GetWord fileline begin end if end 1 break if nowSpare com1 begin end 1 while true vector pair mid result mid result analyst array OutFile mid result cout n cout 程序已完成词法分析 分析结果已经存储在文件 file name 中 n cout n cout 感谢使用 谢谢再见 endl 精品文档 8欢迎下载 system pause return 0 提取文本文件中的信息 string GetText string file name1 cout file name1 ifstream infile file name1 c str ios in if infile cerr 无法打开文件 file name1 c str endl exit 1 cout endl char f 1000 infile getline f 1000 EOF infile close printf f cout endl return f 精品文档 9欢迎下载 获得一个单词符号 从位置 i 开始查找 并且有一个引用参数 j 用来返回这个单词最后一个字符在原字符串的位 置 string GetWord string str int i int n j str find first of no use i if j 1 return if i j j return str substr i j i 1 这个函数用来除去字符串中连续的空格和换行 第一个参数为目标字符串 第二个参数为开始位置 返回值为连续的空格和换行后的第一个有效字符在字符串的位置 int DeleteNull string str int i for i if str i 判断 i 当前所指的字符是否为一个分界符 是的话返回真 反之假 精品文档 10欢迎下载 bool IsBoundary string str int i int t char arr 7 for t 0 t 7 t if str i arr t return true return false 判断 i 当前所指的字符是否为一个运算符 是的话返回真 反之假 bool IsOperation string str int i int t char arr 8 for t 0 t 8 t if str i arr t return true return false 此函数将一个个字符串数组输出到一个文件中 void OutFile vector pair v cout file name ofstream outfile file name c str ios out if outfile cerr 无法打开文件 file name c str endl exit 1 cout endl int i for i 0 i v size i outfile v i first v i second endl cout v i first v i second endl outfile n n n outfile close return 此函数判断传递的参数是否为关键字 是的话 返回真 反之返回假 bool IsKey string str string p 7 main int char if else for while vector ppp p p 7 精品文档 12欢迎下载 int u for u 0 u ppp size u if pare ppp u return true return false 此函数接受一个字符串数组 对它进行词法分析 返回一个 pair 型数组 vector pair analyst vector vec vector pair temp int i for i 0 i jk append vec i 0 1 pair pp 37 jk temp push back pp continue if vec i jk append vec i 0 1 pair pp 38 jk temp push back pp continue if vec i jk append vec i 0 1 pair pp 39 jk temp push back pp continue if vec i jk append vec i 0 1 pair pp 40 jk temp push back pp continue if vec i jk append vec i 0 1 pair pp 42 jk temp push back pp continue if vec i jk append vec i 0 1 pair pp 43 jk temp push back pp continue if IsBoundary vec i 0 if vec i pair pp1 32 vec i temp push back pp1 if vec i pair pp2 34 vec i temp push back pp2 精品文档 15欢迎下载 if vec i pair pp3 30 vec i temp push back pp3 if vec i pair pp4 31 vec i temp push back pp4 if vec i pair pp5 26 vec i temp push back pp5 if vec i pair pp6 27 vec i temp push back pp6 if vec i pair pp7 33 vec i temp push back pp7 精品文档 16欢迎下载 else if IsOperation vec i 0 if vec i pair pp8 22 vec i temp push back pp8 if vec i pair pp9 23 vec i temp push back pp9 if vec i pair pp10 24 vec i temp push back pp10 if vec i pair pp11 25 vec i temp push back pp11 if vec i 精品文档 17欢迎下载 pair pp12 21 vec i temp push back pp12 if vec i pair pp13 35 vec i temp push back pp13 if vec i pair pp14 36 vec i temp push back pp14 if vec i temp push back pp26 else if vec i 0 0 pair pp24 10 vec i temp push back pp24 精品文档 18欢迎下载 else pair pp25 10 vec i temp push back pp25 else if vec i 0 0 pair pp23 3 vec i temp push back pp23 else if IsKey vec i if vec i main pair pp15 1 vec i temp push back pp15 if vec i int pair pp16 2 vec i temp push back pp16 if vec i char 精品文档 19欢迎下载 pair pp17 3 vec i temp push back pp17 if vec i else pair pp18 4 vec i temp push back pp18 if vec i if pair pp19 5 vec i temp push back pp19 if vec i for pair pp20 6 vec i tem

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论