编译原理课程设计.doc

上传人:夏** 文档编号:563305080 上传时间:2023-02-28 格式:DOC 页数:21 大小:373.51KB
返回 下载 相关 举报
编译原理课程设计.doc_第1页
第1页 / 共21页
编译原理课程设计.doc_第2页
第2页 / 共21页
编译原理课程设计.doc_第3页
第3页 / 共21页
编译原理课程设计.doc_第4页
第4页 / 共21页
编译原理课程设计.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《编译原理课程设计.doc》由会员分享,可在线阅读,更多相关《编译原理课程设计.doc(21页珍藏版)》请在金锄头文库上搜索。

1、编译原理课程设计报告课题名称: 使用lex工具实现C/C+语言词法分析器专业:计算机科学与技术班级:xxxx指导老师:xxxx小组成员成员学号xxxXxxxxXxxXxxxxXxxXxxxxxxXxx目 录1.课程设计题目名称- 2 -2.课程设计需实现的功能及目标- 2 -3.课程设计所涉及的知识介绍- 3 -4.课程设计环境设置- 5 -5.程序设计- 5 -6.程序运行结果和测试报告- 6 -7.总结及改进建议- 9 -附件一- 9 -附件二- 13 -1. 课程设计题目名称 使用lex工具实现C/C+语言词法分析器2. 课程设计需实现的功能及目标u 实现功能:完成C/C+语言的词法分析

2、器(C语言词法记号及其含义详见附件一)u 词法分析器的作用如下:1. 读入源程序字符序列2. 对源程序进行预处理,如删除注释和回车换行符,宏展开 等3. 识别源程序中的单词符号,创建符号表并在相应的符号表中登录信息4. 输出单词符号序列5. 要求使用Lex编程来自动生成词法分析器。6. 要求能识别8进制、16进制数据。- 1 -3. 课程设计所涉及的知识介绍u Lex介绍Lex 是一种生成扫描器的工具。扫描器是一种识别文本中的词汇模式的程序。 这些词汇模式(或者常规表达式)在一种特殊的句子结构中定义。一种匹配的常规表达式可能会包含相关的动作。这一动作可能还包括返回一个标记。 当 Lex 接收到

3、文件或文本形式的输入时,它试图将文本与常规表达式进行匹配。 它一次读入一个输入字符,直到找到一个匹配的模式。 如果能够找到一个匹配的模式,Lex 就执行相关的动作(可能包括返回一个标记)。 另一方面,如果没有可以匹配的常规表达式,将会停止进一步的处理,Lex 将显示一个错误消息。u Lex编程Lex 编程可以分为三步:1. 以 Lex 可以理解的格式指定模式相关的动作。一个 Lex 程序分为三个段: 第一段是 C 和 Lex 的全局声明; 第二段包括模式(C 代码),即一系列规则; 第三段是补充的 C 函数。 例如, 第三段中一般都有 main() 函数。注:这些段以%来分界。 那么,回到字数

4、统计的 Lex 程序,让我们看一下程序不同段的构成。2. 在这一文件上运行 Lex,生成扫描器的 C 代码。3. 编译和链接 C 代码,生成可执行的扫描器。u Lex常规正则表达式字符含义A-Z, 0-9, a-z构成了部分模式的字符和数字。.匹配任意字符,除了 n。-用来指定范围。例如:A-Z 指从 A 到 Z 之间的所有字符。 一个字符集合。匹配括号内的任意字符。如果第一个字符是那么它表示否定模式。例如: abC 匹配 a, b, 和 C中的任何一个。*匹配0个或者多个上述的模式。+匹配1个或者多个上述模式。?匹配0个或1个上述模式。$作为模式的最后一个字符匹配一行的结尾。 指出一个模式可

5、能出现的次数。 例如: A1,3 表示 A 可能出现1次或3次。用来转义元字符。同样用来覆盖字符在此表中定义的特殊意义,只取字符的本意。否定。|表达式间的逻辑或。字符的字面含义。元字符具有。/向前匹配。如果在匹配的模版中的“/”后跟有后续表达式,只匹配模版中“/”前 面的部分。如:如果输入 A01,那么在模版 A0/1 中的 A0 是匹配的。( )将一系列常规表达式分组。u LEX常用函数及变量说明Lex 变量yyinFILE* 类型。 它指向 lexer 正在解析的当前文件。yyoutFILE* 类型。 它指向记录 lexer 输出的位置。 缺省情况下,yyin 和 yyout 都指向标准输

6、入和输出。yytext匹配模式的文本存储在这一变量中(char*)。yyleng给出匹配模式的长度。yylineno提供当前的行数信息。 (lexer不一定支持。)Lex 函数yylex()这一函数开始分析。 它由 Lex 自动生成。yywrap()这一函数在文件(或输入)的末尾调用。 如果函数的返回值是1,就停止解析。 因此它可以用来解析多个文件。 代码可以写在第三段,这就能够解析多个文件。 方法是使用 yyin 文件指针(见上表)指向不同的文件,直到所有的文件都被解析。 最后,yywrap() 可以返回 1 来表示解析的结束。yyless(int n)这一函数可以用来送回除了前n? 个字符

7、外的所有读出标记。yymore()这一函数告诉 Lexer 将下一个标记附加到当前标记后。4. 课程设计环境设置实验所需软件及文件:mingw-get-inst-20110316.exebison.exeflex.exebison.hairybison.simple环境设置:(1) 安装软件mingw-get-inst-20110316.exe,安装目录D:BYYL(2) 将bison.exe flex.exe复制到目录D:BYYL下(3) 将文件bison.hairybison.simple 复制到目录D:BYYL下(4) 设置环境变量:变量名:BISON_HAIRY 变量值:D:BYYLb

8、ison.hairy变量名:BISON.SIMPLE 变量值:D:BYYLbison.simple变量名:path变量值:D:BYYLMINGWbin;D:BYYL;5. 程序设计第一段:定义部分 包括include语句、声明语句在内的C语句和LEX的标记声明其中LEX的标记声明包括:(1) 关键字标记(2) 空格、制表位和换行标记(3) 八进制、十进制、十六进制数字标记(4) 特殊符号标记(“,”、“;”、“”、“”、“(”、“)”、“【”、“】”等)(5) 算术运算符标记(6) 逻辑运算符标记(包括自增、自减)(7) 关系运算符标记(8) 标识符标记(9) 注释标记(10) 字符串标记(1

9、1) 字符标记(12) 预处理标记第二段:规则部分词法规则由模式和动作两部分组成。模式部分可以由任意的正则表达式组成,动作部分由C语言语句组成,这些语句用来对所匹配的模式进行相应处理。需要注意的是,lex将识别出来的单词存放在yytext字符数据中,因此该数组的内容就代表了所识别出来的单词的内容。规则定义如下:(见附录2)第三段:自定义函数。函数实现功能:打开input.c文件进行词法分析,并将结果输出到output.tok文件中。/*程序段*/int yywrap() return 1;int main(int argc, char *argv) yyin = fopen(input.c,r

10、); yyout = fopen(output.tok,w); printf(input.c文件分析完毕,结果保存在output.tok文件n); fprintf(yyout,/文件 input.c词法分析如下:n); yylex(); return 0;6. 程序运行结果和测试报告 在cmd里面运行:flex ym.l 生成lex.yy.c程序,即扫描器的C代码 用gcc编译链接lex.yy.c文件,生成ym.exe可执行文件,即扫描器 执行ym.exe 即可对C源代码进行分析,本报告测试程序是:input.c文件Input.c文件如下:#include #include#includein

11、t main()int a;/整数aint b;/整数bint sum;/求和int i;a = 0x3f ;b = 045 ;sum = 2.112;sum += a;sum+;-b;if(a=b)sum -= b;for(i=0;i b & sum != b)sum = a + b ;return 0; 经词法分析器分析,得,输出文件output.tok如下:/文件 input.c词法分析如下:#include PRE-预处理定义#includePRE-预处理定义#includePRE-预处理定义intKEYWORD INTmainKEYWORD MAIN(LP(左小括号)RP(右小括号)

12、LB(左大括号)intKEYWORD INTaIdentifier-标识符;SC(分号)intKEYWORD INTbIdentifier-标识符;SC(分号)intKEYWORD INTsumIdentifier-标识符;SC(分号)intKEYWORD INTiIdentifier-标识符;SC(分号)aIdentifier-标识符=ASSIGN(等于号)0x3fNumber-十六进制数;SC(分号)bIdentifier-标识符=ASSIGN(等于号)045Number-八进制数;SC(分号)sumIdentifier-标识符=ASSIGN(等于号)2.112Number-十进制数;SC

13、(分号)sumIdentifier-标识符+=PLUSA-算术运算符aIdentifier-标识符;SC(分号)sum+POS_OP-双目向后运算符;SC(分号)-bPRE_OP-双目向前运算符;SC(分号)ifKEYWORD IF(LP(左小括号)aIdentifier-标识符=ALOGRITHM_OP-关系运算符)bIdentifier-标识符)RP(右小括号)LB(左大括号)sumIdentifier-标识符-=MINUSA-算术运算符bIdentifier-标识符;SC(分号)RB(右大括号)forKEYWORD FOR(LP(左小括号)iIdentifier-标识符=ASSIGN(等于号)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号