home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / Utilities / byacc 1.8.2 / test / calc.tab.pl < prev    next >
Encoding:
Text File  |  1993-02-04  |  21.6 KB  |  719 lines  |  [TEXT/R*ch]

  1. $yysccsid = "@(#)yaccpar 1.8 (Berkeley) 01/20/91 (Perl 2.0 12/31/92)";
  2. #define YYBYACC 1
  3. $INT=257;
  4. $FLOAT=258;
  5. $STRING=259;
  6. $IDENT=260;
  7. $EQ=261;
  8. $NE=262;
  9. $GT=263;
  10. $GE=264;
  11. $LT=265;
  12. $LE=266;
  13. $L_SHIFT=267;
  14. $R_SHIFT=268;
  15. $EXP=269;
  16. $UNARY=270;
  17. $YYERRCODE=256;
  18. @yylhs = (                                               -1,
  19.     0,    0,    1,    1,    1,    2,    2,    3,    3,    3,
  20.     3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
  21.     3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
  22.     3,    3,    3,    3,
  23. );
  24. @yylen = (                                                2,
  25.     0,    2,    1,    2,    2,    1,    1,    3,    3,    3,
  26.     3,    3,    3,    3,    3,    3,    3,    3,    3,    3,
  27.     3,    3,    3,    2,    2,    2,    2,    2,    3,    1,
  28.     1,    1,    1,    1,
  29. );
  30. @yydefred = (                                             1,
  31.     0,    0,   31,   32,   33,    0,    0,    0,    0,    0,
  32.     6,    7,    0,   34,    2,    3,    0,    5,    0,   28,
  33.    27,   25,   26,    0,    0,    0,    0,    0,    0,    0,
  34.     0,    0,    0,    0,    0,    0,    0,    0,    0,   24,
  35.     4,    0,    8,    0,    0,    0,    0,    0,    0,    0,
  36.     0,    0,    0,    0,    0,    0,    0,    0,
  37. );
  38. @yydgoto = (                                              1,
  39.    15,   16,   17,
  40. );
  41. @yysindex = (                                             0,
  42.   147,   30,    0,    0,    0,  -60, -257,  375,  375,  375,
  43.     0,    0,  375,    0,    0,    0,    1,    0,  375,    0,
  44.     0,    0,    0,  -28,  375,  375,  375,  375,  375,  375,
  45.   375,  375,  375,  375,  375,  375,  375,  375,  375,    0,
  46.     0,  166,    0,  130,  183,  301,  301,  109,  109,  109,
  47.   109,  172,  172,  -26,  -26,  -27,  -27,  -27,
  48. );
  49. @yyrindex = (                                             0,
  50.     0,    0,    0,    0,    0,  -10,    0,    0,    0,    0,
  51.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  52.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  53.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  54.     0,   41,    0,  190,   78,  120,  124,   88,   94,  100,
  55.   108,   65,   74,   42,   54,   12,   20,   31,
  56. );
  57. @yygindex = (                                             0,
  58.     0,    7,  445,
  59. );
  60. $YYTABLESIZE=635;
  61. @yytable = (                                             30,
  62.    19,   20,    0,    0,   40,   40,   40,    0,   18,   26,
  63.    12,    0,   43,   37,   35,   37,   36,    0,   38,    0,
  64.    38,   21,   30,   41,    0,    0,    0,   30,    0,   22,
  65.    30,   30,   30,   40,   30,    0,   30,    0,   26,   12,
  66.    23,    0,   37,   35,    0,   36,    0,   38,   30,   21,
  67.    29,   19,   21,   21,   21,    0,   21,   22,   21,   11,
  68.    22,   22,   22,   20,   22,    0,   22,    0,   23,    0,
  69.    21,   23,   23,   23,   17,   23,    0,   23,   22,   19,
  70.     0,   29,   19,   18,   19,    0,   19,   10,   11,   23,
  71.     0,   20,    0,    0,   20,   25,   20,   13,   20,   29,
  72.    19,    0,   17,   14,    0,   17,    0,    0,    0,   15,
  73.     0,   18,   20,   30,   18,   10,    0,   16,   10,    0,
  74.     0,    0,    0,   17,   25,   13,    0,    0,   13,   11,
  75.     0,   14,   18,   12,   14,   21,   10,   15,    0,    0,
  76.    15,   40,    0,   22,    0,   16,   13,    0,   16,    0,
  77.    37,   35,   14,   36,   23,   38,   12,   11,   15,    0,
  78.    11,   12,   40,    0,   12,   19,   16,   26,    0,    0,
  79.     0,   37,   35,    0,   36,    0,   38,   20,   11,   10,
  80.     0,    0,   12,   14,    7,    0,   13,    0,   17,    8,
  81.     0,    9,    0,    0,    0,    0,    0,   18,   40,    9,
  82.     0,   10,    0,   26,   40,   11,    0,   37,   35,    0,
  83.    36,   13,   38,   37,   35,   40,   36,   14,   38,    0,
  84.     0,    0,    0,   15,   37,   35,    0,   36,    0,   38,
  85.     9,   16,   27,   28,   29,   30,   31,   32,   33,   34,
  86.    39,   39,   39,   11,    0,    0,    0,   12,    9,    0,
  87.    30,   30,   30,   30,   30,   30,   30,   30,   30,    0,
  88.     0,   27,   28,   29,   30,   31,   32,   33,   34,   39,
  89.     0,    0,   21,   21,   21,   21,   21,   21,   21,   21,
  90.    22,   22,   22,   22,   22,   22,   22,   22,    0,   25,
  91.     0,   23,   23,   23,   23,   23,   23,   23,   23,    0,
  92.     0,    0,   19,   19,   19,   19,   19,   19,   19,   19,
  93.     0,    0,    0,    9,   20,   20,   20,   20,   20,   20,
  94.    20,   20,    0,    0,    0,   17,   17,   17,   17,   17,
  95.    17,   17,   17,   40,   18,   18,   18,   18,   18,   18,
  96.    18,   18,   37,   35,    0,   36,    0,   38,   13,   13,
  97.    13,   13,   13,   13,   14,   14,   14,   14,   14,   14,
  98.    15,   15,   15,   15,   15,   15,    0,    0,   16,   16,
  99.    16,   16,   16,   16,    0,   33,   34,   39,    0,    0,
  100.    11,   11,    0,    0,   12,   12,    0,    0,    0,    0,
  101.    27,   28,   29,   30,   31,   32,   33,   34,   39,    0,
  102.     0,    0,    2,    3,    4,    5,    6,   10,    0,    0,
  103.     0,   14,    7,    0,   13,    0,    0,    8,    0,    9,
  104.     0,    0,    0,    0,    0,    0,   27,   28,   29,   30,
  105.    31,   32,   33,   34,   39,    0,    0,    0,    0,    0,
  106.    39,    0,    0,   27,   28,   29,   30,   31,   32,   33,
  107.    34,   39,   21,   22,   23,    0,    0,   24,    0,    0,
  108.     0,    0,    0,   42,    0,    0,    0,    0,    0,   44,
  109.    45,   46,   47,   48,   49,   50,   51,   52,   53,   54,
  110.    55,   56,   57,   58,    0,    0,    0,    0,    0,    0,
  111.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  112.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  113.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  114.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  115.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  116.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  117.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  118.     0,    0,    0,   29,   30,   31,   32,   33,   34,   39,
  119.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  120.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  121.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  122.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  123.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  124.     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
  125.     0,    3,    4,    5,    6,
  126. );
  127. @yycheck = (                                             10,
  128.    61,  259,   -1,   -1,   33,   33,   33,   -1,    2,   38,
  129.    10,   -1,   41,   42,   43,   42,   45,   -1,   47,   -1,
  130.    47,   10,   33,   17,   -1,   -1,   -1,   38,   -1,   10,
  131.    41,   42,   43,   33,   45,   -1,   47,   -1,   38,   10,
  132.    10,   -1,   42,   43,   -1,   45,   -1,   47,   59,   38,
  133.    10,   10,   41,   42,   43,   -1,   45,   38,   47,   59,
  134.    41,   42,   43,   10,   45,   -1,   47,   -1,   38,   -1,
  135.    59,   41,   42,   43,   10,   45,   -1,   47,   59,   38,
  136.    -1,   41,   41,   10,   43,   -1,   45,   10,   59,   59,
  137.    -1,   38,   -1,   -1,   41,  124,   43,   10,   45,   59,
  138.    59,   -1,   38,   10,   -1,   41,   -1,   -1,   -1,   10,
  139.    -1,   38,   59,  124,   41,   38,   -1,   10,   41,   -1,
  140.    -1,   -1,   -1,   59,  124,   38,   -1,   -1,   41,   10,
  141.    -1,   38,   59,   10,   41,  124,   59,   38,   -1,   -1,
  142.    41,   33,   -1,  124,   -1,   38,   59,   -1,   41,   -1,
  143.    42,   43,   59,   45,  124,   47,   10,   38,   59,   -1,
  144.    41,   38,   33,   -1,   41,  124,   59,   38,   -1,   -1,
  145.    -1,   42,   43,   -1,   45,   -1,   47,  124,   59,   33,
  146.    -1,   -1,   59,   37,   38,   -1,   40,   -1,  124,   43,
  147.    -1,   45,   -1,   -1,   -1,   -1,   -1,  124,   33,   10,
  148.    -1,  124,   -1,   38,   33,   59,   -1,   42,   43,   -1,
  149.    45,  124,   47,   42,   43,   33,   45,  124,   47,   -1,
  150.    -1,   -1,   -1,  124,   42,   43,   -1,   45,   -1,   47,
  151.    41,  124,  261,  262,  263,  264,  265,  266,  267,  268,
  152.   269,  269,  269,  124,   -1,   -1,   -1,  124,   59,   -1,
  153.   261,  262,  263,  264,  265,  266,  267,  268,  269,   -1,
  154.    -1,  261,  262,  263,  264,  265,  266,  267,  268,  269,
  155.    -1,   -1,  261,  262,  263,  264,  265,  266,  267,  268,
  156.   261,  262,  263,  264,  265,  266,  267,  268,   -1,  124,
  157.    -1,  261,  262,  263,  264,  265,  266,  267,  268,   -1,
  158.    -1,   -1,  261,  262,  263,  264,  265,  266,  267,  268,
  159.    -1,   -1,   -1,  124,  261,  262,  263,  264,  265,  266,
  160.   267,  268,   -1,   -1,   -1,  261,  262,  263,  264,  265,
  161.   266,  267,  268,   33,  261,  262,  263,  264,  265,  266,
  162.   267,  268,   42,   43,   -1,   45,   -1,   47,  261,  262,
  163.   263,  264,  265,  266,  261,  262,  263,  264,  265,  266,
  164.   261,  262,  263,  264,  265,  266,   -1,   -1,  261,  262,
  165.   263,  264,  265,  266,   -1,  267,  268,  269,   -1,   -1,
  166.   261,  262,   -1,   -1,  261,  262,   -1,   -1,   -1,   -1,
  167.   261,  262,  263,  264,  265,  266,  267,  268,  269,   -1,
  168.    -1,   -1,  256,  257,  258,  259,  260,   33,   -1,   -1,
  169.    -1,   37,   38,   -1,   40,   -1,   -1,   43,   -1,   45,
  170.    -1,   -1,   -1,   -1,   -1,   -1,  261,  262,  263,  264,
  171.   265,  266,  267,  268,  269,   -1,   -1,   -1,   -1,   -1,
  172.   269,   -1,   -1,  261,  262,  263,  264,  265,  266,  267,
  173.   268,  269,    8,    9,   10,   -1,   -1,   13,   -1,   -1,
  174.    -1,   -1,   -1,   19,   -1,   -1,   -1,   -1,   -1,   25,
  175.    26,   27,   28,   29,   30,   31,   32,   33,   34,   35,
  176.    36,   37,   38,   39,   -1,   -1,   -1,   -1,   -1,   -1,
  177.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  178.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  179.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  180.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  181.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  182.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  183.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  184.    -1,   -1,   -1,  263,  264,  265,  266,  267,  268,  269,
  185.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  186.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  187.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  188.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  189.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  190.    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
  191.    -1,  257,  258,  259,  260,
  192. );
  193. $YYFINAL=1;
  194. #ifndef YYDEBUG
  195. #define YYDEBUG 0
  196. #endif
  197. $YYMAXTOKEN=270;
  198. #if YYDEBUG
  199. @yyname = (
  200. "end-of-file",'','','','','','','','','',"'\\n'",'','','','','','','','','','','','','','','','','','','','',
  201. '','',"'!'",'','','',"'%'","'&'",'',"'('","')'","'*'","'+'",'',"'-'",'',"'/'",'','','','','',
  202. '','','','','','',"';'",'',"'='",'','','','','','','','','','','','','','','','','','','','','','','','','','','',
  203. '','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',"'|'",'','',
  204. '','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',
  205. '','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',
  206. '','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',
  207. '','','','','','','','','','',"INT","FLOAT","STRING","IDENT","EQ","NE","GT","GE","LT",
  208. "LE","L_SHIFT","R_SHIFT","EXP","UNARY",
  209. );
  210. @yyrule = (
  211. "\$accept : stmt_list",
  212. "stmt_list :",
  213. "stmt_list : stmt_list stmt",
  214. "stmt : terminator",
  215. "stmt : expr terminator",
  216. "stmt : error terminator",
  217. "terminator : ';'",
  218. "terminator : '\\n'",
  219. "expr : '(' expr ')'",
  220. "expr : expr '|' expr",
  221. "expr : expr '&' expr",
  222. "expr : expr EQ expr",
  223. "expr : expr NE expr",
  224. "expr : expr GT expr",
  225. "expr : expr GE expr",
  226. "expr : expr LT expr",
  227. "expr : expr LE expr",
  228. "expr : expr L_SHIFT expr",
  229. "expr : expr R_SHIFT expr",
  230. "expr : expr '+' expr",
  231. "expr : expr '-' expr",
  232. "expr : expr '*' expr",
  233. "expr : expr '/' expr",
  234. "expr : expr EXP expr",
  235. "expr : expr '!'",
  236. "expr : '-' expr",
  237. "expr : '!' expr",
  238. "expr : '+' expr",
  239. "expr : '&' STRING",
  240. "expr : IDENT '=' expr",
  241. "expr : IDENT",
  242. "expr : INT",
  243. "expr : FLOAT",
  244. "expr : STRING",
  245. "expr : '%'",
  246. );
  247. #endif
  248. sub yyclearin { $yychar = -1; }
  249. sub yyerrok { $yyerrflag = 0; }
  250. $YYSTACKSIZE = $YYSTACKSIZE || $YYMAXDEPTH || 500;
  251. $YYMAXDEPTH = $YYMAXDEPTH || $YYSTACKSIZE || 500;
  252. $yyss[$YYSTACKSIZE] = 0;
  253. $yyvs[$YYSTACKSIZE] = 0;
  254. sub YYERROR { ++$yynerrs; &yy_err_recover; }
  255. sub yy_err_recover
  256. {
  257.   if ($yyerrflag < 3)
  258.   {
  259.     $yyerrflag = 3;
  260.     while (1)
  261.     {
  262.       if (($yyn = $yysindex[$yyss[$yyssp]]) && 
  263.           ($yyn += $YYERRCODE) >= 0 && 
  264.           $yycheck[$yyn] == $YYERRCODE)
  265.       {
  266. #if YYDEBUG
  267.        print "yydebug: state $yyss[$yyssp], error recovery shifting",
  268.              " to state $yytable[$yyn]\n" if $yydebug;
  269. #endif
  270.         $yyss[++$yyssp] = $yystate = $yytable[$yyn];
  271.         $yyvs[++$yyvsp] = $yylval;
  272.         next yyloop;
  273.       }
  274.       else
  275.       {
  276. #if YYDEBUG
  277.         print "yydebug: error recovery discarding state ",
  278.               $yyss[$yyssp], "\n"  if $yydebug;
  279. #endif
  280.         return(1) if $yyssp <= 0;
  281.         --$yyssp;
  282.         --$yyvsp;
  283.       }
  284.     }
  285.   }
  286.   else
  287.   {
  288.     return (1) if $yychar == 0;
  289. #if YYDEBUG
  290.     if ($yydebug)
  291.     {
  292.       $yys = '';
  293.       if ($yychar <= $YYMAXTOKEN) { $yys = $yyname[$yychar]; }
  294.       if (!$yys) { $yys = 'illegal-symbol'; }
  295.       print "yydebug: state $yystate, error recovery discards ",
  296.             "token $yychar ($yys)\n";
  297.     }
  298. #endif
  299.     $yychar = -1;
  300.     next yyloop;
  301.   }
  302. 0;
  303. } # yy_err_recover
  304.  
  305. sub yyparse
  306. {
  307. #ifdef YYDEBUG
  308.   if ($yys = $ENV{'YYDEBUG'})
  309.   {
  310.     $yydebug = int($1) if $yys =~ /^(\d)/;
  311.   }
  312. #endif
  313.  
  314.   $yynerrs = 0;
  315.   $yyerrflag = 0;
  316.   $yychar = (-1);
  317.  
  318.   $yyssp = 0;
  319.   $yyvsp = 0;
  320.   $yyss[$yyssp] = $yystate = 0;
  321.  
  322. yyloop: while(1)
  323.   {
  324.     yyreduce: {
  325.       last yyreduce if ($yyn = $yydefred[$yystate]);
  326.       if ($yychar < 0)
  327.       {
  328.         if (($yychar = &yylex) < 0) { $yychar = 0; }
  329. #if YYDEBUG
  330.         if ($yydebug)
  331.         {
  332.           $yys = '';
  333.           if ($yychar <= $#yyname) { $yys = $yyname[$yychar]; }
  334.           if (!$yys) { $yys = 'illegal-symbol'; };
  335.           print "yydebug: state $yystate, reading $yychar ($yys)\n";
  336.         }
  337. #endif
  338.       }
  339.       if (($yyn = $yysindex[$yystate]) && ($yyn += $yychar) >= 0 &&
  340.               $yycheck[$yyn] == $yychar)
  341.       {
  342. #if YYDEBUG
  343.         print "yydebug: state $yystate, shifting to state ",
  344.               $yytable[$yyn], "\n"  if $yydebug;
  345. #endif
  346.         $yyss[++$yyssp] = $yystate = $yytable[$yyn];
  347.         $yyvs[++$yyvsp] = $yylval;
  348.         $yychar = (-1);
  349.         --$yyerrflag if $yyerrflag > 0;
  350.         next yyloop;
  351.       }
  352.       if (($yyn = $yyrindex[$yystate]) && ($yyn += $yychar) >= 0 &&
  353.             $yycheck[$yyn] == $yychar)
  354.       {
  355.         $yyn = $yytable[$yyn];
  356.         last yyreduce;
  357.       }
  358.       if (! $yyerrflag) {
  359.         &yyerror('syntax error');
  360.         ++$yynerrs;
  361.       }
  362.       return(1) if &yy_err_recover;
  363.     } # yyreduce
  364. #if YYDEBUG
  365.     print "yydebug: state $yystate, reducing by rule ",
  366.           "$yyn ($yyrule[$yyn])\n"  if $yydebug;
  367. #endif
  368.     $yym = $yylen[$yyn];
  369.     $yyval = $yyvs[$yyvsp+1-$yym];
  370.     switch:
  371.     {
  372. if ($yyn == 4) {
  373. #line 45 "calc.y"
  374. { print $yyvs[$yyvsp-1], "\n" if $yyvs[$yyvsp-0] eq "\n"; $P = $yyvs[$yyvsp-1]; 
  375. last switch;
  376. } }
  377. if ($yyn == 5) {
  378. #line 47 "calc.y"
  379. { &yyerrok; 
  380. last switch;
  381. } }
  382. if ($yyn == 6) {
  383. #line 51 "calc.y"
  384. { $yyval = $yyvs[$yyvsp-0]; 
  385. last switch;
  386. } }
  387. if ($yyn == 7) {
  388. #line 53 "calc.y"
  389. { $yyval = $yyvs[$yyvsp-0]; 
  390. last switch;
  391. } }
  392. if ($yyn == 8) {
  393. #line 57 "calc.y"
  394. { $yyval = $yyvs[$yyvsp-1]; 
  395. last switch;
  396. } }
  397. if ($yyn == 9) {
  398. #line 59 "calc.y"
  399. { $yyval = $yyvs[$yyvsp-2] || $yyvs[$yyvsp-0]; 
  400. last switch;
  401. } }
  402. if ($yyn == 10) {
  403. #line 61 "calc.y"
  404. { $yyval = $yyvs[$yyvsp-2] && $yyvs[$yyvsp-0]; 
  405. last switch;
  406. } }
  407. if ($yyn == 11) {
  408. #line 63 "calc.y"
  409. { $yyval = $yyvs[$yyvsp-2] == $yyvs[$yyvsp-0]; 
  410. last switch;
  411. } }
  412. if ($yyn == 12) {
  413. #line 65 "calc.y"
  414. { $yyval = $yyvs[$yyvsp-2] != $yyvs[$yyvsp-0]; 
  415. last switch;
  416. } }
  417. if ($yyn == 13) {
  418. #line 67 "calc.y"
  419. { $yyval = $yyvs[$yyvsp-2] > $yyvs[$yyvsp-0]; 
  420. last switch;
  421. } }
  422. if ($yyn == 14) {
  423. #line 69 "calc.y"
  424. { $yyval = $yyvs[$yyvsp-2] >= $yyvs[$yyvsp-0]; 
  425. last switch;
  426. } }
  427. if ($yyn == 15) {
  428. #line 71 "calc.y"
  429. { $yyval = $yyvs[$yyvsp-2] < $yyvs[$yyvsp-0]; 
  430. last switch;
  431. } }
  432. if ($yyn == 16) {
  433. #line 73 "calc.y"
  434. { $yyval = $yyvs[$yyvsp-2] <= $yyvs[$yyvsp-0]; 
  435. last switch;
  436. } }
  437. if ($yyn == 17) {
  438. #line 75 "calc.y"
  439. { $yyval = $yyvs[$yyvsp-2] << $yyvs[$yyvsp-0]; 
  440. last switch;
  441. } }
  442. if ($yyn == 18) {
  443. #line 77 "calc.y"
  444. { $yyval = $yyvs[$yyvsp-2] >> $yyvs[$yyvsp-0]; 
  445. last switch;
  446. } }
  447. if ($yyn == 19) {
  448. #line 79 "calc.y"
  449. { $yyval = $yyvs[$yyvsp-2] + $yyvs[$yyvsp-0]; 
  450. last switch;
  451. } }
  452. if ($yyn == 20) {
  453. #line 81 "calc.y"
  454. { $yyval = $yyvs[$yyvsp-2] - $yyvs[$yyvsp-0]; 
  455. last switch;
  456. } }
  457. if ($yyn == 21) {
  458. #line 83 "calc.y"
  459. { $yyval = $yyvs[$yyvsp-2] * $yyvs[$yyvsp-0]; 
  460. last switch;
  461. } }
  462. if ($yyn == 22) {
  463. #line 85 "calc.y"
  464. { $yyval = $yyvs[$yyvsp-2] / $yyvs[$yyvsp-0]; 
  465. last switch;
  466. } }
  467. if ($yyn == 23) {
  468. #line 87 "calc.y"
  469. { $yyval = $yyvs[$yyvsp-2] ** $yyvs[$yyvsp-0]; 
  470. last switch;
  471. } }
  472. if ($yyn == 24) {
  473. #line 89 "calc.y"
  474. { $yyval = &fact($yyvs[$yyvsp-1]); 
  475. last switch;
  476. } }
  477. if ($yyn == 25) {
  478. #line 91 "calc.y"
  479. { $yyval = -$yyvs[$yyvsp-0]; 
  480. last switch;
  481. } }
  482. if ($yyn == 26) {
  483. #line 93 "calc.y"
  484. { $yyval = !$yyvs[$yyvsp-0]; 
  485. last switch;
  486. } }
  487. if ($yyn == 27) {
  488. #line 95 "calc.y"
  489. { $yyval = $yyvs[$yyvsp-0]; 
  490. last switch;
  491. } }
  492. if ($yyn == 28) {
  493. #line 97 "calc.y"
  494. { $yyval = eval($yyvs[$yyvsp-0]); 
  495. last switch;
  496. } }
  497. if ($yyn == 29) {
  498. #line 99 "calc.y"
  499. { eval '$V{'.$yyvs[$yyvsp-2].'}=('.$yyvs[$yyvsp-0].'); 1' || &yyerror($@); $yyval = $V{$yyvs[$yyvsp-2]}; 
  500. last switch;
  501. } }
  502. if ($yyn == 30) {
  503. #line 101 "calc.y"
  504. { if (! defined $V{$yyvs[$yyvsp-0]}) {
  505.             &yyerror($yyvs[$yyvsp-0].": undefined variable");
  506.             $V{$yyvs[$yyvsp-0]} = 0;
  507.           }
  508.           $yyval = $V{$yyvs[$yyvsp-0]};
  509.         
  510. last switch;
  511. } }
  512. if ($yyn == 31) {
  513. #line 108 "calc.y"
  514. { $yyval = $yyvs[$yyvsp-0]; 
  515. last switch;
  516. } }
  517. if ($yyn == 32) {
  518. #line 110 "calc.y"
  519. { $yyval = $yyvs[$yyvsp-0]; 
  520. last switch;
  521. } }
  522. if ($yyn == 33) {
  523. #line 112 "calc.y"
  524. { $yyval = $yyvs[$yyvsp-0]; 
  525. last switch;
  526. } }
  527. if ($yyn == 34) {
  528. #line 114 "calc.y"
  529. { $yyval = $P; 
  530. last switch;
  531. } }
  532. #line 533 "calc.tab.pl"
  533.     } # switch
  534.     $yyssp -= $yym;
  535.     $yystate = $yyss[$yyssp];
  536.     $yyvsp -= $yym;
  537.     $yym = $yylhs[$yyn];
  538.     if ($yystate == 0 && $yym == 0)
  539.     {
  540. #if YYDEBUG
  541.       print "yydebug: after reduction, shifting from state 0 ",
  542.             "to state $YYFINAL\n" if $yydebug;
  543. #endif
  544.       $yystate = $YYFINAL;
  545.       $yyss[++$yyssp] = $YYFINAL;
  546.       $yyvs[++$yyvsp] = $yyval;
  547.       if ($yychar < 0)
  548.       {
  549.         if (($yychar = &yylex) < 0) { $yychar = 0; }
  550. #if YYDEBUG
  551.         if ($yydebug)
  552.         {
  553.           $yys = '';
  554.           if ($yychar <= $#yyname) { $yys = $yyname[$yychar]; }
  555.           if (!$yys) { $yys = 'illegal-symbol'; }
  556.           print "yydebug: state $YYFINAL, reading $yychar ($yys)\n";
  557.         }
  558. #endif
  559.       }
  560.       return(0) if $yychar == 0;
  561.       next yyloop;
  562.     }
  563.     if (($yyn = $yygindex[$yym]) && ($yyn += $yystate) >= 0 &&
  564.         $yyn <= $#yycheck && $yycheck[$yyn] == $yystate)
  565.     {
  566.         $yystate = $yytable[$yyn];
  567.     } else {
  568.         $yystate = $yydgoto[$yym];
  569.     }
  570. #if YYDEBUG
  571.     print "yydebug: after reduction, shifting from state ",
  572.         "$yyss[$yyssp] to state $yystate\n" if $yydebug;
  573. #endif
  574.     $yyss[++$yyssp] = $yystate;
  575.     $yyvs[++$yyvsp] = $yyval;
  576.   } # yyloop
  577. } # yyparse
  578. #line 118 "calc.y"
  579.  
  580. # Prompt the user on STDERR, but only prompt if STDERR and the input
  581. # file are both terminals.
  582.  
  583. # read from STDIN if no files are named on the command line
  584. unshift(@ARGV, '-') if $#ARGV < $[;
  585.  
  586. # After finishing a file, open the next one.  Return whether there
  587. # really is a next one that was opened.
  588. sub next_file
  589. {
  590.     while ($ARGV = shift(@ARGV)) {
  591.     if (! open(ARGV, $ARGV)) {
  592.         print STDERR "$ARGV: cannot open file: $!\n";
  593.         next;
  594.     }
  595.     $prompt = (-t ARGV && -t STDERR) ? '(Calc) ' : '';
  596.     last;
  597.     }
  598.     $ARGV >= $[;
  599. }
  600.  
  601. # print he prompt
  602. sub prompt
  603. {
  604.     print STDERR $prompt if $prompt;
  605. }
  606.  
  607. # print an error message
  608. sub yyerror
  609. {
  610.     print STDERR "\"$ARGV\", " if $ARGV ne '-';
  611.     print STDERR "line $.: ", @_, "\n";
  612. }
  613.  
  614. # Hand-coded lex until I write lex -p, too!
  615. sub yylex
  616. {
  617.  lexloop:
  618.     {
  619.     # get a line of input, if we need it.
  620.     if ($line eq '') {
  621.         &prompt;
  622.         $line = <ARGV>;
  623.         if ($line eq '') {
  624.         close(ARGV);
  625.         &next_file || return(0);
  626.         }
  627.     }
  628.  
  629.     # Skip over white space, and grab the first character.
  630.     # If there is no such character, then grab the next line.
  631.     $line =~ s/^[ \t\f\r\v]*(.|\n)//    || next lexloop;
  632.     local($char) = $1;
  633.     if ($char eq '#') {
  634.         # comment, so discard the line
  635.         $line = "\n";
  636.         &yylex;
  637.     } elsif ($char =~ /^['"]/) {
  638.         # collect the string
  639.         if ($line =~ s/^([^$char]*)$char//) {
  640.         $yylval = $1;
  641.         } else {
  642.         &yyerror('unterminated string');
  643.         $yylval = '';
  644.         }
  645.         $STRING;
  646.     } elsif ($char =~ /^\d/) {
  647.         # number, is it integer or float?
  648.         if ($line =~ s/^(\d+)//) {
  649.         $yylval = int($char . $1);
  650.         } else {
  651.         $yylval = int($char);
  652.         }
  653.         $type = $INT;
  654.         if ($line =~ s/^(\.\d*)//) {
  655.         $tmp = "0$1";
  656.         $yylval += $tmp;
  657.         $type = $FLOAT;
  658.         }
  659.         if ($line =~ s/^[eE]([-+]*\d+)//) {
  660.         $yylval *= 10 ** $1;
  661.         $type = $FLOAT;
  662.         }
  663.         $type;
  664.     } elsif ($char =~ /^\w/) {
  665.         # identifier
  666.         $line =~ s/^([\w\d]*)//;
  667.         $yylval = $char.$1;
  668.         $IDENT;
  669.     } elsif ($char eq '*' && $line =~ s/^\*//) {
  670.         $EXP;
  671.     } elsif ($char eq '!' && $line =~ s/^=//) {
  672.         $NE;
  673.     } elsif ($char eq '=' && $line =~ s/^=//) {
  674.         $EQ;
  675.     } elsif ($char =~ /^[<>]/ && $line =~ s/^=//) {
  676.         $char eq '<' ? $LE : $GE;
  677.     } elsif ($char =~ /^[<>]/ && $line =~ s/^$char//) {
  678.         $char eq '<' ? $L_SHIFT : $R_SHIFT;
  679.     } else {
  680.         $yylval = $char;
  681.         ord($char);
  682.     }
  683.     }
  684. }
  685.  
  686. # factorial
  687. sub fact
  688. {
  689.     local($n) = @_;
  690.     local($f) = 1;
  691.     $f *= $n-- while ($n > 1) ;
  692.     $f;
  693. }
  694.  
  695. # catch signals
  696. sub catch
  697. {
  698.     local($signum) = @_;
  699.     print STDERR "\n" if (-t STDERR && -t STDIN);
  700.     &yyerror("Floating point exception") if $signum = 8;
  701.     next outer;
  702. }
  703. $SIG{'INT'} = 'catch';
  704. $SIG{'FPE'} = 'catch';
  705.  
  706. select(STDERR); $| = 1;
  707. select(STDOUT);
  708. &next_file;
  709.  
  710. # main program
  711. outer: while(1)
  712. {
  713.     $line = '';
  714.     eval '$status = &yyparse;';
  715.     exit $status if ! $@;
  716.     &yyerror($@);
  717. }
  718. #line 719 "calc.tab.pl"
  719.