文档介绍:TINY部分源码分析报告
LT
TINY源码分析
一、文件概述
: 主函数
:全局定义的文件
: 词法分析
:语法分析
:构造树
:符号表
:生成"汇编代码"
:这个只是用来把分析过程输出到屏幕的.
二、各个文件的分析
:
主要有三个FILE*句柄:
source--源代码文件。
listing--显示分析过程的文件,这里重定向到stdout。
code--目标汇编代码文件。
从该文件中可知程序运行的流程:
检查参数正确否( filename)->构造语法树(调用parse函数)->根据语法树生成代码(调用codeGen函数,该函数又调用cGen函数。
:
定义了关键字个数8个。
定义了关键字,运算符等内容的枚举值。
定义了语句类型的枚举值,这个决定树的结点。
这两个文件主要是关于语法树的创建和输出
主要有这么几个函数:
static int getNextChar(void);
static void ungetNextChar(void);
static TokenType reservedLookup (char * s);
TokenType getToken(void);
reservedLookup函数是查找关键字的,在符号表中找。这里还定义了一个保存关键字的结构:
static struct
{ char* str;
TokenType tok;
} reservedWords[MAXRESERVED]
=
{{"if",IF},{"then",THEN},{"else",ELSE},{"end",END},
{"repeat",REPEAT},{"until",UNTIL},{"read",READ},
{"write",WRITE}};
最重要的是getToken(void)函数。这个相当于lex的功能,进行词法分析。也就是一个DFA,switch后面跟了一堆的case。
其中getNextChar(void)函数的思路,以下列出:
static int getNextChar(void)
{
if (!(linepos < bufsize))
{
lineno++;
if (fgets(lineBuf,BUFLEN-1,source))
{
if (EchoSource) fprintf(listing,"%4d: %s",lineno,lineBuf);
bufsize = strlen(lineBuf);
linepos = 0;
return lineBuf[linepos++];
}
else
{
EOF_flag = TRUE;
return EOF;
}
}
else return lineBuf[linepos++];
}
有这么几个函数:
TreeNode * parse(void)
static TreeNode * stmt_sequence(void);
static TreeNode * statement(void);
static TreeNode * if_stmt(void);
static TreeNode * repeat_stmt(void);
static TreeNode * assign_stmt(void);
static TreeNode * read_stmt(void);
static TreeNode * write_stmt(void);
static TreeNode * exp(void);
static TreeNode * simple_exp(void);
static TreeNode * term(void);
static TreeNode * factor(void);