📄 parser.h
字号:
#include "struct.h"
void program(tree *);
void declaration(tree *);
void declaration_list1(tree *);
void type_specifer(tree *);
void declaration1(tree *);
void params(tree *);
void compound_stmt(tree *);
void var_declaration1(tree *);
void param(tree *);
void param1(tree *);
void param_list(tree *);
void param_list1(tree *);
void local_declarations(tree *);
void statement_list(tree *);
void var_declaration(tree *);
void local_declarations1(tree *);
void statement_list1(tree *);
void statement(tree *);
void if_stmt(tree *);
void while_stmt(tree *);
void return_stmt(tree *);
void expression_stmt(tree *);
void return_stmt1(tree *);
void if_stmt1(tree *);
void expression(tree *);
void simple_expression(tree *);
void additive_expression(tree *);
void additive_expression1(tree *);
void simple_expression1(tree *);
void relop(tree *);
void addop(tree *);
void term(tree *);
void term1(tree *);
void mulop(tree *);
void factor(tree *);
void args(tree *);
void arg_list(tree *);
void arg_list1(tree *);
void error(char err[30]);
void back(int);
void advance();
int num=0;
FILE *fpout;
void program(tree *node)
{
curentword=words[0];
declaration(node);
declaration_list1(node);
}
void declaration(tree *node)
{
leaf *leaf1,*leaf2;
int i=0;
while(node->child[i]!=NULL)i++;
if(!strcmp(curentword.type,"INT"))
{
advance();
if(!strcmp(curentword.type,"ID"))
{
leaf1=makeleaf("ID",curentword.string);
advance();
if(!strcmp(curentword.type,"SEMI"))
{
advance();
node->child[i]=makenode(curentword.line,"VarDecl",leaf1->ral,"\0","INT",0,"\0");
}
else if(!strcmp(curentword.type,"LSQUAR"))
{
advance();
if(!strcmp(curentword.type,"NUMBER"))
{
leaf2=makeleaf("NUMBER",curentword.string);
advance();
if(!strcmp(curentword.type,"RSQUAR"))
{
advance();
if(!strcmp(curentword.type,"SEMI"))
{
advance();
node->child[i]=makenode(curentword.line,"VarDecl",leaf1->ral,"\0","INT",1,leaf2->ral);
}
else error("缺少;");
}
else error("缺少]");
}
else error("数组定义错误");
}
else if(!strcmp(curentword.type,"LPAREN"))
{
node->child[i]=makenode(curentword.line,"FunDecl",leaf1->ral,"INT","\0",0,"\0");
advance();
params(node->child[i]);
if(!strcmp(curentword.type,"RPAREN"))
{
advance();
compound_stmt(node->child[i]);
}
else error("缺少)");
}
else error("缺少;");
}
else error("语法错误");
}
else if(!strcmp(curentword.type,"VOID"))
{
advance();
if(!strcmp(curentword.type,"ID"))
{
leaf1=makeleaf("ID",curentword.string);
advance();
if(!strcmp(curentword.type,"LPAREN"))
{
node->child[i]=makenode(curentword.line,"FunDecl",leaf1->ral,"VOID","\0",0,"\0");
advance();
params(node->child[i]);
if(!strcmp(curentword.type,"RPAREN"))
{
advance();
compound_stmt(node->child[i]);
}
else error("缺少)");
}
else error("函数定义错误");
}
else error("函数定义错误");
}
else if(!strcmp(curentword.type,"ID"))
{
leaf1=makeleaf("ID",curentword.string);
advance();
if(!strcmp(curentword.type,"LPAREN"))
{
node->child[i]=makenode(curentword.line,"FunDecl",leaf1->ral,"\0","\0",0,"\0");
advance();
params(node->child[i]);
if(!strcmp(curentword.type,"RPAREN"))
{
advance();
compound_stmt(node->child[i]);
}
else error("缺少)");
}
else error("函数定义错误");
}
else error("语法错误");
}
void var_declaration(tree *node)
{
leaf *leaf1,*leaf2;
int i=0;
while(node->child[i]!=NULL)i++;
if(!strcmp(curentword.type,"INT"))
{
advance();
if(!strcmp(curentword.type,"ID"))
{
leaf1=makeleaf("ID",curentword.string);
advance();
if(!strcmp(curentword.type,"SEMI"))
{
node->child[i]=makenode(curentword.line,"VarDecl",leaf1->ral,"\0","INT",0,"\0");
advance();
}
else if(!strcmp(curentword.type,"LSQUAR"))
{
advance();
if(!strcmp(curentword.type,"NUMBER"))
{
leaf2=makeleaf("NUMBER",curentword.string);
advance();
if(!strcmp(curentword.type,"RSQUAR"))
{
advance();
if(!strcmp(curentword.type,"SEMI"))
{
node->child[i]=makenode(curentword.line,"VarDecl",leaf1->ral,"\0","INT",1,leaf2->ral);
advance();
}
else error("缺少;");
}
else error("缺少)");
}
else error("数组定义错误");
}
else error("缺少;");
}
else error("变量声明错误");
}
else error("变量声明错误");
}
void declaration_list1(tree *node)
{
if((!strcmp(curentword.type,"INT"))||(!strcmp(curentword.type,"VOID"))||(!strcmp(curentword.type,"ID")))
{
declaration(node);
declaration_list1(node);
}
else if(strcmp(curentword.type,"\0"))error("语法错误");
}
void params(tree *node)
{
int i=0;
while(node->child[i]!=NULL)i++;
if(!strcmp(curentword.type,"VOID"))
{
node->child[i]=makenode(curentword.line,"Para","\0","VOID","\0",0,"\0");
advance();
}
else if(!strcmp(curentword.type,"INT"))
{
param_list(node);
}
}
void compound_stmt(tree *node)
{
if(!strcmp(curentword.type,"LBRACE"))
{
advance();
local_declarations(node);
statement_list(node);
if(!strcmp(curentword.type,"RBRACE"))
{
advance();
}
else error("缺少;");
}
else error("语法错误");
}
void param_list(tree *node)
{
param(node);
param_list1(node);
}
void param_list1(tree *node)
{
if(!strcmp(curentword.type,"COMMA"))
{
advance();
param(node);
param_list1(node);
}
}
void param(tree *node)
{
leaf *leaf;
int i=0;
while(node->child[i]!=NULL)i++;
if(!strcmp(curentword.type,"INT"))
{
advance();
if(!strcmp(curentword.type,"ID"))
{
leaf=makeleaf("ID",curentword.string);
advance();
node->child[i]=makenode(curentword.line,"Para",leaf->ral,"\0",leaf->leaftype,0,"\0");
}
else error("参数声明错误");
}
else error("语法错误");
}
void local_declarations(tree *node)
{
local_declarations1(node);
}
void local_declarations1(tree *node)
{
if(!strcmp(curentword.type,"INT"))
{
var_declaration(node);
local_declarations1(node);
}
}
void statement_list(tree *node)
{
statement_list1(node);
}
void statement_list1(tree *node)
{
if((!strcmp(curentword.type,"ID"))||(!strcmp(curentword.type,"NUMBER"))||(!strcmp(curentword.type,"LPAREN"))||(!strcmp(curentword.type,"IF"))||(!strcmp(curentword.type,"WHILE"))||(!strcmp(curentword.type,"RETURN"))||(!strcmp(curentword.type,"SEMI"))||(!strcmp(curentword.type,"LBRACE")))
{
statement(node);
statement_list1(node);
}
}
void statement(tree *node)
{
if(!strcmp(curentword.type,"LBRACE"))
{
compound_stmt(node);
}
else if(!strcmp(curentword.type,"IF"))
{
if_stmt(node);
}
else if(!strcmp(curentword.type,"WHILE"))
{
while_stmt(node);
}
else if(!strcmp(curentword.type,"RETURN"))
{
return_stmt(node);
}
else expression_stmt(node);
}
void if_stmt(tree *node)
{
int i=0;
while(node->child[i]!=NULL)i++;
if(!strcmp(curentword.type,"IF"))
{
node->child[i]=makenode(curentword.line,"if-stmt","if","\0","\0",0,"\0");
advance();
if(!strcmp(curentword.type,"LPAREN"))
{
advance();
expression(node->child[i]);
if(!strcmp(curentword.type,"RPAREN"))
{
advance();
statement(node->child[i]);
if_stmt1(node->child[i]);
}
else error("缺少)");
}
else error("if语句缺少条件");
}
else error("语法错误");
}
void if_stmt1(tree *node)
{
if(!strcmp(curentword.type,"ELSE"))
{
advance();
statement(node);
}
}
void while_stmt(tree *node)
{
int i=0;
while(node->child[i]!=NULL)i++;
if(!strcmp(curentword.type,"WHILE"))
{
node->child[i]=makenode(curentword.line,"while_stmt","while","\0","\0",0,"\0");
advance();
if(!strcmp(curentword.type,"LPAREN"))
{
advance();
expression(node->child[i]);
if(!strcmp(curentword.type,"RPAREN"))
{
advance();
statement(node->child[i]);
}
else error("缺少)");
}
else error("while语句缺少条件");
}
else error("语法错误");
}
void return_stmt(tree *node)
{
int i=0;
while(node->child[i]!=NULL)i++;
if(!strcmp(curentword.type,"RETURN"))
{
node->child[i]=makenode(curentword.line,"return-stmt","return","\0","\0",0,"\0");
advance();
return_stmt1(node->child[i]);
}
else error("语法错误");
}
void return_stmt1(tree *node)
{
if(!strcmp(curentword.type,"SEMI"))
{
advance();
}
else
{
expression(node);
if(!strcmp(curentword.type,"SEMI"))
{
advance();
}
else error("缺少;");
}
}
void expression_stmt(tree *node)
{
if(!strcmp(curentword.type,"SEMI"))
{
advance();
}
else
{
expression(node);
if(!strcmp(curentword.type,"SEMI"))
{
advance();
}
else error("缺少;");
}
}
void expression(tree *node)
{
leaf *leaf;
int curent;
int i=0;
while(node->child[i]!=NULL)i++;
if(!strcmp(curentword.type,"ID"))
{
curent=num;
leaf=makeleaf("ID",curentword.string);
advance();
if(!strcmp(curentword.type,"ASSIGN"))
{
node->child[i]=makenode(curentword.line,"AssignStm","=","\0","\0",0,"0");
node->child[i]->child[0]=makenode(curentword.line,"VarID",leaf->ral,"\0","\0",0,"\0");
advance();
expression(node->child[i]);
}
else
{
back(curent);
simple_expression(node);
}
}
else simple_expression(node);
}
void simple_expression(tree *node)
{
additive_expression(node);
simple_expression1(node);
}
void additive_expression(tree *node)
{
term(node);
additive_expression1(node);
}
void additive_expression1(tree *node)
{
if((!strcmp(curentword.type,"PLUS"))||(!strcmp(curentword.type,"MINUS")))
{
addop(node);
term(node);
additive_expression1(node);
}
}
void simple_expression1(tree *node)
{
if((!strcmp(curentword.type,"LT"))||(!strcmp(curentword.type,"GT"))||(!strcmp(curentword.type,"EQ"))||(!strcmp(curentword.type,"NEQ"))||(!strcmp(curentword.type,"GTEQ"))||(!strcmp(curentword.type,"LTEQ")))
{
relop(node);
additive_expression(node);
}
}
void relop(tree *node)
{
int i=0;
while(node->child[i]!=NULL)i++;
if(!strcmp(curentword.type,"LTEQ"))
{
node->child[i]=makenode(curentword.line,"relop","LTEQ","\0","\0",0,"\0");
advance();
}
else if(!strcmp(curentword.type,"LT"))
{
node->child[i]=makenode(curentword.line,"relop","LT","\0","\0",0,"\0");
advance();
}
else if(!strcmp(curentword.type,"GT"))
{
node->child[i]=makenode(curentword.line,"relop","GT","\0","\0",0,"\0");
advance();
}
else if(!strcmp(curentword.type,"GTEQ"))
{
node->child[i]=makenode(curentword.line,"relop","GTEQ","\0","\0",0,"\0");
advance();
}
else if(!strcmp(curentword.type,"NEQ"))
{
node->child[i]=makenode(curentword.line,"relop","NEQ","\0","\0",0,"\0");
advance();
}
else if(!strcmp(curentword.type,"EQ"))
{
node->child[i]=makenode(curentword.line,"relop","EQ","\0","\0",0,"\0");
advance();
}
else error("语法错误");
}
void addop(tree *node)
{
int i=0;
while(node->child[i]!=NULL)i++;
if(!strcmp(curentword.type,"PLUS"))
{
node->child[i]=makenode(curentword.line,"addop","PLUS","\0","\0",0,"\0");
advance();
}
else if(!strcmp(curentword.type,"MINUS"))
{
node->child[i]=makenode(curentword.line,"addop","MINUS","\0","\0",0,"\0");
advance();
}
}
void term(tree *node)
{
factor(node);
term1(node);
}
void term1(tree *node)
{
if((!strcmp(curentword.type,"STAR"))||(!strcmp(curentword.type,"SLASH")))
{
mulop(node);
factor(node);
term1(node);
}
}
void mulop(tree *node)
{
int i=0;
while(node->child[i]!=NULL)i++;
if(!strcmp(curentword.type,"STAR"))
{
node->child[i]=makenode(curentword.line,"mulop","STAR","\0","\0",0,"\0");
advance();
}
else if(!strcmp(curentword.type,"SLASH"))
{
node->child[i]=makenode(curentword.line,"mulop","SLASH","\0","\0",0,"\0");
advance();
}
}
void factor(tree *node)
{
leaf *leaf;
int i=0;
while(node->child[i]!=NULL)i++;
if(!strcmp(curentword.type,"LPAREN"))
{
node->child[i]=makenode(curentword.line,"exprssion-in-paren","\0","\0","\0",0,"\0");
advance();
expression(node->child[i]);
if(!strcmp(curentword.type,"RPAREN"))
{
advance();
}
else error("缺少)");
}
else if(!strcmp(curentword.type,"ID"))
{
leaf=makeleaf("ID",curentword.string);
advance();
if(!strcmp(curentword.type,"LPAREN"))
{
node->child[i]=makenode(curentword.line,"FunCall",leaf->ral,"\0","\0",0,"\0");
advance();
args(node->child[i]);
if(!strcmp(curentword.type,"RPAREN"))
{
advance();
}
else error("缺少)");
}
else
{
node->child[i]=makenode(curentword.line,"VarID",leaf->ral,"\0","\0",0,"\0");
}
}
else if(!strcmp(curentword.type,"NUMBER"))
{
leaf=makeleaf("NUMBER",curentword.string);
node->child[i]=makenode(curentword.line,"ConstID",leaf->ral,"\0","\0",0,"\0");
advance();
}
else error("语法错误");
}
void args(tree *node)
{
if((!strcmp(curentword.type,"ID"))||(!strcmp(curentword.type,"NUMBER"))||(!strcmp(curentword.type,"LPAREN")))
{
arg_list(node);
}
}
void arg_list(tree *node)
{
expression(node);
arg_list1(node);
}
void arg_list1(tree *node)
{
if(!strcmp(curentword.type,"COMMA"))
{
advance();
expression(node);
arg_list1(node);
}
}
void error(char err[30])
{
fprintf(fpout,"<%s/>\n",err);
}
void back(int n)
{
curentword=words[n];
num=n;
}
void advance()
{
if(curentword.line==0) exit;
curentword=words[++num];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -