#include #ifndef lint #if 0 static char yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93"; #else __IDSTRING(yyrcsid, "$NetBSD: skeleton.c,v 1.14 1997/10/20 03:41:16 lukem Exp $"); #endif #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) #define YYPREFIX "yy" #line 2 "hexcalc.y" #include "hexcalc.h" #line 5 "hexcalc.y" typedef union /* stack type */ { BASE_TYPE val; /* actual value */ Symbol *sym; /* symbol table pointer */ } YYSTYPE; #line 28 "y.tab.c" #define NUMBER 257 #define CONST 258 #define VAR 259 #define BLTIN 260 #define UNDEF 261 #define QUIT 262 #define HELP 263 #define CHRADIX 264 #define LSH 265 #define RSH 266 #define UNARYMINUS 267 #define POW 268 #define YYERRCODE 256 short yylhs[] = { -1, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, }; short yylen[] = { 2, 0, 2, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, }; short yydefred[] = { 1, 0, 0, 10, 11, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 8, 0, 0, 6, 5, 7, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 3, 0, 0, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, }; short yydgoto[] = { 1, 14, 23, }; short yysindex[] = { 0, 113, -9, 0, 0, -55, -25, 7, 10, 14, 23, 23, 0, 23, 1, 15, 0, 23, 23, 0, 0, 0, -242, 0, -242, 144, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 0, 0, 133, 155, 0, 178, -35, -24, 203, 203, -33, -33, -242, -242, -242, -242, 0, }; short yyrindex[] = { 0, 0, 0, 0, 0, -10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 167, 0, 0, 0, 0, 0, 0, 12, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, 0, -5, 94, 224, 50, 71, 89, 123, 35, 60, 79, 100, 0, }; short yygindex[] = { 0, 446, 28, }; #define YYTABLESIZE 482 short yytable[] = { 12, 16, 35, 28, 35, 17, 17, 33, 31, 33, 32, 37, 34, 35, 34, 18, 9, 19, 33, 31, 20, 32, 27, 34, 21, 38, 36, 12, 12, 15, 0, 12, 12, 12, 28, 12, 17, 12, 35, 28, 0, 0, 0, 33, 31, 22, 32, 9, 34, 27, 27, 0, 0, 27, 27, 27, 0, 27, 0, 27, 15, 28, 28, 13, 0, 28, 28, 28, 10, 28, 23, 28, 22, 22, 0, 0, 22, 22, 22, 0, 22, 16, 22, 0, 12, 0, 0, 0, 15, 24, 0, 15, 0, 0, 0, 27, 0, 23, 23, 20, 0, 23, 23, 23, 18, 23, 27, 23, 0, 16, 25, 0, 16, 0, 12, 0, 24, 24, 28, 17, 24, 24, 24, 12, 24, 26, 24, 20, 0, 22, 20, 0, 20, 21, 20, 18, 27, 25, 25, 0, 0, 25, 25, 25, 15, 25, 0, 25, 28, 11, 0, 0, 0, 13, 23, 0, 0, 0, 10, 22, 0, 21, 0, 0, 21, 16, 21, 0, 21, 0, 35, 28, 0, 24, 15, 33, 31, 0, 32, 0, 34, 35, 28, 20, 23, 41, 33, 31, 18, 32, 0, 34, 35, 28, 25, 16, 53, 33, 31, 0, 32, 0, 34, 24, 13, 13, 0, 0, 0, 13, 13, 0, 13, 20, 13, 35, 28, 21, 18, 0, 33, 31, 0, 32, 25, 34, 0, 27, 0, 0, 29, 30, 0, 36, 19, 36, 0, 0, 27, 11, 35, 29, 30, 0, 36, 33, 31, 21, 32, 27, 34, 0, 0, 0, 0, 12, 12, 26, 12, 0, 0, 13, 19, 0, 0, 19, 29, 30, 26, 36, 0, 0, 27, 0, 0, 0, 0, 27, 27, 26, 3, 4, 5, 6, 0, 0, 0, 0, 0, 28, 28, 13, 0, 0, 0, 0, 0, 0, 0, 0, 22, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 0, 19, 0, 0, 0, 0, 0, 0, 23, 23, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 16, 0, 0, 0, 0, 0, 0, 24, 24, 0, 0, 19, 0, 0, 0, 0, 0, 20, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 25, 0, 0, 2, 3, 4, 5, 6, 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 21, 0, 0, 0, 0, 0, 0, 0, 0, 29, 30, 0, 36, 0, 0, 0, 0, 0, 0, 0, 29, 30, 0, 36, 0, 0, 0, 0, 0, 0, 0, 29, 30, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 13, 13, 0, 13, 0, 0, 0, 0, 0, 0, 0, 29, 30, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22, 24, 0, 25, 0, 0, 0, 39, 40, 0, 0, 0, 0, 0, 0, 36, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, }; short yycheck[] = { 10, 10, 37, 38, 37, 10, 61, 42, 43, 42, 45, 10, 47, 37, 47, 40, 10, 10, 42, 43, 10, 45, 10, 47, 10, 10, 268, 37, 38, 1, -1, 41, 42, 43, 10, 45, 41, 47, 37, 38, -1, -1, -1, 42, 43, 10, 45, 41, 47, 37, 38, -1, -1, 41, 42, 43, -1, 45, -1, 47, 10, 37, 38, 40, -1, 41, 42, 43, 45, 45, 10, 47, 37, 38, -1, -1, 41, 42, 43, -1, 45, 10, 47, -1, 94, -1, -1, -1, 38, 10, -1, 41, -1, -1, -1, 94, -1, 37, 38, 10, -1, 41, 42, 43, 10, 45, 94, 47, -1, 38, 10, -1, 41, -1, 124, -1, 37, 38, 94, 124, 41, 42, 43, 10, 45, 124, 47, 38, -1, 94, 41, -1, 43, 10, 45, 41, 124, 37, 38, -1, -1, 41, 42, 43, 94, 45, -1, 47, 124, 126, -1, -1, -1, 40, 94, -1, -1, -1, 45, 124, -1, 38, -1, -1, 41, 94, 43, -1, 45, -1, 37, 38, -1, 94, 124, 42, 43, -1, 45, -1, 47, 37, 38, 94, 124, 41, 42, 43, 94, 45, -1, 47, 37, 38, 94, 124, 41, 42, 43, -1, 45, -1, 47, 124, 37, 38, -1, -1, -1, 42, 43, -1, 45, 124, 47, 37, 38, 94, 124, -1, 42, 43, -1, 45, 124, 47, -1, 94, -1, -1, 265, 266, -1, 268, 10, 268, -1, -1, 94, 126, 37, 265, 266, -1, 268, 42, 43, 124, 45, 94, 47, -1, -1, -1, -1, 265, 266, 124, 268, -1, -1, 94, 38, -1, -1, 41, 265, 266, 124, 268, -1, -1, 94, -1, -1, -1, -1, 265, 266, 124, 257, 258, 259, 260, -1, -1, -1, -1, -1, 265, 266, 124, -1, -1, -1, -1, -1, -1, -1, -1, 265, 266, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 265, 266, -1, 94, -1, -1, -1, -1, -1, -1, 265, 266, -1, -1, -1, -1, -1, -1, -1, -1, -1, 265, 266, -1, -1, -1, -1, -1, -1, 265, 266, -1, -1, 124, -1, -1, -1, -1, -1, 265, 266, -1, -1, -1, -1, -1, -1, -1, -1, -1, 265, 266, -1, -1, 256, 257, 258, 259, 260, -1, 262, 263, 264, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 265, 266, -1, -1, -1, -1, -1, -1, -1, -1, 265, 266, -1, 268, -1, -1, -1, -1, -1, -1, -1, 265, 266, -1, 268, -1, -1, -1, -1, -1, -1, -1, 265, 266, -1, 268, -1, -1, -1, -1, -1, -1, -1, -1, 265, 266, -1, 268, -1, -1, -1, -1, -1, -1, -1, 265, 266, -1, 268, -1, -1, -1, -1, -1, -1, -1, -1, -1, 10, 11, -1, 13, -1, -1, -1, 17, 18, -1, -1, -1, -1, -1, -1, 268, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, }; #define YYFINAL 1 #ifndef YYDEBUG #define YYDEBUG 0 #endif #define YYMAXTOKEN 268 #if YYDEBUG char *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,0,0,0,"NUMBER","CONST","VAR","BLTIN","UNDEF","QUIT","HELP", "CHRADIX","LSH","RSH","UNARYMINUS","POW", }; char *yyrule[] = { "$accept : list", "list :", "list : list '\\n'", "list : list asgn '\\n'", "list : list expr '\\n'", "list : list HELP '\\n'", "list : list QUIT '\\n'", "list : list CHRADIX '\\n'", "list : list error '\\n'", "asgn : VAR '=' expr", "expr : NUMBER", "expr : CONST", "expr : VAR", "expr : asgn", "expr : BLTIN '(' expr ')'", "expr : expr LSH expr", "expr : expr RSH expr", "expr : expr '|' expr", "expr : expr '^' expr", "expr : expr '&' expr", "expr : expr '+' expr", "expr : expr '-' expr", "expr : expr '*' expr", "expr : expr '/' expr", "expr : expr '%' expr", "expr : expr POW expr", "expr : '(' expr ')'", "expr : '-' expr", "expr : '~' expr", }; #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 80 "hexcalc.y" #include #include char *progname; /* for error messages */ int lineno = 1; int radix = 16; STATIC char *credit = "hexcalc 1.1 by Richard Hargrove, 25 June 1988; based on hoc3 from Kernighan and Pike"; jmp_buf prog_begin, prog_end; /******************************************************************************/ void puthelp() { static char *help_text[] = { "Type in an expression or command. Expressions other than assignment", "cause the evaluated result to be output. All values are 32-bit integers.", "Expressions are made up of the following operands and operators:", "", "Operands: numeric literals (must begin with a digit), variables", "(31 chars max, initialized with assignment), and built-in functions.", "Built-ins: DEC(expr) output decimal value of expr", " OCT(expr) output octal value of expr", " HEX(expr) output hex value of expr", "Operators: ( ) grouping", " ** exponentiation", " - ~ unary minus, bitwise not", " * / % multiplication, division, modulus", " + - addition, subtraction", " << >> left-shift, right-shift", " & bitwise and", " ^ bitwise exclusive-or", " | bitwise or", " = assignment", "", "Commands: help HELP print this message", " quit exit terminate execution", " hex dec oct set the default radix", (char *)0 }; int i = 0; while (help_text[i] != (char *)0) { puts(help_text[i++]); } } /******************************************************************************/ void warning (s, t) /* print warning message */ char *s, *t; { fprintf (stderr, "%s : %s", progname, s); if (t != (char *)0) { fprintf (stderr, " %s", t); } fprintf (stderr, " near line %d\n", lineno); } /******************************************************************************/ void yyerror (s) /* called for yacc syntax error */ char *s; { warning (s, (char *)0); } /******************************************************************************/ void execerror (s, t) char *s, *t; { warning (s, t); longjmp (prog_begin, 1); } /******************************************************************************/ main (argc, argv) int argc; char *argv []; { progname = argv [0]; init (); if (setjmp (prog_end) == 0) { (void)setjmp (prog_begin); yyparse (); } return 0; } #line 356 "y.tab.c" /* allocate initial stack or double stack size, up to YYMAXDEPTH */ int yyparse __P((void)); static int yygrowstack __P((void)); 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; if ((newss = (short *)realloc(yyss, newsize * sizeof *newss)) == NULL) return -1; yyss = newss; yyssp = newss + i; if ((newvs = (YYSTYPE *)realloc(yyvs, newsize * sizeof *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 int yyparse() { int yym, yyn, yystate; #if YYDEBUG char *yys; if ((yys = getenv("YYDEBUG")) != NULL) { 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]) != 0) 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; goto yynewerror; yynewerror: yyerror("syntax error"); goto yyerrlab; 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 4: #line 28 "hexcalc.y" { if (radix == 16) printf ("\t%lx\n", yyvsp[-1].val); else if (radix == 10) printf ("\t%lu\n", yyvsp[-1].val); else printf ("\t%lo\n", yyvsp[-1].val); } break; case 5: #line 36 "hexcalc.y" { puthelp(); } break; case 6: #line 37 "hexcalc.y" { longjmp (prog_end, 1); } break; case 7: #line 38 "hexcalc.y" { if (*(yyvsp[-1].sym->name) == 'h') radix = 16; else if (*(yyvsp[-1].sym->name) == 'd') radix = 10; else radix = 8; } break; case 8: #line 46 "hexcalc.y" { yyerrok; } break; case 9: #line 48 "hexcalc.y" { yyval.val = yyvsp[-2].sym->u.val = yyvsp[0].val; yyvsp[-2].sym->type = VAR; } break; case 10: #line 50 "hexcalc.y" { yyval.val = yyvsp[0].val; } break; case 11: #line 51 "hexcalc.y" { yyval.val = yyvsp[0].sym->u.val; } break; case 12: #line 52 "hexcalc.y" { if (yyvsp[0].sym->type == UNDEF) execerror ("undefined variable", yyvsp[0].sym->name); yyval.val = yyvsp[0].sym->u.val; } break; case 14: #line 57 "hexcalc.y" { yyval.val = (*(yyvsp[-3].sym->u.ptr))(yyvsp[-1].val); } break; case 15: #line 58 "hexcalc.y" { yyval.val = yyvsp[-2].val << yyvsp[0].val; } break; case 16: #line 59 "hexcalc.y" { yyval.val = yyvsp[-2].val >> yyvsp[0].val; } break; case 17: #line 60 "hexcalc.y" { yyval.val = yyvsp[-2].val | yyvsp[0].val; } break; case 18: #line 61 "hexcalc.y" { yyval.val = yyvsp[-2].val ^ yyvsp[0].val; } break; case 19: #line 62 "hexcalc.y" { yyval.val = yyvsp[-2].val & yyvsp[0].val; } break; case 20: #line 63 "hexcalc.y" { yyval.val = yyvsp[-2].val + yyvsp[0].val; } break; case 21: #line 64 "hexcalc.y" { yyval.val = yyvsp[-2].val - yyvsp[0].val; } break; case 22: #line 65 "hexcalc.y" { yyval.val = yyvsp[-2].val * yyvsp[0].val; } break; case 23: #line 66 "hexcalc.y" { if (yyvsp[0].val == 0) execerror ("division by zero", (char *)0); yyval.val = yyvsp[-2].val / yyvsp[0].val; } break; case 24: #line 70 "hexcalc.y" { if (yyvsp[0].val == 0) execerror ("modulo zero", (char *)0); yyval.val = yyvsp[-2].val % yyvsp[0].val; } break; case 25: #line 74 "hexcalc.y" { yyval.val = ulpow (yyvsp[-2].val, yyvsp[0].val); } break; case 26: #line 75 "hexcalc.y" { yyval.val = yyvsp[-1].val; } break; case 27: #line 76 "hexcalc.y" { yyval.val = -yyvsp[0].val; } break; case 28: #line 77 "hexcalc.y" { yyval.val = ~ yyvsp[0].val; } break; #line 641 "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); }