资源简介
华南师范大学 本资源包括TINY扩充语言的语法分析的实验报告,编译原理附录B和TINY扩充语言的语法分析代码.实验报告中说明了该实验的完成步骤.
扩充的语法规则有:实现while、do while、for语句和求余计算式子,具体文法规则自行构造。
可参考:P97及P136的文法规则。
(1) While-stmt --> while exp do stmt-sequence endwhile
(2) Dowhile-stmt-->do stmt-sequence while exp
(3) for-stmt-->for identifier:=simple-exp to simple-exp do stmt-sequence enddo 步长递增1
(4) for-stmt-->for identifier:=simple-exp downto simple-exp do stmt-sequence enddo 步长递减1
要求:
(1)要提供一个源程序编辑界面,以让用户输入源程序(可保存、打开源程序)
(2)可由用户选择是否生成语法树,并可查看所生成的语法树。
(3)应该书写完善的软件文档

代码片段和文件信息
/****************************************************/
/* File: analyze.c */
/* Semantic analyzer implementation */
/* for the TINY compiler */
/* Compiler Construction: Principles and Practice */
/* Kenneth C. Louden */
/****************************************************/
#include “globals.h“
#include “symtab.h“
#include “analyze.h“
/* counter for variable memory locations */
static int location = 0;
/* Procedure traverse is a generic recursive
* syntax tree traversal routine:
* it applies preProc in preorder and postProc
* in postorder to tree pointed to by t
*/
static void traverse( TreeNode * t
void (* preProc) (TreeNode *)
void (* postProc) (TreeNode *) )
{ if (t != NULL)
{ preProc(t);
{ int i;
for (i=0; i < MAXCHILDREN; i++)
traverse(t->child[i]preProcpostProc);
}
postProc(t);
traverse(t->siblingpreProcpostProc);
}
}
/* nullProc is a do-nothing procedure to
* generate preorder-only or postorder-only
* traversals from traverse
*/
static void nullProc(TreeNode * t)
{ if (t==NULL) return;
else return;
}
/* Procedure insertNode inserts
* identifiers stored in t into
* the symbol table
*/
static void insertNode( TreeNode * t)
{ switch (t->nodekind)
{ case StmtK:
switch (t->kind.stmt)
{ case AssignK:
case ReadK:
if (st_lookup(t->attr.name) == -1)
/* not yet in table so treat as new definition */
st_insert(t->attr.namet->linenolocation++);
else
/* already in table so ignore location
add line number of use only */
st_insert(t->attr.namet->lineno0);
break;
default:
break;
}
break;
case ExpK:
switch (t->kind.exp)
{ case IdK:
if (st_lookup(t->attr.name) == -1)
/* not yet in table so treat as new definition */
st_insert(t->attr.namet->linenolocation++);
else
/* already in table so ignore location
add line number of use only */
st_insert(t->attr.namet->lineno0);
break;
default:
break;
}
break;
default:
break;
}
}
/* Function buildSymtab constructs the symbol
* table by preorder traversal of the syntax tree
*/
void buildSymtab(TreeNode * syntaxTree)
{ traverse(syntaxTreeinsertNodenullProc);
if (TraceAnalyze)
{ fprintf(listing“\nSymbol table:\n\n“);
printSymTab(listing);
}
}
static void typeError(TreeNode * t char * message)
{ fprintf(listing“Type error at line %d: %s\n“t->linenomessage);
Error = TRUE;
}
/* Procedure checkNode performs
* type checking at a single tree node
*/
static void checkNode(TreeNode * t)
{ switch (t->nodek
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 462848 2013-01-02 21:56 TINY 扩充语言的语法分析 - 副本.doc
文件 5161 1997-02-01 09:33 编译原理附录B\YACC\TINY.Y
文件 3338 1997-01-31 22:48 编译原理附录B\YACC\GLOBALS.H
目录 0 2013-01-02 19:48 编译原理附录B\YACC\
文件 1037 1998-08-01 14:01 编译原理附录B\UTIL.H
文件 4848 1998-08-01 14:02 编译原理附录B\UTIL.C
文件 14104 1998-03-20 13:40 编译原理附录B\TM.EXE
文件 16753 1998-08-01 14:02 编译原理附录B\TM.C
文件 40736 1998-04-26 21:47 编译原理附录B\TINY.EXE
文件 959 1998-08-01 14:01 编译原理附录B\SYMTAB.H
文件 3564 1998-08-01 14:02 编译原理附录B\SYMTAB.C
文件 659 1998-08-01 14:01 编译原理附录B\SCAN.H
文件 5733 1999-08-04 16:05 编译原理附录B\SCAN.C
文件 263 1996-08-25 15:33 编译原理附录B\SAMPLE.TNY
文件 920 1998-07-31 16:47 编译原理附录B\SAMPLE.TM
文件 1962 1998-07-31 15:15 编译原理附录B\README.DOS
文件 484 1998-08-01 14:01 编译原理附录B\PARSE.H
文件 5173 1998-08-01 14:02 编译原理附录B\PARSE.C
文件 1129 1998-02-03 22:29 编译原理附录B\MAKEFILE
文件 2535 1998-08-01 14:02 编译原理附录B\MAIN.C
文件 1995 1998-07-31 14:45 编译原理附录B\LEX\TINY.L
目录 0 2013-01-02 19:48 编译原理附录B\LEX\
文件 2955 1998-08-01 14:01 编译原理附录B\GLOBALS.H
文件 2234 1998-08-01 14:01 编译原理附录B\CODE.H
文件 3039 1998-08-01 14:02 编译原理附录B\CODE.C
文件 679 1998-08-01 14:01 编译原理附录B\CGEN.H
文件 6971 1998-08-01 14:02 编译原理附录B\CGEN.C
文件 652 1998-08-01 14:01 编译原理附录B\ANALYZE.H
文件 4452 1998-08-01 14:02 编译原理附录B\ANALYZE.C
目录 0 2013-01-02 19:48 编译原理附录B\
目录 0 2013-01-02 20:34 实验二\
............此处省略69个文件信息
相关资源
- Rtx51_tiny_RTOS中文版.pdf
- 编译原理实验工具及参考源码(lex&
- 类pascal语言编译器(编译原理实验)
-
开源tinyxm
l - 编译原理课程设计:词法语法编译器
- 中科院 编译原理 习题及解答
- 编译原理四元式和逆波兰式
- 《编译原理》清华大学版中的pl0扩充
- PL/0功能扩充break功能
- 编译原理LR(0)语法分析
- 编译原理中间代码生成程序
- 编译原理:LR分析程序
- powerpaste-4.0.1-317(兼容最新tinymce5.2.
- 编译原理实验:词法分析,语法分析
- 吉林大学编译原理课件
- 编译原理龙书答案
- 编译原理 第三章课后习题答案
- 易语言变量和数组的编译原理
- 编译原理语法分析器、词法分析器
- 山东大学编译原理PL/0语言 compiler实验
- FOR循环语句的翻译程序设计简单优先
- NFA的确定化NFA->DFA完整可运行代码
- 哈工大威海编译原理实验报告和源代
- 哈工大威海-编译原理实验报告和源码
- 编译原理课设c编译器
- 赋值语句翻译四元式
- 河北工业大学编译原理实验代码及实
- TINY+编译器 改编自原版TINY
- 编译原理课程设计 while do循环语句翻
- 编译原理课程设计do——while简单优先
评论
共有 条评论