cm_parse.cpp

来自「小型编译系统的源代码」· C++ 代码 · 共 2,361 行 · 第 1/4 页

CPP
2,361
字号
#include <yacc.h>

#define YYPARSEFAST
#line 1 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

#define YYPARSER /* distinguishes Yacc output from other code files */
//#define YYDEBUG

#include "globals.h"
#include "util.h"
#include "scan.h"
#include "parse.h"

#define YYSTYPE TreeNode *

static char * savedName;        /* for use in assignments */
static int savedLineNo;         /* ditto */
static TreeNode * savedTree;    /* stores syntax tree for later return */


#line 22 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
/* repeated because of possible precompiled header */
#include <yacc.h>

#define YYPARSEFAST
#include "CM_parse.h"

#ifndef YYSTYPE
#define YYSTYPE int
#endif
#ifndef YYSTACK_SIZE
#define YYSTACK_SIZE 100
#endif

/* (state) stack */
#if (YYSTACK_SIZE) != 0
static yystack_t YYNEAR yystack[(YYSTACK_SIZE)];
yystack_t YYFAR *YYNEAR YYDCDECL yysstackptr = yystack;
yystack_t YYFAR *YYNEAR YYDCDECL yystackptr = yystack;
#else
yystack_t YYFAR *YYNEAR YYDCDECL yysstackptr = NULL;
yystack_t YYFAR *YYNEAR YYDCDECL yystackptr = NULL;
#endif

/* attribute stack */
#if (YYSTACK_SIZE) != 0
static YYSTYPE YYNEAR yyattributestack[(YYSTACK_SIZE)];
#ifdef YYPROTOTYPE
void YYFAR *YYNEAR YYDCDECL yysattributestackptr = yyattributestack;
void YYFAR *YYNEAR YYDCDECL yyattributestackptr = yyattributestack;
#else
char YYFAR *YYNEAR YYDCDECL yysattributestackptr = (char YYFAR *) yyattributestack;
char YYFAR *YYNEAR YYDCDECL yyattributestackptr = (char YYFAR *) yyattributestack;
#endif
#else
#ifdef YYPROTOTYPE
void YYFAR *YYNEAR YYDCDECL yysattributestackptr = NULL;
void YYFAR *YYNEAR YYDCDECL yyattributestackptr = NULL;
#else
char YYFAR *YYNEAR YYDCDECL yysattributestackptr = NULL;
char YYFAR *YYNEAR YYDCDECL yyattributestackptr = NULL;
#endif
#endif

int YYNEAR YYDCDECL yysstack_size = (YYSTACK_SIZE);
int YYNEAR YYDCDECL yystack_size = (YYSTACK_SIZE);

/* attributes */
YYSTYPE YYNEAR yyval;
YYSTYPE YYNEAR yylval;
#ifdef YYPROTOTYPE
void YYFAR *YYNEAR YYDCDECL yyvalptr = &yyval;
void YYFAR *YYNEAR YYDCDECL yylvalptr = &yylval;
#else
char YYFAR *YYNEAR YYDCDECL yyvalptr = (char *) &yyval;
char YYFAR *YYNEAR YYDCDECL yylvalptr = (char *) &yylval;
#endif

size_t YYNEAR YYDCDECL yyattribute_size = sizeof(YYSTYPE);

/* yyattribute */
#ifdef YYDEBUG
#ifdef YYPROTOTYPE
static YYSTYPE YYFAR *yyattribute1(int index)
#else
static YYSTYPE YYFAR *yyattribute1(index)
int index;
#endif
{
	YYSTYPE YYFAR *p = &((YYSTYPE YYFAR *) yyattributestackptr)[yytop + index];
	return p;
}
#define yyattribute(index) (*yyattribute1(index))
#else
#define yyattribute(index) (((YYSTYPE YYFAR *) yyattributestackptr)[yytop + (index)])
#endif

#ifdef YYDEBUG
#ifdef YYPROTOTYPE
static void yyinitdebug(YYSTYPE YYFAR **p, int count)
#else
static void yyinitdebug(p, count)
YYSTYPE YYFAR **p;
int count;
#endif
{
	int i;
	yyassert(p != NULL);
	yyassert(count >= 1);

	for (i = 0; i < count; i++) {
		p[i] = &((YYSTYPE YYFAR *) yyattributestackptr)[yytop + i - (count - 1)];
	}
}
#endif

#ifdef YYPROTOTYPE
void YYCDECL yyparseaction(int action)
#else
void YYCDECL yyparseaction(action)
int action;
#endif
{
	switch (action) {
	case 0:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 26 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"
 savedTree = yyattribute(1 - 1); 
#line 135 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 1:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[3];
			yyinitdebug(yya, 3);
#endif
			{
#line 29 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"
 
                        YYSTYPE t = yyattribute(1 - 2);
                        if (t!=NULL){
                          while (t->sibling!=NULL)
                            t=t->sibling;
                          t->sibling = yyattribute(2 - 2);
                          yyval = yyattribute(1 - 2);
                        }
                        else 
                          yyval = yyattribute(2 - 2);
                       
#line 158 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 2:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 41 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"
 yyval = 0; 
#line 171 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 3:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 46 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"
 yyval = yyattribute(1 - 1); 
#line 184 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 4:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 48 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"
 yyval = yyattribute(1 - 1); 
#line 197 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 5:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 50 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"
 yyval = yyattribute(1 - 1); 
#line 210 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 6:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[4];
			yyinitdebug(yya, 4);
#endif
			{
#line 53 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

                        yyval = newDeclNode(VarDeclK);
                        yyval->child[0] = yyattribute(1 - 3);
                        yyval->child[1] = yyattribute(2 - 3);
                      
#line 227 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 7:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[4];
			yyinitdebug(yya, 4);
#endif
			{
#line 60 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

												YYSTYPE t = yyattribute(1 - 3);
                        if (t!=NULL){
                          while (t->sibling!=NULL)
                            t=t->sibling;
                          t->sibling = yyattribute(3 - 3);
                          yyval = yyattribute(1 - 3);
                        }
                        else 
                          yyval = yyattribute(3 - 3);
											
#line 250 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 8:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[4];
			yyinitdebug(yya, 4);
#endif
			{
#line 72 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

												YYSTYPE t = yyattribute(1 - 3);
                        if (t!=NULL){
                          while (t->sibling!=NULL)
                            t=t->sibling;
                          t->sibling = yyattribute(3 - 3);
                          yyval = yyattribute(1 - 3);
                        }
                        else
                          yyval = yyattribute(3 - 3);
											
#line 273 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 9:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 84 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

												yyval = yyattribute(1 - 1);
											
#line 288 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 10:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 88 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

												yyval = yyattribute(1 - 1);
											
#line 303 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 11:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[4];
			yyinitdebug(yya, 4);
#endif
			{
#line 92 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"
 yyattribute(3 - 3) = newExpNode(ConstK); yyattribute(3 - 3)->attr.vali = atoi(tokenString); yyattribute(3 - 3)->attr.vartype = Integer; 
#line 316 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 12:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[6];
			yyinitdebug(yya, 6);
#endif
			{
#line 93 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

												yyval = newExpNode(ArrayK);
												yyval->attr.name = yyattribute(1 - 5)->attr.name;
												delete(yyattribute(1 - 5));
                        yyval->child[0] = yyattribute(3 - 5);
											
#line 334 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 13:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 101 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"
 
                        yyval = newExpNode(TypeK);
                        yyval->attr.vartype = Integer;
                      
#line 350 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 14:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 106 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"
 
                        yyval = newExpNode(TypeK);
                        yyval->attr.vartype = Char;
                      
#line 366 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 15:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 111 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

                        yyval = newExpNode(TypeK);
                        yyval->attr.vartype = Float;
                      
#line 382 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 16:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 116 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

                        yyval = newExpNode(TypeK);
                        yyval->attr.vartype = Void;
                      
#line 398 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 17:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 122 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

												yyval = newExpNode(IdK);
												yyval->lineno = lineno;
												yyval->attr.name = copyString(tokenString);
											
#line 415 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 18:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[7];
			yyinitdebug(yya, 7);
#endif
			{
#line 129 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

                        yyval = newDeclNode(FuncDeclK);
                        yyval->child[0] = yyattribute(1 - 6);
                        yyval->child[1] = yyattribute(2 - 6);
                        yyval->child[2] = yyattribute(4 - 6);
                      
#line 433 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 19:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[6];
			yyinitdebug(yya, 6);
#endif
			{
#line 136 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

                        yyval = newDeclNode(FuncDeclK);
                        yyval->child[0] = yyattribute(1 - 5);
                        yyval->child[1] = yyattribute(2 - 5);
                      
#line 450 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 20:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[7];
			yyinitdebug(yya, 7);
#endif
			{
#line 143 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

                        yyval = newDeclNode(FuncDefK);
                        yyval->child[0] = yyattribute(1 - 6);
                        yyval->child[1] = yyattribute(2 - 6);
                        yyval->child[2] = yyattribute(4 - 6);
                        yyval->child[3] = yyattribute(6 - 6);
                      
#line 469 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 21:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[6];
			yyinitdebug(yya, 6);
#endif
			{
#line 151 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

                        yyval = newDeclNode(FuncDefK);
                        yyval->child[0] = yyattribute(1 - 5);
                        yyval->child[1] = yyattribute(2 - 5);
                        yyval->child[3] = yyattribute(5 - 5);
                      
#line 487 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 22:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 159 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"
 yyval = yyattribute(1 - 1); 
#line 500 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 23:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 161 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"
 yyval = 0; 
#line 513 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 24:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 163 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"
 yyval = 0; 
#line 526 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 25:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[4];
			yyinitdebug(yya, 4);
#endif
			{
#line 166 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

                        YYSTYPE t = yyattribute(1 - 3);
                        if (t!=NULL){
                          while (t->sibling!=NULL)
                            t=t->sibling;
                          t->sibling = yyattribute(3 - 3);
                          yyval = yyattribute(1 - 3);
                        }
                        else 
                          yyval = yyattribute(3 - 3);
                      
#line 549 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 26:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[2];
			yyinitdebug(yya, 2);
#endif
			{
#line 178 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"
 yyval = yyattribute(1 - 1); 
#line 562 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 27:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[3];
			yyinitdebug(yya, 3);
#endif
			{
#line 181 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.y"

                        yyval = newDeclNode(ParamK);
                        yyval->child[0] = yyattribute(1 - 2);
                        yyattribute(2 - 2) = newExpNode(IdK);
                        yyattribute(2 - 2)->lineno = lineno;
                        yyattribute(2 - 2)->attr.name = copyString(tokenString);
                        yyattribute(2 - 2)->varK = Norm;
                        yyval->child[1] = yyattribute(2 - 2);
                      
#line 583 "E:\\Myworks\\Compiler\\C_Minus\\CM_parse.c"
			}
		}
		break;
	case 28:
		{
#ifdef YYDEBUG
			YYSTYPE YYFAR *yya[3];
			yyinitdebug(yya, 3);
#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?