基于winform实现的编译原理简单编译器

Viewer

发布日期: 2019-03-18 12:53:59 浏览量: 1311
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

1、程序功能描述

  • 文件名:编译原理课程设计:编译器.exe

    • 文件说明:编译器本体,将PL/0代码编译为可汇编的汇编代码(asm)、并输出中间代码和规约过程
    • 开发环境:VC++2008、Parser Generator 2(LEX&&YACC集成环境)
    • 运行环境:windows
    • 功能:从指定路径文件输入PL/0源代码,向指定路径文件输出汇编代码、中间语言、规约过程(文件路径通过运行参数设置,路径支持中文)
  • 文件名:使用编译器的窗体界面.exe

    • 文件说明:与编译原理课程设计:编译器.exe配套的窗体界面。
    • 开发环境:VC++2008中的WINFORM
    • 运行环境:windows、.NET Frame Work 3.5以上
    • 功能:通过窗体界面指定文件路径并进行编译

2、程序具体实现

2.1 主要算法

  • 词法分析:Lex提供的词法分析算法

  • 语法分析:Yacc提供的文法分析算法

  • 中间代码生成:一遍生成算法

  • 目标代码生成:简单的生成算法

  • 常量处理方法:生成中间代码时直接替换

  • 变量处理算法:生成中间代码时分配内存地址

  • 临时变量分配方法:每个语句单独分配临时变量

2.2 基本框图

主函数:_tmain()

目标代码生成函数:masmcode()

2.3 主要模块

  • 词法分析:由Lex提供

  • 语法分析:由Yacc提供

变量、临时量节点结构

  1. struct VarTableNode
  2. {
  3. VarTableNode *next;
  4. string name;
  5. int group;
  6. int val,offset;
  7. VarTableNode()
  8. };

常量、变量、临时量管理类

  1. class VarTable
  2. {
  3. public:
  4. VarTableNode *first,*last;
  5. int length,lasttemp,lengthofint,countoftemp;
  6. VarTable()
  7. ~VarTable()
  8. void insertconst(string name,int val)
  9. int insertvar(string name)
  10. int inserttemp()
  11. string addtemp()
  12. void cleartemp()
  13. int check(string name)
  14. VarTableNode *lookup(string name)
  15. string itostr(int x)
  16. string getplace(string name)
  17. void masmdseg(ofstream &ofs)
  18. };

中间代码节点结构

  1. struct MidCode
  2. {
  3. int no;
  4. string d[4];
  5. MidCode *next,*prev;
  6. MidCode()
  7. };

中间代码管理类

  1. class MidCodeManager
  2. {
  3. MidCode *first,*last;
  4. int lcount;
  5. public:
  6. MidCodeManager()
  7. ~MidCodeManager()
  8. void emit(string s0,string s1,string s2,string s3)
  9. void fout(_TCHAR* file)
  10. MidCode* find(int x)
  11. int nextquad()
  12. string itostr(int x)
  13. bool backpatch(List *list,int x)
  14. string memi(string s)
  15. void masmcseg(ofstream &ofs)
  16. };

列表节点数据结构

  1. struct ListNode
  2. {
  3. int val;
  4. ListNode *next;
  5. ListNode()
  6. };

列表类

  1. class List
  2. {
  3. public:
  4. ListNode *first,*last;
  5. List()
  6. List(List *l)
  7. ~List()
  8. void add(int x)
  9. void add(List *l)
  10. };

附注语法树节点类

  1. class TreeNode
  2. {
  3. public:
  4. string name;
  5. int val;
  6. string place;
  7. int q;
  8. List *t,*f,*n;
  9. TreeNode()
  10. };

全局变量、函数

  1. string itostr(int x)
  2. void error()
  3. VarTable vt;
  4. MidCodeManager mcm;
  5. ofstream mesout;
  6. void masmcode(_TCHAR* file)

2.4 功能函数

  1. struct VarTableNode
  2. {
  3. VarTableNode *next;
  4. string name;
  5. int group;
  6. int val,offset;
  7. VarTableNode()//变量、临时量节点构造函数
  8. };
  9. class VarTable
  10. {
  11. public:
  12. VarTableNode *first,*last;
  13. int length,lasttemp,lengthofint,countoftemp;
  14. VarTable()//变量、常量、临时量管理类构造函数
  15. ~VarTable()//变量、常量、临时量管理类析构函数
  16. void insertconst(string name,int val) //添加常量
  17. int insertvar(string name) //添加变量
  18. string addtemp()//添加临时量
  19. void cleartemp()//释放全部临时量
  20. int check(string name) //返回量的类型
  21. VarTableNode *lookup(string name)//返回指定量的节点
  22. string itostr(int x) //int转string
  23. string getplace(string name) //取得对应量的place属性
  24. void masmdseg(ofstream &ofs) //目标代码数据段生成输出函数
  25. };
  26. struct MidCode
  27. {
  28. int no;
  29. string d[4];
  30. MidCode *next,*prev;
  31. MidCode()//中间代码节点构造函数
  32. };
  33. class MidCodeManager
  34. {
  35. MidCode *first,*last;
  36. int lcount;
  37. public:
  38. MidCodeManager()//中间代码管理类构造函数
  39. ~MidCodeManager()//中间代码管理类析构函数
  40. void emit(string s0,string s1,string s2,string s3) //添加中间代码
  41. void fout(_TCHAR* file) //将中间代码写入文件
  42. MidCode* find(int x) //返回指定中间代码节点
  43. int nextquad()// 返回下一语句的中间代码行号
  44. string itostr(int x) //int转string
  45. bool backpatch(List *list,int x) //回填
  46. string memi(string s) //内部函数
  47. void masmcseg(ofstream &ofs) //生成并输出目标语言代码段
  48. };
  49. struct ListNode
  50. {
  51. int val;
  52. ListNode *next;
  53. ListNode()//列表节点构造函数
  54. };
  55. class List
  56. {
  57. public:
  58. ListNode *first,*last;
  59. List()//列表类构造函数
  60. List(List *l) //列表类复制构造函数
  61. ~List()//列表类析构函数
  62. void add(int x) //添加表项
  63. void add(List *l) //从列表类添加表项
  64. };
  65. class TreeNode
  66. {
  67. public:
  68. string name;
  69. int val;
  70. string place;
  71. int q;
  72. List *t,*f,*n;
  73. TreeNode()//附注语法树节点类
  74. };
  75. string itostr(int x) //int转string
  76. void error()//返回错误
  77. VarTable vt;
  78. MidCodeManager mcm;
  79. ofstream mesout;
  80. void masmcode(_TCHAR* file) //目标代码生成函数

3、执行界面和运行结果

编译器配套使用界面:为了方便使用配合编译器本体制作的窗体界面

编译器本体:无界面、参数决定文件名、文件输入输出

源代码文件截图

源代码文件内容(输入)

  1. PROGRAM add
  2. CONST a=3,b=5;
  3. VAR x,y;
  4. BEGIN
  5. x:=1;
  6. y:=2;
  7. WHILE x<5 DO
  8. BEGIN
  9. x:=x+1;
  10. IF x+y>a+b THEN
  11. BEGIN
  12. y:=y-1;
  13. y:=y+a;
  14. END;
  15. END;
  16. x:=(x+y)*(y-x);
  17. y:=(x+y)/(y-x);
  18. x:=(x+y)+(x+y);
  19. END

目标代码文件截图

目标代码文件内容(输出)

  1. DSEG SEGMENT
  2. MEM DB 4100 DUP(0)
  3. DSEG ENDS
  4. CSEG SEGMENT
  5. ASSUME DS:DSEG, CS:CSEG
  6. MAIN PROC FAR
  7. MOV AX,DSEG
  8. MOV DS,AX
  9. l10001: MOV word ptr MEM[4096],1
  10. l10002: MOV word ptr MEM[4098],2
  11. l10003: CMP word ptr MEM[4096],5
  12. JL l10005
  13. l10004: JMP l10016
  14. l10005: MOV AX,word ptr MEM[4096]
  15. MOV BX,1
  16. ADD AX,BX
  17. MOV word ptr MEM[0],AX
  18. l10006: MOV BX,word ptr MEM[0]
  19. MOV word ptr MEM[4096],BX
  20. l10007: MOV AX,word ptr MEM[4096]
  21. MOV BX,word ptr MEM[4098]
  22. ADD AX,BX
  23. MOV word ptr MEM[0],AX
  24. l10008: MOV AX,3
  25. MOV BX,5
  26. ADD AX,BX
  27. MOV word ptr MEM[2],AX
  28. l10009: MOV BX,word ptr MEM[2]
  29. CMP word ptr MEM[0],BX
  30. JG l10011
  31. l10010: JMP l10015
  32. l10011: MOV AX,word ptr MEM[4098]
  33. MOV BX,1
  34. SUB AX,BX
  35. MOV word ptr MEM[0],AX
  36. l10012: MOV BX,word ptr MEM[0]
  37. MOV word ptr MEM[4098],BX
  38. l10013: MOV AX,word ptr MEM[4098]
  39. MOV BX,3
  40. ADD AX,BX
  41. MOV word ptr MEM[0],AX
  42. l10014: MOV BX,word ptr MEM[0]
  43. MOV word ptr MEM[4098],BX
  44. l10015: JMP l10003
  45. l10016: MOV AX,word ptr MEM[4096]
  46. MOV BX,word ptr MEM[4098]
  47. ADD AX,BX
  48. MOV word ptr MEM[0],AX
  49. l10017: MOV AX,word ptr MEM[4098]
  50. MOV BX,word ptr MEM[4096]
  51. SUB AX,BX
  52. MOV word ptr MEM[2],AX
  53. l10018: MOV AX,word ptr MEM[0]
  54. MOV BX,word ptr MEM[2]
  55. IMUL BX
  56. MOV word ptr MEM[4],AX
  57. l10019: MOV BX,word ptr MEM[4]
  58. MOV word ptr MEM[4096],BX
  59. l10020: MOV AX,word ptr MEM[4096]
  60. MOV BX,word ptr MEM[4098]
  61. ADD AX,BX
  62. MOV word ptr MEM[0],AX
  63. l10021: MOV AX,word ptr MEM[4098]
  64. MOV BX,word ptr MEM[4096]
  65. SUB AX,BX
  66. MOV word ptr MEM[2],AX
  67. l10022: MOV AX,word ptr MEM[0]
  68. MOV BX,word ptr MEM[2]
  69. CWD
  70. IDIV BX
  71. MOV word ptr MEM[4],AX
  72. l10023: MOV BX,word ptr MEM[4]
  73. MOV word ptr MEM[4098],BX
  74. l10024: MOV AX,word ptr MEM[4096]
  75. MOV BX,word ptr MEM[4098]
  76. ADD AX,BX
  77. MOV word ptr MEM[0],AX
  78. l10025: MOV AX,word ptr MEM[4096]
  79. MOV BX,word ptr MEM[4098]
  80. ADD AX,BX
  81. MOV word ptr MEM[2],AX
  82. l10026: MOV AX,word ptr MEM[0]
  83. MOV BX,word ptr MEM[2]
  84. ADD AX,BX
  85. MOV word ptr MEM[4],AX
  86. l10027: MOV BX,word ptr MEM[4]
  87. MOV word ptr MEM[4096],BX
  88. l10028: MOV AH,4CH
  89. INT 21H
  90. MAIN ENDP
  91. CSEG ENDS
  92. END MAIN

中间代码文件截图

中间代码文件内容(输出)

  1. 10001:(:=,1,#,[4096])
  2. 10002:(:=,2,#,[4098])
  3. 10003:(j<,[4096],5,10005)
  4. 10004:(j,#,#,10016)
  5. 10005:(+,[4096],1,[0])
  6. 10006:(:=,[0],#,[4096])
  7. 10007:(+,[4096],[4098],[0])
  8. 10008:(+,3,5,[2])
  9. 10009:(j>,[0],[2],10011)
  10. 10010:(j,#,#,10015)
  11. 10011:(-,[4098],1,[0])
  12. 10012:(:=,[0],#,[4098])
  13. 10013:(+,[4098],3,[0])
  14. 10014:(:=,[0],#,[4098])
  15. 10015:(j,#,#,10003)
  16. 10016:(+,[4096],[4098],[0])
  17. 10017:(-,[4098],[4096],[2])
  18. 10018:(*,[0],[2],[4])
  19. 10019:(:=,[4],#,[4096])
  20. 10020:(+,[4096],[4098],[0])
  21. 10021:(-,[4098],[4096],[2])
  22. 10022:(/,[0],[2],[4])
  23. 10023:(:=,[4],#,[4098])
  24. 10024:(+,[4096],[4098],[0])
  25. 10025:(+,[4096],[4098],[2])
  26. 10026:(+,[0],[2],[4])
  27. 10027:(:=,[4],#,[4096])

规约过程文件截图

规约过程文件内容(输出)

  1. HEAD->PROGRAM ID
  2. CONSTDEF->ID '=' INT
  3. CONSTDEF->ID '=' INT
  4. CONSTDEFS->CONSTDEF
  5. CONSTDEFS->CONSTDEF ',' CONSTDEFS
  6. CONSTS->CONST CONSTDEFS
  7. VARDEF->ID
  8. VARDEF->ID
  9. VARDEFS->VARDEF
  10. VARDEFS->VARDEF ',' VARDEFS
  11. VARS->VAR VARDEFS
  12. FACTOR->INT
  13. TERM->FACTOR
  14. EXPRESSION->TERM
  15. ASSIGN->ID := EXPRESSION
  16. STATEMENT->ASSIGN
  17. M->/EMPTY/
  18. FACTOR->INT
  19. TERM->FACTOR
  20. EXPRESSION->TERM
  21. ASSIGN->ID := EXPRESSION
  22. STATEMENT->ASSIGN
  23. M->/EMPTY/
  24. M->/EMPTY/
  25. FACTOR->ID
  26. TERM->FACTOR
  27. EXPRESSION->TERM
  28. OP-> <
  29. FACTOR->INT
  30. TERM->FACTOR
  31. EXPRESSION->TERM
  32. CONDITION->EXPRESSION OP EXPRESSION
  33. M->/EMPTY/
  34. FACTOR->ID
  35. TERM->FACTOR
  36. EXPRESSION->TERM
  37. FACTOR->INT
  38. TERM->FACTOR
  39. EXPRESSION->EXPRESSION + TERM
  40. ASSIGN->ID := EXPRESSION
  41. STATEMENT->ASSIGN
  42. M->/EMPTY/
  43. FACTOR->ID
  44. TERM->FACTOR
  45. EXPRESSION->TERM
  46. FACTOR->ID
  47. TERM->FACTOR
  48. EXPRESSION->EXPRESSION + TERM
  49. OP-> >
  50. FACTOR->ID
  51. TERM->FACTOR
  52. EXPRESSION->TERM
  53. FACTOR->ID
  54. TERM->FACTOR
  55. EXPRESSION->EXPRESSION + TERM
  56. CONDITION->EXPRESSION OP EXPRESSION
  57. M->/EMPTY/
  58. FACTOR->ID
  59. TERM->FACTOR
  60. EXPRESSION->TERM
  61. FACTOR->INT
  62. TERM->FACTOR
  63. EXPRESSION->EXPRESSION - TERM
  64. ASSIGN->ID := EXPRESSION
  65. STATEMENT->ASSIGN
  66. M->/EMPTY/
  67. FACTOR->ID
  68. TERM->FACTOR
  69. EXPRESSION->TERM
  70. FACTOR->ID
  71. TERM->FACTOR
  72. EXPRESSION->EXPRESSION + TERM
  73. ASSIGN->ID := EXPRESSION
  74. STATEMENT->ASSIGN
  75. M->/EMPTY/
  76. STATEMENT->/EMPTY/
  77. STATEMENTS->STATEMENT
  78. STATEMENTS->STATEMENT ';' STATEMENTS
  79. STATEMENTS->STATEMENT ';' STATEMENTS
  80. BLOCK->BEG STATEMENTS END
  81. STATEMENT->BLOCK
  82. IFTHENELSE->IF CONDITION THEN STATEMENT
  83. STATEMENT->IFTHENELSE
  84. M->/EMPTY/
  85. STATEMENT->/EMPTY/
  86. STATEMENTS->STATEMENT
  87. STATEMENTS->STATEMENT ';' STATEMENTS
  88. STATEMENTS->STATEMENT ';' STATEMENTS
  89. BLOCK->BEG STATEMENTS END
  90. STATEMENT->BLOCK
  91. WHILEDO->WHILE CONDITION DO STATEMENT
  92. STATEMENT->WHILEDO
  93. M->/EMPTY/
  94. FACTOR->ID
  95. TERM->FACTOR
  96. EXPRESSION->TERM
  97. FACTOR->ID
  98. TERM->FACTOR
  99. EXPRESSION->EXPRESSION + TERM
  100. FACTOR->( EXPRESSION )
  101. TERM->FACTOR
  102. FACTOR->ID
  103. TERM->FACTOR
  104. EXPRESSION->TERM
  105. FACTOR->ID
  106. TERM->FACTOR
  107. EXPRESSION->EXPRESSION - TERM
  108. FACTOR->( EXPRESSION )
  109. TERM->TERM * FACTOR
  110. EXPRESSION->TERM
  111. ASSIGN->ID := EXPRESSION
  112. STATEMENT->ASSIGN
  113. M->/EMPTY/
  114. FACTOR->ID
  115. TERM->FACTOR
  116. EXPRESSION->TERM
  117. FACTOR->ID
  118. TERM->FACTOR
  119. EXPRESSION->EXPRESSION + TERM
  120. FACTOR->( EXPRESSION )
  121. TERM->FACTOR
  122. FACTOR->ID
  123. TERM->FACTOR
  124. EXPRESSION->TERM
  125. FACTOR->ID
  126. TERM->FACTOR
  127. EXPRESSION->EXPRESSION - TERM
  128. FACTOR->( EXPRESSION )
  129. TERM->TERM / FACTOR
  130. EXPRESSION->TERM
  131. ASSIGN->ID := EXPRESSION
  132. STATEMENT->ASSIGN
  133. M->/EMPTY/
  134. FACTOR->ID
  135. TERM->FACTOR
  136. EXPRESSION->TERM
  137. FACTOR->ID
  138. TERM->FACTOR
  139. EXPRESSION->EXPRESSION + TERM
  140. FACTOR->( EXPRESSION )
  141. TERM->FACTOR
  142. EXPRESSION->TERM
  143. FACTOR->ID
  144. TERM->FACTOR
  145. EXPRESSION->TERM
  146. FACTOR->ID
  147. TERM->FACTOR
  148. EXPRESSION->EXPRESSION + TERM
  149. FACTOR->( EXPRESSION )
  150. TERM->FACTOR
  151. EXPRESSION->EXPRESSION + TERM
  152. ASSIGN->ID := EXPRESSION
  153. STATEMENT->ASSIGN
  154. M->/EMPTY/
  155. STATEMENT->/EMPTY/
  156. STATEMENTS->STATEMENT
  157. STATEMENTS->STATEMENT ';' STATEMENTS
  158. STATEMENTS->STATEMENT ';' STATEMENTS
  159. STATEMENTS->STATEMENT ';' STATEMENTS
  160. STATEMENTS->STATEMENT ';' STATEMENTS
  161. STATEMENTS->STATEMENT ';' STATEMENTS
  162. STATEMENTS->STATEMENT ';' STATEMENTS
  163. BLOCK->BEG STATEMENTS END
  164. STATEMENT->BLOCK
  165. BODY->CONSTS VARS STATEMENT
  166. P->HEAD BODY

4、设计中遇到的问题、解决方法及设计体会

4.1 遇到的问题及解决方法

  • 附注语法树节点yylval(TreeNode类型)中的动态成员t、f、n释放时遭到多次释放产生异常错误
    解决方法:不使用析构函数释放、等程序结束后统一释放

  • Lex&Yacc在分析过程中向标准输入输出自动产生一堆无用的回车和空格

4.2 设计体会

这次课程设计,使我在课堂学习之余更加深层次的理解了编译器的工作方式,掌握了Lex、Yacc与VS2008的集成环境使用方法及符号表管理算法、中间代码生成算法等编译算法,提升了我的编程能力,受益匪浅,相信这次历练给我带来的进步必能为我今后的人生带来积极的影响。

上传的附件 cloud_download 基于winform实现的编译原理简单编译器.7z ( 493.02kb, 20次下载 )
error_outline 下载需要11点积分

发送私信

如果没有为想要的东西努力,就别为自己失去的东西哭泣

16
文章数
16
评论数
最近文章
eject