BSD 4_3_Net_2 development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Tue, 30 Apr 1991 09:10:01 +0000 (01:10 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Tue, 30 Apr 1991 09:10:01 +0000 (01:10 -0800)
Work on file usr/src/usr.bin/groff/pic/grot/pic.tab.c
Work on file usr/src/usr.bin/groff/pic/grot/pic.tab.h

Synthesized-from: CSRG/cd2/net.2

usr/src/usr.bin/groff/pic/grot/pic.tab.c [new file with mode: 0644]
usr/src/usr.bin/groff/pic/grot/pic.tab.h [new file with mode: 0644]

diff --git a/usr/src/usr.bin/groff/pic/grot/pic.tab.c b/usr/src/usr.bin/groff/pic/grot/pic.tab.c
new file mode 100644 (file)
index 0000000..b346e45
--- /dev/null
@@ -0,0 +1,3205 @@
+
+/*  A Bison parser, made from pic.y  */
+
+#define        LABEL   258
+#define        VARIABLE        259
+#define        NUMBER  260
+#define        TEXT    261
+#define        COMMAND 262
+#define        DELIMITED       263
+#define        ORDINAL 264
+#define        LEFT_ARROW_HEAD 265
+#define        RIGHT_ARROW_HEAD        266
+#define        DOUBLE_ARROW_HEAD       267
+#define        LAST    268
+#define        UP      269
+#define        DOWN    270
+#define        LEFT    271
+#define        RIGHT   272
+#define        BOX     273
+#define        CIRCLE  274
+#define        ELLIPSE 275
+#define        ARC     276
+#define        LINE    277
+#define        ARROW   278
+#define        MOVE    279
+#define        SPLINE  280
+#define        HEIGHT  281
+#define        RADIUS  282
+#define        WIDTH   283
+#define        DIAMETER        284
+#define        FROM    285
+#define        TO      286
+#define        AT      287
+#define        WITH    288
+#define        BY      289
+#define        THEN    290
+#define        DOTTED  291
+#define        DASHED  292
+#define        CHOP    293
+#define        SAME    294
+#define        INVISIBLE       295
+#define        LJUST   296
+#define        RJUST   297
+#define        ABOVE   298
+#define        BELOW   299
+#define        OF      300
+#define        THE     301
+#define        WAY     302
+#define        BETWEEN 303
+#define        AND     304
+#define        HERE    305
+#define        DOT_N   306
+#define        DOT_E   307
+#define        DOT_W   308
+#define        DOT_S   309
+#define        DOT_NE  310
+#define        DOT_SE  311
+#define        DOT_NW  312
+#define        DOT_SW  313
+#define        DOT_C   314
+#define        DOT_START       315
+#define        DOT_END 316
+#define        DOT_X   317
+#define        DOT_Y   318
+#define        DOT_HT  319
+#define        DOT_WID 320
+#define        DOT_RAD 321
+#define        SIN     322
+#define        COS     323
+#define        ATAN2   324
+#define        LOG     325
+#define        EXP     326
+#define        SQRT    327
+#define        MAX     328
+#define        MIN     329
+#define        INT     330
+#define        RAND    331
+#define        COPY    332
+#define        THRU    333
+#define        TOP     334
+#define        BOTTOM  335
+#define        UPPER   336
+#define        LOWER   337
+#define        SH      338
+#define        PRINT   339
+#define        CW      340
+#define        CCW     341
+#define        FOR     342
+#define        DO      343
+#define        IF      344
+#define        ELSE    345
+#define        ANDAND  346
+#define        OROR    347
+#define        NOTEQUAL        348
+#define        EQUALEQUAL      349
+#define        LESSEQUAL       350
+#define        GREATEREQUAL    351
+#define        LEFT_CORNER     352
+#define        RIGHT_CORNER    353
+#define        CENTER  354
+#define        END     355
+#define        START   356
+#define        RESET   357
+#define        UNTIL   358
+#define        PLOT    359
+#define        THICKNESS       360
+#define        FILL    361
+#define        ALIGNED 362
+#define        SPRINTF 363
+#define        DEFINE  364
+#define        UNDEF   365
+
+#line 19 "pic.y"
+
+#include "pic.h"
+#include "ptable.h"
+#include "object.h"
+
+extern int delim_flag;
+extern void do_copy(const char *);
+extern void copy_rest_thru(const char *, const char *);
+extern void copy_file_thru(const char *, const char *, const char *);
+extern void push_body(const char *);
+extern void do_for(char *var, double from, double to,
+                  int by_is_multiplicative, double by, char *body);
+extern void do_lookahead();
+
+extern "C" {
+  double fmod(double, double);
+  int rand();
+}
+
+#define YYDEBUG 1
+
+int yylex();
+void yyerror(const char *);
+
+void reset(const char *nm);
+void reset_all();
+
+place *lookup_label(const char *);
+void define_label(const char *label, const place *pl);
+
+direction current_direction;
+position current_position;
+
+implement_ptable(place)
+
+PTABLE(place) top_table;
+
+PTABLE(place) *current_table = &top_table;
+saved_state *current_saved_state = 0;
+
+object_list olist;
+
+const char *ordinal_postfix(int n);
+const char *object_type_name(object_type type);
+char *format_number(const char *form, double n);
+char *do_sprintf(const char *form, const double *v, int nv);
+
+
+#line 69 "pic.y"
+typedef union {
+       char *str;
+       int n;
+       double x;
+       struct { double x, y; } pair;
+       struct { double x; char *body; } if_data;
+       struct { char *str; const char *filename; int lineno; } lstr;
+       struct { double *v; int nv; int maxv; } dv;
+       struct { double val; int is_multiplicative; } by;
+       place pl;
+       object *obj;
+       corner crn;
+       path *pth;
+       object_spec *spec;
+       saved_state *pstate;
+       graphics_state state;
+       object_type obtype;
+} YYSTYPE;
+
+#ifndef YYLTYPE
+typedef
+  struct yyltype
+    {
+      int timestamp;
+      int first_line;
+      int first_column;
+      int last_line;
+      int last_column;
+      char *text;
+   }
+  yyltype;
+
+#define YYLTYPE yyltype
+#endif
+
+#include <stdio.h>
+
+#ifndef __STDC__
+#define const
+#endif
+
+
+
+#define        YYFINAL         373
+#define        YYFLAG          -32768
+#define        YYNTBASE        131
+
+#define YYTRANSLATE(x) ((unsigned)(x) <= 365 ? yytranslate[x] : 170)
+
+static const short yytranslate[] = {     0,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,   120,     2,     2,     2,   119,     2,     2,   111,
+   129,   117,   115,   112,   116,   130,   118,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,   124,   122,   113,
+   123,   114,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+   127,     2,   128,   121,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,   125,     2,   126,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     1,     2,     3,     4,     5,
+     6,     7,     8,     9,    10,    11,    12,    13,    14,    15,
+    16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+    26,    27,    28,    29,    30,    31,    32,    33,    34,    35,
+    36,    37,    38,    39,    40,    41,    42,    43,    44,    45,
+    46,    47,    48,    49,    50,    51,    52,    53,    54,    55,
+    56,    57,    58,    59,    60,    61,    62,    63,    64,    65,
+    66,    67,    68,    69,    70,    71,    72,    73,    74,    75,
+    76,    77,    78,    79,    80,    81,    82,    83,    84,    85,
+    86,    87,    88,    89,    90,    91,    92,    93,    94,    95,
+    96,    97,    98,    99,   100,   101,   102,   103,   104,   105,
+   106,   107,   108,   109,   110
+};
+
+#if YYDEBUG != 0
+static const short yyrline[] = { 0,
+   263,   265,   273,   278,   281,   285,   287,   290,   292,   295,
+   301,   303,   305,   307,   309,   315,   320,   326,   331,   334,
+   339,   346,   349,   351,   359,   362,   364,   371,   374,   380,
+   388,   391,   402,   403,   407,   410,   412,   416,   420,   423,
+   426,   430,   433,   439,   446,   449,   451,   455,   470,   472,
+   480,   486,   492,   499,   507,   512,   516,   520,   525,   532,
+   539,   546,   553,   558,   563,   570,   585,   597,   603,   609,
+   615,   621,   640,   647,   654,   661,   668,   675,   682,   689,
+   696,   703,   718,   730,   736,   743,   755,   761,   767,   773,
+   779,   784,   790,   806,   823,   828,   833,   838,   843,   848,
+   853,   858,   865,   874,   883,   892,   901,   907,   914,   919,
+   929,   936,   957,   960,   968,   971,   976,   981,   986,   991,
+   998,  1000,  1003,  1006,  1010,  1013,  1019,  1025,  1031,  1039,
+  1050,  1054,  1062,  1065,  1069,  1084,  1100,  1103,  1105,  1107,
+  1109,  1111,  1113,  1115,  1117,  1121,  1126,  1133,  1141,  1145,
+  1152,  1158,  1164,  1170,  1176,  1184,  1187,  1189,  1191,  1193,
+  1195,  1197,  1199,  1201,  1203,  1205,  1207,  1209,  1211,  1213,
+  1215,  1217,  1219,  1221,  1223,  1225,  1227,  1229,  1231,  1233,
+  1235,  1237,  1239,  1243,  1252,  1254,  1261,  1268,  1275,  1282,
+  1289,  1291,  1293,  1295,  1303,  1311,  1324,  1326,  1328,  1337,
+  1346,  1359,  1368,  1377,  1386,  1388,  1390,  1392,  1394,  1400,
+  1402,  1404,  1406,  1408,  1410,  1412,  1414,  1416
+};
+
+static const char * const yytname[] = {     0,
+"error","$illegal.","LABEL","VARIABLE","NUMBER","TEXT","COMMAND","DELIMITED","ORDINAL","LEFT_ARROW_HEAD",
+"RIGHT_ARROW_HEAD","DOUBLE_ARROW_HEAD","LAST","UP","DOWN","LEFT","RIGHT","BOX","CIRCLE","ELLIPSE",
+"ARC","LINE","ARROW","MOVE","SPLINE","HEIGHT","RADIUS","WIDTH","DIAMETER","FROM",
+"TO","AT","WITH","BY","THEN","DOTTED","DASHED","CHOP","SAME","INVISIBLE",
+"LJUST","RJUST","ABOVE","BELOW","OF","THE","WAY","BETWEEN","AND","HERE",
+"DOT_N","DOT_E","DOT_W","DOT_S","DOT_NE","DOT_SE","DOT_NW","DOT_SW","DOT_C","DOT_START",
+"DOT_END","DOT_X","DOT_Y","DOT_HT","DOT_WID","DOT_RAD","SIN","COS","ATAN2","LOG",
+"EXP","SQRT","MAX","MIN","INT","RAND","COPY","THRU","TOP","BOTTOM",
+"UPPER","LOWER","SH","PRINT","CW","CCW","FOR","DO","IF","ELSE",
+"ANDAND","OROR","NOTEQUAL","EQUALEQUAL","LESSEQUAL","GREATEREQUAL","LEFT_CORNER","RIGHT_CORNER","CENTER","END",
+"START","RESET","UNTIL","PLOT","THICKNESS","FILL","ALIGNED","SPRINTF","DEFINE","UNDEF",
+"'('","','","'<'","'>'","'+'","'-'","'*'","'/'","'%'","'!'",
+"'^'","';'","'='","':'","'{'","'}'","'['","']'","')'","'.'",
+"top"
+};
+#endif
+
+static const short yyr1[] = {     0,
+   131,   131,   132,   133,   133,   134,   134,   135,   135,   136,
+   136,   136,   136,   136,   136,   136,   136,   136,   137,   136,
+   136,   138,   139,   136,   140,   141,   136,   142,   136,   136,
+   143,   136,   136,   136,   144,   144,   144,   146,   145,   147,
+   147,   148,   148,   148,   149,   149,   149,   150,   150,   150,
+   150,   151,   150,   150,   152,   152,   152,   152,   152,   152,
+   152,   152,   152,   152,   152,   153,   152,   152,   152,   152,
+   152,   152,   152,   152,   152,   152,   152,   152,   152,   152,
+   152,   152,   152,   152,   152,   152,   152,   152,   152,   152,
+   152,   152,   152,   152,   152,   152,   152,   152,   152,   152,
+   152,   152,   152,   152,   152,   152,   152,   152,   154,   154,
+   155,   155,   156,   156,   157,   157,   157,   157,   157,   157,
+   158,   158,   159,   159,   160,   160,   160,   160,   160,   161,
+   161,   161,   162,   162,   163,   163,   164,   164,   164,   164,
+   164,   164,   164,   164,   164,   165,   165,   166,   166,   166,
+   167,   167,   167,   167,   167,   168,   168,   168,   168,   168,
+   168,   168,   168,   168,   168,   168,   168,   168,   168,   168,
+   168,   168,   168,   168,   168,   168,   168,   168,   168,   168,
+   168,   168,   168,   169,   169,   169,   169,   169,   169,   169,
+   169,   169,   169,   169,   169,   169,   169,   169,   169,   169,
+   169,   169,   169,   169,   169,   169,   169,   169,   169,   169,
+   169,   169,   169,   169,   169,   169,   169,   169
+};
+
+static const short yyr2[] = {     0,
+     1,     1,     3,     1,     3,     0,     1,     1,     2,     3,
+     1,     1,     1,     1,     1,     2,     2,     2,     0,     3,
+     2,     0,     0,     7,     0,     0,     6,     0,    10,     1,
+     0,     4,     1,     1,     2,     2,     3,     0,     5,     0,
+     2,     1,     3,     3,     0,     2,     3,     1,     4,     4,
+     4,     0,     4,     1,     1,     1,     1,     1,     1,     1,
+     1,     1,     1,     2,     3,     0,     4,     3,     3,     3,
+     3,     2,     2,     3,     2,     3,     2,     3,     2,     3,
+     3,     3,     3,     3,     3,     2,     2,     3,     2,     3,
+     2,     3,     2,     3,     2,     2,     2,     2,     2,     2,
+     2,     2,     2,     2,     2,     2,     3,     2,     1,     5,
+     0,     3,     1,     1,     1,     3,     3,     5,     5,     6,
+     1,     4,     3,     3,     1,     2,     2,     3,     1,     1,
+     1,     3,     1,     2,     2,     2,     1,     1,     1,     1,
+     1,     1,     1,     2,     1,     2,     3,     1,     1,     2,
+     1,     4,     3,     3,     2,     1,     1,     1,     1,     1,
+     1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
+     2,     2,     2,     2,     1,     1,     2,     2,     2,     2,
+     1,     1,     1,     1,     1,     2,     2,     2,     2,     2,
+     3,     3,     3,     3,     3,     3,     2,     3,     4,     4,
+     6,     4,     4,     4,     6,     6,     4,     4,     3,     3,
+     3,     3,     3,     3,     3,     3,     3,     2
+};
+
+static const short yydefact[] = {     6,
+     8,     2,     1,     7,     0,     0,   109,    15,    11,    12,
+    13,    14,    55,    56,    57,    58,    59,    60,    61,    62,
+     0,    19,     0,     0,     0,    34,     0,     0,    52,    66,
+     6,    54,    33,    30,     4,    48,    63,     9,     6,     0,
+    21,    25,     0,   130,   184,   185,     0,   133,   169,   170,
+   129,   156,   157,   158,   159,   160,   161,   162,   163,   164,
+   165,   166,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,   167,   168,     0,     0,   175,   176,   181,   183,
+   182,     0,     0,     0,    17,    18,   113,   115,   114,   125,
+     0,   131,     0,    16,     0,     0,     0,     0,     0,    42,
+    35,    64,     0,     6,     6,     3,     7,    36,     0,    31,
+    97,    98,    99,    73,    75,    79,    77,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,    86,    87,    89,    93,
+    95,    96,   103,   104,   105,   106,   100,   101,     0,    91,
+   108,   102,    72,     0,    10,    22,     0,    20,   145,   134,
+   137,   138,   139,   140,   141,   142,   143,     0,   135,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,   171,
+   173,   177,   179,   172,   174,   178,   180,     0,   115,     0,
+   197,   218,     0,     0,   186,   187,   188,   189,   190,     0,
+   126,   136,     0,   127,     0,   121,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,    38,     0,     0,     0,    65,   111,
+     0,     0,     0,     5,    37,     0,    74,    76,    80,    78,
+    68,    69,    70,    71,    81,     0,    82,    83,     0,     0,
+     0,     0,   149,   151,    84,   148,     0,    85,     0,    88,
+    90,    94,   107,    92,   130,   184,    13,    14,    49,     0,
+    50,    51,     0,    26,   144,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,   209,     0,     0,   124,   198,   116,
+   117,   132,   128,     0,   216,   217,   215,   214,   211,   213,
+   123,     0,   210,   212,   191,   192,   193,   194,   195,   196,
+     0,     0,     0,    44,    43,   210,     0,    53,    67,    32,
+   155,     0,     0,     0,   146,     0,   150,     0,     0,    23,
+    40,   199,   200,     0,   202,   203,   204,     0,     0,   207,
+   208,     0,     0,     0,     0,     0,    39,     0,   110,     0,
+   154,   153,   147,    40,     0,    27,     0,     0,     0,   118,
+   122,     0,   119,    45,   112,   152,    24,    41,   201,   205,
+   206,   120,     0,     0,     0,    46,    28,    47,     0,    29,
+     0,     0,     0
+};
+
+static const short yydefgoto[] = {   371,
+     2,    31,   222,     4,    32,    43,   263,   344,   147,   321,
+   369,   226,    33,    34,   303,   346,    97,   364,    35,   104,
+    36,   105,    37,   307,    86,    87,   212,    88,    99,    90,
+    91,    92,   159,   243,   244,   245,    93,   236
+};
+
+static const short yypact[] = {  -101,
+-32768,-32768,   535,   -99,   -96,   -89,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+    23,-32768,   750,    37,   851,    38,  1057,   -65,-32768,-32768,
+  -101,-32768,     1,   -42,-32768,   641,-32768,-32768,  -101,   851,
+    -4,-32768,    68,-32768,-32768,-32768,    62,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,   -32,   -21,    -9,    -7,    25,    41,    42,    46,
+    48,    52,-32768,-32768,     2,    21,-32768,-32768,-32768,-32768,
+-32768,  1158,  1057,  1057,-32768,   -59,-32768,-32768,   232,  1673,
+   363,-32768,    13,  1646,     7,  1057,    97,    28,   232,  1973,
+-32768,   984,   143,  -101,  -101,-32768,   509,-32768,   150,-32768,
+-32768,-32768,-32768,  1499,  1499,  1339,  1419,  1057,  1057,  1057,
+  1057,  1158,  1158,  1158,   153,  1259,-32768,  1499,  1499,  1499,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,  1057,  1499,
+-32768,-32768,  1973,   394,-32768,-32768,   157,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,    39,-32768,  1057,
+  1057,  1057,  1057,  1057,  1057,  1057,  1057,  1057,   276,-32768,
+-32768,-32768,-32768,-32768,-32768,-32768,-32768,   -61,    44,  1594,
+    50,    50,  1259,  1259,-32768,-32768,-32768,-32768,-32768,   190,
+-32768,-32768,   111,    64,   126,-32768,  1057,  1057,  1057,  1057,
+  1057,  1057,  1057,  1158,  1057,  1057,  1057,  1057,  1057,  1057,
+  1057,  1158,  1057,  1701,-32768,     0,     0,  1057,-32768,-32768,
+    70,   535,    69,-32768,-32768,   194,  1973,  1973,  1973,  1973,
+  1973,  1973,  1973,  1973,   -59,  1646,   -59,   -59,  1569,   253,
+   363,   200,  1621,-32768,-32768,-32768,  1259,-32768,   677,  1973,
+  1973,  1973,  1973,  1973,   -96,   -89,    22,    27,-32768,   -59,
+    19,   154,   207,-32768,-32768,  1732,  1741,  1540,  1772,  1781,
+  1812,  1932,  1942,  1821,-32768,  1852,  1158,-32768,-32768,-32768,
+-32768,-32768,    64,   174,   720,   778,   767,   767,   125,   125,
+  1973,    11,   110,   125,   169,   169,    50,    50,    50,    50,
+   -38,   486,   215,-32768,-32768,   125,   -80,-32768,-32768,-32768,
+-32768,   363,  1569,  1569,-32768,   227,-32768,    44,  1692,-32768,
+   133,-32768,-32768,  1057,-32768,-32768,-32768,  1057,  1057,-32768,
+-32768,   -63,   189,  1158,  1158,  1057,-32768,  1057,-32768,  1569,
+-32768,-32768,-32768,   133,   239,-32768,  1861,  1892,  1901,-32768,
+-32768,   -52,   -59,   452,  1973,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,   952,   159,  1057,  1973,-32768,  1973,   240,-32768,
+   249,   257,-32768
+};
+
+static const short yypgoto[] = {-32768,
+    43,-32768,     8,   229,-32768,-32768,-32768,-32768,-32768,-32768,
+-32768,-32768,-32768,-32768,-32768,   -86,   221,-32768,   -74,-32768,
+-32768,-32768,   -16,-32768,   -79,   118,-32768,   -55,   -13,   -81,
+-32768,-32768,   -90,-32768,  -225,-32768,   -75,   -23
+};
+
+
+#define        YYLAST          2094
+
+
+static const short yytable[] = {    94,
+   192,   100,   178,   102,   108,     7,    85,     3,    98,    89,
+   335,   194,   143,   311,   191,    44,   100,   170,   171,   142,
+     1,    47,    38,    98,  -169,    48,   179,    39,    41,  -170,
+  -169,   338,   224,    40,  -169,  -170,   174,   175,   106,  -170,
+    95,   101,   235,   237,   238,   103,   144,   110,   339,   246,
+   277,   183,   184,   183,   184,   183,   184,   193,   180,   181,
+   182,   362,   183,   184,   260,   350,  -169,   149,    89,   259,
+   248,  -170,   214,   146,   150,   148,   183,   184,   160,   151,
+   152,   153,   154,   155,   156,   219,   157,   341,   342,   161,
+   227,   228,   229,   230,   231,   232,   233,   234,   172,   173,
+    42,   162,   249,   163,   250,   251,   252,    28,    89,    89,
+    89,   283,   109,    44,   356,   253,   254,   176,   177,    47,
+   216,   217,   334,    48,   292,   183,   184,   280,   281,   213,
+   262,   215,   301,  -113,  -113,   164,   266,   267,   268,   269,
+   270,   271,   272,   273,   274,   276,   221,   223,   220,   313,
+   314,   165,   166,   225,   195,   239,   167,   196,   168,   249,
+   249,   240,   169,   246,   264,   241,   265,   317,    49,    50,
+   211,   284,   278,   285,   286,   287,   288,   289,   290,   291,
+   293,   294,   295,   296,   297,   298,   299,   300,   158,   302,
+    89,   318,   282,   190,   306,   308,   309,   332,    89,   304,
+   305,   310,   315,    52,    53,    54,    55,    56,    57,    58,
+    59,    60,    61,    62,   320,   185,   186,   187,   188,   189,
+   333,   340,   337,   319,   206,   207,   208,   209,   210,   343,
+   211,    73,    74,    75,    76,   345,   351,   246,   246,   206,
+   207,   208,   209,   210,   358,   211,   367,   370,   372,    77,
+    78,    79,    80,    81,   352,   353,   373,   357,   149,   107,
+   145,   261,     0,    89,   246,   312,     0,     0,  -114,  -114,
+   151,   152,   153,   154,   155,   156,     0,   157,    44,    45,
+    46,     0,   242,     0,    47,   208,   209,   210,    48,   211,
+     0,    49,    50,   185,   186,   187,   188,   189,     0,     0,
+   347,     0,     0,     0,   348,   349,     0,     0,     0,     0,
+     0,     0,   354,     0,   355,     0,     0,     0,     0,     0,
+    89,    89,     0,     0,     0,    51,    52,    53,    54,    55,
+    56,    57,    58,    59,    60,    61,    62,     0,     0,   366,
+     0,   368,    63,    64,    65,    66,    67,    68,    69,    70,
+    71,    72,     0,     0,    73,    74,    75,    76,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,   149,     0,
+     0,     0,    77,    78,    79,    80,    81,     0,     0,   158,
+   151,   152,   153,   154,   155,   156,    96,   157,     0,     0,
+     0,    83,     0,     0,     0,    84,   255,   256,    46,     7,
+     8,     0,    47,     0,   275,     0,    48,     9,    10,   257,
+   258,    13,    14,    15,    16,    17,    18,    19,    20,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,    51,    52,    53,    54,    55,    56,    57,
+    58,    59,    60,    61,    62,     0,     0,     0,     0,     0,
+    63,    64,    65,    66,    67,    68,    69,    70,    71,    72,
+    21,     0,    73,    74,    75,    76,    22,    23,     0,     0,
+    24,     0,    25,     0,     0,   363,     0,     0,     0,   158,
+    77,    78,    79,    80,    81,    26,     0,    27,     0,     0,
+     0,    28,     0,     0,    82,     0,     0,     0,     0,    83,
+     0,     5,     6,    84,     7,     8,   336,     0,    29,     0,
+    30,     0,     9,    10,    11,    12,    13,    14,    15,    16,
+    17,    18,    19,    20,     0,     0,     0,     5,     6,     0,
+     7,     8,   197,   198,   199,   200,   201,   202,     9,    10,
+    11,    12,    13,    14,    15,    16,    17,    18,    19,    20,
+     0,     0,     0,     0,   218,   205,   206,   207,   208,   209,
+   210,     0,   211,     0,     0,     0,   197,   198,   199,   200,
+   201,   202,     0,     0,     0,    21,     0,     0,     0,     0,
+     0,    22,    23,     0,     0,    24,     0,    25,   218,   205,
+   206,   207,   208,   209,   210,     0,   211,     0,     0,     0,
+    26,    21,    27,     0,     0,     0,    28,    22,    23,     0,
+     0,    24,     0,    25,     0,     0,     0,     0,     0,     0,
+    38,     0,     0,    29,     0,    30,    26,     0,    27,     0,
+     0,     0,    28,    44,    45,    46,     7,     0,     0,    47,
+   111,   112,   113,    48,   114,   115,   116,   117,     0,    29,
+     0,    30,     0,     0,     0,     0,   118,   119,   120,   121,
+   122,   123,   124,   125,   126,   127,   128,   129,   130,   131,
+   132,   133,   134,   135,   136,     0,     0,     0,     0,     0,
+    51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
+    61,    62,     0,     0,     0,     0,     0,    63,    64,    65,
+    66,    67,    68,    69,    70,    71,    72,     0,     0,    73,
+    74,    75,    76,     0,     0,   137,   138,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,    77,    78,    79,
+    80,    81,     0,     0,     0,   139,   140,   141,    28,     0,
+     0,    96,    44,    45,    46,     7,    83,     0,    47,     0,
+    84,     0,    48,     0,     0,    49,    50,   197,   198,   199,
+   200,   201,   202,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,   203,   218,
+   205,   206,   207,   208,   209,   210,     0,   211,     0,    51,
+    52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
+    62,     0,   199,   200,   201,   202,    63,    64,    65,    66,
+    67,    68,    69,    70,    71,    72,     0,     0,    73,    74,
+    75,    76,   218,   205,   206,   207,   208,   209,   210,     0,
+   211,     0,     0,     0,     0,     0,    77,    78,    79,    80,
+    81,     0,     0,    44,    45,    46,     7,    28,     0,    47,
+    82,   201,   202,    48,     0,    83,    49,    50,   197,    84,
+   199,   200,   201,   202,     0,     0,     0,     0,     0,   218,
+   205,   206,   207,   208,   209,   210,     0,   211,     0,     0,
+   218,   205,   206,   207,   208,   209,   210,     0,   211,     0,
+    51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
+    61,    62,     0,     0,     0,     0,     0,    63,    64,    65,
+    66,    67,    68,    69,    70,    71,    72,     0,     0,    73,
+    74,    75,    76,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,    77,    78,    79,
+    80,    81,     0,     0,    44,    45,    46,     0,    28,     0,
+    47,    96,     0,     0,    48,     0,    83,    49,    50,     0,
+    84,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     7,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,    51,    52,    53,    54,    55,    56,    57,    58,    59,
+    60,    61,    62,     0,     0,     0,     0,     0,    63,    64,
+    65,    66,    67,    68,    69,    70,    71,    72,     0,     0,
+    73,    74,    75,    76,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,    77,    78,
+    79,    80,    81,     0,     0,     0,     0,     0,     0,    44,
+    45,    46,    96,     0,     0,    47,     0,    83,   365,    48,
+     0,    84,    49,    50,   197,   198,   199,   200,   201,   202,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,    28,     0,     0,     0,     0,   218,   205,   206,   207,
+   208,   209,   210,     0,   211,     0,    51,    52,    53,    54,
+    55,    56,    57,    58,    59,    60,    61,    62,     0,     0,
+     0,     0,     0,    63,    64,    65,    66,    67,    68,    69,
+    70,    71,    72,     0,     0,    73,    74,    75,    76,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,    77,    78,    79,    80,    81,     0,     0,
+    44,    45,    46,     0,     0,     0,    47,    96,     0,     0,
+    48,     0,    83,    49,    50,     0,    84,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,    51,    52,    53,
+    54,    55,    56,    57,    58,    59,    60,    61,    62,     0,
+     0,     0,     0,     0,    63,    64,    65,    66,    67,    68,
+    69,    70,    71,    72,     0,     0,    73,    74,    75,    76,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,    77,    78,    79,    80,    81,     0,
+     0,    44,    45,    46,     0,     0,     0,    47,    82,     0,
+     0,    48,     0,    83,    49,    50,     0,    84,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,    51,    52,
+    53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
+     0,     0,     0,     0,     0,    63,    64,    65,    66,    67,
+    68,    69,    70,    71,    72,     0,     0,    73,    74,    75,
+    76,    44,    45,    46,     0,     0,     0,    47,     0,     0,
+     0,    48,     0,     0,     0,    77,    78,    79,    80,    81,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,   247,
+     0,     0,     0,     0,    83,     0,     0,     0,    84,     0,
+     0,     0,     0,  -169,     0,     0,     0,     0,    51,    52,
+    53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
+     0,     0,     0,     0,     0,    63,    64,    65,    66,    67,
+    68,    69,    70,    71,    72,     0,     0,    73,    74,    75,
+    76,    44,    45,    46,     0,     0,     0,    47,     0,     0,
+     0,    48,     0,     0,     0,    77,    78,    79,    80,    81,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,    96,
+     0,     0,     0,     0,    83,     0,     0,     0,    84,     0,
+     0,     0,     0,  -170,     0,     0,     0,     0,    51,    52,
+    53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
+     0,     0,     0,     0,     0,    63,    64,    65,    66,    67,
+    68,    69,    70,    71,    72,     0,     0,    73,    74,    75,
+    76,    44,    45,    46,     0,     0,     0,    47,     0,     0,
+     0,    48,     0,     0,     0,    77,    78,    79,    80,    81,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,    96,
+     0,     0,     0,     0,    83,     0,     0,     0,    84,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,    51,    52,
+    53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
+     0,     0,     0,     0,     0,    63,    64,    65,    66,    67,
+    68,    69,    70,    71,    72,     0,     0,    73,    74,    75,
+    76,     0,     0,     0,    49,    50,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,    77,    78,    79,    80,    81,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,    96,
+     0,     0,     0,     0,    83,     0,     0,     0,    84,    52,
+    53,    54,    55,    56,    57,    58,    59,    60,    61,    62,
+   197,   198,   199,   200,   201,   202,    49,    50,   195,     0,
+     0,   196,     0,     0,     0,     0,     0,    73,    74,    75,
+    76,   324,   218,   205,   206,   207,   208,   209,   210,     0,
+   211,     0,     0,     0,     0,    77,    78,    79,    80,    81,
+     0,    52,    53,    54,    55,    56,    57,    58,    59,    60,
+    61,    62,     0,     0,   197,   198,   199,   200,   201,   202,
+   195,     0,     0,   196,     0,     0,     0,     0,   242,    73,
+    74,    75,    76,     0,     0,   203,   204,   205,   206,   207,
+   208,   209,   210,     0,   211,     0,     0,    77,    78,    79,
+    80,    81,   279,    52,    53,    54,    55,    56,    57,    58,
+    59,    60,    61,    62,     0,     0,   197,   198,   199,   200,
+   201,   202,     0,     0,     0,     0,     0,     0,     0,     0,
+   316,    73,    74,    75,    76,     0,     0,   203,   204,   205,
+   206,   207,   208,   209,   210,     0,   211,     0,     0,    77,
+    78,    79,    80,    81,     0,     0,     0,     0,     0,     0,
+     0,     0,   197,   198,   199,   200,   201,   202,     0,     0,
+     0,   197,   198,   199,   200,   201,   202,     0,     0,     0,
+     0,     0,   190,   203,   218,   205,   206,   207,   208,   209,
+   210,     0,   211,   218,   205,   206,   207,   208,   209,   210,
+   279,   211,   197,   198,   199,   200,   201,   202,     0,   279,
+     0,   197,   198,   199,   200,   201,   202,     0,     0,     0,
+     0,     0,     0,     0,   218,   205,   206,   207,   208,   209,
+   210,     0,   211,   218,   205,   206,   207,   208,   209,   210,
+   322,   211,   197,   198,   199,   200,   201,   202,     0,   323,
+     0,   197,   198,   199,   200,   201,   202,     0,     0,     0,
+     0,     0,     0,     0,   218,   205,   206,   207,   208,   209,
+   210,     0,   211,   218,   205,   206,   207,   208,   209,   210,
+   325,   211,   197,   198,   199,   200,   201,   202,     0,   326,
+     0,   197,   198,   199,   200,   201,   202,     0,     0,     0,
+     0,     0,     0,     0,   218,   205,   206,   207,   208,   209,
+   210,     0,   211,   218,   205,   206,   207,   208,   209,   210,
+   327,   211,   197,   198,   199,   200,   201,   202,     0,   330,
+     0,   197,   198,   199,   200,   201,   202,     0,     0,     0,
+     0,     0,     0,     0,   218,   205,   206,   207,   208,   209,
+   210,     0,   211,   218,   205,   206,   207,   208,   209,   210,
+   331,   211,   197,   198,   199,   200,   201,   202,     0,   359,
+     0,   197,   198,   199,   200,   201,   202,     0,     0,     0,
+     0,     0,     0,     0,   218,   205,   206,   207,   208,   209,
+   210,     0,   211,   218,   205,   206,   207,   208,   209,   210,
+   360,   211,   197,   198,   199,   200,   201,   202,     0,   361,
+     0,     0,   197,   198,   199,   200,   201,   202,     0,     0,
+     0,     0,     0,   328,   218,   205,   206,   207,   208,   209,
+   210,     0,   211,   329,   218,   205,   206,   207,   208,   209,
+   210,     0,   211,   197,   198,   199,   200,   201,   202,     0,
+     0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
+     0,     0,     0,     0,     0,   218,   205,   206,   207,   208,
+   209,   210,     0,   211
+};
+
+static const short yycheck[] = {    23,
+    91,    25,    82,    27,     4,     6,    23,     0,    25,    23,
+    49,    93,    36,   239,    90,     3,    40,    16,    17,    36,
+   122,     9,   122,    40,     3,    13,    82,   124,     6,     3,
+     9,   112,   107,   123,    13,     9,    16,    17,    31,    13,
+     4,     4,   122,   123,   124,   111,    39,    90,   129,   125,
+   112,   115,   116,   115,   116,   115,   116,    45,    82,    83,
+    84,   114,   115,   116,   144,   129,    45,     6,    82,   144,
+   126,    45,    96,    78,    13,     8,   115,   116,   111,    18,
+    19,    20,    21,    22,    23,   102,    25,   313,   314,   111,
+   114,   115,   116,   117,   118,   119,   120,   121,    97,    98,
+    78,   111,   126,   111,   128,   129,   130,   108,   122,   123,
+   124,   193,   112,     3,   340,   139,   140,    97,    98,     9,
+    93,    94,   112,    13,   204,   115,   116,   183,   184,   123,
+   144,    35,   212,   115,   116,   111,   160,   161,   162,   163,
+   164,   165,   166,   167,   168,   169,   104,   105,     6,   240,
+   241,   111,   111,     4,    45,     3,   111,    48,   111,   183,
+   184,     9,   111,   239,     8,    13,   128,   243,    16,    17,
+   121,    46,   129,   197,   198,   199,   200,   201,   202,   203,
+   204,   205,   206,   207,   208,   209,   210,   211,   127,   213,
+   204,   247,     3,   130,   218,   126,   128,   277,   212,   216,
+   217,     8,     3,    51,    52,    53,    54,    55,    56,    57,
+    58,    59,    60,    61,     8,    62,    63,    64,    65,    66,
+    47,   312,     8,   247,   115,   116,   117,   118,   119,     3,
+   121,    79,    80,    81,    82,   103,    48,   313,   314,   115,
+   116,   117,   118,   119,     6,   121,    88,     8,     0,    97,
+    98,    99,   100,   101,   334,   335,     0,   344,     6,    31,
+    40,   144,    -1,   277,   340,    13,    -1,    -1,   115,   116,
+    18,    19,    20,    21,    22,    23,    -1,    25,     3,     4,
+     5,    -1,   130,    -1,     9,   117,   118,   119,    13,   121,
+    -1,    16,    17,    62,    63,    64,    65,    66,    -1,    -1,
+   324,    -1,    -1,    -1,   328,   329,    -1,    -1,    -1,    -1,
+    -1,    -1,   336,    -1,   338,    -1,    -1,    -1,    -1,    -1,
+   334,   335,    -1,    -1,    -1,    50,    51,    52,    53,    54,
+    55,    56,    57,    58,    59,    60,    61,    -1,    -1,   363,
+    -1,   365,    67,    68,    69,    70,    71,    72,    73,    74,
+    75,    76,    -1,    -1,    79,    80,    81,    82,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     6,    -1,
+    -1,    -1,    97,    98,    99,   100,   101,    -1,    -1,   127,
+    18,    19,    20,    21,    22,    23,   111,    25,    -1,    -1,
+    -1,   116,    -1,    -1,    -1,   120,     3,     4,     5,     6,
+     7,    -1,     9,    -1,   129,    -1,    13,    14,    15,    16,
+    17,    18,    19,    20,    21,    22,    23,    24,    25,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    50,    51,    52,    53,    54,    55,    56,
+    57,    58,    59,    60,    61,    -1,    -1,    -1,    -1,    -1,
+    67,    68,    69,    70,    71,    72,    73,    74,    75,    76,
+    77,    -1,    79,    80,    81,    82,    83,    84,    -1,    -1,
+    87,    -1,    89,    -1,    -1,    34,    -1,    -1,    -1,   127,
+    97,    98,    99,   100,   101,   102,    -1,   104,    -1,    -1,
+    -1,   108,    -1,    -1,   111,    -1,    -1,    -1,    -1,   116,
+    -1,     3,     4,   120,     6,     7,    31,    -1,   125,    -1,
+   127,    -1,    14,    15,    16,    17,    18,    19,    20,    21,
+    22,    23,    24,    25,    -1,    -1,    -1,     3,     4,    -1,
+     6,     7,    91,    92,    93,    94,    95,    96,    14,    15,
+    16,    17,    18,    19,    20,    21,    22,    23,    24,    25,
+    -1,    -1,    -1,    -1,   113,   114,   115,   116,   117,   118,
+   119,    -1,   121,    -1,    -1,    -1,    91,    92,    93,    94,
+    95,    96,    -1,    -1,    -1,    77,    -1,    -1,    -1,    -1,
+    -1,    83,    84,    -1,    -1,    87,    -1,    89,   113,   114,
+   115,   116,   117,   118,   119,    -1,   121,    -1,    -1,    -1,
+   102,    77,   104,    -1,    -1,    -1,   108,    83,    84,    -1,
+    -1,    87,    -1,    89,    -1,    -1,    -1,    -1,    -1,    -1,
+   122,    -1,    -1,   125,    -1,   127,   102,    -1,   104,    -1,
+    -1,    -1,   108,     3,     4,     5,     6,    -1,    -1,     9,
+    10,    11,    12,    13,    14,    15,    16,    17,    -1,   125,
+    -1,   127,    -1,    -1,    -1,    -1,    26,    27,    28,    29,
+    30,    31,    32,    33,    34,    35,    36,    37,    38,    39,
+    40,    41,    42,    43,    44,    -1,    -1,    -1,    -1,    -1,
+    50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
+    60,    61,    -1,    -1,    -1,    -1,    -1,    67,    68,    69,
+    70,    71,    72,    73,    74,    75,    76,    -1,    -1,    79,
+    80,    81,    82,    -1,    -1,    85,    86,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    97,    98,    99,
+   100,   101,    -1,    -1,    -1,   105,   106,   107,   108,    -1,
+    -1,   111,     3,     4,     5,     6,   116,    -1,     9,    -1,
+   120,    -1,    13,    -1,    -1,    16,    17,    91,    92,    93,
+    94,    95,    96,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   112,   113,
+   114,   115,   116,   117,   118,   119,    -1,   121,    -1,    50,
+    51,    52,    53,    54,    55,    56,    57,    58,    59,    60,
+    61,    -1,    93,    94,    95,    96,    67,    68,    69,    70,
+    71,    72,    73,    74,    75,    76,    -1,    -1,    79,    80,
+    81,    82,   113,   114,   115,   116,   117,   118,   119,    -1,
+   121,    -1,    -1,    -1,    -1,    -1,    97,    98,    99,   100,
+   101,    -1,    -1,     3,     4,     5,     6,   108,    -1,     9,
+   111,    95,    96,    13,    -1,   116,    16,    17,    91,   120,
+    93,    94,    95,    96,    -1,    -1,    -1,    -1,    -1,   113,
+   114,   115,   116,   117,   118,   119,    -1,   121,    -1,    -1,
+   113,   114,   115,   116,   117,   118,   119,    -1,   121,    -1,
+    50,    51,    52,    53,    54,    55,    56,    57,    58,    59,
+    60,    61,    -1,    -1,    -1,    -1,    -1,    67,    68,    69,
+    70,    71,    72,    73,    74,    75,    76,    -1,    -1,    79,
+    80,    81,    82,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    97,    98,    99,
+   100,   101,    -1,    -1,     3,     4,     5,    -1,   108,    -1,
+     9,   111,    -1,    -1,    13,    -1,   116,    16,    17,    -1,
+   120,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,     6,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    50,    51,    52,    53,    54,    55,    56,    57,    58,
+    59,    60,    61,    -1,    -1,    -1,    -1,    -1,    67,    68,
+    69,    70,    71,    72,    73,    74,    75,    76,    -1,    -1,
+    79,    80,    81,    82,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    97,    98,
+    99,   100,   101,    -1,    -1,    -1,    -1,    -1,    -1,     3,
+     4,     5,   111,    -1,    -1,     9,    -1,   116,   117,    13,
+    -1,   120,    16,    17,    91,    92,    93,    94,    95,    96,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,   108,    -1,    -1,    -1,    -1,   113,   114,   115,   116,
+   117,   118,   119,    -1,   121,    -1,    50,    51,    52,    53,
+    54,    55,    56,    57,    58,    59,    60,    61,    -1,    -1,
+    -1,    -1,    -1,    67,    68,    69,    70,    71,    72,    73,
+    74,    75,    76,    -1,    -1,    79,    80,    81,    82,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    97,    98,    99,   100,   101,    -1,    -1,
+     3,     4,     5,    -1,    -1,    -1,     9,   111,    -1,    -1,
+    13,    -1,   116,    16,    17,    -1,   120,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    50,    51,    52,
+    53,    54,    55,    56,    57,    58,    59,    60,    61,    -1,
+    -1,    -1,    -1,    -1,    67,    68,    69,    70,    71,    72,
+    73,    74,    75,    76,    -1,    -1,    79,    80,    81,    82,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    97,    98,    99,   100,   101,    -1,
+    -1,     3,     4,     5,    -1,    -1,    -1,     9,   111,    -1,
+    -1,    13,    -1,   116,    16,    17,    -1,   120,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    50,    51,
+    52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
+    -1,    -1,    -1,    -1,    -1,    67,    68,    69,    70,    71,
+    72,    73,    74,    75,    76,    -1,    -1,    79,    80,    81,
+    82,     3,     4,     5,    -1,    -1,    -1,     9,    -1,    -1,
+    -1,    13,    -1,    -1,    -1,    97,    98,    99,   100,   101,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   111,
+    -1,    -1,    -1,    -1,   116,    -1,    -1,    -1,   120,    -1,
+    -1,    -1,    -1,    45,    -1,    -1,    -1,    -1,    50,    51,
+    52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
+    -1,    -1,    -1,    -1,    -1,    67,    68,    69,    70,    71,
+    72,    73,    74,    75,    76,    -1,    -1,    79,    80,    81,
+    82,     3,     4,     5,    -1,    -1,    -1,     9,    -1,    -1,
+    -1,    13,    -1,    -1,    -1,    97,    98,    99,   100,   101,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   111,
+    -1,    -1,    -1,    -1,   116,    -1,    -1,    -1,   120,    -1,
+    -1,    -1,    -1,    45,    -1,    -1,    -1,    -1,    50,    51,
+    52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
+    -1,    -1,    -1,    -1,    -1,    67,    68,    69,    70,    71,
+    72,    73,    74,    75,    76,    -1,    -1,    79,    80,    81,
+    82,     3,     4,     5,    -1,    -1,    -1,     9,    -1,    -1,
+    -1,    13,    -1,    -1,    -1,    97,    98,    99,   100,   101,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   111,
+    -1,    -1,    -1,    -1,   116,    -1,    -1,    -1,   120,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    50,    51,
+    52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
+    -1,    -1,    -1,    -1,    -1,    67,    68,    69,    70,    71,
+    72,    73,    74,    75,    76,    -1,    -1,    79,    80,    81,
+    82,    -1,    -1,    -1,    16,    17,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,    97,    98,    99,   100,   101,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,   111,
+    -1,    -1,    -1,    -1,   116,    -1,    -1,    -1,   120,    51,
+    52,    53,    54,    55,    56,    57,    58,    59,    60,    61,
+    91,    92,    93,    94,    95,    96,    16,    17,    45,    -1,
+    -1,    48,    -1,    -1,    -1,    -1,    -1,    79,    80,    81,
+    82,   112,   113,   114,   115,   116,   117,   118,   119,    -1,
+   121,    -1,    -1,    -1,    -1,    97,    98,    99,   100,   101,
+    -1,    51,    52,    53,    54,    55,    56,    57,    58,    59,
+    60,    61,    -1,    -1,    91,    92,    93,    94,    95,    96,
+    45,    -1,    -1,    48,    -1,    -1,    -1,    -1,   130,    79,
+    80,    81,    82,    -1,    -1,   112,   113,   114,   115,   116,
+   117,   118,   119,    -1,   121,    -1,    -1,    97,    98,    99,
+   100,   101,   129,    51,    52,    53,    54,    55,    56,    57,
+    58,    59,    60,    61,    -1,    -1,    91,    92,    93,    94,
+    95,    96,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+   130,    79,    80,    81,    82,    -1,    -1,   112,   113,   114,
+   115,   116,   117,   118,   119,    -1,   121,    -1,    -1,    97,
+    98,    99,   100,   101,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    91,    92,    93,    94,    95,    96,    -1,    -1,
+    -1,    91,    92,    93,    94,    95,    96,    -1,    -1,    -1,
+    -1,    -1,   130,   112,   113,   114,   115,   116,   117,   118,
+   119,    -1,   121,   113,   114,   115,   116,   117,   118,   119,
+   129,   121,    91,    92,    93,    94,    95,    96,    -1,   129,
+    -1,    91,    92,    93,    94,    95,    96,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,   113,   114,   115,   116,   117,   118,
+   119,    -1,   121,   113,   114,   115,   116,   117,   118,   119,
+   129,   121,    91,    92,    93,    94,    95,    96,    -1,   129,
+    -1,    91,    92,    93,    94,    95,    96,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,   113,   114,   115,   116,   117,   118,
+   119,    -1,   121,   113,   114,   115,   116,   117,   118,   119,
+   129,   121,    91,    92,    93,    94,    95,    96,    -1,   129,
+    -1,    91,    92,    93,    94,    95,    96,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,   113,   114,   115,   116,   117,   118,
+   119,    -1,   121,   113,   114,   115,   116,   117,   118,   119,
+   129,   121,    91,    92,    93,    94,    95,    96,    -1,   129,
+    -1,    91,    92,    93,    94,    95,    96,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,   113,   114,   115,   116,   117,   118,
+   119,    -1,   121,   113,   114,   115,   116,   117,   118,   119,
+   129,   121,    91,    92,    93,    94,    95,    96,    -1,   129,
+    -1,    91,    92,    93,    94,    95,    96,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,   113,   114,   115,   116,   117,   118,
+   119,    -1,   121,   113,   114,   115,   116,   117,   118,   119,
+   129,   121,    91,    92,    93,    94,    95,    96,    -1,   129,
+    -1,    -1,    91,    92,    93,    94,    95,    96,    -1,    -1,
+    -1,    -1,    -1,   112,   113,   114,   115,   116,   117,   118,
+   119,    -1,   121,   112,   113,   114,   115,   116,   117,   118,
+   119,    -1,   121,    91,    92,    93,    94,    95,    96,    -1,
+    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
+    -1,    -1,    -1,    -1,    -1,   113,   114,   115,   116,   117,
+   118,   119,    -1,   121
+};
+#define YYPURE 1
+
+/* -*-C-*-  Note some compilers choke on comments on `#line' lines.  */
+#line 3 "/usr/local/lib/bison.simple"
+
+/* Skeleton output parser for bison,
+   Copyright (C) 1984, 1989, 1990 Bob Corbett and Richard Stallman
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 1, or (at your option)
+   any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+
+#ifdef __GNUC__
+#ifndef alloca
+#define alloca __builtin_alloca
+#endif /* Not alloca. */
+#else /* Not GNU C.  */
+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__)
+#include <alloca.h>
+#endif /* Sparc.  */
+#endif /* Not GNU C.  */
+
+/* This is the parser code that is written into each bison parser
+  when the %semantic_parser declaration is not specified in the grammar.
+  It was written by Richard Stallman by simplifying the hairy parser
+  used when %semantic_parser is specified.  */
+
+/* Note: there must be only one dollar sign in this file.
+   It is replaced by the list of actions, each action
+   as one case of the switch.  */
+
+#define yyerrok                (yyerrstatus = 0)
+#define yyclearin      (yychar = YYEMPTY)
+#define YYEMPTY                -2
+#define YYEOF          0
+#define YYACCEPT       return(0)
+#define YYABORT        return(1)
+#define YYERROR                goto yyerrlab1
+/* Like YYERROR except do call yyerror.
+   This remains here temporarily to ease the
+   transition to the new meaning of YYERROR, for GCC.
+   Once GCC version 2 has supplanted version 1, this can go.  */
+#define YYFAIL         goto yyerrlab
+#define YYRECOVERING()  (!!yyerrstatus)
+#define YYBACKUP(token, value) \
+do                                                             \
+  if (yychar == YYEMPTY && yylen == 1)                         \
+    { yychar = (token), yylval = (value);                      \
+      yychar1 = YYTRANSLATE (yychar);                          \
+      YYPOPSTACK;                                              \
+      goto yybackup;                                           \
+    }                                                          \
+  else                                                         \
+    { yyerror ("syntax error: cannot back up"); YYERROR; }     \
+while (0)
+
+#define YYTERROR       1
+#define YYERRCODE      256
+
+#ifndef YYIMPURE
+#define YYLEX          yylex()
+#endif
+
+#ifndef YYPURE
+#define YYLEX          yylex(&yylval, &yylloc)
+#endif
+
+/* If nonreentrant, generate the variables here */
+
+#ifndef YYIMPURE
+
+int    yychar;                 /*  the lookahead symbol                */
+YYSTYPE        yylval;                 /*  the semantic value of the           */
+                               /*  lookahead symbol                    */
+
+#ifdef YYLSP_NEEDED
+YYLTYPE yylloc;                        /*  location data for the lookahead     */
+                               /*  symbol                              */
+#endif
+
+int yynerrs;                   /*  number of parse errors so far       */
+#endif  /* YYIMPURE */
+
+#if YYDEBUG != 0
+int yydebug;                   /*  nonzero means print parse trace     */
+/* Since this is uninitialized, it does not stop multiple parsers
+   from coexisting.  */
+#endif
+
+/*  YYINITDEPTH indicates the initial size of the parser's stacks      */
+
+#ifndef        YYINITDEPTH
+#define YYINITDEPTH 200
+#endif
+
+/*  YYMAXDEPTH is the maximum size the stacks can grow to
+    (effective only if the built-in stack extension method is used).  */
+
+#if YYMAXDEPTH == 0
+#undef YYMAXDEPTH
+#endif
+
+#ifndef YYMAXDEPTH
+#define YYMAXDEPTH 10000
+#endif
+
+/* This is the most reliable way to avoid incompatibilities
+   in available built-in functions on various systems.  */
+static void
+#ifdef __cplusplus
+__yy_bcopy (char *from, char *to, int count)
+#else
+__yy_bcopy (from, to, count)
+     char *from;
+     char *to;
+     int count;
+#endif
+{
+  register char *f = from;
+  register char *t = to;
+  register int i = count;
+
+  while (i-- > 0)
+    *t++ = *f++;
+}
+
+#line 137 "/usr/local/lib/bison.simple"
+int
+yyparse()
+{
+  register int yystate;
+  register int yyn;
+  register short *yyssp;
+  register YYSTYPE *yyvsp;
+  int yyerrstatus;     /*  number of tokens to shift before error messages enabled */
+  int yychar1;         /*  lookahead token as an internal (translated) token number */
+
+  short        yyssa[YYINITDEPTH];     /*  the state stack                     */
+  YYSTYPE yyvsa[YYINITDEPTH];  /*  the semantic value stack            */
+
+  short *yyss = yyssa;         /*  refer to the stacks thru separate pointers */
+  YYSTYPE *yyvs = yyvsa;       /*  to allow yyoverflow to reallocate them elsewhere */
+
+#ifdef YYLSP_NEEDED
+  YYLTYPE *yyls = yylsa;
+  YYLTYPE *yylsp;
+  YYLTYPE yylsa[YYINITDEPTH];  /*  the location stack                  */
+
+#define YYPOPSTACK   (yyvsp--, yysp--, yylsp--)
+#else
+#define YYPOPSTACK   (yyvsp--, yysp--)
+#endif
+
+  int yystacksize = YYINITDEPTH;
+
+#ifndef YYPURE
+  int yychar;
+  YYSTYPE yylval;
+  int yynerrs;
+#ifdef YYLSP_NEEDED
+  YYLTYPE yylloc;
+#endif
+#endif
+
+  YYSTYPE yyval;               /*  the variable used to return         */
+                               /*  semantic values from the action     */
+                               /*  routines                            */
+
+  int yylen;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Starting parse\n");
+#endif
+
+  yystate = 0;
+  yyerrstatus = 0;
+  yynerrs = 0;
+  yychar = YYEMPTY;            /* Cause a token to be read.  */
+
+  /* Initialize stack pointers.
+     Waste one element of value and location stack
+     so that they stay on the same level as the state stack.  */
+
+  yyssp = yyss - 1;
+  yyvsp = yyvs;
+#ifdef YYLSP_NEEDED
+  yylsp = yyls;
+#endif
+
+/* Push a new state, which is found in  yystate  .  */
+/* In all cases, when you get here, the value and location stacks
+   have just been pushed. so pushing a state here evens the stacks.  */
+yynewstate:
+
+  *++yyssp = yystate;
+
+  if (yyssp >= yyss + yystacksize - 1)
+    {
+      /* Give user a chance to reallocate the stack */
+      /* Use copies of these so that the &'s don't force the real ones into memory. */
+      YYSTYPE *yyvs1 = yyvs;
+      short *yyss1 = yyss;
+#ifdef YYLSP_NEEDED
+      YYLTYPE *yyls1 = yyls;
+#endif
+
+      /* Get the current used size of the three stacks, in elements.  */
+      int size = yyssp - yyss + 1;
+
+#ifdef yyoverflow
+      /* Each stack pointer address is followed by the size of
+        the data in use in that stack, in bytes.  */
+      yyoverflow("parser stack overflow",
+                &yyss1, size * sizeof (*yyssp),
+                &yyvs1, size * sizeof (*yyvsp),
+#ifdef YYLSP_NEEDED
+                &yyls1, size * sizeof (*yylsp),
+#endif
+                &yystacksize);
+
+      yyss = yyss1; yyvs = yyvs1;
+#ifdef YYLSP_NEEDED
+      yyls = yyls1;
+#endif
+#else /* no yyoverflow */
+      /* Extend the stack our own way.  */
+      if (yystacksize >= YYMAXDEPTH)
+       {
+         yyerror("parser stack overflow");
+         return 2;
+       }
+      yystacksize *= 2;
+      if (yystacksize > YYMAXDEPTH)
+       yystacksize = YYMAXDEPTH;
+      yyss = (short *) alloca (yystacksize * sizeof (*yyssp));
+      __yy_bcopy ((char *)yyss1, (char *)yyss, size * sizeof (*yyssp));
+      yyvs = (YYSTYPE *) alloca (yystacksize * sizeof (*yyvsp));
+      __yy_bcopy ((char *)yyvs1, (char *)yyvs, size * sizeof (*yyvsp));
+#ifdef YYLSP_NEEDED
+      yyls = (YYLTYPE *) alloca (yystacksize * sizeof (*yylsp));
+      __yy_bcopy ((char *)yyls1, (char *)yyls, size * sizeof (*yylsp));
+#endif
+#endif /* no yyoverflow */
+
+      yyssp = yyss + size - 1;
+      yyvsp = yyvs + size - 1;
+#ifdef YYLSP_NEEDED
+      yylsp = yyls + size - 1;
+#endif
+
+#if YYDEBUG != 0
+      if (yydebug)
+       fprintf(stderr, "Stack size increased to %d\n", yystacksize);
+#endif
+
+      if (yyssp >= yyss + yystacksize - 1)
+       YYABORT;
+    }
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Entering state %d\n", yystate);
+#endif
+
+ yybackup:
+
+/* Do appropriate processing given the current state.  */
+/* Read a lookahead token if we need one and don't already have one.  */
+/* yyresume: */
+
+  /* First try to decide what to do without reference to lookahead token.  */
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yydefault;
+
+  /* Not known => get a lookahead token if don't already have one.  */
+
+  /* yychar is either YYEMPTY or YYEOF
+     or a valid token in external form.  */
+
+  if (yychar == YYEMPTY)
+    {
+#if YYDEBUG != 0
+      if (yydebug)
+       fprintf(stderr, "Reading a token: ");
+#endif
+      yychar = YYLEX;
+    }
+
+  /* Convert token to internal form (in yychar1) for indexing tables with */
+
+  if (yychar <= 0)             /* This means end of input. */
+    {
+      yychar1 = 0;
+      yychar = YYEOF;          /* Don't call YYLEX any more */
+
+#if YYDEBUG != 0
+      if (yydebug)
+       fprintf(stderr, "Now at end of input.\n");
+#endif
+    }
+  else
+    {
+      yychar1 = YYTRANSLATE(yychar);
+
+#if YYDEBUG != 0
+      if (yydebug)
+       fprintf(stderr, "Next token is %d (%s)\n", yychar, yytname[yychar1]);
+#endif
+    }
+
+  yyn += yychar1;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != yychar1)
+    goto yydefault;
+
+  yyn = yytable[yyn];
+
+  /* yyn is what to do for this token type in this state.
+     Negative => reduce, -yyn is rule number.
+     Positive => shift, yyn is new state.
+       New state is final state => don't bother to shift,
+       just return success.
+     0, or most negative number => error.  */
+
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+       goto yyerrlab;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrlab;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+  /* Shift the lookahead token.  */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting token %d (%s), ", yychar, yytname[yychar1]);
+#endif
+
+  /* Discard the token being shifted unless it is eof.  */
+  if (yychar != YYEOF)
+    yychar = YYEMPTY;
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  /* count tokens shifted since error; after three, turn off error status.  */
+  if (yyerrstatus) yyerrstatus--;
+
+  yystate = yyn;
+  goto yynewstate;
+
+/* Do the default action for the current state.  */
+yydefault:
+
+  yyn = yydefact[yystate];
+  if (yyn == 0)
+    goto yyerrlab;
+
+/* Do a reduction.  yyn is the number of a rule to reduce with.  */
+yyreduce:
+  yylen = yyr2[yyn];
+  yyval = yyvsp[1-yylen]; /* implement default value of the action */
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      if (yylen == 1)
+       fprintf (stderr, "Reducing 1 value via rule %d (line %d), ",
+                yyn, yyrline[yyn]);
+      else
+       fprintf (stderr, "Reducing %d values via rule %d (line %d), ",
+                yylen, yyn, yyrline[yyn]);
+    }
+#endif
+
+
+  switch (yyn) {
+
+case 2:
+#line 266 "pic.y"
+{
+                 if (olist.head)
+                   print_picture(olist.head);
+               ;
+    break;}
+case 3:
+#line 275 "pic.y"
+{ yyval.pl = yyvsp[-1].pl; ;
+    break;}
+case 4:
+#line 280 "pic.y"
+{ yyval.pl = yyvsp[0].pl; ;
+    break;}
+case 5:
+#line 282 "pic.y"
+{ yyval.pl = yyvsp[-2].pl; ;
+    break;}
+case 10:
+#line 297 "pic.y"
+{
+                 define_variable(yyvsp[-2].str, yyvsp[0].x);
+                 delete yyvsp[-2].str;
+               ;
+    break;}
+case 11:
+#line 302 "pic.y"
+{ current_direction = UP_DIRECTION; ;
+    break;}
+case 12:
+#line 304 "pic.y"
+{ current_direction = DOWN_DIRECTION; ;
+    break;}
+case 13:
+#line 306 "pic.y"
+{ current_direction = LEFT_DIRECTION; ;
+    break;}
+case 14:
+#line 308 "pic.y"
+{ current_direction = RIGHT_DIRECTION; ;
+    break;}
+case 15:
+#line 310 "pic.y"
+{
+                 olist.append(make_command_object(yyvsp[0].lstr.str,
+                                                        yyvsp[0].lstr.filename,
+                                                        yyvsp[0].lstr.lineno));
+               ;
+    break;}
+case 16:
+#line 316 "pic.y"
+{
+                 fprintf(stderr, "%g\n", yyvsp[0].x);
+                 fflush(stderr);
+               ;
+    break;}
+case 17:
+#line 321 "pic.y"
+{
+                 fprintf(stderr, "%s\n", yyvsp[0].lstr.str);
+                 delete yyvsp[0].lstr.str;
+                 fflush(stderr);
+               ;
+    break;}
+case 18:
+#line 327 "pic.y"
+{
+                 fprintf(stderr, "%g, %g\n", yyvsp[0].pair.x, yyvsp[0].pair.y);
+                 fflush(stderr);
+               ;
+    break;}
+case 19:
+#line 332 "pic.y"
+{ delim_flag = 1; ;
+    break;}
+case 20:
+#line 334 "pic.y"
+{
+                 delim_flag = 0;
+                 system(yyvsp[0].str);
+                 delete yyvsp[0].str;
+               ;
+    break;}
+case 21:
+#line 340 "pic.y"
+{
+                 if (yychar < 0)
+                   do_lookahead();
+                 do_copy(yyvsp[0].lstr.str);
+                 // do not delete the filename
+               ;
+    break;}
+case 22:
+#line 347 "pic.y"
+{ delim_flag = 2; ;
+    break;}
+case 23:
+#line 349 "pic.y"
+{ delim_flag = 0; ;
+    break;}
+case 24:
+#line 351 "pic.y"
+{
+                 if (yychar < 0)
+                   do_lookahead();
+                 copy_file_thru(yyvsp[-5].lstr.str, yyvsp[-2].str, yyvsp[0].str);
+                 // do not delete the filename
+                 delete yyvsp[-2].str;
+                 delete yyvsp[0].str;
+               ;
+    break;}
+case 25:
+#line 360 "pic.y"
+{ delim_flag = 2; ;
+    break;}
+case 26:
+#line 362 "pic.y"
+{ delim_flag = 0; ;
+    break;}
+case 27:
+#line 364 "pic.y"
+{
+                 if (yychar < 0)
+                   do_lookahead();
+                 copy_rest_thru(yyvsp[-2].str, yyvsp[0].str);
+                 delete yyvsp[-2].str;
+                 delete yyvsp[0].str;
+               ;
+    break;}
+case 28:
+#line 372 "pic.y"
+{ delim_flag = 1; ;
+    break;}
+case 29:
+#line 374 "pic.y"
+{
+                 delim_flag = 0;
+                 if (yychar < 0)
+                   do_lookahead();
+                 do_for(yyvsp[-8].str, yyvsp[-6].x, yyvsp[-4].x, yyvsp[-3].by.is_multiplicative, yyvsp[-3].by.val, yyvsp[0].str); 
+               ;
+    break;}
+case 30:
+#line 381 "pic.y"
+{
+                 if (yychar < 0)
+                   do_lookahead();
+                 if (yyvsp[0].if_data.x != 0.0)
+                   push_body(yyvsp[0].if_data.body);
+                 delete yyvsp[0].if_data.body;
+               ;
+    break;}
+case 31:
+#line 389 "pic.y"
+{ delim_flag = 1; ;
+    break;}
+case 32:
+#line 391 "pic.y"
+{
+                 delim_flag = 0;
+                 if (yychar < 0)
+                   do_lookahead();
+                 if (yyvsp[-3].if_data.x != 0.0)
+                   push_body(yyvsp[-3].if_data.body);
+                 else
+                   push_body(yyvsp[0].str);
+                 delete yyvsp[-3].if_data.body;
+                 delete yyvsp[0].str;
+               ;
+    break;}
+case 34:
+#line 404 "pic.y"
+{ define_variable("scale", 1.0); ;
+    break;}
+case 35:
+#line 409 "pic.y"
+{ reset(yyvsp[0].str); delete yyvsp[0].str; ;
+    break;}
+case 36:
+#line 411 "pic.y"
+{ reset(yyvsp[0].str); delete yyvsp[0].str; ;
+    break;}
+case 37:
+#line 413 "pic.y"
+{ reset(yyvsp[0].str); delete yyvsp[0].str; ;
+    break;}
+case 38:
+#line 418 "pic.y"
+{ delim_flag = 1; ;
+    break;}
+case 39:
+#line 420 "pic.y"
+{ delim_flag = 0; yyval.if_data.x = yyvsp[-3].x; yyval.if_data.body = yyvsp[0].str; ;
+    break;}
+case 40:
+#line 425 "pic.y"
+{ yyval.str = 0; ;
+    break;}
+case 41:
+#line 427 "pic.y"
+{ yyval.str = yyvsp[0].lstr.str; ;
+    break;}
+case 42:
+#line 432 "pic.y"
+{ yyval.x = yyvsp[0].x; ;
+    break;}
+case 43:
+#line 434 "pic.y"
+{
+                 yyval.x = strcmp(yyvsp[-2].lstr.str, yyvsp[0].lstr.str) == 0;
+                 delete yyvsp[-2].lstr.str;
+                 delete yyvsp[0].lstr.str;
+               ;
+    break;}
+case 44:
+#line 440 "pic.y"
+{
+                 yyval.x = strcmp(yyvsp[-2].lstr.str, yyvsp[0].lstr.str) != 0;
+                 delete yyvsp[-2].lstr.str;
+                 delete yyvsp[0].lstr.str;
+               ;
+    break;}
+case 45:
+#line 448 "pic.y"
+{ yyval.by.val = 1.0; yyval.by.is_multiplicative = 0; ;
+    break;}
+case 46:
+#line 450 "pic.y"
+{ yyval.by.val = yyvsp[0].x; yyval.by.is_multiplicative = 0; ;
+    break;}
+case 47:
+#line 452 "pic.y"
+{ yyval.by.val = yyvsp[0].x; yyval.by.is_multiplicative = 1; ;
+    break;}
+case 48:
+#line 457 "pic.y"
+{
+                 yyval.pl.obj = yyvsp[0].spec->make_object(&current_position,
+                                          &current_direction);
+                 if (yyval.pl.obj == 0)
+                   YYABORT;
+                 delete yyvsp[0].spec;
+                 if (yyval.pl.obj)
+                   olist.append(yyval.pl.obj);
+                 else {
+                   yyval.pl.x = current_position.x;
+                   yyval.pl.y = current_position.y;
+                 }
+               ;
+    break;}
+case 49:
+#line 471 "pic.y"
+{ yyval.pl = yyvsp[0].pl; define_label(yyvsp[-3].str, & yyval.pl); delete yyvsp[-3].str; ;
+    break;}
+case 50:
+#line 473 "pic.y"
+{
+                 yyval.pl.obj = 0;
+                 yyval.pl.x = yyvsp[0].pair.x;
+                 yyval.pl.y = yyvsp[0].pair.y;
+                 define_label(yyvsp[-3].str, & yyval.pl);
+                 delete yyvsp[-3].str;
+               ;
+    break;}
+case 51:
+#line 481 "pic.y"
+{
+                 yyval.pl = yyvsp[0].pl;
+                 define_label(yyvsp[-3].str, & yyval.pl);
+                 delete yyvsp[-3].str;
+               ;
+    break;}
+case 52:
+#line 487 "pic.y"
+{
+                 yyval.state.x = current_position.x;
+                 yyval.state.y = current_position.y;
+                 yyval.state.dir = current_direction;
+               ;
+    break;}
+case 53:
+#line 493 "pic.y"
+{
+                 current_position.x = yyvsp[-2].state.x;
+                 current_position.y = yyvsp[-2].state.y;
+                 current_direction = yyvsp[-2].state.dir;
+                 yyval.pl = yyvsp[-1].pl;
+               ;
+    break;}
+case 54:
+#line 500 "pic.y"
+{
+                 yyval.pl.obj = 0;
+                 yyval.pl.x = current_position.x;
+                 yyval.pl.y = current_position.y;
+               ;
+    break;}
+case 55:
+#line 509 "pic.y"
+{
+                 yyval.spec = new object_spec(BOX_OBJECT);
+               ;
+    break;}
+case 56:
+#line 513 "pic.y"
+{
+                 yyval.spec = new object_spec(CIRCLE_OBJECT);
+               ;
+    break;}
+case 57:
+#line 517 "pic.y"
+{
+                 yyval.spec = new object_spec(ELLIPSE_OBJECT);
+               ;
+    break;}
+case 58:
+#line 521 "pic.y"
+{
+                 yyval.spec = new object_spec(ARC_OBJECT);
+                 yyval.spec->dir = current_direction;
+               ;
+    break;}
+case 59:
+#line 526 "pic.y"
+{
+                 yyval.spec = new object_spec(LINE_OBJECT);
+                 lookup_variable("lineht", & yyval.spec->segment_height);
+                 lookup_variable("linewid", & yyval.spec->segment_width);
+                 yyval.spec->dir = current_direction;
+               ;
+    break;}
+case 60:
+#line 533 "pic.y"
+{
+                 yyval.spec = new object_spec(ARROW_OBJECT);
+                 lookup_variable("lineht", & yyval.spec->segment_height);
+                 lookup_variable("linewid", & yyval.spec->segment_width);
+                 yyval.spec->dir = current_direction;
+               ;
+    break;}
+case 61:
+#line 540 "pic.y"
+{
+                 yyval.spec = new object_spec(MOVE_OBJECT);
+                 lookup_variable("moveht", & yyval.spec->segment_height);
+                 lookup_variable("movewid", & yyval.spec->segment_width);
+                 yyval.spec->dir = current_direction;
+               ;
+    break;}
+case 62:
+#line 547 "pic.y"
+{
+                 yyval.spec = new object_spec(SPLINE_OBJECT);
+                 lookup_variable("lineht", & yyval.spec->segment_height);
+                 lookup_variable("linewid", & yyval.spec->segment_width);
+                 yyval.spec->dir = current_direction;
+               ;
+    break;}
+case 63:
+#line 554 "pic.y"
+{
+                 yyval.spec = new object_spec(TEXT_OBJECT);
+                 yyval.spec->text = new text_item(yyvsp[0].lstr.str, yyvsp[0].lstr.filename, yyvsp[0].lstr.lineno);
+               ;
+    break;}
+case 64:
+#line 559 "pic.y"
+{
+                 yyval.spec = new object_spec(TEXT_OBJECT);
+                 yyval.spec->text = new text_item(format_number(0, yyvsp[0].x), 0, -1);
+               ;
+    break;}
+case 65:
+#line 564 "pic.y"
+{
+                 yyval.spec = new object_spec(TEXT_OBJECT);
+                 yyval.spec->text = new text_item(format_number(yyvsp[0].lstr.str, yyvsp[-1].x),
+                                          yyvsp[0].lstr.filename, yyvsp[0].lstr.lineno);
+                 delete yyvsp[0].lstr.str;
+               ;
+    break;}
+case 66:
+#line 571 "pic.y"
+{
+                 saved_state *p = new saved_state;
+                 yyval.pstate = p;
+                 p->x = current_position.x;
+                 p->y = current_position.y;
+                 p->dir = current_direction;
+                 p->tbl = current_table;
+                 p->prev = current_saved_state;
+                 current_position.x = 0.0;
+                 current_position.y = 0.0;
+                 current_table = new PTABLE(place);
+                 current_saved_state = p;
+                 olist.append(make_mark_object());
+               ;
+    break;}
+case 67:
+#line 586 "pic.y"
+{
+                 current_position.x = yyvsp[-2].pstate->x;
+                 current_position.y = yyvsp[-2].pstate->y;
+                 current_direction = yyvsp[-2].pstate->dir;
+                 yyval.spec = new object_spec(BLOCK_OBJECT);
+                 olist.wrap_up_block(& yyval.spec->oblist);
+                 yyval.spec->tbl = current_table;
+                 current_table = yyvsp[-2].pstate->tbl;
+                 current_saved_state = yyvsp[-2].pstate->prev;
+                 delete yyvsp[-2].pstate;
+               ;
+    break;}
+case 68:
+#line 598 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->height = yyvsp[0].x;
+                 yyval.spec->flags |= HAS_HEIGHT;
+               ;
+    break;}
+case 69:
+#line 604 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->radius = yyvsp[0].x;
+                 yyval.spec->flags |= HAS_RADIUS;
+               ;
+    break;}
+case 70:
+#line 610 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->width = yyvsp[0].x;
+                 yyval.spec->flags |= HAS_WIDTH;
+               ;
+    break;}
+case 71:
+#line 616 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->radius = yyvsp[0].x/2.0;
+                 yyval.spec->flags |= HAS_RADIUS;
+               ;
+    break;}
+case 72:
+#line 622 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->flags |= HAS_SEGMENT;
+                 switch (yyval.spec->dir) {
+                 case UP_DIRECTION:
+                   yyval.spec->segment_pos.y += yyvsp[0].x;
+                   break;
+                 case DOWN_DIRECTION:
+                   yyval.spec->segment_pos.y -= yyvsp[0].x;
+                   break;
+                 case RIGHT_DIRECTION:
+                   yyval.spec->segment_pos.x += yyvsp[0].x;
+                   break;
+                 case LEFT_DIRECTION:
+                   yyval.spec->segment_pos.x -= yyvsp[0].x;
+                   break;
+                 }
+               ;
+    break;}
+case 73:
+#line 641 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->dir = UP_DIRECTION;
+                 yyval.spec->flags |= HAS_SEGMENT;
+                 yyval.spec->segment_pos.y += yyval.spec->segment_height;
+               ;
+    break;}
+case 74:
+#line 648 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->dir = UP_DIRECTION;
+                 yyval.spec->flags |= HAS_SEGMENT;
+                 yyval.spec->segment_pos.y += yyvsp[0].x;
+               ;
+    break;}
+case 75:
+#line 655 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->dir = DOWN_DIRECTION;
+                 yyval.spec->flags |= HAS_SEGMENT;
+                 yyval.spec->segment_pos.y -= yyval.spec->segment_height;
+               ;
+    break;}
+case 76:
+#line 662 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->dir = DOWN_DIRECTION;
+                 yyval.spec->flags |= HAS_SEGMENT;
+                 yyval.spec->segment_pos.y -= yyvsp[0].x;
+               ;
+    break;}
+case 77:
+#line 669 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->dir = RIGHT_DIRECTION;
+                 yyval.spec->flags |= HAS_SEGMENT;
+                 yyval.spec->segment_pos.x += yyval.spec->segment_width;
+               ;
+    break;}
+case 78:
+#line 676 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->dir = RIGHT_DIRECTION;
+                 yyval.spec->flags |= HAS_SEGMENT;
+                 yyval.spec->segment_pos.x += yyvsp[0].x;
+               ;
+    break;}
+case 79:
+#line 683 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->dir = LEFT_DIRECTION;
+                 yyval.spec->flags |= HAS_SEGMENT;
+                 yyval.spec->segment_pos.x -= yyval.spec->segment_width;
+               ;
+    break;}
+case 80:
+#line 690 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->dir = LEFT_DIRECTION;
+                 yyval.spec->flags |= HAS_SEGMENT;
+                 yyval.spec->segment_pos.x -= yyvsp[0].x;
+               ;
+    break;}
+case 81:
+#line 697 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->flags |= HAS_FROM;
+                 yyval.spec->from.x = yyvsp[0].pair.x;
+                 yyval.spec->from.y = yyvsp[0].pair.y;
+               ;
+    break;}
+case 82:
+#line 704 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 if (yyval.spec->flags & HAS_SEGMENT)
+                   yyval.spec->segment_list = new segment(yyval.spec->segment_pos,
+                                                  yyval.spec->segment_is_absolute,
+                                                  yyval.spec->segment_list);
+                 yyval.spec->flags |= HAS_SEGMENT;
+                 yyval.spec->segment_pos.x = yyvsp[0].pair.x;
+                 yyval.spec->segment_pos.y = yyvsp[0].pair.y;
+                 yyval.spec->segment_is_absolute = 1;
+                 yyval.spec->flags |= HAS_TO;
+                 yyval.spec->to.x = yyvsp[0].pair.x;
+                 yyval.spec->to.y = yyvsp[0].pair.y;
+               ;
+    break;}
+case 83:
+#line 719 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->flags |= HAS_AT;
+                 yyval.spec->at.x = yyvsp[0].pair.x;
+                 yyval.spec->at.y = yyvsp[0].pair.y;
+                 if (yyval.spec->type != ARC_OBJECT) {
+                   yyval.spec->flags |= HAS_FROM;
+                   yyval.spec->from.x = yyvsp[0].pair.x;
+                   yyval.spec->from.y = yyvsp[0].pair.y;
+                 }
+               ;
+    break;}
+case 84:
+#line 731 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->flags |= HAS_WITH;
+                 yyval.spec->with = yyvsp[0].pth;
+               ;
+    break;}
+case 85:
+#line 737 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->flags |= HAS_SEGMENT;
+                 yyval.spec->segment_pos.x += yyvsp[0].pair.x;
+                 yyval.spec->segment_pos.y += yyvsp[0].pair.y;
+               ;
+    break;}
+case 86:
+#line 744 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 if (yyval.spec->flags & HAS_SEGMENT) {
+                   yyval.spec->segment_list = new segment(yyval.spec->segment_pos,
+                                                  yyval.spec->segment_is_absolute,
+                                                  yyval.spec->segment_list);
+                   yyval.spec->flags &= ~HAS_SEGMENT;
+                   yyval.spec->segment_pos.x = yyval.spec->segment_pos.y = 0.0;
+                   yyval.spec->segment_is_absolute = 0;
+                 }
+               ;
+    break;}
+case 87:
+#line 756 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->flags |= IS_DOTTED;
+                 lookup_variable("dashwid", & yyval.spec->dash_width);
+               ;
+    break;}
+case 88:
+#line 762 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->flags |= IS_DOTTED;
+                 yyval.spec->dash_width = yyvsp[0].x;
+               ;
+    break;}
+case 89:
+#line 768 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->flags |= IS_DASHED;
+                 lookup_variable("dashwid", & yyval.spec->dash_width);
+               ;
+    break;}
+case 90:
+#line 774 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->flags |= IS_DASHED;
+                 yyval.spec->dash_width = yyvsp[0].x;
+               ;
+    break;}
+case 91:
+#line 780 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->flags |= IS_DEFAULT_FILLED;
+               ;
+    break;}
+case 92:
+#line 785 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->flags |= IS_FILLED;
+                 yyval.spec->fill = yyvsp[0].x;
+               ;
+    break;}
+case 93:
+#line 791 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 // line chop chop means line chop 0 chop 0
+                 if (yyval.spec->flags & IS_DEFAULT_CHOPPED) {
+                   yyval.spec->flags |= IS_CHOPPED;
+                   yyval.spec->flags &= ~IS_DEFAULT_CHOPPED;
+                   yyval.spec->start_chop = yyval.spec->end_chop = 0.0;
+                 }
+                 else if (yyval.spec->flags & IS_CHOPPED) {
+                   yyval.spec->end_chop = 0.0;
+                 }
+                 else {
+                   yyval.spec->flags |= IS_DEFAULT_CHOPPED;
+                 }
+               ;
+    break;}
+case 94:
+#line 807 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 if (yyval.spec->flags & IS_DEFAULT_CHOPPED) {
+                   yyval.spec->flags |= IS_CHOPPED;
+                   yyval.spec->flags &= ~IS_DEFAULT_CHOPPED;
+                   yyval.spec->start_chop = 0.0;
+                   yyval.spec->end_chop = yyvsp[0].x;
+                 }
+                 else if (yyval.spec->flags & IS_CHOPPED) {
+                   yyval.spec->end_chop = yyvsp[0].x;
+                 }
+                 else {
+                   yyval.spec->start_chop = yyval.spec->end_chop = yyvsp[0].x;
+                   yyval.spec->flags |= IS_CHOPPED;
+                 }
+               ;
+    break;}
+case 95:
+#line 824 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->flags |= IS_SAME;
+               ;
+    break;}
+case 96:
+#line 829 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->flags |= IS_INVISIBLE;
+               ;
+    break;}
+case 97:
+#line 834 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->flags |= HAS_LEFT_ARROW_HEAD;
+               ;
+    break;}
+case 98:
+#line 839 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->flags |= HAS_RIGHT_ARROW_HEAD;
+               ;
+    break;}
+case 99:
+#line 844 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->flags |= (HAS_LEFT_ARROW_HEAD|HAS_RIGHT_ARROW_HEAD);
+               ;
+    break;}
+case 100:
+#line 849 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->flags |= IS_CLOCKWISE;
+               ;
+    break;}
+case 101:
+#line 854 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->flags &= ~IS_CLOCKWISE;
+               ;
+    break;}
+case 102:
+#line 859 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 for (text_item **p = & yyval.spec->text; *p; p = &(*p)->next)
+                   ;
+                 *p = new text_item(yyvsp[0].lstr.str, yyvsp[0].lstr.filename, yyvsp[0].lstr.lineno);
+               ;
+    break;}
+case 103:
+#line 866 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 if (yyval.spec->text) {
+                   for (text_item *p = yyval.spec->text; p->next; p = p->next)
+                     ;
+                   p->adj.h = LEFT_ADJUST;
+                 }
+               ;
+    break;}
+case 104:
+#line 875 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 if (yyval.spec->text) {
+                   for (text_item *p = yyval.spec->text; p->next; p = p->next)
+                     ;
+                   p->adj.h = RIGHT_ADJUST;
+                 }
+               ;
+    break;}
+case 105:
+#line 884 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 if (yyval.spec->text) {
+                   for (text_item *p = yyval.spec->text; p->next; p = p->next)
+                     ;
+                   p->adj.v = ABOVE_ADJUST;
+                 }
+               ;
+    break;}
+case 106:
+#line 893 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 if (yyval.spec->text) {
+                   for (text_item *p = yyval.spec->text; p->next; p = p->next)
+                     ;
+                   p->adj.v = BELOW_ADJUST;
+                 }
+               ;
+    break;}
+case 107:
+#line 902 "pic.y"
+{
+                 yyval.spec = yyvsp[-2].spec;
+                 yyval.spec->flags |= HAS_THICKNESS;
+                 yyval.spec->thickness = yyvsp[0].x;
+               ;
+    break;}
+case 108:
+#line 908 "pic.y"
+{
+                 yyval.spec = yyvsp[-1].spec;
+                 yyval.spec->flags |= IS_ALIGNED;
+               ;
+    break;}
+case 109:
+#line 916 "pic.y"
+{
+                 yyval.lstr = yyvsp[0].lstr;
+               ;
+    break;}
+case 110:
+#line 920 "pic.y"
+{
+                 yyval.lstr.filename = yyvsp[-2].lstr.filename;
+                 yyval.lstr.lineno = yyvsp[-2].lstr.lineno;
+                 yyval.lstr.str = do_sprintf(yyvsp[-2].lstr.str, yyvsp[-1].dv.v, yyvsp[-1].dv.nv);
+                 delete yyvsp[-1].dv.v;
+                 delete yyvsp[-2].lstr.str;
+               ;
+    break;}
+case 111:
+#line 931 "pic.y"
+{
+                 yyval.dv.v = 0;
+                 yyval.dv.nv = 0;
+                 yyval.dv.maxv = 0;
+               ;
+    break;}
+case 112:
+#line 937 "pic.y"
+{
+                 yyval.dv = yyvsp[-2].dv;
+                 if (yyval.dv.nv >= yyval.dv.maxv) {
+                   if (yyval.dv.nv == 0) {
+                     yyval.dv.v = new double[4];
+                     yyval.dv.maxv = 4;
+                   }
+                   else {
+                     double *oldv = yyval.dv.v;
+                     yyval.dv.maxv *= 2;
+                     yyval.dv.v = new double[yyval.dv.maxv];
+                     memcpy(yyval.dv.v, oldv, yyval.dv.nv*sizeof(double));
+                     delete oldv;
+                   }
+                 }
+                 yyval.dv.v[yyval.dv.nv] = yyvsp[0].x;
+                 yyval.dv.nv += 1;
+               ;
+    break;}
+case 113:
+#line 959 "pic.y"
+{ yyval.pair = yyvsp[0].pair; ;
+    break;}
+case 114:
+#line 961 "pic.y"
+{
+                 position pos = yyvsp[0].pl;
+                 yyval.pair.x = pos.x;
+                 yyval.pair.y = pos.y;
+               ;
+    break;}
+case 115:
+#line 970 "pic.y"
+{ yyval.pair = yyvsp[0].pair; ;
+    break;}
+case 116:
+#line 972 "pic.y"
+{
+                 yyval.pair.x = yyvsp[-2].pair.x + yyvsp[0].pair.x;
+                 yyval.pair.y = yyvsp[-2].pair.y + yyvsp[0].pair.y;
+               ;
+    break;}
+case 117:
+#line 977 "pic.y"
+{
+                 yyval.pair.x = yyvsp[-2].pair.x - yyvsp[0].pair.x;
+                 yyval.pair.y = yyvsp[-2].pair.y - yyvsp[0].pair.y;
+               ;
+    break;}
+case 118:
+#line 982 "pic.y"
+{
+                 yyval.pair.x = yyvsp[-3].pair.x;
+                 yyval.pair.y = yyvsp[-1].pair.y;
+               ;
+    break;}
+case 119:
+#line 987 "pic.y"
+{
+                 yyval.pair.x = (1.0 - yyvsp[-4].x)*yyvsp[-2].pair.x + yyvsp[-4].x*yyvsp[0].pair.x;
+                 yyval.pair.y = (1.0 - yyvsp[-4].x)*yyvsp[-2].pair.y + yyvsp[-4].x*yyvsp[0].pair.y;
+               ;
+    break;}
+case 120:
+#line 992 "pic.y"
+{
+                 yyval.pair.x = (1.0 - yyvsp[-5].x)*yyvsp[-3].pair.x + yyvsp[-5].x*yyvsp[-1].pair.x;
+                 yyval.pair.y = (1.0 - yyvsp[-5].x)*yyvsp[-3].pair.y + yyvsp[-5].x*yyvsp[-1].pair.y;
+               ;
+    break;}
+case 123:
+#line 1005 "pic.y"
+{ yyval.pair.x = yyvsp[-2].x; yyval.pair.y = yyvsp[0].x; ;
+    break;}
+case 124:
+#line 1007 "pic.y"
+{ yyval.pair = yyvsp[-1].pair; ;
+    break;}
+case 125:
+#line 1012 "pic.y"
+{ yyval.pl = yyvsp[0].pl; ;
+    break;}
+case 126:
+#line 1014 "pic.y"
+{
+                 path pth(yyvsp[0].crn);
+                 if (!pth.follow(yyvsp[-1].pl, & yyval.pl))
+                   YYABORT;
+               ;
+    break;}
+case 127:
+#line 1020 "pic.y"
+{
+                 path pth(yyvsp[-1].crn);
+                 if (!pth.follow(yyvsp[0].pl, & yyval.pl))
+                   YYABORT;
+               ;
+    break;}
+case 128:
+#line 1026 "pic.y"
+{
+                 path pth(yyvsp[-2].crn);
+                 if (!pth.follow(yyvsp[0].pl, & yyval.pl))
+                   YYABORT;
+               ;
+    break;}
+case 129:
+#line 1032 "pic.y"
+{
+                 yyval.pl.x = current_position.x;
+                 yyval.pl.y = current_position.y;
+                 yyval.pl.obj = 0;
+               ;
+    break;}
+case 130:
+#line 1041 "pic.y"
+{
+                 place *p = lookup_label(yyvsp[0].str);
+                 if (!p) {
+                   lex_error("there is no place `%1'", yyvsp[0].str);
+                   YYABORT;
+                 }
+                 yyval.pl = *p;
+                 delete yyvsp[0].str;
+               ;
+    break;}
+case 131:
+#line 1051 "pic.y"
+{
+                 yyval.pl.obj = yyvsp[0].obj;
+               ;
+    break;}
+case 132:
+#line 1055 "pic.y"
+{
+                 path pth(yyvsp[0].str);
+                 if (!pth.follow(yyvsp[-2].pl, & yyval.pl))
+                   YYABORT;
+               ;
+    break;}
+case 133:
+#line 1064 "pic.y"
+{ yyval.n = 1; ;
+    break;}
+case 134:
+#line 1066 "pic.y"
+{ yyval.n = yyvsp[-1].n; ;
+    break;}
+case 135:
+#line 1071 "pic.y"
+{
+                 int count = 0;
+                 for (object *p = olist.head; p != 0; p = p->next)
+                   if (p->type() == yyvsp[0].obtype && ++count == yyvsp[-1].n) {
+                     yyval.obj = p;
+                     break;
+                   }
+                 if (p == 0) {
+                   lex_error("there is no %1%2 %3", yyvsp[-1].n, ordinal_postfix(yyvsp[-1].n),
+                             object_type_name(yyvsp[0].obtype));
+                   YYABORT;
+                 }
+               ;
+    break;}
+case 136:
+#line 1085 "pic.y"
+{
+                 int count = 0;
+                 for (object *p = olist.tail; p != 0; p = p->prev)
+                   if (p->type() == yyvsp[0].obtype && ++count == yyvsp[-1].n) {
+                     yyval.obj = p;
+                     break;
+                   }
+                 if (p == 0) {
+                   lex_error("there is no %1%2 last %3", yyvsp[-1].n,
+                             ordinal_postfix(yyvsp[-1].n), object_type_name(yyvsp[0].obtype));
+                   YYABORT;
+                 }
+               ;
+    break;}
+case 137:
+#line 1102 "pic.y"
+{ yyval.obtype = BOX_OBJECT; ;
+    break;}
+case 138:
+#line 1104 "pic.y"
+{ yyval.obtype = CIRCLE_OBJECT; ;
+    break;}
+case 139:
+#line 1106 "pic.y"
+{ yyval.obtype = ELLIPSE_OBJECT; ;
+    break;}
+case 140:
+#line 1108 "pic.y"
+{ yyval.obtype = ARC_OBJECT; ;
+    break;}
+case 141:
+#line 1110 "pic.y"
+{ yyval.obtype = LINE_OBJECT; ;
+    break;}
+case 142:
+#line 1112 "pic.y"
+{ yyval.obtype = ARROW_OBJECT; ;
+    break;}
+case 143:
+#line 1114 "pic.y"
+{ yyval.obtype = SPLINE_OBJECT; ;
+    break;}
+case 144:
+#line 1116 "pic.y"
+{ yyval.obtype = BLOCK_OBJECT; ;
+    break;}
+case 145:
+#line 1118 "pic.y"
+{ yyval.obtype = TEXT_OBJECT; ;
+    break;}
+case 146:
+#line 1123 "pic.y"
+{
+                 yyval.pth = new path(yyvsp[0].str);
+               ;
+    break;}
+case 147:
+#line 1127 "pic.y"
+{
+                 yyval.pth = yyvsp[-2].pth;
+                 yyval.pth->append(yyvsp[0].str);
+               ;
+    break;}
+case 148:
+#line 1135 "pic.y"
+{
+                 yyval.pth = new path(yyvsp[0].crn);
+               ;
+    break;}
+case 149:
+#line 1142 "pic.y"
+{
+                 yyval.pth = yyvsp[0].pth;
+               ;
+    break;}
+case 150:
+#line 1146 "pic.y"
+{
+                 yyval.pth = yyvsp[-1].pth;
+                 yyval.pth->append(yyvsp[0].crn);
+               ;
+    break;}
+case 151:
+#line 1154 "pic.y"
+{
+                 yyval.pth = yyvsp[0].pth;
+               ;
+    break;}
+case 152:
+#line 1159 "pic.y"
+{
+                 lex_warning("`%1%2 last %3' in `with' argument ignored",
+                             yyvsp[-3].n, ordinal_postfix(yyvsp[-3].n), object_type_name(yyvsp[-1].obtype));
+                 yyval.pth = yyvsp[0].pth;
+               ;
+    break;}
+case 153:
+#line 1165 "pic.y"
+{
+                 lex_warning("`last %1' in `with' argument ignored",
+                             object_type_name(yyvsp[-1].obtype));
+                 yyval.pth = yyvsp[0].pth;
+               ;
+    break;}
+case 154:
+#line 1171 "pic.y"
+{
+                 lex_warning("`%1%2 %3' in `with' argument ignored",
+                             yyvsp[-2].n, ordinal_postfix(yyvsp[-2].n), object_type_name(yyvsp[-1].obtype));
+                 yyval.pth = yyvsp[0].pth;
+               ;
+    break;}
+case 155:
+#line 1177 "pic.y"
+{
+                 lex_warning("initial `%1' in `with' argument ignored", yyvsp[-1].str);
+                 delete yyvsp[-1].str;
+                 yyval.pth = yyvsp[0].pth;
+               ;
+    break;}
+case 156:
+#line 1186 "pic.y"
+{ yyval.crn = &object::north; ;
+    break;}
+case 157:
+#line 1188 "pic.y"
+{ yyval.crn = &object::east; ;
+    break;}
+case 158:
+#line 1190 "pic.y"
+{ yyval.crn = &object::west; ;
+    break;}
+case 159:
+#line 1192 "pic.y"
+{ yyval.crn = &object::south; ;
+    break;}
+case 160:
+#line 1194 "pic.y"
+{ yyval.crn = &object::north_east; ;
+    break;}
+case 161:
+#line 1196 "pic.y"
+{ yyval.crn = &object:: south_east; ;
+    break;}
+case 162:
+#line 1198 "pic.y"
+{ yyval.crn = &object::north_west; ;
+    break;}
+case 163:
+#line 1200 "pic.y"
+{ yyval.crn = &object::south_west; ;
+    break;}
+case 164:
+#line 1202 "pic.y"
+{ yyval.crn = &object::center; ;
+    break;}
+case 165:
+#line 1204 "pic.y"
+{ yyval.crn = &object::start; ;
+    break;}
+case 166:
+#line 1206 "pic.y"
+{ yyval.crn = &object::end; ;
+    break;}
+case 167:
+#line 1208 "pic.y"
+{ yyval.crn = &object::north; ;
+    break;}
+case 168:
+#line 1210 "pic.y"
+{ yyval.crn = &object::south; ;
+    break;}
+case 169:
+#line 1212 "pic.y"
+{ yyval.crn = &object::west; ;
+    break;}
+case 170:
+#line 1214 "pic.y"
+{ yyval.crn = &object::east; ;
+    break;}
+case 171:
+#line 1216 "pic.y"
+{ yyval.crn = &object::north_west; ;
+    break;}
+case 172:
+#line 1218 "pic.y"
+{ yyval.crn = &object::south_west; ;
+    break;}
+case 173:
+#line 1220 "pic.y"
+{ yyval.crn = &object::north_east; ;
+    break;}
+case 174:
+#line 1222 "pic.y"
+{ yyval.crn = &object::south_east; ;
+    break;}
+case 175:
+#line 1224 "pic.y"
+{ yyval.crn = &object::west; ;
+    break;}
+case 176:
+#line 1226 "pic.y"
+{ yyval.crn = &object::east; ;
+    break;}
+case 177:
+#line 1228 "pic.y"
+{ yyval.crn = &object::north_west; ;
+    break;}
+case 178:
+#line 1230 "pic.y"
+{ yyval.crn = &object::south_west; ;
+    break;}
+case 179:
+#line 1232 "pic.y"
+{ yyval.crn = &object::north_east; ;
+    break;}
+case 180:
+#line 1234 "pic.y"
+{ yyval.crn = &object::south_east; ;
+    break;}
+case 181:
+#line 1236 "pic.y"
+{ yyval.crn = &object::center; ;
+    break;}
+case 182:
+#line 1238 "pic.y"
+{ yyval.crn = &object::start; ;
+    break;}
+case 183:
+#line 1240 "pic.y"
+{ yyval.crn = &object::end; ;
+    break;}
+case 184:
+#line 1245 "pic.y"
+{
+                 if (!lookup_variable(yyvsp[0].str, & yyval.x)) {
+                   lex_error("there is no variable `%1'", yyvsp[0].str);
+                   YYABORT;
+                 }
+                 delete yyvsp[0].str;
+               ;
+    break;}
+case 185:
+#line 1253 "pic.y"
+{ yyval.x = yyvsp[0].x; ;
+    break;}
+case 186:
+#line 1255 "pic.y"
+{
+                 if (yyvsp[-1].pl.obj != 0)
+                   yyval.x = yyvsp[-1].pl.obj->origin().x;
+                 else
+                   yyval.x = yyvsp[-1].pl.x;
+               ;
+    break;}
+case 187:
+#line 1262 "pic.y"
+{
+                 if (yyvsp[-1].pl.obj != 0)
+                   yyval.x = yyvsp[-1].pl.obj->origin().y;
+                 else
+                   yyval.x = yyvsp[-1].pl.y;
+               ;
+    break;}
+case 188:
+#line 1269 "pic.y"
+{
+                 if (yyvsp[-1].pl.obj != 0)
+                   yyval.x = yyvsp[-1].pl.obj->height();
+                 else
+                   yyval.x = 0.0;
+               ;
+    break;}
+case 189:
+#line 1276 "pic.y"
+{
+                 if (yyvsp[-1].pl.obj != 0)
+                   yyval.x = yyvsp[-1].pl.obj->width();
+                 else
+                   yyval.x = 0.0;
+               ;
+    break;}
+case 190:
+#line 1283 "pic.y"
+{
+                 if (yyvsp[-1].pl.obj != 0)
+                   yyval.x = yyvsp[-1].pl.obj->radius();
+                 else
+                   yyval.x = 0.0;
+               ;
+    break;}
+case 191:
+#line 1290 "pic.y"
+{ yyval.x = yyvsp[-2].x + yyvsp[0].x; ;
+    break;}
+case 192:
+#line 1292 "pic.y"
+{ yyval.x = yyvsp[-2].x - yyvsp[0].x; ;
+    break;}
+case 193:
+#line 1294 "pic.y"
+{ yyval.x = yyvsp[-2].x * yyvsp[0].x; ;
+    break;}
+case 194:
+#line 1296 "pic.y"
+{
+                 if (yyvsp[0].x == 0.0) {
+                   lex_error("division by zero");
+                   YYABORT;
+                 }
+                 yyval.x = yyvsp[-2].x/yyvsp[0].x;
+               ;
+    break;}
+case 195:
+#line 1304 "pic.y"
+{
+                 if (yyvsp[0].x == 0.0) {
+                   lex_error("modulus by zero");
+                   YYABORT;
+                 }
+                 yyval.x = fmod(yyvsp[-2].x, yyvsp[0].x);
+               ;
+    break;}
+case 196:
+#line 1312 "pic.y"
+{
+                 errno = 0;
+                 yyval.x = pow(yyvsp[-2].x, yyvsp[0].x);
+                 if (errno == EDOM) {
+                   lex_error("arguments to `^' operator out of domain");
+                   YYABORT;
+                 }
+                 if (errno == ERANGE) {
+                   lex_error("result of `^' operator out of range");
+                   YYABORT;
+                 }
+               ;
+    break;}
+case 197:
+#line 1325 "pic.y"
+{ yyval.x = -yyvsp[0].x; ;
+    break;}
+case 198:
+#line 1327 "pic.y"
+{ yyval.x = yyvsp[-1].x; ;
+    break;}
+case 199:
+#line 1329 "pic.y"
+{
+                 errno = 0;
+                 yyval.x = sin(yyvsp[-1].x);
+                 if (errno == ERANGE) {
+                   lex_error("sin result out of range");
+                   YYABORT;
+                 }
+               ;
+    break;}
+case 200:
+#line 1338 "pic.y"
+{
+                 errno = 0;
+                 yyval.x = cos(yyvsp[-1].x);
+                 if (errno == ERANGE) {
+                   lex_error("cos result out of range");
+                   YYABORT;
+                 }
+               ;
+    break;}
+case 201:
+#line 1347 "pic.y"
+{
+                 errno = 0;
+                 yyval.x = atan2(yyvsp[-3].x, yyvsp[-1].x);
+                 if (errno == EDOM) {
+                   lex_error("atan2 argument out of domain");
+                   YYABORT;
+                 }
+                 if (errno == ERANGE) {
+                   lex_error("atan2 result out of range");
+                   YYABORT;
+                 }
+               ;
+    break;}
+case 202:
+#line 1360 "pic.y"
+{
+                 errno = 0;
+                 yyval.x = log10(yyvsp[-1].x);
+                 if (errno == ERANGE) {
+                   lex_error("log result out of range");
+                   YYABORT;
+                 }
+               ;
+    break;}
+case 203:
+#line 1369 "pic.y"
+{
+                 errno = 0;
+                 yyval.x = pow(10.0, yyvsp[-1].x);
+                 if (errno == ERANGE) {
+                   lex_error("exp result out of range");
+                   YYABORT;
+                 }
+               ;
+    break;}
+case 204:
+#line 1378 "pic.y"
+{
+                 errno = 0;
+                 yyval.x = sqrt(yyvsp[-1].x);
+                 if (errno == EDOM) {
+                   lex_error("sqrt argument out of domain");
+                   YYABORT;
+                 }
+               ;
+    break;}
+case 205:
+#line 1387 "pic.y"
+{ yyval.x = yyvsp[-3].x > yyvsp[-1].x ? yyvsp[-3].x : yyvsp[-1].x; ;
+    break;}
+case 206:
+#line 1389 "pic.y"
+{ yyval.x = yyvsp[-3].x > yyvsp[-1].x ? yyvsp[-3].x : yyvsp[-1].x; ;
+    break;}
+case 207:
+#line 1391 "pic.y"
+{ yyval.x = floor(yyvsp[-1].x); ;
+    break;}
+case 208:
+#line 1393 "pic.y"
+{ yyval.x = 1.0 + floor(((rand()&0x7fff)/double(0x7fff))*yyvsp[-1].x); ;
+    break;}
+case 209:
+#line 1395 "pic.y"
+{
+                 /* return a random number in the range [0,1) */
+                 /* portable, but not very random */
+                 yyval.x = (rand() & 0x7fff) / double(0x8000);
+               ;
+    break;}
+case 210:
+#line 1401 "pic.y"
+{ yyval.x = (yyvsp[-2].x < yyvsp[0].x); ;
+    break;}
+case 211:
+#line 1403 "pic.y"
+{ yyval.x = (yyvsp[-2].x <= yyvsp[0].x); ;
+    break;}
+case 212:
+#line 1405 "pic.y"
+{ yyval.x = (yyvsp[-2].x > yyvsp[0].x); ;
+    break;}
+case 213:
+#line 1407 "pic.y"
+{ yyval.x = (yyvsp[-2].x >= yyvsp[0].x); ;
+    break;}
+case 214:
+#line 1409 "pic.y"
+{ yyval.x = (yyvsp[-2].x == yyvsp[0].x); ;
+    break;}
+case 215:
+#line 1411 "pic.y"
+{ yyval.x = (yyvsp[-2].x != yyvsp[0].x); ;
+    break;}
+case 216:
+#line 1413 "pic.y"
+{ yyval.x = (yyvsp[-2].x != 0.0 && yyvsp[0].x != 0.0); ;
+    break;}
+case 217:
+#line 1415 "pic.y"
+{ yyval.x = (yyvsp[-2].x != 0.0 || yyvsp[0].x != 0.0); ;
+    break;}
+case 218:
+#line 1417 "pic.y"
+{ yyval.x = (yyvsp[0].x == 0.0); ;
+    break;}
+}
+   /* the action file gets copied in in place of this dollarsign */
+#line 362 "/usr/local/lib/bison.simple"
+\f
+  yyvsp -= yylen;
+  yyssp -= yylen;
+#ifdef YYLSP_NEEDED
+  yylsp -= yylen;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "state stack now");
+      while (ssp1 != yyssp)
+       fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+  *++yyvsp = yyval;
+
+#ifdef YYLSP_NEEDED
+  yylsp++;
+  if (yylen == 0)
+    {
+      yylsp->first_line = yylloc.first_line;
+      yylsp->first_column = yylloc.first_column;
+      yylsp->last_line = (yylsp-1)->last_line;
+      yylsp->last_column = (yylsp-1)->last_column;
+      yylsp->text = 0;
+    }
+  else
+    {
+      yylsp->last_line = (yylsp+yylen-1)->last_line;
+      yylsp->last_column = (yylsp+yylen-1)->last_column;
+    }
+#endif
+
+  /* Now "shift" the result of the reduction.
+     Determine what state that goes to,
+     based on the state we popped back to
+     and the rule number reduced by.  */
+
+  yyn = yyr1[yyn];
+
+  yystate = yypgoto[yyn - YYNTBASE] + *yyssp;
+  if (yystate >= 0 && yystate <= YYLAST && yycheck[yystate] == *yyssp)
+    yystate = yytable[yystate];
+  else
+    yystate = yydefgoto[yyn - YYNTBASE];
+
+  goto yynewstate;
+
+yyerrlab:   /* here on detecting error */
+
+  if (! yyerrstatus)
+    /* If not already recovering from an error, report this error.  */
+    {
+      ++yynerrs;
+
+#ifdef YYERROR_VERBOSE
+      yyn = yypact[yystate];
+
+      if (yyn > YYFLAG && yyn < YYLAST)
+       {
+         int size = 0;
+         char *msg;
+         int x, count;
+
+         count = 0;
+         for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++)
+           if (yycheck[x + yyn] == x)
+             size += strlen(yytname[x]) + 15, count++;
+         msg = (char *) xmalloc(size + 15);
+         strcpy(msg, "parse error");
+
+         if (count < 5)
+           {
+             count = 0;
+             for (x = 0; x < (sizeof(yytname) / sizeof(char *)); x++)
+               if (yycheck[x + yyn] == x)
+                 {
+                   strcat(msg, count == 0 ? ", expecting `" : " or `");
+                   strcat(msg, yytname[x]);
+                   strcat(msg, "'");
+                   count++;
+                 }
+           }
+         yyerror(msg);
+         free(msg);
+       }
+      else
+#endif /* YYERROR_VERBOSE */
+       yyerror("parse error");
+    }
+
+yyerrlab1:   /* here on error raised explicitly by an action */
+
+  if (yyerrstatus == 3)
+    {
+      /* if just tried and failed to reuse lookahead token after an error, discard it.  */
+
+      /* return failure if at end of input */
+      if (yychar == YYEOF)
+       YYABORT;
+
+#if YYDEBUG != 0
+      if (yydebug)
+       fprintf(stderr, "Discarding token %d (%s).\n", yychar, yytname[yychar1]);
+#endif
+
+      yychar = YYEMPTY;
+    }
+
+  /* Else will try to reuse lookahead token
+     after shifting the error token.  */
+
+  yyerrstatus = 3;             /* Each real token shifted decrements this */
+
+  goto yyerrhandle;
+
+yyerrdefault:  /* current state does not do anything special for the error token. */
+
+#if 0
+  /* This is wrong; only states that explicitly want error tokens
+     should shift them.  */
+  yyn = yydefact[yystate];  /* If its default is to accept any token, ok.  Otherwise pop it.*/
+  if (yyn) goto yydefault;
+#endif
+
+yyerrpop:   /* pop the current state because it cannot handle the error token */
+
+  if (yyssp == yyss) YYABORT;
+  yyvsp--;
+  yystate = *--yyssp;
+#ifdef YYLSP_NEEDED
+  yylsp--;
+#endif
+
+#if YYDEBUG != 0
+  if (yydebug)
+    {
+      short *ssp1 = yyss - 1;
+      fprintf (stderr, "Error: state stack now");
+      while (ssp1 != yyssp)
+       fprintf (stderr, " %d", *++ssp1);
+      fprintf (stderr, "\n");
+    }
+#endif
+
+yyerrhandle:
+
+  yyn = yypact[yystate];
+  if (yyn == YYFLAG)
+    goto yyerrdefault;
+
+  yyn += YYTERROR;
+  if (yyn < 0 || yyn > YYLAST || yycheck[yyn] != YYTERROR)
+    goto yyerrdefault;
+
+  yyn = yytable[yyn];
+  if (yyn < 0)
+    {
+      if (yyn == YYFLAG)
+       goto yyerrpop;
+      yyn = -yyn;
+      goto yyreduce;
+    }
+  else if (yyn == 0)
+    goto yyerrpop;
+
+  if (yyn == YYFINAL)
+    YYACCEPT;
+
+#if YYDEBUG != 0
+  if (yydebug)
+    fprintf(stderr, "Shifting error token, ");
+#endif
+
+  *++yyvsp = yylval;
+#ifdef YYLSP_NEEDED
+  *++yylsp = yylloc;
+#endif
+
+  yystate = yyn;
+  goto yynewstate;
+}
+#line 1421 "pic.y"
+
+
+/* bison defines const to be empty unless __STDC__ is defined, which it
+isn't under cfront */
+
+#ifdef const
+#undef const
+#endif
+
+static struct {
+  const char *name;
+  double val;
+  int scaled;               // non-zero if val should be multiplied by scale
+} defaults_table[] = {
+  "arcrad", .25, 1,
+  "arrowht", .1, 1,
+  "arrowwid", .05, 1,
+  "circlerad", .25, 1,
+  "boxht", .5, 1,
+  "boxwid", .75, 1,
+  "boxrad", 0.0, 1,
+  "dashwid", .05, 1,
+  "ellipseht", .5, 1,
+  "ellipsewid", .75, 1,
+  "moveht", .5, 1,
+  "movewid", .5, 1,
+  "lineht", .5, 1,
+  "linewid", .5, 1,
+  "textht", 0.0, 1,
+  "textwid", 0.0, 1,
+  "scale", 1.0, 0,
+  "linethick", -1.0, 0,                // in points
+  "fillval", .5, 0,
+  "arrowhead", 1.0, 0,
+  "maxpswid", 8.5, 0,
+  "maxpsht", 11.0, 0,
+};
+
+place *lookup_label(const char *label)
+{
+  saved_state *state = current_saved_state;
+  PTABLE(place) *tbl = current_table;
+  for (;;) {
+    place *pl = tbl->lookup(label);
+    if (pl)
+      return pl;
+    if (!state)
+      return 0;
+    tbl = state->tbl;
+    state = state->prev;
+  }
+}
+
+void define_label(const char *label, const place *pl)
+{
+  place *p = new place;
+  *p = *pl;
+  current_table->define(label, p);
+}
+
+int lookup_variable(const char *name, double *val)
+{
+  place *pl = lookup_label(name);
+  if (pl) {
+    *val = pl->x;
+    return 1;
+  }
+  return 0;
+}
+
+void define_variable(const char *name, double val)
+{
+  place *p = new place;
+  p->obj = 0;
+  p->x = val;
+  p->y = 0.0;
+  current_table->define(name, p);
+  if (strcmp(name, "scale") == 0) {
+    // When the scale changes, reset all scaled pre-defined variables to
+    // their default values.
+    for (int i = 0; i < sizeof(defaults_table)/sizeof(defaults_table[0]); i++) 
+      if (defaults_table[i].scaled)
+       define_variable(defaults_table[i].name, val*defaults_table[i].val);
+  }
+}
+
+// called once only (not once per parse)
+
+void parse_init()
+{
+  current_direction = RIGHT_DIRECTION;
+  current_position.x = 0.0;
+  current_position.y = 0.0;
+  // This resets everything to its default value.
+  reset_all();
+}
+
+void reset(const char *nm)
+{
+  for (int i = 0; i < sizeof(defaults_table)/sizeof(defaults_table[0]); i++)
+    if (strcmp(nm, defaults_table[i].name) == 0) {
+      double val = defaults_table[i].val;
+      if (defaults_table[i].scaled) {
+       double scale;
+       lookup_variable("scale", &scale);
+       val *= scale;
+      }
+      define_variable(defaults_table[i].name, val);
+      return;
+    }
+  lex_error("`%1' is not a predefined variable", nm);
+}
+
+void reset_all()
+{
+  // We only have to explicitly reset the pre-defined variables that
+  // aren't scaled because `scale' is not scaled, and changing the
+  // value of `scale' will reset all the pre-defined variables that
+  // are scaled.
+  for (int i = 0; i < sizeof(defaults_table)/sizeof(defaults_table[0]); i++)
+    if (!defaults_table[i].scaled)
+      define_variable(defaults_table[i].name, defaults_table[i].val);
+}
+
+// called after each parse
+
+void parse_cleanup()
+{
+  while (current_saved_state != 0) {
+    delete current_table;
+    current_table = current_saved_state->tbl;
+    saved_state *tem = current_saved_state;
+    current_saved_state = current_saved_state->prev;
+    delete tem;
+  }
+  assert(current_table == &top_table);
+  PTABLE_ITERATOR(place) iter(current_table);
+  const char *key;
+  place *pl;
+  while (iter.next(&key, &pl))
+    if (pl->obj != 0) {
+      position pos = pl->obj->origin();
+      pl->obj = 0;
+      pl->x = pos.x;
+      pl->y = pos.y;
+    }
+  while (olist.head != 0) {
+    object *tem = olist.head;
+    olist.head = olist.head->next;
+    delete tem;
+  }
+  olist.tail = 0;
+  current_direction = RIGHT_DIRECTION;
+  current_position.x = 0.0;
+  current_position.y = 0.0;
+}
+
+const char *ordinal_postfix(int n)
+{
+  if (n < 10 || n > 20)
+    switch (n % 10) {
+    case 1:
+      return "st";
+    case 2:
+      return "nd";
+    case 3:
+      return "rd";
+    }
+  return "th";
+}
+
+const char *object_type_name(object_type type)
+{
+  switch (type) {
+  case BOX_OBJECT:
+    return "box";
+  case CIRCLE_OBJECT:
+    return "circle";
+  case ELLIPSE_OBJECT:
+    return "ellipse";
+  case ARC_OBJECT:
+    return "arc";
+  case SPLINE_OBJECT:
+    return "spline";
+  case LINE_OBJECT:
+    return "line";
+  case ARROW_OBJECT:
+    return "arrow";
+  case MOVE_OBJECT:
+    return "move";
+  case TEXT_OBJECT:
+    return "\"\"";
+  case BLOCK_OBJECT:
+    return "[]";
+  case OTHER_OBJECT:
+  case MARK_OBJECT:
+  default:
+    break;
+  }
+  return "object";
+}
+
+static char sprintf_buf[1024];
+
+char *format_number(const char *form, double n)
+{
+  if (form == 0)
+    form = "%g";
+  else {
+    // this is a fairly feeble attempt at validation of the format
+    int nspecs = 0;
+    for (const char *p = form; *p != '\0'; p++)
+      if (*p == '%') {
+       if (p[1] == '%')
+         p++;
+       else
+         nspecs++;
+      }
+    if (nspecs > 1) {
+      lex_error("bad format `%1'", form);
+      return strsave(form);
+    }
+  }
+  sprintf(sprintf_buf, form, n);
+  return strsave(sprintf_buf);
+}
+
+char *do_sprintf(const char *form, const double *v, int nv)
+{
+  string result;
+  int i = 0;
+  string one_format;
+  while (*form) {
+    if (*form == '%') {
+      one_format += *form++;
+      for (; *form != '\0' && strchr("#-+ 0123456789.", *form) != 0; form++)
+       one_format += *form;
+      if (*form == '\0' || strchr("eEfgG%", *form) == 0) {
+       lex_error("bad sprintf format");
+       result += one_format;
+       result += form;
+       break;
+      }
+      if (*form == '%') {
+       one_format += *form++;
+       one_format += '\0';
+       sprintf(sprintf_buf, one_format.contents());
+      }
+      else {
+       if (i >= nv) {
+         lex_error("too few arguments to sprintf");
+         result += one_format;
+         result += form;
+         break;
+       }
+       one_format += *form++;
+       one_format += '\0';
+       sprintf(sprintf_buf, one_format.contents(), v[i++]);
+      }
+      one_format.clear();
+      result += sprintf_buf;
+    }
+    else
+      result += *form++;
+  }
+  result += '\0';
+  return strsave(result.contents());
+}
diff --git a/usr/src/usr.bin/groff/pic/grot/pic.tab.h b/usr/src/usr.bin/groff/pic/grot/pic.tab.h
new file mode 100644 (file)
index 0000000..33af90e
--- /dev/null
@@ -0,0 +1,129 @@
+typedef union {
+       char *str;
+       int n;
+       double x;
+       struct { double x, y; } pair;
+       struct { double x; char *body; } if_data;
+       struct { char *str; const char *filename; int lineno; } lstr;
+       struct { double *v; int nv; int maxv; } dv;
+       struct { double val; int is_multiplicative; } by;
+       place pl;
+       object *obj;
+       corner crn;
+       path *pth;
+       object_spec *spec;
+       saved_state *pstate;
+       graphics_state state;
+       object_type obtype;
+} YYSTYPE;
+#define        LABEL   258
+#define        VARIABLE        259
+#define        NUMBER  260
+#define        TEXT    261
+#define        COMMAND 262
+#define        DELIMITED       263
+#define        ORDINAL 264
+#define        LEFT_ARROW_HEAD 265
+#define        RIGHT_ARROW_HEAD        266
+#define        DOUBLE_ARROW_HEAD       267
+#define        LAST    268
+#define        UP      269
+#define        DOWN    270
+#define        LEFT    271
+#define        RIGHT   272
+#define        BOX     273
+#define        CIRCLE  274
+#define        ELLIPSE 275
+#define        ARC     276
+#define        LINE    277
+#define        ARROW   278
+#define        MOVE    279
+#define        SPLINE  280
+#define        HEIGHT  281
+#define        RADIUS  282
+#define        WIDTH   283
+#define        DIAMETER        284
+#define        FROM    285
+#define        TO      286
+#define        AT      287
+#define        WITH    288
+#define        BY      289
+#define        THEN    290
+#define        DOTTED  291
+#define        DASHED  292
+#define        CHOP    293
+#define        SAME    294
+#define        INVISIBLE       295
+#define        LJUST   296
+#define        RJUST   297
+#define        ABOVE   298
+#define        BELOW   299
+#define        OF      300
+#define        THE     301
+#define        WAY     302
+#define        BETWEEN 303
+#define        AND     304
+#define        HERE    305
+#define        DOT_N   306
+#define        DOT_E   307
+#define        DOT_W   308
+#define        DOT_S   309
+#define        DOT_NE  310
+#define        DOT_SE  311
+#define        DOT_NW  312
+#define        DOT_SW  313
+#define        DOT_C   314
+#define        DOT_START       315
+#define        DOT_END 316
+#define        DOT_X   317
+#define        DOT_Y   318
+#define        DOT_HT  319
+#define        DOT_WID 320
+#define        DOT_RAD 321
+#define        SIN     322
+#define        COS     323
+#define        ATAN2   324
+#define        LOG     325
+#define        EXP     326
+#define        SQRT    327
+#define        MAX     328
+#define        MIN     329
+#define        INT     330
+#define        RAND    331
+#define        COPY    332
+#define        THRU    333
+#define        TOP     334
+#define        BOTTOM  335
+#define        UPPER   336
+#define        LOWER   337
+#define        SH      338
+#define        PRINT   339
+#define        CW      340
+#define        CCW     341
+#define        FOR     342
+#define        DO      343
+#define        IF      344
+#define        ELSE    345
+#define        ANDAND  346
+#define        OROR    347
+#define        NOTEQUAL        348
+#define        EQUALEQUAL      349
+#define        LESSEQUAL       350
+#define        GREATEREQUAL    351
+#define        LEFT_CORNER     352
+#define        RIGHT_CORNER    353
+#define        CENTER  354
+#define        END     355
+#define        START   356
+#define        RESET   357
+#define        UNTIL   358
+#define        PLOT    359
+#define        THICKNESS       360
+#define        FILL    361
+#define        ALIGNED 362
+#define        SPRINTF 363
+#define        DEFINE  364
+#define        UNDEF   365
+
+
+extern YYSTYPE yylval;