⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parser.h

📁 采用递归下降分析法实现C0语言的语法分析器
💻 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 + -