该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include "globals.h"
#include "util.h"
#include "scan.h"
#include "parse.h"
static TokenType token;
static TreeNode * dec_list(void);
static TreeNode * declaration(void);
static TreeNode * param_list(void);
static TreeNode * param(void);
static TreeNode * statement_list(void);
static TreeNode * statement(void);
static TreeNode * expression_stmt(void);
static TreeNode * compound_stmt(void);
static TreeNode * selection_stmt(void);
static TreeNode * iteration_stmt(void);
static TreeNode * return_stmt(void);
static TreeNode * expression(void);
static TreeNode * simple_exp(void);
static TreeNode * additive_exp(void);
static TreeNode * term(void);
static TreeNode * factor(void);
static TreeNode * var(void);
static TreeNode * call(void);
static TreeNode * args(void);
static TreeNode * arg_list(void);
static void syntaxError(char * message)
{
fprintf(listing,"\n>>> ");
fprintf(listing,"Syntax error at line %d: %s",lineno,message);
Error = TRUE;
}
static void match(TokenType expected)
{
if (token == expected) token = getToken();
else
{
syntaxError("unexpected token -> ");
printToken(token,tokenString);
fprintf(listing," ");
}
}
//2
TreeNode * dec_list(void)
{
TreeNode * t =NULL;
if(token==INT||token==VOID)
{
t = declaration();
TreeNode * p = t;
while (token!=ENDFILE&&(token==INT||token==VOID))
{
TreeNode * q;
q = declaration();
if (q!=NULL)
{
if (t==NULL) t = p = q;
else
{
p->sibling = q;
p = q;
}
}
}
}
return t;
}
//3,4,5,6
TreeNode * declaration(void)
{
TreeNode * t = newDecNode();
if(token==VOID)
{
strcpy(t->type,"void");
}
else if(token==INT)
{
strcpy(t->type,"int");
}
token=getToken();
t->attr.name = copyString(tokenString);
token=getToken();
switch (token)
{
case SEMI :
match(SEMI);
t->kind.dec =VarK;
break;
case LFANG :
match(LFANG);
t->kind.dec =ArrayK;
t->child[0]=factor();
match(RFANG);
match(SEMI);
break;
case LPAREN :
match(LPAREN);
t->kind.dec = FunK;
if (t!=NULL)
t->child[0] = param_list();
match(RPAREN);
if (t!=NULL)
t->child[1] = compound_stmt();
break;
default : syntaxError("unexpected token -> ");
printToken(token,tokenString);
token = getToken();
break;
}
return t;
}
//8
TreeNode * param_list(void)
{
TreeNode * t = param();
TreeNode * p = t;
while (token!=RPAREN && token!= LHUA)//此处修改后:当函数后括号去掉是就不会出现n多错误的情况
{
match(COM);
TreeNode * q;
q = param();
if (q!=NULL)
{
if (t==NULL) t = p = q;
else
{ p->sibling = q;
p = q;
}
}
}
return t;
}
//9
TreeNode * param(void)
{
TreeNode * t = newParamNode();
if(token==VOID)
{
match(VOID);
t->kind.param=Null;
}
else if(token==INT)
{
strcpy(t->type,"int");
token=getToken();
if(token != ID)//补充,修改后,可识别错误
{
syntaxError("unexpected token -> ");