www.pudn.com > calc.rar > old_parse.c
#ifndef lint static char const yyrcsid[] = "$FreeBSD: src/usr.bin/yacc/skeleton.c,v 1.28 2000/01/17 02:04:06 bde Exp $"; #endif #include#define YYBYACC 1 #define YYMAJOR 1 #define YYMINOR 9 #define YYLEX yylex() #define YYEMPTY -1 #define yyclearin (yychar=(YYEMPTY)) #define yyerrok (yyerrflag=0) #define YYRECOVERING() (yyerrflag!=0) static int yygrowstack(); #define YYPREFIX "yy" #line 12 "parse.y" #include #include #include #include #include "integer.h" #include "fun.h" #include "calc.h" #include "stack.h" #define POLYID 'X' union { MPI *mpi; POLYI polyi; } retval; int rettype; /* 0 for nothing, 1 for MPI, 2 for POLYI, 3 for failure of * function */ int yyparse(void); int yylex(void); #line 38 "parse.y" typedef union { MPI *val; /* actual value */ POLYI pol; Stack argStack; MPIA arr; Symbol *sym; /* symbol table pointer */ } YYSTYPE; #line 50 "y.tab.c" #define YYERRCODE 256 #define NUMBER 257 #define POL 258 #define ARGSTACK 259 #define ANARRAY 260 #define ARRAY 261 #define POLYVAR 262 #define VAR 263 #define POLYTERM 264 #define BLTIN 265 #define BLTINV 266 #define BLTINP 267 #define UNDEF 268 #define UNARYMINUS 269 const short yylhs[] = { -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 7, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 9, 9, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, }; const short yylen[] = { 2, 0, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 2, 4, 3, 1, 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 6, 6, 2, 3, 3, 1, 1, 4, 4, 4, 1, 3, 3, 3, 3, 3, 3, 2, 3, 2, 2, 3, 2, 2, 2, 2, 4, 5, 3, 4, 3, 3, 5, 6, }; const short yydefred[] = { 1, 0, 0, 38, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 52, 53, 32, 0, 0, 43, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 3, 6, 9, 0, 0, 0, 0, 0, 0, 8, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 0, 51, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 0, 0, 0, 0, 57, 0, 58, 0, 0, 40, 0, 0, 0, 0, 0, 61, 63, 64, 42, 0, 34, 0, 0, 59, 0, 62, 0, 35, 65, 0, 60, 36, 66, }; const short yydgoto[] = { 1, 69, 32, 16, 33, 59, 19, 118, 71, 27, }; const short yysindex[] = { 0, -10, -1, 0, -75, -29, -43, -60, 6, 6, 6, 34, 0, 34, 5, 41, 50, 78, 469, 83, 0, 16, 34, 34, 34, 34, -37, 0, 0, 0, 4, -166, 0, 0, 64, 21, 368, 19, 34, 34, 34, 34, 34, 34, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 0, 34, 0, 39, 49, 491, 102, 491, 60, 102, 491, -92, 23, 0, -256, -16, 478, 0, 34, 0, 0, 34, -23, 228, -23, 228, -92, -27, -92, -92, -92, -23, 228, -23, 228, -92, -27, -27, -27, -92, 82, -7, 59, 0, 25, 31, -21, -28, 0, -28, 0, 91, -92, 0, 34, 34, 28, 33, -28, 0, 0, 0, 0, 38, 0, 102, -28, 0, 32, 0, 34, 0, 0, -28, 0, 0, 0, }; const short yyrindex[] = { 0, 0, 0, 0, 0, 445, -4, 157, 0, 0, 0, 0, 0, 0, 0, 113, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 0, 0, 454, 0, 0, 534, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 43, 0, 313, 107, 546, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 125, 67, 147, 130, 338, 606, 392, 407, 433, 294, 319, 644, 525, 555, 615, 627, 636, 570, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; const short yygindex[] = { 0, 348, 136, 0, 140, 292, 0, 22, 589, 35, }; #define YYTABLESIZE 716 const short yytable[] = { 12, 68, 43, 13, 67, 99, 39, 100, 11, 20, 68, 23, 13, 55, 42, 44, 21, 11, 24, 40, 113, 42, 42, 112, 41, 102, 40, 38, 101, 39, 13, 41, 22, 39, 25, 11, 39, 39, 39, 39, 39, 39, 42, 39, 28, 29, 26, 40, 38, 42, 39, 45, 41, 10, 42, 42, 13, 42, 42, 42, 46, 11, 73, 40, 38, 13, 39, 53, 41, 121, 11, 43, 120, 128, 13, 42, 127, 24, 43, 11, 40, 38, 124, 39, 10, 41, 42, 10, 47, 39, 39, 40, 38, 56, 39, 72, 41, 42, 37, 43, 95, 97, 40, 38, 55, 39, 42, 41, 24, 57, 24, 24, 24, 75, 98, 43, 108, 11, 110, 42, 109, 39, 111, 107, 40, 38, 122, 39, 42, 41, 54, 33, 43, 40, 38, 44, 39, 15, 41, 42, 26, 17, 96, 43, 40, 38, 129, 39, 11, 41, 43, 11, 0, 0, 43, 43, 43, 45, 43, 0, 43, 0, 0, 125, 0, 44, 44, 13, 44, 44, 44, 26, 37, 26, 26, 26, 43, 0, 0, 50, 0, 0, 0, 0, 116, 43, 0, 45, 45, 0, 45, 45, 45, 0, 13, 0, 43, 13, 13, 13, 13, 13, 13, 0, 13, 0, 50, 43, 0, 50, 50, 50, 50, 50, 50, 0, 50, 0, 44, 0, 3, 0, 0, 0, 66, 5, 6, 7, 8, 3, 10, 0, 0, 66, 5, 6, 7, 8, 0, 10, 45, 37, 0, 0, 0, 0, 2, 3, 37, 0, 44, 4, 5, 6, 7, 8, 9, 10, 0, 0, 39, 0, 50, 50, 0, 52, 0, 0, 55, 37, 50, 0, 45, 3, 0, 51, 42, 30, 5, 6, 7, 8, 3, 10, 0, 37, 30, 5, 6, 7, 8, 3, 10, 18, 50, 30, 5, 6, 7, 8, 0, 10, 37, 34, 23, 36, 0, 0, 0, 0, 0, 0, 0, 37, 61, 0, 64, 0, 70, 0, 0, 0, 53, 37, 37, 0, 0, 0, 0, 18, 77, 79, 81, 0, 23, 23, 0, 23, 23, 23, 86, 88, 90, 91, 92, 0, 37, 0, 46, 14, 0, 0, 0, 37, 37, 37, 0, 37, 0, 31, 18, 35, 18, 18, 18, 0, 37, 0, 0, 58, 60, 62, 63, 65, 0, 46, 0, 43, 46, 46, 46, 46, 46, 46, 0, 46, 76, 78, 80, 82, 83, 84, 0, 70, 0, 70, 85, 87, 89, 60, 60, 93, 47, 94, 70, 52, 37, 0, 55, 74, 50, 48, 70, 49, 0, 51, 0, 48, 0, 70, 105, 0, 0, 106, 0, 0, 0, 0, 0, 47, 0, 46, 47, 47, 47, 47, 47, 47, 37, 47, 0, 0, 0, 49, 48, 0, 105, 48, 48, 48, 48, 48, 48, 0, 48, 12, 117, 119, 0, 0, 0, 0, 53, 46, 21, 0, 0, 0, 0, 0, 49, 0, 117, 49, 49, 49, 49, 49, 49, 54, 49, 0, 12, 0, 0, 47, 12, 12, 12, 12, 12, 21, 12, 0, 0, 21, 21, 21, 21, 21, 48, 21, 0, 0, 0, 0, 52, 0, 0, 55, 0, 50, 48, 0, 49, 52, 51, 47, 55, 104, 50, 48, 103, 49, 0, 51, 49, 0, 52, 0, 0, 55, 48, 50, 48, 22, 49, 17, 51, 12, 17, 0, 17, 17, 14, 17, 0, 17, 21, 0, 0, 0, 0, 0, 0, 0, 16, 0, 49, 0, 0, 0, 0, 53, 0, 28, 22, 0, 22, 22, 22, 14, 53, 0, 14, 14, 14, 14, 14, 14, 30, 14, 0, 16, 0, 53, 16, 16, 16, 16, 16, 16, 28, 16, 17, 28, 28, 28, 28, 28, 28, 15, 28, 0, 0, 0, 0, 30, 0, 0, 30, 30, 30, 30, 30, 30, 27, 30, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 15, 0, 0, 15, 15, 15, 15, 15, 15, 20, 15, 0, 0, 0, 0, 27, 0, 0, 19, 27, 27, 27, 27, 27, 29, 27, 25, 0, 29, 29, 29, 29, 29, 0, 29, 0, 20, 0, 0, 0, 20, 20, 20, 20, 20, 19, 20, 0, 0, 19, 19, 19, 19, 19, 0, 19, 25, 25, 0, 25, 25, 25, 114, 0, 115, 0, 0, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 130, }; const short yycheck[] = { 10, 38, 94, 40, 41, 261, 10, 263, 45, 10, 38, 40, 40, 40, 37, 10, 91, 45, 61, 42, 41, 37, 10, 44, 47, 41, 42, 43, 44, 45, 40, 47, 61, 37, 94, 45, 40, 41, 42, 43, 44, 45, 37, 47, 9, 10, 40, 42, 43, 37, 45, 10, 47, 10, 42, 43, 40, 45, 37, 47, 10, 45, 41, 42, 43, 40, 45, 94, 47, 41, 45, 94, 44, 41, 40, 37, 44, 10, 94, 45, 42, 43, 44, 45, 41, 47, 37, 44, 10, 93, 94, 42, 43, 10, 45, 91, 47, 37, 264, 94, 61, 41, 42, 43, 40, 45, 94, 47, 41, 93, 43, 44, 45, 94, 91, 94, 123, 10, 93, 37, 61, 125, 91, 41, 42, 43, 93, 45, 37, 47, 10, 10, 94, 42, 43, 10, 45, 1, 47, 37, 10, 1, 93, 94, 42, 43, 124, 45, 41, 47, 37, 44, -1, -1, 94, 42, 43, 10, 45, -1, 47, -1, -1, 125, -1, 40, 41, 10, 43, 44, 45, 41, 264, 43, 44, 45, 94, -1, -1, 10, -1, -1, -1, -1, 93, 94, -1, 40, 41, -1, 43, 44, 45, -1, 37, -1, 94, 40, 41, 42, 43, 44, 45, -1, 47, -1, 37, 94, -1, 40, 41, 42, 43, 44, 45, -1, 47, -1, 93, -1, 257, -1, -1, -1, 261, 262, 263, 264, 265, 257, 267, -1, -1, 261, 262, 263, 264, 265, -1, 267, 93, 264, -1, -1, -1, -1, 256, 257, 264, -1, 125, 261, 262, 263, 264, 265, 266, 267, -1, -1, 264, -1, 93, 94, -1, 37, -1, -1, 40, 264, 42, -1, 125, 257, -1, 47, 264, 261, 262, 263, 264, 265, 257, 267, -1, 264, 261, 262, 263, 264, 265, 257, 267, 1, 125, 261, 262, 263, 264, 265, -1, 267, 264, 11, 10, 13, -1, -1, -1, -1, -1, -1, -1, 264, 22, -1, 24, -1, 26, -1, -1, -1, 94, 10, 264, -1, -1, -1, -1, 10, 38, 39, 40, -1, 40, 41, -1, 43, 44, 45, 48, 49, 50, 51, 52, -1, 264, -1, 10, 1, -1, -1, -1, 40, 41, 264, -1, 44, -1, 11, 41, 13, 43, 44, 45, -1, 264, -1, -1, 21, 22, 23, 24, 25, -1, 37, -1, 264, 40, 41, 42, 43, 44, 45, -1, 47, 38, 39, 40, 41, 42, 43, -1, 101, -1, 103, 48, 49, 50, 51, 52, 53, 10, 55, 112, 37, 93, -1, 40, 41, 42, 43, 120, 45, -1, 47, -1, 10, -1, 127, 72, -1, -1, 75, -1, -1, -1, -1, -1, 37, -1, 93, 40, 41, 42, 43, 44, 45, 125, 47, -1, -1, -1, 10, 37, -1, 98, 40, 41, 42, 43, 44, 45, -1, 47, 10, 108, 109, -1, -1, -1, -1, 94, 125, 10, -1, -1, -1, -1, -1, 37, -1, 124, 40, 41, 42, 43, 44, 45, 10, 47, -1, 37, -1, -1, 93, 41, 42, 43, 44, 45, 37, 47, -1, -1, 41, 42, 43, 44, 45, 93, 47, -1, -1, -1, -1, 37, -1, -1, 40, -1, 42, 43, -1, 45, 37, 47, 125, 40, 41, 42, 43, 44, 45, -1, 47, 93, -1, 37, -1, -1, 40, 125, 42, 43, 10, 45, 37, 47, 94, 40, -1, 42, 43, 10, 45, -1, 47, 94, -1, -1, -1, -1, -1, -1, -1, 10, -1, 125, -1, -1, -1, -1, 94, -1, 10, 41, -1, 43, 44, 45, 37, 94, -1, 40, 41, 42, 43, 44, 45, 10, 47, -1, 37, -1, 94, 40, 41, 42, 43, 44, 45, 37, 47, 94, 40, 41, 42, 43, 44, 45, 10, 47, -1, -1, -1, -1, 37, -1, -1, 40, 41, 42, 43, 44, 45, 10, 47, -1, -1, -1, -1, -1, -1, -1, 10, -1, -1, 37, -1, -1, 40, 41, 42, 43, 44, 45, 10, 47, -1, -1, -1, -1, 37, -1, -1, 10, 41, 42, 43, 44, 45, 37, 47, 10, -1, 41, 42, 43, 44, 45, -1, 47, -1, 37, -1, -1, -1, 41, 42, 43, 44, 45, 37, 47, -1, -1, 41, 42, 43, 44, 45, -1, 47, 40, 41, -1, 43, 44, 45, 101, -1, 103, -1, -1, -1, -1, -1, -1, -1, -1, 112, -1, -1, -1, -1, -1, -1, -1, 120, -1, -1, -1, -1, -1, -1, 127, }; #define YYFINAL 1 #ifndef YYDEBUG #define YYDEBUG 0 #endif #define YYMAXTOKEN 269 #if YYDEBUG const char * const yyname[] = { "end-of-file",0,0,0,0,0,0,0,0,0,"'\\n'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,"'%'","'&'",0,"'('","')'","'*'","'+'","','","'-'",0,"'/'",0,0,0,0,0, 0,0,0,0,0,0,0,0,"'='",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, "'['",0,"']'","'^'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, "'{'",0,"'}'",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"NUMBER","POL","ARGSTACK","ANARRAY","ARRAY", "POLYVAR","VAR","POLYTERM","BLTIN","BLTINV","BLTINP","UNDEF","UNARYMINUS", }; const char * const yyrule[] = { "$accept : list", "list :", "list : list '\\n'", "list : list varassign '\\n'", "list : list arrayassign '\\n'", "list : list expr '\\n'", "list : list VOID '\\n'", "list : list error '\\n'", "list : list polyexpr '\\n'", "list : list polyassign '\\n'", "polyassign : POLYVAR '=' polyexpr", "polyassign : VAR '=' polyexpr", "polyexpr : POLYVAR", "polyexpr : POLYTERM", "polyexpr : expr POLYTERM", "polyexpr : expr POLYTERM '^' expr", "polyexpr : POLYTERM '^' expr", "polyexpr : polyassign", "polyexpr : polyexpr '+' polyexpr", "polyexpr : polyexpr '%' polyexpr", "polyexpr : polyexpr '/' polyexpr", "polyexpr : '-' polyexpr", "polyexpr : polyexpr '-' polyexpr", "polyexpr : polyexpr '+' expr", "polyexpr : expr '+' polyexpr", "polyexpr : polyexpr '-' expr", "polyexpr : expr '-' polyexpr", "polyexpr : expr '*' polyexpr", "polyexpr : polyexpr '*' expr", "polyexpr : polyexpr '*' polyexpr", "polyexpr : polyexpr '^' expr", "polyexpr : '(' polyexpr ')'", "polyexpr : BLTINP arglist", "arrayassign : ARRAY '[' expr ']' '=' expr", "arrayassign : ARRAY '[' ']' '=' '{' arraylist", "arraylist : expr '}'", "arraylist : expr ',' arraylist", "varassign : VAR '=' expr", "expr : NUMBER", "expr : VAR", "expr : polyexpr '(' expr ')'", "expr : POLYVAR '(' expr ')'", "expr : ARRAY '[' expr ']'", "expr : varassign", "expr : expr '+' expr", "expr : expr '-' expr", "expr : expr '*' expr", "expr : expr '/' expr", "expr : expr '%' expr", "expr : expr '^' expr", "expr : '-' expr", "expr : '(' expr ')'", "expr : BLTIN arglist", "VOID : BLTINV arglist", "VOID : ARRAY '[' ']'", "arglist : '(' ')'", "arglist : '(' arguments", "arguments : expr ')'", "arguments : polyexpr ')'", "arguments : ARRAY '[' ']' ')'", "arguments : '&' ARRAY '[' ']' ')'", "arguments : '&' VAR ')'", "arguments : '&' VAR ',' arguments", "arguments : expr ',' arguments", "arguments : polyexpr ',' arguments", "arguments : ARRAY '[' ']' ',' arguments", "arguments : '&' ARRAY '[' ']' ',' arguments", }; #endif #if YYDEBUG #include #endif #ifdef YYSTACKSIZE #undef YYMAXDEPTH #define YYMAXDEPTH YYSTACKSIZE #else #ifdef YYMAXDEPTH #define YYSTACKSIZE YYMAXDEPTH #else #define YYSTACKSIZE 10000 #define YYMAXDEPTH 10000 #endif #endif #define YYINITSTACKSIZE 200 int yydebug; int yynerrs; int yyerrflag; int yychar; short *yyssp; YYSTYPE *yyvsp; YYSTYPE yyval; YYSTYPE yylval; short *yyss; short *yysslim; YYSTYPE *yyvs; int yystacksize; #line 562 "parse.y" static char *p; static Stack argStack =NULL; void Parse(s) char *s; { p = s; argStack = stackNew(); yyparse(); switch (rettype) { case RET_MPI: FREEMPI(retval.mpi); break; case RET_POLY: DELETEPI(retval.polyi); break; } rettype=RET_NULL; stackFree(&argStack); } /* Checks if the arguments contained in the source stack match the arguments * of the function whose information is stored in the supplied symbol. * If the arguments match then the function returns a variable stack that * can be sent straight to a wrapper function (see note at top of file) * If the arguments do not match then an error message is printed, and the * function returns NULL. * Regardless of whether the match is successful or not, all the arguments on * the globar variable argStack are popped, leaving an empty stack. */ Stack checkArgs(Symbol *s) { Stack varStack=stackNew(); Stack tmpStack=stackNew(); int *argTypes = s->argTypes; int nArgs=argTypes[0]; int quitFlag=0; int i; Argument Arg=NULL; for (i=1; ; i++) { if (i > nArgs && stackEmpty(argStack)) break; if (!stackEmpty(argStack)) Arg = stackPop(argStack); else quitFlag = 1; /* This means there are too few arguments sent to this * function */ /* oh no! we quit if this is true */ if (quitFlag == 1 || Arg->type != argTypes[i]) { /* short circuit eval! */ int j; /* pop all entries off argument stack */ if (!quitFlag) { /* only free these if the reason we are exiting is * that there are too few Arguments */ freeArg(Arg); while (!stackEmpty(argStack)) { Arg = stackPop(argStack); freeArg(Arg); } } /* pop all entries off stack to be returned * It is helpful that i contains a value one greater than the number * of elements on the stack to be returned. */ while (!stackEmpty(tmpStack)) { Arg = stackPop(tmpStack); switch(Arg->type) { case NUM: FREEMPI(Arg->u.num); break; case POLY: DELETEPI(Arg->u.poly); break; /* we do not free arrays, array address or variable addresses */ } } printf("This function has the format: %s(", s->name); if (nArgs > 0) { for (j=1;j<=nArgs;j++) { switch(argTypes[j]) { case NUM: printf("number"); break; case VARADR: printf("&var"); break; case ARR: printf("array[]"); break; case ARRADR: printf("&array[]"); break; case POLY: printf("poly"); break; } if (j!=nArgs) printf(", "); else printf(")\n"); } } else printf(")\n"); stackFree(&tmpStack); return NULL; } stackPush(tmpStack, Arg); /* put it back in the stack. in reverse order */ } while (!stackEmpty(tmpStack)) { Arg = stackPop(tmpStack); switch(Arg->type) { case NUM: stackPush(varStack, Arg->u.num); break; case VARADR: if ( Arg->defined == 1) /* if the variable has previously been assigned. */ FREEMPI(*(Arg->u.varAdr)); stackPush(varStack, Arg->u.varAdr); break; case ARR: stackPush(varStack, Arg->u.array); break; case ARRADR: if ( Arg->defined == 1) /* if the variable has previously been assigned. */ FREEMPIA(*(Arg->u.arrayAdr)); stackPush(varStack, Arg->u.arrayAdr); break; case POLY: stackPush(varStack, Arg->u.poly); break; } } stackFree(&tmpStack); return varStack; } int yylex() { MPI *Temp; char c; int typ; while ((c = *p++) == ' ' || c == '\t') ; if (c == '\0') return 0; if (isdigit((int)c)) { yylval.val = CHANGE((USL)(c - '0')); while (isdigit((int)*p)) { Temp = yylval.val; yylval.val = MULT_I(yylval.val, 10L); FREEMPI(Temp); Temp = yylval.val; yylval.val = ADD0_I(yylval.val, (USL)(*p++ - '0')); FREEMPI(Temp); } return NUMBER; } p--; if ( isalpha((int)c)) { Symbol *s; char sbuf[100], *tmp = sbuf; do { *tmp++ = *p; p++; c=(*p); } while (c && isalnum((int)c)); *tmp = '\0'; if(c=='[') typ=ARRAY; else if ( (c=='^' && *(tmp-1) == POLYID && (tmp-1) == sbuf ) || (*(p-1)==POLYID && strlen(sbuf) == 1 )) { return POLYTERM; /* don't want to install this */ } else typ=VAR; s = lookup(sbuf,typ); if (s == NULL) s = lookup(sbuf, BLTIN); if (s == NULL) s = lookup(sbuf, BLTINV); if (s == NULL) s = lookup(sbuf, BLTINP); if (s == NULL) s = lookup(sbuf,POLYVAR); if (s == NULL) s = install(sbuf, UNDEF); yylval.sym = s; if (s->type == UNDEF) return(typ); else return (s->type); } p++; return (int)c; /* returns +, -, ^, *, / etc */ } void yyerror(s) char *s; { warning(s,""); } #line 617 "y.tab.c" /* allocate initial stack or double stack size, up to YYMAXDEPTH */ static int yygrowstack() { int newsize, i; short *newss; YYSTYPE *newvs; if ((newsize = yystacksize) == 0) newsize = YYINITSTACKSIZE; else if (newsize >= YYMAXDEPTH) return -1; else if ((newsize *= 2) > YYMAXDEPTH) newsize = YYMAXDEPTH; i = yyssp - yyss; newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) : (short *)malloc(newsize * sizeof *newss); if (newss == NULL) return -1; yyss = newss; yyssp = newss + i; newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) : (YYSTYPE *)malloc(newsize * sizeof *newvs); if (newvs == NULL) return -1; yyvs = newvs; yyvsp = newvs + i; yystacksize = newsize; yysslim = yyss + newsize - 1; return 0; } #define YYABORT goto yyabort #define YYREJECT goto yyabort #define YYACCEPT goto yyaccept #define YYERROR goto yyerrlab #ifndef YYPARSE_PARAM #if defined(__cplusplus) || __STDC__ #define YYPARSE_PARAM_ARG void #define YYPARSE_PARAM_DECL #else /* ! ANSI-C/C++ */ #define YYPARSE_PARAM_ARG #define YYPARSE_PARAM_DECL #endif /* ANSI-C/C++ */ #else /* YYPARSE_PARAM */ #ifndef YYPARSE_PARAM_TYPE #define YYPARSE_PARAM_TYPE void * #endif #if defined(__cplusplus) || __STDC__ #define YYPARSE_PARAM_ARG YYPARSE_PARAM_TYPE YYPARSE_PARAM #define YYPARSE_PARAM_DECL #else /* ! ANSI-C/C++ */ #define YYPARSE_PARAM_ARG YYPARSE_PARAM #define YYPARSE_PARAM_DECL YYPARSE_PARAM_TYPE YYPARSE_PARAM; #endif /* ANSI-C/C++ */ #endif /* ! YYPARSE_PARAM */ int yyparse (YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { register int yym, yyn, yystate; #if YYDEBUG register const char *yys; if ((yys = getenv("YYDEBUG"))) { yyn = *yys; if (yyn >= '0' && yyn <= '9') yydebug = yyn - '0'; } #endif yynerrs = 0; yyerrflag = 0; yychar = (-1); if (yyss == NULL && yygrowstack()) goto yyoverflow; yyssp = yyss; yyvsp = yyvs; *yyssp = yystate = 0; yyloop: if ((yyn = yydefred[yystate])) goto yyreduce; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, yystate, yychar, yys); } #endif } if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { #if YYDEBUG if (yydebug) printf("%sdebug: state %d, shifting to state %d\n", YYPREFIX, yystate, yytable[yyn]); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; yychar = (-1); if (yyerrflag > 0) --yyerrflag; goto yyloop; } if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { yyn = yytable[yyn]; goto yyreduce; } if (yyerrflag) goto yyinrecovery; #if defined(lint) || defined(__GNUC__) goto yynewerror; #endif yynewerror: yyerror("syntax error"); #if defined(lint) || defined(__GNUC__) goto yyerrlab; #endif yyerrlab: ++yynerrs; yyinrecovery: if (yyerrflag < 3) { yyerrflag = 3; for (;;) { if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) { #if YYDEBUG if (yydebug) printf("%sdebug: state %d, error recovery shifting\ to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; goto yyloop; } else { #if YYDEBUG if (yydebug) printf("%sdebug: error recovery discarding state %d\n", YYPREFIX, *yyssp); #endif if (yyssp <= yyss) goto yyabort; --yyssp; --yyvsp; } } } else { if (yychar == 0) goto yyabort; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, error recovery discards token %d (%s)\n", YYPREFIX, yystate, yychar, yys); } #endif yychar = (-1); goto yyloop; } yyreduce: #if YYDEBUG if (yydebug) printf("%sdebug: state %d, reducing by rule %d (%s)\n", YYPREFIX, yystate, yyn, yyrule[yyn]); #endif yym = yylen[yyn]; yyval = yyvsp[1-yym]; switch (yyn) { case 3: #line 64 "parse.y" { retval.mpi = yyvsp[-1].val; rettype=RET_MPI; } break; case 4: #line 69 "parse.y" { rettype=RET_MPIA; } break; case 5: #line 73 "parse.y" { retval.mpi = yyvsp[-1].val; if (!(rettype == FUNC_FAIL)) { PRINTI(yyvsp[-1].val); printf("\n"); } rettype = RET_MPI; } break; case 6: #line 84 "parse.y" { rettype=0; } break; case 7: #line 88 "parse.y" { yyerrok; } break; case 8: #line 92 "parse.y" { retval.polyi=yyvsp[-1].pol; if (!(rettype == FUNC_FAIL)) { PRINTPI(yyvsp[-1].pol); printf("\n"); } rettype=RET_POLY; } break; case 9: #line 101 "parse.y" { retval.polyi = yyvsp[-1].pol; rettype=RET_POLY; } break; case 10: #line 108 "parse.y" { DELETEPI(yyvsp[-2].sym->u.sympval); yyvsp[-2].sym->u.sympval=yyvsp[0].pol; yyval.pol = COPYPI(yyvsp[0].pol); } break; case 11: #line 114 "parse.y" { if (yyvsp[-2].sym->type == VAR) FREEMPI(yyvsp[-2].sym->u.symval); yyvsp[-2].sym->u.sympval = yyvsp[0].pol; yyvsp[-2].sym->type=POLYVAR; yyval.pol=COPYPI(yyvsp[0].pol); } break; case 12: #line 123 "parse.y" { if (yyvsp[0].sym->type == UNDEF) execerror("is an undefined variable", yyvsp[0].sym->name); else if( yyvsp[0].sym->u.sympval != (POLYI) NULL) yyval.pol = COPYPI(yyvsp[0].sym->u.sympval); else yyval.pol = (POLYI) NULL; } break; case 13: #line 132 "parse.y" { MPI *ONE; ONE = ONEI(); yyval.pol = NULL; PINSERTPI(1, ONE, &yyval.pol, 1); FREEMPI(ONE); } break; case 14: #line 140 "parse.y" { yyval.pol = NULL; PINSERTPI(1, yyvsp[-1].val, &yyval.pol, 1); FREEMPI(yyvsp[-1].val); } break; case 15: #line 146 "parse.y" { yyval.pol = NULL; PINSERTPI(CONVERTI(yyvsp[0].val), yyvsp[-3].val, &yyval.pol,1); FREEMPI(yyvsp[-3].val); FREEMPI(yyvsp[0].val); } break; case 16: #line 154 "parse.y" { MPI *O; O = ONEI(); yyval.pol = NULL; PINSERTPI(CONVERTI(yyvsp[0].val), O, &yyval.pol,1); FREEMPI(O); FREEMPI(yyvsp[0].val); } break; case 17: #line 163 "parse.y" { } break; case 18: #line 166 "parse.y" { yyval.pol = ADDPI(yyvsp[-2].pol,yyvsp[0].pol); DELETEPI(yyvsp[-2].pol); DELETEPI(yyvsp[0].pol); } break; case 19: #line 173 "parse.y" { yyval.pol = MODPI(yyvsp[-2].pol,yyvsp[0].pol); DELETEPI(yyvsp[-2].pol); DELETEPI(yyvsp[0].pol); } break; case 20: #line 180 "parse.y" { yyval.pol = DIVPI(yyvsp[-2].pol, yyvsp[0].pol); DELETEPI(yyvsp[-2].pol); DELETEPI(yyvsp[0].pol); } break; case 21: #line 186 "parse.y" { POLYI Z; Z = ZEROPI(); /* returns zero polynomial */ yyval.pol = SUBPI(Z, yyvsp[0].pol); DELETEPI(Z); DELETEPI(yyvsp[0].pol); } break; case 22: #line 194 "parse.y" { yyval.pol = SUBPI(yyvsp[-2].pol, yyvsp[0].pol); DELETEPI(yyvsp[-2].pol); DELETEPI(yyvsp[0].pol); } break; case 23: #line 200 "parse.y" { POLYI O, P; O = ONEPI(); P = SCALARPI(yyvsp[0].val, O); yyval.pol = ADDPI(yyvsp[-2].pol, P); DELETEPI(O); DELETEPI(P); DELETEPI(yyvsp[-2].pol); FREEMPI(yyvsp[0].val); } break; case 24: #line 211 "parse.y" { POLYI O, P; O = ONEPI(); P = SCALARPI(yyvsp[-2].val, O); yyval.pol = ADDPI(yyvsp[0].pol, P); DELETEPI(O); DELETEPI(P); DELETEPI(yyvsp[0].pol); FREEMPI(yyvsp[-2].val); } break; case 25: #line 223 "parse.y" { POLYI O, P; O = ONEPI(); P = SCALARPI(yyvsp[0].val, O); yyval.pol = SUBPI(yyvsp[-2].pol, P); DELETEPI(O); DELETEPI(P); DELETEPI(yyvsp[-2].pol); FREEMPI(yyvsp[0].val); } break; case 26: #line 234 "parse.y" { POLYI O, P; O = ONEPI(); P = SCALARPI(yyvsp[-2].val, O); yyval.pol = SUBPI(P, yyvsp[0].pol); DELETEPI(O); DELETEPI(P); DELETEPI(yyvsp[0].pol); FREEMPI(yyvsp[-2].val); } break; case 27: #line 245 "parse.y" { yyval.pol = SCALARPI(yyvsp[-2].val,yyvsp[0].pol); FREEMPI(yyvsp[-2].val); DELETEPI(yyvsp[0].pol); } break; case 28: #line 251 "parse.y" { yyval.pol = SCALARPI(yyvsp[0].val, yyvsp[-2].pol); FREEMPI(yyvsp[0].val); DELETEPI(yyvsp[-2].pol); } break; case 29: #line 257 "parse.y" { yyval.pol = MULTPI(yyvsp[-2].pol, yyvsp[0].pol); DELETEPI(yyvsp[-2].pol); DELETEPI(yyvsp[0].pol); } break; case 30: #line 263 "parse.y" { yyval.pol = POWERPI(yyvsp[-2].pol, CONVERTI(yyvsp[0].val)); DELETEPI(yyvsp[-2].pol); FREEMPI(yyvsp[0].val); } break; case 31: #line 269 "parse.y" { yyval.pol = yyvsp[-1].pol; } break; case 32: #line 273 "parse.y" { Stack varStack; if ((varStack = checkArgs(yyvsp[-1].sym))) { yyval.pol = (*(yyvsp[-1].sym->u.ptrp))(varStack); stackFree(&varStack); } else { rettype = FUNC_FAIL; /* return failure of function */ yyval.pol = NULL; } } break; case 33: #line 290 "parse.y" { unsigned n = CONVERTI(yyvsp[-3].val); if (yyvsp[-5].sym->type == UNDEF) { yyvsp[-5].sym->u.symarr = BUILDMPIA(); yyvsp[-5].sym->type = ARRAY; } ADD_TO_MPIA(yyvsp[-5].sym->u.symarr, yyvsp[0].val, n); FREEMPI(yyvsp[-3].val); FREEMPI(yyvsp[0].val); } break; case 34: #line 302 "parse.y" { if (yyvsp[-5].sym->type != UNDEF) FREEMPIA(yyvsp[-5].sym->u.symarr); yyvsp[-5].sym->u.symarr = yyvsp[0].arr; yyvsp[-5].sym->type=ARRAY; } break; case 35: #line 310 "parse.y" { yyval.arr = BUILDMPIA(); ADD_TO_MPIA(yyval.arr, yyvsp[-1].val, 0); FREEMPI(yyvsp[-1].val); } break; case 36: #line 316 "parse.y" { MPIA_INSERT(yyvsp[0].arr, yyvsp[-2].val, 0); FREEMPI(yyvsp[-2].val); yyval.arr = yyvsp[0].arr; } break; case 37: #line 323 "parse.y" { if(yyvsp[-2].sym->type!=UNDEF && yyvsp[-2].sym->u.symval != NULL) FREEMPI(yyvsp[-2].sym->u.symval); yyvsp[-2].sym->u.symval=yyvsp[0].val; if ( yyvsp[-2].sym->u.symval != (MPI *) NULL) yyval.val = COPYI(yyvsp[-2].sym->u.symval); else yyval.val = (MPI *) NULL; yyvsp[-2].sym->type = VAR; } break; case 38: #line 334 "parse.y" { yyval.val = yyvsp[0].val; } break; case 39: #line 338 "parse.y" { if (yyvsp[0].sym->type == UNDEF) execerror("is an undefined variable", yyvsp[0].sym->name); else yyval.val = COPYI(yyvsp[0].sym->u.symval); } break; case 40: #line 350 "parse.y" { yyval.val = VALPI(yyvsp[-3].pol, yyvsp[-1].val); FREEMPI(yyvsp[-1].val); DELETEPI(yyvsp[-3].pol); } break; case 41: #line 356 "parse.y" { yyval.val = VALPI(yyvsp[-3].sym->u.sympval, yyvsp[-1].val); FREEMPI(yyvsp[-1].val); } break; case 42: #line 361 "parse.y" { int ind; if (yyvsp[-3].sym->type == UNDEF) { FREEMPI(yyvsp[-1].val); execerror("[] is an undefined array", yyvsp[-3].sym->name); } ind = (int)CONVERTI(yyvsp[-1].val); if(ind >= yyvsp[-3].sym->u.symarr->size) { FREEMPI(yyvsp[-1].val); execerror("array is too small", yyvsp[-3].sym->name); } yyval.val = COPYI(yyvsp[-3].sym->u.symarr->A[ind]); FREEMPI(yyvsp[-1].val); } break; case 43: #line 378 "parse.y" { } break; case 44: #line 381 "parse.y" { yyval.val = ADDI(yyvsp[-2].val, yyvsp[0].val); FREEMPI(yyvsp[-2].val); FREEMPI(yyvsp[0].val); } break; case 45: #line 387 "parse.y" { yyval.val = SUBI(yyvsp[-2].val, yyvsp[0].val); FREEMPI(yyvsp[-2].val); FREEMPI(yyvsp[0].val); } break; case 46: #line 393 "parse.y" { yyval.val = MULTI(yyvsp[-2].val, yyvsp[0].val); FREEMPI(yyvsp[-2].val); FREEMPI(yyvsp[0].val); } break; case 47: #line 399 "parse.y" { if((yyvsp[0].val)->S <= 0) { FREEMPI(yyvsp[-2].val); FREEMPI(yyvsp[0].val); execerror(" divisor <= 0", ""); } yyval.val = INTI(yyvsp[-2].val, yyvsp[0].val); FREEMPI(yyvsp[-2].val); FREEMPI(yyvsp[0].val); } break; case 48: #line 411 "parse.y" { if((yyvsp[0].val)->S <= 0) { FREEMPI(yyvsp[-2].val); FREEMPI(yyvsp[0].val); execerror(" divisor <= 0", ""); } yyval.val = MOD(yyvsp[-2].val, yyvsp[0].val); FREEMPI(yyvsp[-2].val); FREEMPI(yyvsp[0].val); } break; case 49: #line 423 "parse.y" { if ((yyvsp[0].val)->S < 0) { FREEMPI(yyvsp[-2].val); FREEMPI(yyvsp[0].val); execerror("negative exponent", ""); } if ((yyvsp[0].val)->D > 0) { FREEMPI(yyvsp[-2].val); FREEMPI(yyvsp[0].val); execerror("exponent >= R0", ""); } yyval.val = POWERI(yyvsp[-2].val, (unsigned int)(CONVERTI(yyvsp[0].val))); FREEMPI(yyvsp[-2].val); FREEMPI(yyvsp[0].val); } break; case 50: #line 435 "parse.y" { yyval.val = MINUSI(yyvsp[0].val); FREEMPI(yyvsp[0].val); } break; case 51: #line 440 "parse.y" { yyval.val = yyvsp[-1].val; } break; case 52: #line 444 "parse.y" { Stack varStack; if ((varStack = checkArgs(yyvsp[-1].sym))) { yyval.val = (*(yyvsp[-1].sym->u.ptr))(varStack); stackFree(&varStack); } else { yyval.val = NULL; rettype = FUNC_FAIL; } } break; case 53: #line 457 "parse.y" { Stack varStack; if ((varStack = checkArgs(yyvsp[-1].sym))) { (*(yyvsp[-1].sym->u.ptrv))(varStack); stackFree(&varStack); } else { rettype = FUNC_FAIL; } } break; case 54: #line 467 "parse.y" { if (yyvsp[-2].sym->type != UNDEF){ PRINTIA(yyvsp[-2].sym->u.symarr); } else { execerror("undefined array", yyvsp[-2].sym->name ); } } break; case 55: #line 476 "parse.y" { } break; case 56: #line 479 "parse.y" { } break; case 57: #line 484 "parse.y" { stackPush(argStack, createArg(yyvsp[-1].val, NUM, 0)); } break; case 58: #line 488 "parse.y" { stackPush(argStack, createArg(yyvsp[-1].pol, POLY, 0)); } break; case 59: #line 492 "parse.y" { if (yyvsp[-3].sym->type != UNDEF) { stackPush(argStack, createArg(yyvsp[-3].sym, ARR, 0)); } else { execerror("[] is an undefined array", yyvsp[-3].sym->name); rettype = FUNC_FAIL; } } break; case 60: #line 501 "parse.y" { /* S.Seefried. Normally one would free an old array if it * existed. I have deferred this until I am sure all arguments * on the command line are valid for the function in question. * See checkArgs. It is here that I free. */ if (yyvsp[-3].sym->type != UNDEF) stackPush(argStack, createArg(yyvsp[-3].sym, ARRADR, 1)); else stackPush(argStack, createArg(yyvsp[-3].sym, ARRADR, 0)); yyvsp[-3].sym->type=ARRAY; } break; case 61: #line 514 "parse.y" { if (yyvsp[-1].sym->type != UNDEF) stackPush(argStack, createArg(yyvsp[-1].sym, VARADR, 1)); else stackPush(argStack, createArg(yyvsp[-1].sym, VARADR, 0)); yyvsp[-1].sym->type=VAR; } break; case 62: #line 524 "parse.y" { if (yyvsp[-2].sym->type != UNDEF) stackPush(argStack, createArg(yyvsp[-2].sym, VARADR, 1)); else stackPush(argStack, createArg(yyvsp[-2].sym, VARADR, 0)); yyvsp[-2].sym->type=VAR; } break; case 63: #line 532 "parse.y" { stackPush(argStack, createArg(yyvsp[-2].val, NUM, 0)); } break; case 64: #line 536 "parse.y" { stackPush(argStack, createArg(yyvsp[-2].pol, POLY, 0)); } break; case 65: #line 540 "parse.y" { if (yyvsp[-4].sym->type != UNDEF) { stackPush(argStack, createArg(yyvsp[-4].sym, ARR, 0)); } else { rettype = FUNC_FAIL; } } break; case 66: #line 548 "parse.y" { /* S.Seefried. Normally one would free an old array if it * existed. I have deferred this until I am sure all arguments * on the command line are valid for the function in question. * See checkArgs. It is here that I free. */ if (yyvsp[-4].sym->type != UNDEF) stackPush(argStack, createArg(yyvsp[-4].sym, ARRADR, 1)); else stackPush(argStack, createArg(yyvsp[-4].sym, ARRADR, 0)); yyvsp[-4].sym->type=ARRAY; } break; #line 1414 "y.tab.c" } yyssp -= yym; yystate = *yyssp; yyvsp -= yym; yym = yylhs[yyn]; if (yystate == 0 && yym == 0) { #if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state 0 to\ state %d\n", YYPREFIX, YYFINAL); #endif yystate = YYFINAL; *++yyssp = YYFINAL; *++yyvsp = yyval; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, YYFINAL, yychar, yys); } #endif } if (yychar == 0) goto yyaccept; goto yyloop; } if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yystate) yystate = yytable[yyn]; else yystate = yydgoto[yym]; #if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state %d \ to state %d\n", YYPREFIX, *yyssp, yystate); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate; *++yyvsp = yyval; goto yyloop; yyoverflow: yyerror("yacc stack overflow"); yyabort: return (1); yyaccept: return (0); }