1、编译原理课程设计C语言编译器( 编译原理课程设计报告课题名称: C-语言编译器设计 提交文档学生姓名: 李杰 )提交文档学生学号: 00 同组 成 员 名 单: 无 指导 教 师 姓 名: 金军 N不指导教师评阅意见: . . 提交报告时间: 2010年 6 月 10日1.课程设计目标实验建立C-编译器。只含有scanner和parser部分。2.分析与设计(1)实现方法:.编程语言为C语言。编程方法:scanner部分根据DFA图用switch-case结构实现状态转换;parser部分用递归下降分析方法实现。(2)扫描器:C惯用的词法1、语言的关键字:else if int return
2、void while 2、专用符号:+ - * / = = != = ; , ( ) /* */ 3、其他标记是ID和NUM,通过下列正则表达式定义:ID = letter letter* NUM = digit digit* letter = a|.|z|A|.|Z digit = 0|.|9?4、空格由空白、换行符和制表符组成。空格通常被忽略,除了它必须分开ID、NUM关键字。 5. 注释用通常的C语言符号/ * . . . * /围起来。注释可以放在任何空白出现的位置(即注释不能放在标记内)上,且可以超过一行。注释不能嵌套各单词的状态转换图(DFA图如下)词法结构见文件中。#(3)分析器
3、:分析树结构见文件中。C的BNF语法如下:(4)代码设计说明:#程序结构:语法分析函数parse通过调用词法分析函数getToken实现语法分析。文件和函数的设计说明:文件包含相应头文件,及main函数的实现;文件包含符号表和分析数的数据结构及在其它文件中使用的变量;文件 和实现与词法分析和语法分析输出相关的函数printToken和printTree,以及分析树节点初始化相关的函数newStmtNode,newExpNode(Expkind)和copyString;文件 和实现词法分析,主要函数为getToken;文件 和实现语法分析,函数为与文法规则对应的函数。关键数据结构3.程序代码实现
4、文件代码如下:=NULL) strcat(pgm,.tny); 。 source=fopen(pgm,r); if(source=NULL) fprintf(stderr,file %s not found n,pgm); return -1; listing=stdout; fprintf(listing,n C-COMPILATION: %sn,pgm); else EOF_Flag=TRUE; return EOF; else return lineBuflinepos+;=;=;=;!=;错误用例:/* A program to perform Eucilds Algorithm to
5、 compute gcd. */int gcd (int u, int v) returk; re9; ! if (v=0) return u; else return gcd(v,u-u/v*v);! /* u mod v */语法分析用例:正确用例:()/* A program to perform selection sort on a 10 element array. */int x10;-int minloc (int a,int low,int high) int i; int x; int k; k=low; x=alow; i=low+1; while (ihigh) if
6、(aix)% x=ai; k=i; i=i+1; return k;void sort (int a,int low,int high), int i;int k; i=low; while (ihigh-1) int t; k=minloc (a,i,high); t=ak; ak=ai; ai=t;、 i=i+1; void main (void) int i; i=0; while (i10)* xi= input; i=i+1; sort (x,0,10); i=0; while (i=;compiler sou C-COMPILATION: 1: /* A program to pe
7、rform Eucilds! 2: Algorithm to compute gcd. */ 3: int gcd (int u, int v) 3:reserved word: int 3:ID, name= gcd 3:( 3:reserved word: int 3:ID, name= u 3:, 3:reserved word: int 3:ID, name= v 3:) 4: 4: 5: if (v=0) return u; 5:reserved word: if 5:( 5:ID, name= v 5:= 5:NUM, val= 0 5:) 5:reserved word: ret
8、urn 5:ID, name= u 5:; 6: else return gcd(v,u-u/v*v); 6:reserved word: else 6:reserved word: return 6:ID, name= gcd 6:( 6:ID, name= v 6:, 6:ID, name= u 6:- 6:ID, name= u 6:/ 6:ID, name= v 6:* 6:ID, name= v 6:) 6:; 7: /* u-u/v*v= u mod v */ 8: 9: 9: 10: void main(void) 10:reserved word: void 10:ID, na
9、me= main 10:( 10:reserved word: void=;= 16:; 16:compiler sour C-COMPILATION: 1: /* A program to perform Eucilds 2: Algorithm to compute gcd. */ 3: int gcd (int u, int v)【 3:reserved word: int 3:ID, name= gcd 3:( 3:reserved word: int 3:ID, name= u 3:, 3:reserved word: int 3:ID, name= v! 3:) 4: returk
10、; re9; 4: 4:ERROR: 4:ID, name= returk 4:; 4:ID, name= re 4:NUM, val= 9。 4:; 5: ! if (v=0) return u; 5:ERROR: ! 5:reserved word: if 5:( 5:ID, name= v 5:= 5:NUM, val= 0 5:) 5:reserved word: return 5:ID, name= u 5:; 6: else return gcd(v,u-u/v*v); 6:ERROR: 6:reserved word: else 6:reserved word: return 6
11、:ID, name= gcd 6:( 6:ID, name= v 6:, 6:ID, name= u 6:- 6:ID, name= u 6:/; 6:ID, name= v 6:* 6:ID, name= v 6:) 6:; 7: /* u mod v */ 8: 8:* 9:EOFC:Documents and Settings计算机学院专业实验室桌面compilerDebug语法分析的结果输出:正确结果:C:Documents and Settings计算机学院专业实验室桌面compilerDebugcompiler sour C-COMPILATION: Syntax tree: In
12、t Id: x Vark: 10 Int Id: minloc Hanshu Int Id: a Vark: -1 Int Id: low Int Id: high¥ Hanshuti Int Id: i Int Id: x Int Id: k Assign to: k Id: low Assign to: x Id: a Id: low Assign to: i Op:+ Id: low Const: 1。 While Op: Id: i Id: high Hanshuti If Op: Id: a( Id: i Id: x Hanshuti Assign to: x Id: a Id: i
13、 Assign to: k Id: i Assign to: i Op:+ Id: i Const: 1 Return Id: k Void Id: sort( Hanshu Int Id: a Vark: -1 Int Id: low Int Id: high Hanshuti Int Id: i Int Id: k Assign to: i Id: low While Op: Id: i Op:- Id: high Const: 1 Hanshuti Int Id: t Assign to: k Id: minloc Id: a Id: i Id: high Assign to: t Id
14、: a Id: k; Assign to: a Id: a Id: i Assign to: a Id: t Assign to: i Op:+ Id: i Const: 1 Void Id: main Hanshu Void Hanshuti Int Id: i, Assign to: i Const: 0 While Op: Id: i Const: 10 Hanshuti Assign to: x Id: input Assign to: i Op:+ Id: i Const: 1 Id: sort Id: x Const: 0$ Const: 10 Assign to: i Const
15、: 0 While Op:cd 桌面compilerDebugC:Documents and Settings计算机学院专业实验室桌面compilerDebugcompiler sour, C-COMPILATION: Syntax error at line 4: unexoected token- Syntax error at line 5: unexoected token-reserved word: return、 Syntax error at line 12: unexoected token-reserved word: int Syntax error at line 16
16、: code end beforeSyntax tree: Int Id: gcd Hanshu Int Id: u Int Id: v Hanshuti If Op:= Id: v Const: 0 Return Id: u Return Id: gcd Id: v Op:- Id: u Op:* Op:/ Id: u Id: v Id: v Void Id: main Hanshu Void Hanshuti Int Id: x Int Id: y Int Id: z Assign to: x Id: input Assign to: y Id: input Id: output Id:
17、gcd Id: x Id: yC:Documents and Settings计算机学院专业实验室桌面compilerDebug4.总结收获:1、熟悉C语言的结构、指针、文件方面的使用。2、学会用startUml构造状态图,及用switch-case结构实现状态转换实现词法分析。3、学会用递归下降方法实现EBNF文法规则,进而实现语法分析。4、熟悉构造编译器的步骤及程序实现的框架及部分方法。不足:1、程序语法实现部分只用了递归下降分析一种方法。2、此程序框架与教材编译原理及实践附录B Tiny编译器的程序框架相似。3、递归下降分析方法手工实现应经验少程序逻辑错误多,调试费时久,不能保证程序的高健壮性。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1