First cut at l_to_python.py translator which reads a lex specification (in XML format...
authorNick Downing <downing.nick@gmail.com>
Sun, 5 Aug 2018 00:59:05 +0000 (10:59 +1000)
committerNick Downing <downing.nick@gmail.com>
Sun, 5 Aug 2018 00:59:05 +0000 (10:59 +1000)
39 files changed:
.gitignore [new file with mode: 0644]
ansi_c_lex.l [new file with mode: 0644]
ansi_c_lex.xml [new file with mode: 0644]
ansi_c_tokens.py [new file with mode: 0644]
ansi_c_yacc.xml [new file with mode: 0644]
ansi_c_yacc.y [new file with mode: 0644]
ansi_c_yylex.py [new file with mode: 0644]
ansi_c_yylex.sh [new file with mode: 0755]
ansi_c_yyparse.py [new file with mode: 0644]
ansi_c_yyparse.sh [new file with mode: 0755]
ast.py [new file with mode: 0644]
ast.sh [new file with mode: 0755]
bisect_set.py [new file with mode: 0644]
c_to_python.py [new file with mode: 0644]
degenerate.py [new file with mode: 0755]
dfa.py [new file with mode: 0644]
element.py [new file with mode: 0644]
generate.py [new file with mode: 0755]
grammar.py [new file with mode: 0644]
grammar.sh [new file with mode: 0755]
l_to_python.py [new file with mode: 0755]
lex.yy.c [new file with mode: 0644]
lr1.py [new file with mode: 0644]
lr1dfa.py [new file with mode: 0644]
macify.txt [new file with mode: 0644]
minilex.py [new file with mode: 0755]
miniyacc.py [new file with mode: 0755]
n.sh [new file with mode: 0755]
nfa.py [new file with mode: 0644]
regex.py [new file with mode: 0644]
regex.sh [new file with mode: 0755]
tests/parse-gram.y [new file with mode: 0644]
tests/parse.y [new file with mode: 0644]
tests/scan-code.l [new file with mode: 0644]
tests/scan-gram.l [new file with mode: 0644]
tests/scan.l [new file with mode: 0644]
work.py [new file with mode: 0644]
wrap_repr.py [new file with mode: 0644]
xml_to_l.py [new file with mode: 0755]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..6c9896d
--- /dev/null
@@ -0,0 +1,7 @@
+__pycache__
+a
+b
+a.c
+a.i
+tests/*.l.xml
+tests/*.y.xml
diff --git a/ansi_c_lex.l b/ansi_c_lex.l
new file mode 100644 (file)
index 0000000..a914b38
--- /dev/null
@@ -0,0 +1,868 @@
+%e  1019
+%p  2807
+%n  371
+%k  284
+%a  1213
+%o  1117
+
+O   [0-7]
+D   [0-9]
+NZ  [1-9]
+L   [a-zA-Z_]
+A   [a-zA-Z_0-9]
+H   [a-fA-F0-9]
+HP  (0[xX])
+E   ([Ee][+-]?{D}+)
+P   ([Pp][+-]?{D}+)
+FS  (f|F|l|L)
+IS  (((u|U)(l|L|ll|LL)?)|((l|L|ll|LL)(u|U)?))
+CP  (u|U|L)
+SP  (u8|u|U|L)
+ES  (\\(['"\?\\abfnrtv]|[0-7]{1,3}|x[a-fA-F0-9]+))
+WS  [ \t\v\n\f]
+
+%{
+#include "Python.h"
+#include "structmember.h"
+#include <setjmp.h>
+#include <stdbool.h>
+
+#include "yaccmodule.h"
+
+PyDoc_STRVAR(lex_doc_string, \
+"lex is an interface to a flex-generated lexical analyzer.\n");
+
+/* filled in at module initialization time */
+static PyObject *work;
+static PyObject *work_factory;
+
+typedef struct {
+  PyObject_HEAD
+
+  /* filled in by lex.yylex.__init(), no change during iteration */
+  PyObject *root, *mark, *yychunk_iter;
+
+  /* filled in by YY_INPUT() each time we go on to a new chunk */
+  PyObject *YY_INPUT_bytes;
+  Py_ssize_t YY_INPUT_bytes_off, YY_INPUT_bytes_len;
+} lex_yylexObject;
+
+/* filled in by lex.yylex.__next__() each time iterator invoked */
+static lex_yylexObject *yylex_self;
+static jmp_buf yylex_abort;
+static Py_ssize_t yytext_pos, yytext_off, yytext_len;
+
+static void yyerror(const char *); /* prints grammar violation message */
+static bool get_cursor(lex_yylexObject *self, Py_ssize_t i, Py_ssize_t *pos, Py_ssize_t *off);
+static bool set_cursor(lex_yylexObject *self, Py_ssize_t i, Py_ssize_t pos, Py_ssize_t off);
+static bool new_cursor(lex_yylexObject *self, Py_ssize_t i, Py_ssize_t pos, Py_ssize_t off);
+static bool pop_cursors(lex_yylexObject *self, Py_ssize_t i);
+static bool apply_markup(const char *format, ...);
+static bool next_YY_INPUT_chunk(lex_yylexObject *self);
+static bool next_yytext_chunk(lex_yylexObject *self);
+/*static bool skip_yytext_byte(lex_yylexObject *self, int c);*/ /* NO PROTOTYPE, IT'S A MACRO */
+static bool skip_yytext(lex_yylexObject *self);
+static bool skip_comment(lex_yylexObject *self);
+
+#define YY_INPUT(buf, result, max_size) \
+  do { \
+ /*printf("YY_INPUT()\n");*/ \
+    if (yylex_self->YY_INPUT_bytes_off >= yylex_self->YY_INPUT_bytes_len && !next_YY_INPUT_chunk(yylex_self)) \
+      longjmp(yylex_abort, 1); \
+    Py_ssize_t len = yylex_self->YY_INPUT_bytes_len - yylex_self->YY_INPUT_bytes_off; \
+    if (len > max_size) \
+      len = max_size; \
+    /* note: don't call PyBytes_AS_STRING on Py_None (possible if len == 0) */ \
+    if (len) { \
+      memcpy(buf, PyBytes_AS_STRING(yylex_self->YY_INPUT_bytes) + yylex_self->YY_INPUT_bytes_off, len); \
+      yylex_self->YY_INPUT_bytes_off += len; \
+    } \
+    result = len; \
+ /*printf("YY_INPUT() returns \""); fwrite(buf, result, 1, stdout); printf("\"\n");*/ \
+  } while (0)
+
+#define SKIP() \
+  do { \
+    if (!skip_yytext(yylex_self)) \
+      return -1; \
+  } \
+  while (0)
+
+#define MARK() \
+  do { \
+    if (!new_cursor(yylex_self, -1, yytext_pos, yytext_off)) \
+      return -1; \
+  } \
+  while (0)
+
+#define APPLY(tag) \
+   do { \
+    Py_ssize_t len = PyObject_Length(yylex_self->mark); \
+    if ( \
+      len < 0 || \
+      !apply_markup( \
+        "OOnnOs", \
+        yylex_self->root, \
+        yylex_self->mark, \
+        len - 3, \
+        len - 2, \
+        work_factory, \
+        tag \
+      ) \
+    ) \
+      return -1; \
+  } \
+  while (0)
+
+#define sym_type(self, identifier) IDENTIFIER /* with no symbol table, fake it */
+%}
+
+%%
+"/*"                                   { SKIP(); if (!skip_comment(yylex_self)) return -1; }
+"//".*                                 { SKIP(); /* consume //-comment */ }
+
+"auto"                                 { MARK(); SKIP(); MARK(); return AUTO; }
+"break"                                        { MARK(); SKIP(); MARK(); return BREAK; }
+"case"                                 { MARK(); SKIP(); MARK(); return CASE; }
+"char"                                 { MARK(); SKIP(); MARK(); return CHAR; }
+"const"                                        { MARK(); SKIP(); MARK(); return CONST; }
+"continue"                             { MARK(); SKIP(); MARK(); return CONTINUE; }
+"default"                              { MARK(); SKIP(); MARK(); return DEFAULT; }
+"do"                                   { MARK(); SKIP(); MARK(); return DO; }
+"double"                               { MARK(); SKIP(); MARK(); return DOUBLE; }
+"else"                                 { MARK(); SKIP(); MARK(); return ELSE; }
+"enum"                                 { MARK(); SKIP(); MARK(); return ENUM; }
+"extern"                               { MARK(); SKIP(); MARK(); return EXTERN; }
+"float"                                        { MARK(); SKIP(); MARK(); return FLOAT; }
+"for"                                  { MARK(); SKIP(); MARK(); return FOR; }
+"goto"                                 { MARK(); SKIP(); MARK(); return GOTO; }
+"if"                                   { MARK(); SKIP(); MARK(); return IF; }
+"inline"                               { MARK(); SKIP(); MARK(); return INLINE; }
+"int"                                  { MARK(); SKIP(); MARK(); return INT; }
+"long"                                 { MARK(); SKIP(); MARK(); return LONG; }
+"register"                             { MARK(); SKIP(); MARK(); return REGISTER; }
+"restrict"                             { MARK(); SKIP(); MARK(); return RESTRICT; }
+"return"                               { MARK(); SKIP(); MARK(); return RETURN; }
+"short"                                        { MARK(); SKIP(); MARK(); return SHORT; }
+"signed"                               { MARK(); SKIP(); MARK(); return SIGNED; }
+"sizeof"                               { MARK(); SKIP(); MARK(); return SIZEOF; }
+"static"                               { MARK(); SKIP(); MARK(); return STATIC; }
+"struct"                               { MARK(); SKIP(); MARK(); return STRUCT; }
+"switch"                               { MARK(); SKIP(); MARK(); return SWITCH; }
+"typedef"                              { MARK(); SKIP(); MARK(); return TYPEDEF; }
+"union"                                        { MARK(); SKIP(); MARK(); return UNION; }
+"unsigned"                             { MARK(); SKIP(); MARK(); return UNSIGNED; }
+"void"                                 { MARK(); SKIP(); MARK(); return VOID; }
+"volatile"                             { MARK(); SKIP(); MARK(); return VOLATILE; }
+"while"                                        { MARK(); SKIP(); MARK(); return WHILE; }
+"_Alignas"                             { MARK(); SKIP(); MARK(); return ALIGNAS; }
+"_Alignof"                             { MARK(); SKIP(); MARK(); return ALIGNOF; }
+"_Atomic"                              { MARK(); SKIP(); MARK(); return ATOMIC; }
+"_Bool"                                        { MARK(); SKIP(); MARK(); return BOOL; }
+"_Complex"                             { MARK(); SKIP(); MARK(); return COMPLEX; }
+"_Generic"                             { MARK(); SKIP(); MARK(); return GENERIC; }
+"_Imaginary"                           { MARK(); SKIP(); MARK(); return IMAGINARY; }
+"_Noreturn"                            { MARK(); SKIP(); MARK(); return NORETURN; }
+"_Static_assert"                       { MARK(); SKIP(); MARK(); return STATIC_ASSERT; }
+"_Thread_local"                                { MARK(); SKIP(); MARK(); return THREAD_LOCAL; }
+"__func__"                             { MARK(); SKIP(); MARK(); return FUNC_NAME; }
+"size_t"                               { MARK(); SKIP(); MARK(); return TYPEDEF_NAME; /* THIS IS A HACK FOR NOW */ }
+
+(?<Identifier>{L}{A}*) {
+  MARK();
+  SKIP();
+  MARK(); 
+  switch (sym_type(self, yytext))
+  {
+  case TYPEDEF_NAME:        /* previously defined */
+    APPLY("TypedefName");
+    return TYPEDEF_NAME;
+  case ENUMERATION_CONSTANT:    /* previously defined */
+    APPLY("EnumerationConstant");
+    return ENUMERATION_CONSTANT;
+  default:              /* includes undefined */
+    APPLY("Identifier");
+    return IDENTIFIER;
+  }
+}
+
+(?<ExpressionIntLiteral>{HP}{H}+{IS}?)                         { MARK(); SKIP(); MARK(); APPLY("ExpressionIntLiteral"); return I_CONSTANT; }
+(?<ExpressionIntLiteral>{NZ}{D}*{IS}?)                         { MARK(); SKIP(); MARK(); APPLY("ExpressionIntLiteral"); return I_CONSTANT; }
+(?<ExpressionIntLiteral>"0"{O}*{IS}?)                          { MARK(); SKIP(); MARK(); APPLY("ExpressionIntLiteral"); return I_CONSTANT; }
+(?<ExpressionIntLiteral>{CP}?"'"([^'\\\n]|{ES})+"'")           { MARK(); SKIP(); MARK(); APPLY("ExpressionIntLiteral"); return I_CONSTANT; }
+
+(?<ExpressionFloatLiteral>{D}+{E}{FS}?)                                { MARK(); SKIP(); MARK(); APPLY("ExpressionFloatLiteral"); return F_CONSTANT; }
+(?<ExpressionFloatLiteral>{D}*"."{D}+{E}?{FS}?)                        { MARK(); SKIP(); MARK(); APPLY("ExpressionFloatLiteral"); return F_CONSTANT; }
+(?<ExpressionFloatLiteral>{D}+"."{E}?{FS}?)                    { MARK(); SKIP(); MARK(); APPLY("ExpressionFloatLiteral"); return F_CONSTANT; }
+(?<ExpressionFloatLiteral>{HP}{H}+{P}{FS}?)                    { MARK(); SKIP(); MARK(); APPLY("ExpressionFloatLiteral"); return F_CONSTANT; }
+(?<ExpressionFloatLiteral>{HP}{H}*"."{H}+{P}{FS}?)                     { MARK(); SKIP(); MARK(); APPLY("ExpressionFloatLiteral"); return F_CONSTANT; }
+(?<ExpressionFloatLiteral>{HP}{H}+"."{P}{FS}?)                 { MARK(); SKIP(); MARK(); APPLY("ExpressionFloatLiteral"); return F_CONSTANT; }
+
+({SP}?\"([^"\\\n]|{ES})*\"{WS}*)+      { MARK(); SKIP(); MARK(); APPLY("ExpressionStringLiteral"); return STRING_LITERAL;; }
+
+"..."                                  { MARK(); SKIP(); MARK(); return ELLIPSIS; }
+">>="                                  { MARK(); SKIP(); MARK(); return RIGHT_ASSIGN; }
+"<<="                                  { MARK(); SKIP(); MARK(); return LEFT_ASSIGN; }
+"+="                                   { MARK(); SKIP(); MARK(); return ADD_ASSIGN; }
+"-="                                   { MARK(); SKIP(); MARK(); return SUB_ASSIGN; }
+"*="                                   { MARK(); SKIP(); MARK(); return MUL_ASSIGN; }
+"/="                                   { MARK(); SKIP(); MARK(); return DIV_ASSIGN; }
+"%="                                   { MARK(); SKIP(); MARK(); return MOD_ASSIGN; }
+"&="                                   { MARK(); SKIP(); MARK(); return AND_ASSIGN; }
+"^="                                   { MARK(); SKIP(); MARK(); return XOR_ASSIGN; }
+"|="                                   { MARK(); SKIP(); MARK(); return OR_ASSIGN; }
+">>"                                   { MARK(); SKIP(); MARK(); return RIGHT_OP; }
+"<<"                                   { MARK(); SKIP(); MARK(); return LEFT_OP; }
+"++"                                   { MARK(); SKIP(); MARK(); return INC_OP; }
+"--"                                   { MARK(); SKIP(); MARK(); return DEC_OP; }
+"->"                                   { MARK(); SKIP(); MARK(); return PTR_OP; }
+"&&"                                   { MARK(); SKIP(); MARK(); return AND_OP; }
+"||"                                   { MARK(); SKIP(); MARK(); return OR_OP; }
+"<="                                   { MARK(); SKIP(); MARK(); return LE_OP; }
+">="                                   { MARK(); SKIP(); MARK(); return GE_OP; }
+"=="                                   { MARK(); SKIP(); MARK(); return EQ_OP; }
+"!="                                   { MARK(); SKIP(); MARK(); return NE_OP; }
+";"                                    { MARK(); SKIP(); MARK(); return ';'; }
+("{"|"<%")                             { MARK(); SKIP(); MARK(); return '{'; }
+("}"|"%>")                             { MARK(); SKIP(); MARK(); return '}'; }
+","                                    { MARK(); SKIP(); MARK(); return ','; }
+":"                                    { MARK(); SKIP(); MARK(); return ':'; }
+"="                                    { MARK(); SKIP(); MARK(); return '='; }
+"("                                    { MARK(); SKIP(); MARK(); return '('; }
+")"                                    { MARK(); SKIP(); MARK(); return ')'; }
+("["|"<:")                             { MARK(); SKIP(); MARK(); return '['; }
+("]"|":>")                             { MARK(); SKIP(); MARK(); return ']'; }
+"."                                    { MARK(); SKIP(); MARK(); return '.'; }
+"&"                                    { MARK(); SKIP(); MARK(); return '&'; }
+"!"                                    { MARK(); SKIP(); MARK(); return '!'; }
+"~"                                    { MARK(); SKIP(); MARK(); return '~'; }
+"-"                                    { MARK(); SKIP(); MARK(); return '-'; }
+"+"                                    { MARK(); SKIP(); MARK(); return '+'; }
+"*"                                    { MARK(); SKIP(); MARK(); return '*'; }
+"/"                                    { MARK(); SKIP(); MARK(); return '/'; }
+"%"                                    { MARK(); SKIP(); MARK(); return '%'; }
+"<"                                    { MARK(); SKIP(); MARK(); return '<'; }
+">"                                    { MARK(); SKIP(); MARK(); return '>'; }
+"^"                                    { MARK(); SKIP(); MARK(); return '^'; }
+"|"                                    { MARK(); SKIP(); MARK(); return '|'; }
+"?"                                    { MARK(); SKIP(); MARK(); return '?'; }
+
+{WS}+                                  { SKIP(); /* whitespace separates tokens */ }
+.                                      { SKIP(); /* discard bad characters */ }
+<<EOF>>                                        { MARK(); return 0; }
+
+%%
+
+int yywrap(void)    /* called at end of input */
+{
+ /*printf("yywrap()\n");*/
+  return 1;       /* terminate now */
+}
+
+static void yyerror(const char *s) {
+  fflush(stdout);
+  fprintf(stderr, "*** %s\n", s);
+}
+
+static bool get_cursor(lex_yylexObject *self, Py_ssize_t i, Py_ssize_t *pos, Py_ssize_t *off) {
+ /*printf("get_cursor() %zd\n", i);*/
+  /* (pos, off) = self->mark[index] */
+  PyObject *index = PyLong_FromSsize_t(i);
+  if (index == NULL)
+    goto error0;
+  PyObject *cursor = PyObject_GetItem(self->mark, index);
+  if (cursor == NULL)
+    goto error1;
+  if (!PyArg_ParseTuple(cursor, "nn", pos, off)) {
+    Py_DECREF(cursor);
+  error1:
+    Py_DECREF(index);
+  error0:
+    return false;
+  }
+  Py_DECREF(cursor);
+  Py_DECREF(index);
+ /*printf("get_cursor() returns %zd %zd\n", *pos, *off);*/
+  return true;
+}
+
+static bool set_cursor(lex_yylexObject *self, Py_ssize_t i, Py_ssize_t pos, Py_ssize_t off) {
+ /*printf("set_cursor() %zd %zd %zd\n", i, pos, off);*/
+  /* self->mark[index] = (pos, off) */
+  PyObject *index = PyLong_FromSsize_t(i);
+  if (index == NULL)
+    goto error0;
+  PyObject *cursor = Py_BuildValue("nn", pos, off);
+  if (cursor == NULL)
+    goto error1;
+  if (PyObject_SetItem(self->mark, index, cursor)) {
+    Py_DECREF(cursor);
+  error1:
+    Py_DECREF(index);
+  error0:
+    return false;
+  }
+  Py_DECREF(cursor);
+  Py_DECREF(index);
+  return true;
+}
+
+static bool new_cursor(lex_yylexObject *self, Py_ssize_t i, Py_ssize_t pos, Py_ssize_t off) {
+ /*printf("new_cursor() %zd %zd %zd\n", i, pos, off);*/
+  /* self->mark[i:i] = [(pos, off)] */
+  PyObject *index = PyLong_FromSsize_t(i);
+  if (index == NULL)
+    goto error0;
+  PyObject *slice = PySlice_New(index, index, NULL);
+  if (slice == NULL)
+    goto error1;
+  PyObject *list = PyList_New(1);
+  if (list == NULL)
+    goto error2;
+  PyObject *cursor = Py_BuildValue("nn", pos, off);
+  if (cursor == NULL)
+    goto error3;
+  PyList_SET_ITEM(list, 0, cursor);
+  if (PyObject_SetItem(self->mark, slice, list)) {
+  error3:
+    Py_DECREF(list);
+  error2:
+    Py_DECREF(slice);
+  error1:
+    Py_DECREF(index);
+  error0:
+    return false;
+  }
+  Py_DECREF(list);
+  Py_DECREF(slice);
+  Py_DECREF(index);
+  return true;
+}
+
+static bool pop_cursors(lex_yylexObject *self, Py_ssize_t i) {
+ /*printf("pop_cursors() %zd\n", i);*/
+  /* del self->mark[i:] */
+  PyObject *start = PyLong_FromSsize_t(i);
+  if (start == NULL)
+    goto error0;
+  PyObject *slice = PySlice_New(start, NULL, NULL);
+  if (slice == NULL)
+    goto error1;
+  if (PyObject_DelItem(self->mark, slice)) {
+    Py_DECREF(slice);
+  error1:
+    Py_DECREF(start);
+  error0:
+    return false;
+  }
+  Py_DECREF(slice);
+  Py_DECREF(start);
+  return true;
+}
+
+static bool apply_markup(const char *format, ...) {
+  PyObject *apply_markup = PyObject_GetAttrString(work, "apply_markup");
+  if (apply_markup == NULL)
+    goto error0;
+
+  va_list argp;
+  va_start(argp, format);
+  PyObject *args = Py_VaBuildValue(format, argp);
+  va_end(argp);
+  if (args == NULL)
+    goto error1;
+
+  PyObject *result = PyObject_CallObject(apply_markup, args);
+  if (result == NULL) {
+    Py_DECREF(args);
+  error1:
+    Py_DECREF(apply_markup);
+  error0:
+    return false;
+  }
+
+  Py_DECREF(result);
+  Py_DECREF(args);
+  Py_DECREF(apply_markup);
+  return true;
+}
+
+static bool next_YY_INPUT_chunk(lex_yylexObject *self) {
+ /*printf("next_YY_INPUT_chunk()\n");*/
+  /* cursor is not cached, since we'd have to re-cache every time we enter */
+  /* iterator, whereas we are only supposed to read new chunks occasionally */
+  Py_ssize_t pos, off, len;
+  if (!get_cursor(self, -1, &pos, &off))
+    goto error0;
+
+  PyObject *tail;
+  while (true) {
+    /* re-check the length, as tail could have got longer in the meantime */
+    tail = PyObject_CallMethod(work, "get_tail", "On", self->root, pos);
+    if (tail == NULL)
+      goto error0;
+    len = PyObject_Length(tail);
+    if (len < 0)
+      goto error1;
+
+    /* see if now need to do more data from the same chunk */
+    if (off < len)
+      break;
+    Py_DECREF(tail);
+    /* if last chunk try to extend it, otherwise go on to next */
+    Py_ssize_t root_len = PyObject_Length(self->root);
+    if (root_len < 0)
+      goto error0;
+    if (pos + 1 >= root_len) {
+      if (self->yychunk_iter != Py_None){
+        PyObject *result = PyObject_CallMethod(self->yychunk_iter, "__next__", "");
+        if (result != NULL) {
+          Py_DECREF(result);
+          continue; /* re-check current chunk, in case extended */
+        }
+        if (!PyErr_ExceptionMatches(PyExc_StopIteration))
+          goto error0;
+        PyErr_Clear();
+      }
+
+      /* it is not an error to run out of data, empty return indicates EOF */
+      Py_INCREF(Py_None);
+      Py_DECREF(self->YY_INPUT_bytes);
+      self->YY_INPUT_bytes = Py_None;
+      self->YY_INPUT_bytes_off = 0;
+      self->YY_INPUT_bytes_len = 0;
+      return true;
+    }
+    ++pos;
+    off = 0;
+  }
+
+  /* got something we can return, advance cursor by unicode length of data */
+  if (!set_cursor(self, -1, pos, off + len))
+    goto error1;
+
+  /* check for less efficient case when caller has appended to the chunk, */
+  /* requires a large copy that caller can avoid by only adding new chunks */
+  if (off >= 0) {
+    PyObject *index = PyLong_FromSsize_t(off);
+    if (index == NULL)
+      goto error1;
+    PyObject *slice = PySlice_New(index, NULL, NULL);
+    if (slice == NULL)
+      goto error2;
+    PyObject *item = PyObject_GetItem(tail, slice);
+    if (item == NULL) {
+      Py_DECREF(slice);
+    error2:
+      Py_DECREF(index);
+      goto error1;
+    }
+    Py_DECREF(tail);
+    tail = item;
+    Py_DECREF(slice);
+    Py_DECREF(index);
+  }
+
+  /* convert entire chunk to UTF-8, then use for multiple YY_INPUT() calls */
+  PyObject *bytes = PyUnicode_AsUTF8String(tail);
+  if (bytes == NULL)
+    goto error1;
+  len = PyObject_Length(bytes);
+  if (len < 0) {
+    Py_DECREF(bytes);
+  error1:
+    Py_DECREF(tail);
+  error0:
+    return false;
+  }
+  Py_DECREF(self->YY_INPUT_bytes);
+  self->YY_INPUT_bytes = bytes;
+  self->YY_INPUT_bytes_off = 0;
+  self->YY_INPUT_bytes_len = len;
+
+  Py_DECREF(tail);
+  return true;
+}
+
+static bool next_yytext_chunk(lex_yylexObject *self) {
+  while (true) {
+    /* re-cache the length, as tail could have got longer in the meantime */
+    PyObject *tail = PyObject_CallMethod(work, "get_tail", "On", self->root, yytext_pos);
+    if (tail == NULL)
+      goto error0;
+    yytext_len = PyObject_Length(tail);
+    if (yytext_len < 0) {
+      Py_DECREF(tail);
+    error0:
+      return false;
+    }
+    Py_DECREF(tail);
+  
+    /* see if now need to do more data from the same chunk */
+    if (yytext_off < yytext_len)
+      break;
+  
+    /* go on to next chunk (note: it can't go past YY_INPUT cursor) */
+    ++yytext_pos;
+    yytext_off = 0;
+  }
+  return true;
+}
+
+#define skip_yytext_byte(self, c) \
+  do { \
+    if ((c & 0xc0) != 0x80) { \
+ /*printf("'%c' %ld %ld\n", c, yytext_off, yytext_len);*/ \
+      if (yytext_off >= yytext_len && !next_yytext_chunk(self)) \
+        return false; \
+      ++yytext_off; \
+    } \
+  } while (0)
+
+static bool skip_yytext(lex_yylexObject *self) {
+  int c;
+  for (char *p = yytext; (c = *p) != 0; ++p)
+    skip_yytext_byte(self, c);
+  return true;
+}
+
+static bool skip_comment(lex_yylexObject *self) {
+  int c;
+  while ((c = input()) != 0) {
+    if (c == '*') {
+      skip_yytext_byte(self, '*');
+      while ((c = input()) == '*')
+        skip_yytext_byte(self, '*');
+
+      if (c == '/') {
+        skip_yytext_byte(self, '/');
+        return true;
+      }
+
+      if (c == 0)
+        break;
+    }
+    skip_yytext_byte(self, c);
+  }
+  yyerror("unterminated comment");
+  return true;
+}
+
+static PyObject *lex_yylex_new(PyTypeObject *type, PyObject *args, PyObject *kwargs) {
+  lex_yylexObject *self;
+
+  self = (lex_yylexObject *)type->tp_alloc(type, 0);
+  Py_INCREF(Py_None);
+  self->root = Py_None;
+  Py_INCREF(Py_None);
+  self->mark = Py_None;
+  Py_INCREF(Py_None);
+  self->yychunk_iter = Py_None;
+  Py_INCREF(Py_None);
+  self->YY_INPUT_bytes = Py_None;
+  return (PyObject *)self;
+}
+
+static void lex_yylex_dealloc(lex_yylexObject *self) {
+  Py_DECREF(self->root);
+  Py_DECREF(self->mark);
+  Py_DECREF(self->yychunk_iter);
+  Py_DECREF(self->YY_INPUT_bytes);
+  Py_TYPE(self)->tp_free((PyObject *)self);
+}
+
+static int lex_yylex_init(lex_yylexObject *self, PyObject *args, PyObject *kwargs) {
+  PyObject *root, *mark, *yychunk_iter = Py_None;
+  if (!PyArg_ParseTuple(args, "OO|O", &root, &mark, &yychunk_iter))
+    goto error0;
+
+  Py_INCREF(root);
+  Py_DECREF(self->root);
+  self->root = root;
+
+  Py_INCREF(mark);
+  Py_DECREF(self->mark);
+  self->mark = mark;
+
+  if (yychunk_iter == Py_None)
+    Py_INCREF(Py_None);
+  else {
+    yychunk_iter = PyObject_GetIter(yychunk_iter);
+    if (yychunk_iter == NULL)
+      goto error1;
+  }
+  Py_DECREF(self->yychunk_iter);
+  self->yychunk_iter = yychunk_iter;
+
+  /* mark[:] = [(-1, 0), (-1, 0)] */
+  /* the first is the yytext cursor, it will be advanced one unicode code */
+  /* point for each UTF-8 non-continuation character scanned in yytext; */
+  /* the second is the YY_INPUT cursor, it will be advanced by the chunk */
+  /* length in unicode code points each time we convert a chunk to UTF-8; */
+  /* each cursor consists of (pos, off) referring to root[pos].tail[off:], */
+  /* chunks accessed using work.get_tail(), so pos == -1 for root[pos].text */
+  if (!pop_cursors(self, 0) || !new_cursor(self, 0, -1, 0) || !new_cursor(self, 1, -1, 0)) {
+  error1:
+    /* don't keep useless references to user data structures after error */
+    Py_INCREF(Py_None);
+    Py_DECREF(self->root);
+    self->root = Py_None;
+    Py_INCREF(Py_None);
+    Py_DECREF(self->mark);
+    self->mark = Py_None;
+    Py_INCREF(Py_None);
+    Py_DECREF(self->yychunk_iter);
+    self->yychunk_iter = Py_None;
+  error0:
+    return -1;
+  }
+
+  Py_INCREF(Py_None);
+  Py_DECREF(self->YY_INPUT_bytes);
+  self->YY_INPUT_bytes = Py_None;
+  self->YY_INPUT_bytes_off = 0;
+  self->YY_INPUT_bytes_len = 0;
+
+  return 0;
+}
+static PyObject *lex_yylex_iter(PyObject *self) {
+  Py_INCREF(self);
+  return self;
+}
+
+static PyObject *lex_yylex_iternext(lex_yylexObject *self) {
+ /*printf("lex_yylex_iternext()\n");*/
+  if (self->root == Py_None || self->mark == Py_None) {
+    PyErr_SetNone(PyExc_StopIteration);
+    goto error0;
+  }
+
+  /* cache yytext_pos, yytext_off, yytext_len for quickly scanning yytext */
+  if (!get_cursor(self, -2, &yytext_pos, &yytext_off))
+    goto error1;
+  PyObject *tail = PyObject_CallMethod(work, "get_tail", "On", self->root, yytext_pos);
+  if (tail == NULL)
+    goto error1;
+  yytext_len = PyObject_Length(tail);
+  if (yytext_len < 0) {
+    Py_DECREF(tail);
+    goto error1;
+  }
+  Py_DECREF(tail);
+
+  yylex_self = self;
+  if (setjmp(yylex_abort))
+    goto error1;
+
+  (void)yyunput; /* fix defined but not used warning */
+  int token = yylex();
+  if (token == -1)
+    goto error1;
+
+  if (token == 0) {
+    /* finished, automatically delete YY_INPUT cursor and drop references */
+    if (!pop_cursors(self, -1)) {
+    error1:
+      /* don't keep useless references to user data structures after error */
+      Py_INCREF(Py_None);
+      Py_DECREF(self->root);
+      self->root = Py_None;
+      Py_INCREF(Py_None);
+      Py_DECREF(self->mark);
+      self->mark = Py_None;
+      Py_INCREF(Py_None);
+      Py_DECREF(self->yychunk_iter);
+      self->yychunk_iter = Py_None;
+    error0:
+      return NULL;
+    }
+    /* don't keep useless references to user data structures after EOF */
+    Py_INCREF(Py_None);
+    Py_DECREF(self->root);
+    self->root = Py_None;
+    Py_INCREF(Py_None);
+    Py_DECREF(self->mark);
+    self->mark = Py_None;
+    Py_INCREF(Py_None);
+    Py_DECREF(self->yychunk_iter);
+    self->yychunk_iter = Py_None;
+  }
+
+ /*printf("lex_yylex_iternext() returns %d\n", token);*/
+  return PyLong_FromLong((long)token);
+}
+
+static int lex_yylex_traverse(lex_yylexObject *self, visitproc visit, void *arg)
+{
+  Py_VISIT(self->root);
+  Py_VISIT(self->mark);
+  Py_VISIT(self->yychunk_iter);
+  Py_VISIT(self->YY_INPUT_bytes);
+  return 0;
+}
+
+static int lex_yylex_clear(lex_yylexObject *self)
+{
+  Py_CLEAR(self->root);
+  Py_CLEAR(self->mark);
+  Py_CLEAR(self->yychunk_iter);
+  Py_CLEAR(self->YY_INPUT_bytes);
+  return 0;
+}
+
+static PyMemberDef lex_yylex_members[] = {
+    {
+      "root",
+      T_OBJECT_EX,
+      offsetof(lex_yylexObject,
+      root),
+      0,
+      "root element, stack of sub-elements (treated as characters) and text"
+    },
+    {
+      "mark",
+      T_OBJECT_EX,
+      offsetof(lex_yylexObject,
+      mark),
+      0,
+      "list containing cursors, -2 current position, -1 next read position"
+    },
+    {
+      "yychunk_iter",
+      T_OBJECT_EX,
+      offsetof(lex_yylexObject,
+      yychunk_iter),
+      0,
+      "iterator for new input chunks (or None)"
+    },
+    {
+      "YY_INPUT_bytes",
+      T_OBJECT_EX,
+      offsetof(lex_yylexObject,
+      YY_INPUT_bytes),
+      0,
+      "UTF-8 encoding of current chunk to scan"
+    },
+    {
+      "YY_INPUT_bytes_off",
+      T_PYSSIZET,
+      offsetof(lex_yylexObject,
+      YY_INPUT_bytes_off),
+      0,
+      "current offset in UTF-8 text"
+    },
+    {
+      "YY_INPUT_bytes_len",
+      T_PYSSIZET,
+      offsetof(lex_yylexObject,
+      YY_INPUT_bytes_len),
+      0,
+      "maximum offset in UTF-8 text (inclusive)"
+    },
+    {}
+};
+
+static PyTypeObject lex_yylexType = {
+  PyVarObject_HEAD_INIT(NULL, 0)
+  "lex.yylex",               /* tp_name */
+  sizeof(lex_yylexObject),   /* tp_basicsize */
+  0,                         /* tp_itemsize */
+  (destructor)lex_yylex_dealloc, /* tp_dealloc */
+  0,                         /* tp_print */
+  0,                         /* tp_getattr */
+  0,                         /* tp_setattr */
+  0,                         /* tp_reserved */
+  0,                         /* tp_repr */
+  0,                         /* tp_as_number */
+  0,                         /* tp_as_sequence */
+  0,                         /* tp_as_mapping */
+  0,                         /* tp_hash  */
+  0,                         /* tp_call */
+  0,                         /* tp_str */
+  0,                         /* tp_getattro */
+  0,                         /* tp_setattro */
+  0,                         /* tp_as_buffer */
+  Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC, /* tp_flags */
+  "Lexical token iterator",  /* tp_doc */
+  (traverseproc)lex_yylex_traverse, /* tp_traverse */
+  (inquiry)lex_yylex_clear,  /* tp_clear */
+  0,                         /* tp_richcompare */
+  0,                         /* tp_weaklistoffset */
+  (getiterfunc)lex_yylex_iter, /* tp_iter */
+  (iternextfunc)lex_yylex_iternext, /* tp_iternext */
+  0,                         /* tp_methods */
+  lex_yylex_members,         /* tp_members */
+  0,                         /* tp_getset */
+  0,                         /* tp_base */
+  0,                         /* tp_dict */
+  0,                         /* tp_descr_get */
+  0,                         /* tp_descr_set */
+  0,                         /* tp_dictoffset */
+  (initproc)lex_yylex_init,  /* tp_init */
+  0,                         /* tp_alloc */
+  lex_yylex_new              /* tp_new */
+};
+
+static int lex_traverse(PyObject *self, visitproc visit, void *arg)
+{
+  Py_VISIT(work);
+  Py_VISIT(work_factory);
+  return 0;
+}
+
+static int lex_clear(PyObject *self)
+{
+  Py_CLEAR(work);
+  Py_CLEAR(work_factory);
+  return 0;
+}
+
+static struct PyModuleDef lexmodule = {
+  PyModuleDef_HEAD_INIT,
+  "lex",
+  lex_doc_string,
+  -1,
+  NULL,
+  NULL,
+  lex_traverse,
+  lex_clear
+};
+
+PyMODINIT_FUNC PyInit_lex(void)
+{
+  if (work != NULL) {
+    PyErr_SetString(
+      PyExc_RuntimeError,
+      "lex module cannot be re-imported or sub-interpreted\n"
+    );
+    goto error0;
+  }
+
+  PyObject *module = PyModule_Create(&lexmodule);
+  if (module == NULL)
+    goto error0;
+
+  if (
+    PyType_Ready(&lex_yylexType) ||
+    PyModule_AddObject(module, "yylex", (PyObject *)&lex_yylexType)
+  )
+    goto error1;
+  Py_INCREF(&lex_yylexType);
+
+  work = PyImport_ImportModule("work");
+  if (work == NULL)
+    goto error1;
+  work_factory = PyObject_GetAttrString(work, "factory");
+  if (work_factory == NULL) {
+    Py_DECREF(work);
+    work = NULL;
+  error1:
+    Py_DECREF(module);
+  error0:
+    return NULL;
+  }
+
+  return module;
+}
diff --git a/ansi_c_lex.xml b/ansi_c_lex.xml
new file mode 100644 (file)
index 0000000..3d29151
--- /dev/null
@@ -0,0 +1,3 @@
+<root>
+  <RegexAnd ref="0"><RegexRepeat count0="-1" count1="-1" non_greedy="false"><RegexCharacterNot character_set="0 256"><RegexCharacter character_set="" /></RegexCharacterNot></RegexRepeat><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexOr><RegexNone /><RegexGroup group_attributes="" group_index="0" group_name="">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="47 48">/</RegexCharacter></RegexSequence><RegexCharacter character_set="42 43">*</RegexCharacter></RegexSequence>"</RegexGroup>                                   </RegexOr><RegexGroup group_attributes="" group_index="1" group_name=""><RegexSequence>"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="47 48">/</RegexCharacter></RegexSequence><RegexCharacter character_set="47 48">/</RegexCharacter></RegexSequence>"<RegexRepeat count0="0" count1="-1" non_greedy="false"><RegexCharacter character_set="0 10 11 256">.</RegexCharacter>*</RegexRepeat></RegexSequence></RegexGroup>                                  </RegexOr><RegexGroup group_attributes="" group_index="2" group_name="AUTO">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="97 98">a</RegexCharacter></RegexSequence><RegexCharacter character_set="117 118">u</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence>"</RegexGroup>                                     </RegexOr><RegexGroup group_attributes="" group_index="3" group_name="BREAK">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="98 99">b</RegexCharacter></RegexSequence><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="97 98">a</RegexCharacter></RegexSequence><RegexCharacter character_set="107 108">k</RegexCharacter></RegexSequence>"</RegexGroup>                                     </RegexOr><RegexGroup group_attributes="" group_index="4" group_name="CASE">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="99 100">c</RegexCharacter></RegexSequence><RegexCharacter character_set="97 98">a</RegexCharacter></RegexSequence><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="5" group_name="CHAR">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="99 100">c</RegexCharacter></RegexSequence><RegexCharacter character_set="104 105">h</RegexCharacter></RegexSequence><RegexCharacter character_set="97 98">a</RegexCharacter></RegexSequence><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="6" group_name="CONST">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="99 100">c</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence>"</RegexGroup>                                  </RegexOr><RegexGroup group_attributes="" group_index="7" group_name="CONTINUE">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="99 100">c</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="117 118">u</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence>"</RegexGroup>                            </RegexOr><RegexGroup group_attributes="" group_index="8" group_name="DEFAULT">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="100 101">d</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="102 103">f</RegexCharacter></RegexSequence><RegexCharacter character_set="97 98">a</RegexCharacter></RegexSequence><RegexCharacter character_set="117 118">u</RegexCharacter></RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence>"</RegexGroup>                               </RegexOr><RegexGroup group_attributes="" group_index="9" group_name="DO">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="100 101">d</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence>"</RegexGroup>                                       </RegexOr><RegexGroup group_attributes="" group_index="10" group_name="DOUBLE">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="100 101">d</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="117 118">u</RegexCharacter></RegexSequence><RegexCharacter character_set="98 99">b</RegexCharacter></RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence>"</RegexGroup>                                </RegexOr><RegexGroup group_attributes="" group_index="11" group_name="ELSE">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence>"</RegexGroup>                                  </RegexOr><RegexGroup group_attributes="" group_index="12" group_name="ENUM">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="117 118">u</RegexCharacter></RegexSequence><RegexCharacter character_set="109 110">m</RegexCharacter></RegexSequence>"</RegexGroup>                                  </RegexOr><RegexGroup group_attributes="" group_index="13" group_name="EXTERN">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="120 121">x</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence>"</RegexGroup>                              </RegexOr><RegexGroup group_attributes="" group_index="14" group_name="FLOAT">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="102 103">f</RegexCharacter></RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="97 98">a</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence>"</RegexGroup>                                  </RegexOr><RegexGroup group_attributes="" group_index="15" group_name="FOR">"<RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="102 103">f</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence>"</RegexGroup>                                    </RegexOr><RegexGroup group_attributes="" group_index="16" group_name="GOTO">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="103 104">g</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence>"</RegexGroup>                                  </RegexOr><RegexGroup group_attributes="" group_index="17" group_name="IF">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="102 103">f</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="18" group_name="INLINE">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence>"</RegexGroup>                              </RegexOr><RegexGroup group_attributes="" group_index="19" group_name="INT">"<RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence>"</RegexGroup>                                    </RegexOr><RegexGroup group_attributes="" group_index="20" group_name="LONG">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="103 104">g</RegexCharacter></RegexSequence>"</RegexGroup>                                  </RegexOr><RegexGroup group_attributes="" group_index="21" group_name="REGISTER">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="103 104">g</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence>"</RegexGroup>                          </RegexOr><RegexGroup group_attributes="" group_index="22" group_name="RESTRICT">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="99 100">c</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence>"</RegexGroup>                           </RegexOr><RegexGroup group_attributes="" group_index="23" group_name="RETURN">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="117 118">u</RegexCharacter></RegexSequence><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence>"</RegexGroup>                              </RegexOr><RegexGroup group_attributes="" group_index="24" group_name="SHORT">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence><RegexCharacter character_set="104 105">h</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence>"</RegexGroup>                                        </RegexOr><RegexGroup group_attributes="" group_index="25" group_name="SIGNED">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="103 104">g</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="100 101">d</RegexCharacter></RegexSequence>"</RegexGroup>                              </RegexOr><RegexGroup group_attributes="" group_index="26" group_name="SIZEOF">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="122 123">z</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="102 103">f</RegexCharacter></RegexSequence>"</RegexGroup>                              </RegexOr><RegexGroup group_attributes="" group_index="27" group_name="STATIC">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="97 98">a</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="99 100">c</RegexCharacter></RegexSequence>"</RegexGroup>                         </RegexOr><RegexGroup group_attributes="" group_index="28" group_name="STRUCT">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence><RegexCharacter character_set="117 118">u</RegexCharacter></RegexSequence><RegexCharacter character_set="99 100">c</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence>"</RegexGroup>                               </RegexOr><RegexGroup group_attributes="" group_index="29" group_name="SWITCH">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence><RegexCharacter character_set="119 120">w</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="99 100">c</RegexCharacter></RegexSequence><RegexCharacter character_set="104 105">h</RegexCharacter></RegexSequence>"</RegexGroup>                               </RegexOr><RegexGroup group_attributes="" group_index="30" group_name="TYPEDEF">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="121 122">y</RegexCharacter></RegexSequence><RegexCharacter character_set="112 113">p</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="100 101">d</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="102 103">f</RegexCharacter></RegexSequence>"</RegexGroup>                            </RegexOr><RegexGroup group_attributes="" group_index="31" group_name="UNION">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="117 118">u</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence>"</RegexGroup>                                        </RegexOr><RegexGroup group_attributes="" group_index="32" group_name="UNSIGNED">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="117 118">u</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="103 104">g</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="100 101">d</RegexCharacter></RegexSequence>"</RegexGroup>                          </RegexOr><RegexGroup group_attributes="" group_index="33" group_name="VOID">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="118 119">v</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="100 101">d</RegexCharacter></RegexSequence>"</RegexGroup>                                  </RegexOr><RegexGroup group_attributes="" group_index="34" group_name="VOLATILE">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="118 119">v</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence><RegexCharacter character_set="97 98">a</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence>"</RegexGroup>                            </RegexOr><RegexGroup group_attributes="" group_index="35" group_name="WHILE">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="119 120">w</RegexCharacter></RegexSequence><RegexCharacter character_set="104 105">h</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence>"</RegexGroup>                                        </RegexOr><RegexGroup group_attributes="" group_index="36" group_name="ALIGNAS">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="65 66">A</RegexCharacter></RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="103 104">g</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="97 98">a</RegexCharacter></RegexSequence><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence>"</RegexGroup>                         </RegexOr><RegexGroup group_attributes="" group_index="37" group_name="ALIGNOF">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="65 66">A</RegexCharacter></RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="103 104">g</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="102 103">f</RegexCharacter></RegexSequence>"</RegexGroup>                               </RegexOr><RegexGroup group_attributes="" group_index="38" group_name="ATOMIC">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="65 66">A</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="109 110">m</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="99 100">c</RegexCharacter></RegexSequence>"</RegexGroup>                          </RegexOr><RegexGroup group_attributes="" group_index="39" group_name="BOOL">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="66 67">B</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence>"</RegexGroup>                                     </RegexOr><RegexGroup group_attributes="" group_index="40" group_name="COMPLEX">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="67 68">C</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="109 110">m</RegexCharacter></RegexSequence><RegexCharacter character_set="112 113">p</RegexCharacter></RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="120 121">x</RegexCharacter></RegexSequence>"</RegexGroup>                               </RegexOr><RegexGroup group_attributes="" group_index="41" group_name="GENERIC">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="71 72">G</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="99 100">c</RegexCharacter></RegexSequence>"</RegexGroup>                                </RegexOr><RegexGroup group_attributes="" group_index="42" group_name="IMAGINARY">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="73 74">I</RegexCharacter></RegexSequence><RegexCharacter character_set="109 110">m</RegexCharacter></RegexSequence><RegexCharacter character_set="97 98">a</RegexCharacter></RegexSequence><RegexCharacter character_set="103 104">g</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="97 98">a</RegexCharacter></RegexSequence><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence><RegexCharacter character_set="121 122">y</RegexCharacter></RegexSequence>"</RegexGroup>                               </RegexOr><RegexGroup group_attributes="" group_index="43" group_name="NORETURN">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="78 79">N</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="117 118">u</RegexCharacter></RegexSequence><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence>"</RegexGroup>                             </RegexOr><RegexGroup group_attributes="" group_index="44" group_name="STATIC_ASSERT">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="83 84">S</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="97 98">a</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="99 100">c</RegexCharacter></RegexSequence><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="97 98">a</RegexCharacter></RegexSequence><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence>"</RegexGroup>                  </RegexOr><RegexGroup group_attributes="" group_index="45" group_name="THREAD_LOCAL">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="84 85">T</RegexCharacter></RegexSequence><RegexCharacter character_set="104 105">h</RegexCharacter></RegexSequence><RegexCharacter character_set="114 115">r</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="97 98">a</RegexCharacter></RegexSequence><RegexCharacter character_set="100 101">d</RegexCharacter></RegexSequence><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence><RegexCharacter character_set="111 112">o</RegexCharacter></RegexSequence><RegexCharacter character_set="99 100">c</RegexCharacter></RegexSequence><RegexCharacter character_set="97 98">a</RegexCharacter></RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence>"</RegexGroup>                            </RegexOr><RegexGroup group_attributes="" group_index="46" group_name="FUNC_NAME">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="102 103">f</RegexCharacter></RegexSequence><RegexCharacter character_set="117 118">u</RegexCharacter></RegexSequence><RegexCharacter character_set="110 111">n</RegexCharacter></RegexSequence><RegexCharacter character_set="99 100">c</RegexCharacter></RegexSequence><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence>"</RegexGroup>                          </RegexOr><RegexGroup group_attributes="" group_index="47" group_name="TYPEDEF_NAME">"<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="115 116">s</RegexCharacter></RegexSequence><RegexCharacter character_set="105 106">i</RegexCharacter></RegexSequence><RegexCharacter character_set="122 123">z</RegexCharacter></RegexSequence><RegexCharacter character_set="101 102">e</RegexCharacter></RegexSequence><RegexCharacter character_set="95 96">_</RegexCharacter></RegexSequence><RegexCharacter character_set="116 117">t</RegexCharacter></RegexSequence>"</RegexGroup>                          </RegexOr><RegexGroup group_attributes="" group_index="48" group_name="IDENTIFIER"><RegexGroup group_attributes="" group_index="49" group_name="Identifier">(?<RegexSequence><RegexGroup group_attributes="" group_index="50" group_name="">([<RegexCharacterOr character_set="65 91 95 96 97 123"><RegexCharacterOr character_set="65 91 97 123"><RegexCharacterOr character_set="97 123"><RegexCharacter character_set="" /><RegexCharacterRange character_set="97 123"><RegexCharacter character_set="97 98">a</RegexCharacter>-<RegexCharacter character_set="122 123">z</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="65 91"><RegexCharacter character_set="65 66">A</RegexCharacter>-<RegexCharacter character_set="90 91">Z</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacter character_set="95 96">_</RegexCharacter></RegexCharacterOr>])</RegexGroup><RegexRepeat count0="0" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="51" group_name="">([<RegexCharacterOr character_set="48 58 65 91 95 96 97 123"><RegexCharacterOr character_set="65 91 95 96 97 123"><RegexCharacterOr character_set="65 91 97 123"><RegexCharacterOr character_set="97 123"><RegexCharacter character_set="" /><RegexCharacterRange character_set="97 123"><RegexCharacter character_set="97 98">a</RegexCharacter>-<RegexCharacter character_set="122 123">z</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="65 91"><RegexCharacter character_set="65 66">A</RegexCharacter>-<RegexCharacter character_set="90 91">Z</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacter character_set="95 96">_</RegexCharacter></RegexCharacterOr><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>*</RegexRepeat></RegexSequence>)</RegexGroup></RegexGroup> </RegexOr><RegexGroup group_attributes="" group_index="52" group_name="I_CONSTANT"><RegexGroup group_attributes="" group_index="53" group_name="ExpressionIntLiteral">(?<RegexSequence><RegexSequence><RegexGroup group_attributes="" group_index="54" group_name="">(<RegexGroup group_attributes="" group_index="55" group_name="">(<RegexSequence><RegexCharacter character_set="48 49">0</RegexCharacter>[<RegexCharacterOr character_set="88 89 120 121"><RegexCharacterOr character_set="120 121"><RegexCharacter character_set="" /><RegexCharacter character_set="120 121">x</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="88 89">X</RegexCharacter></RegexCharacterOr>]</RegexSequence>)</RegexGroup>)</RegexGroup><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="56" group_name="">([<RegexCharacterOr character_set="48 58 65 71 97 103"><RegexCharacterOr character_set="65 71 97 103"><RegexCharacterOr character_set="97 103"><RegexCharacter character_set="" /><RegexCharacterRange character_set="97 103"><RegexCharacter character_set="97 98">a</RegexCharacter>-<RegexCharacter character_set="102 103">f</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="65 71"><RegexCharacter character_set="65 66">A</RegexCharacter>-<RegexCharacter character_set="70 71">F</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>+</RegexRepeat></RegexSequence><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="57" group_name="">(<RegexGroup group_attributes="" group_index="58" group_name="">(<RegexOr><RegexGroup group_attributes="" group_index="59" group_name="">(<RegexSequence><RegexGroup group_attributes="" group_index="60" group_name="">(<RegexOr><RegexCharacter character_set="117 118">u</RegexCharacter>|<RegexCharacter character_set="85 86">U</RegexCharacter></RegexOr>)</RegexGroup><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="61" group_name="">(<RegexOr><RegexOr><RegexOr><RegexCharacter character_set="108 109">l</RegexCharacter>|<RegexCharacter character_set="76 77">L</RegexCharacter></RegexOr>|<RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence></RegexOr>|<RegexSequence><RegexCharacter character_set="76 77">L</RegexCharacter><RegexCharacter character_set="76 77">L</RegexCharacter></RegexSequence></RegexOr>)</RegexGroup>?</RegexRepeat></RegexSequence>)</RegexGroup>|<RegexGroup group_attributes="" group_index="62" group_name="">(<RegexSequence><RegexGroup group_attributes="" group_index="63" group_name="">(<RegexOr><RegexOr><RegexOr><RegexCharacter character_set="108 109">l</RegexCharacter>|<RegexCharacter character_set="76 77">L</RegexCharacter></RegexOr>|<RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence></RegexOr>|<RegexSequence><RegexCharacter character_set="76 77">L</RegexCharacter><RegexCharacter character_set="76 77">L</RegexCharacter></RegexSequence></RegexOr>)</RegexGroup><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="64" group_name="">(<RegexOr><RegexCharacter character_set="117 118">u</RegexCharacter>|<RegexCharacter character_set="85 86">U</RegexCharacter></RegexOr>)</RegexGroup>?</RegexRepeat></RegexSequence>)</RegexGroup></RegexOr>)</RegexGroup>)</RegexGroup>?</RegexRepeat></RegexSequence>)</RegexGroup></RegexGroup>                         </RegexOr><RegexGroup group_attributes="" group_index="65" group_name="I_CONSTANT"><RegexGroup group_attributes="" group_index="66" group_name="ExpressionIntLiteral">(?<RegexSequence><RegexSequence><RegexGroup group_attributes="" group_index="67" group_name="">([<RegexCharacterOr character_set="49 58"><RegexCharacter character_set="" /><RegexCharacterRange character_set="49 58"><RegexCharacter character_set="49 50">1</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup><RegexRepeat count0="0" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="68" group_name="">([<RegexCharacterOr character_set="48 58"><RegexCharacter character_set="" /><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>*</RegexRepeat></RegexSequence><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="69" group_name="">(<RegexGroup group_attributes="" group_index="70" group_name="">(<RegexOr><RegexGroup group_attributes="" group_index="71" group_name="">(<RegexSequence><RegexGroup group_attributes="" group_index="72" group_name="">(<RegexOr><RegexCharacter character_set="117 118">u</RegexCharacter>|<RegexCharacter character_set="85 86">U</RegexCharacter></RegexOr>)</RegexGroup><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="73" group_name="">(<RegexOr><RegexOr><RegexOr><RegexCharacter character_set="108 109">l</RegexCharacter>|<RegexCharacter character_set="76 77">L</RegexCharacter></RegexOr>|<RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence></RegexOr>|<RegexSequence><RegexCharacter character_set="76 77">L</RegexCharacter><RegexCharacter character_set="76 77">L</RegexCharacter></RegexSequence></RegexOr>)</RegexGroup>?</RegexRepeat></RegexSequence>)</RegexGroup>|<RegexGroup group_attributes="" group_index="74" group_name="">(<RegexSequence><RegexGroup group_attributes="" group_index="75" group_name="">(<RegexOr><RegexOr><RegexOr><RegexCharacter character_set="108 109">l</RegexCharacter>|<RegexCharacter character_set="76 77">L</RegexCharacter></RegexOr>|<RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence></RegexOr>|<RegexSequence><RegexCharacter character_set="76 77">L</RegexCharacter><RegexCharacter character_set="76 77">L</RegexCharacter></RegexSequence></RegexOr>)</RegexGroup><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="76" group_name="">(<RegexOr><RegexCharacter character_set="117 118">u</RegexCharacter>|<RegexCharacter character_set="85 86">U</RegexCharacter></RegexOr>)</RegexGroup>?</RegexRepeat></RegexSequence>)</RegexGroup></RegexOr>)</RegexGroup>)</RegexGroup>?</RegexRepeat></RegexSequence>)</RegexGroup></RegexGroup>                            </RegexOr><RegexGroup group_attributes="" group_index="77" group_name="I_CONSTANT"><RegexGroup group_attributes="" group_index="78" group_name="ExpressionIntLiteral">(?<RegexSequence><RegexSequence>"<RegexSequence><RegexEmpty /><RegexCharacter character_set="48 49">0</RegexCharacter></RegexSequence>"<RegexRepeat count0="0" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="79" group_name="">([<RegexCharacterOr character_set="48 56"><RegexCharacter character_set="" /><RegexCharacterRange character_set="48 56"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="55 56">7</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>*</RegexRepeat></RegexSequence><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="80" group_name="">(<RegexGroup group_attributes="" group_index="81" group_name="">(<RegexOr><RegexGroup group_attributes="" group_index="82" group_name="">(<RegexSequence><RegexGroup group_attributes="" group_index="83" group_name="">(<RegexOr><RegexCharacter character_set="117 118">u</RegexCharacter>|<RegexCharacter character_set="85 86">U</RegexCharacter></RegexOr>)</RegexGroup><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="84" group_name="">(<RegexOr><RegexOr><RegexOr><RegexCharacter character_set="108 109">l</RegexCharacter>|<RegexCharacter character_set="76 77">L</RegexCharacter></RegexOr>|<RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence></RegexOr>|<RegexSequence><RegexCharacter character_set="76 77">L</RegexCharacter><RegexCharacter character_set="76 77">L</RegexCharacter></RegexSequence></RegexOr>)</RegexGroup>?</RegexRepeat></RegexSequence>)</RegexGroup>|<RegexGroup group_attributes="" group_index="85" group_name="">(<RegexSequence><RegexGroup group_attributes="" group_index="86" group_name="">(<RegexOr><RegexOr><RegexOr><RegexCharacter character_set="108 109">l</RegexCharacter>|<RegexCharacter character_set="76 77">L</RegexCharacter></RegexOr>|<RegexSequence><RegexCharacter character_set="108 109">l</RegexCharacter><RegexCharacter character_set="108 109">l</RegexCharacter></RegexSequence></RegexOr>|<RegexSequence><RegexCharacter character_set="76 77">L</RegexCharacter><RegexCharacter character_set="76 77">L</RegexCharacter></RegexSequence></RegexOr>)</RegexGroup><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="87" group_name="">(<RegexOr><RegexCharacter character_set="117 118">u</RegexCharacter>|<RegexCharacter character_set="85 86">U</RegexCharacter></RegexOr>)</RegexGroup>?</RegexRepeat></RegexSequence>)</RegexGroup></RegexOr>)</RegexGroup>)</RegexGroup>?</RegexRepeat></RegexSequence>)</RegexGroup></RegexGroup>                             </RegexOr><RegexGroup group_attributes="" group_index="88" group_name="I_CONSTANT"><RegexGroup group_attributes="" group_index="89" group_name="ExpressionIntLiteral">(?<RegexSequence><RegexSequence><RegexSequence><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="90" group_name="">(<RegexGroup group_attributes="" group_index="91" group_name="">(<RegexOr><RegexOr><RegexCharacter character_set="117 118">u</RegexCharacter>|<RegexCharacter character_set="85 86">U</RegexCharacter></RegexOr>|<RegexCharacter character_set="76 77">L</RegexCharacter></RegexOr>)</RegexGroup>)</RegexGroup>?</RegexRepeat>"<RegexSequence><RegexEmpty /><RegexCharacter character_set="39 40">'</RegexCharacter></RegexSequence>"</RegexSequence><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="92" group_name="">(<RegexOr>[<RegexCharacterNot character_set="0 10 11 39 40 92 93 256">^<RegexCharacterOr character_set="10 11 39 40 92 93"><RegexCharacterOr character_set="39 40 92 93"><RegexCharacterOr character_set="39 40"><RegexCharacter character_set="" /><RegexCharacter character_set="39 40">'</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="92 93">\\</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="10 11">\n</RegexCharacter></RegexCharacterOr></RegexCharacterNot>]|<RegexGroup group_attributes="" group_index="93" group_name="">(<RegexGroup group_attributes="" group_index="94" group_name="">(<RegexSequence><RegexCharacter character_set="92 93">\\</RegexCharacter><RegexGroup group_attributes="" group_index="95" group_name="">(<RegexOr><RegexOr>[<RegexCharacterOr character_set="34 35 39 40 63 64 92 93 97 99 102 103 110 111 114 115 116 117 118 119"><RegexCharacterOr character_set="34 35 39 40 63 64 92 93 97 99 102 103 110 111 114 115 116 117"><RegexCharacterOr character_set="34 35 39 40 63 64 92 93 97 99 102 103 110 111 114 115"><RegexCharacterOr character_set="34 35 39 40 63 64 92 93 97 99 102 103 110 111"><RegexCharacterOr character_set="34 35 39 40 63 64 92 93 97 99 102 103"><RegexCharacterOr character_set="34 35 39 40 63 64 92 93 97 99"><RegexCharacterOr character_set="34 35 39 40 63 64 92 93 97 98"><RegexCharacterOr character_set="34 35 39 40 63 64 92 93"><RegexCharacterOr character_set="34 35 39 40 63 64"><RegexCharacterOr character_set="34 35 39 40"><RegexCharacterOr character_set="39 40"><RegexCharacter character_set="" /><RegexCharacter character_set="39 40">'</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="34 35">"</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="63 64">\?</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="92 93">\\</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="97 98">a</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="98 99">b</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="102 103">f</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="110 111">n</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="114 115">r</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="116 117">t</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="118 119">v</RegexCharacter></RegexCharacterOr>]|<RegexRepeat count0="1" count1="3" non_greedy="false">[<RegexCharacterOr character_set="48 56"><RegexCharacter character_set="" /><RegexCharacterRange character_set="48 56"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="55 56">7</RegexCharacter></RegexCharacterRange></RegexCharacterOr>]{</RegexRepeat></RegexOr>|<RegexSequence><RegexCharacter character_set="120 121">x</RegexCharacter><RegexRepeat count0="1" count1="-1" non_greedy="false">[<RegexCharacterOr character_set="48 58 65 71 97 103"><RegexCharacterOr character_set="65 71 97 103"><RegexCharacterOr character_set="97 103"><RegexCharacter character_set="" /><RegexCharacterRange character_set="97 103"><RegexCharacter character_set="97 98">a</RegexCharacter>-<RegexCharacter character_set="102 103">f</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="65 71"><RegexCharacter character_set="65 66">A</RegexCharacter>-<RegexCharacter character_set="70 71">F</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>]+</RegexRepeat></RegexSequence></RegexOr>)</RegexGroup></RegexSequence>)</RegexGroup>)</RegexGroup></RegexOr>)</RegexGroup>+</RegexRepeat></RegexSequence>"<RegexSequence><RegexEmpty /><RegexCharacter character_set="39 40">'</RegexCharacter></RegexSequence>"</RegexSequence>)</RegexGroup></RegexGroup>           </RegexOr><RegexGroup group_attributes="" group_index="96" group_name="F_CONSTANT"><RegexGroup group_attributes="" group_index="97" group_name="ExpressionFloatLiteral">(?<RegexSequence><RegexSequence><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="98" group_name="">([<RegexCharacterOr character_set="48 58"><RegexCharacter character_set="" /><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>+</RegexRepeat><RegexGroup group_attributes="" group_index="99" group_name="">(<RegexGroup group_attributes="" group_index="100" group_name="">(<RegexSequence><RegexSequence>[<RegexCharacterOr character_set="69 70 101 102"><RegexCharacterOr character_set="69 70"><RegexCharacter character_set="" /><RegexCharacter character_set="69 70">E</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="101 102">e</RegexCharacter></RegexCharacterOr>]<RegexRepeat count0="0" count1="1" non_greedy="false">[<RegexCharacterOr character_set="43 44 45 46"><RegexCharacterOr character_set="43 44"><RegexCharacter character_set="" /><RegexCharacter character_set="43 44">+</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="45 46">-</RegexCharacter></RegexCharacterOr>]?</RegexRepeat></RegexSequence><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="101" group_name="">([<RegexCharacterOr character_set="48 58"><RegexCharacter character_set="" /><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>+</RegexRepeat></RegexSequence>)</RegexGroup>)</RegexGroup></RegexSequence><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="102" group_name="">(<RegexGroup group_attributes="" group_index="103" group_name="">(<RegexOr><RegexOr><RegexOr><RegexCharacter character_set="102 103">f</RegexCharacter>|<RegexCharacter character_set="70 71">F</RegexCharacter></RegexOr>|<RegexCharacter character_set="108 109">l</RegexCharacter></RegexOr>|<RegexCharacter character_set="76 77">L</RegexCharacter></RegexOr>)</RegexGroup>)</RegexGroup>?</RegexRepeat></RegexSequence>)</RegexGroup></RegexGroup>                               </RegexOr><RegexGroup group_attributes="" group_index="104" group_name="F_CONSTANT"><RegexGroup group_attributes="" group_index="105" group_name="ExpressionFloatLiteral">(?<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexRepeat count0="0" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="106" group_name="">([<RegexCharacterOr character_set="48 58"><RegexCharacter character_set="" /><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>*</RegexRepeat>"<RegexSequence><RegexEmpty /><RegexCharacter character_set="46 47">.</RegexCharacter></RegexSequence>"</RegexSequence><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="107" group_name="">([<RegexCharacterOr character_set="48 58"><RegexCharacter character_set="" /><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>+</RegexRepeat></RegexSequence><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="108" group_name="">(<RegexGroup group_attributes="" group_index="109" group_name="">(<RegexSequence><RegexSequence>[<RegexCharacterOr character_set="69 70 101 102"><RegexCharacterOr character_set="69 70"><RegexCharacter character_set="" /><RegexCharacter character_set="69 70">E</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="101 102">e</RegexCharacter></RegexCharacterOr>]<RegexRepeat count0="0" count1="1" non_greedy="false">[<RegexCharacterOr character_set="43 44 45 46"><RegexCharacterOr character_set="43 44"><RegexCharacter character_set="" /><RegexCharacter character_set="43 44">+</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="45 46">-</RegexCharacter></RegexCharacterOr>]?</RegexRepeat></RegexSequence><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="110" group_name="">([<RegexCharacterOr character_set="48 58"><RegexCharacter character_set="" /><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>+</RegexRepeat></RegexSequence>)</RegexGroup>)</RegexGroup>?</RegexRepeat></RegexSequence><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="111" group_name="">(<RegexGroup group_attributes="" group_index="112" group_name="">(<RegexOr><RegexOr><RegexOr><RegexCharacter character_set="102 103">f</RegexCharacter>|<RegexCharacter character_set="70 71">F</RegexCharacter></RegexOr>|<RegexCharacter character_set="108 109">l</RegexCharacter></RegexOr>|<RegexCharacter character_set="76 77">L</RegexCharacter></RegexOr>)</RegexGroup>)</RegexGroup>?</RegexRepeat></RegexSequence>)</RegexGroup></RegexGroup>                  </RegexOr><RegexGroup group_attributes="" group_index="113" group_name="F_CONSTANT"><RegexGroup group_attributes="" group_index="114" group_name="ExpressionFloatLiteral">(?<RegexSequence><RegexSequence><RegexSequence><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="115" group_name="">([<RegexCharacterOr character_set="48 58"><RegexCharacter character_set="" /><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>+</RegexRepeat>"<RegexSequence><RegexEmpty /><RegexCharacter character_set="46 47">.</RegexCharacter></RegexSequence>"</RegexSequence><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="116" group_name="">(<RegexGroup group_attributes="" group_index="117" group_name="">(<RegexSequence><RegexSequence>[<RegexCharacterOr character_set="69 70 101 102"><RegexCharacterOr character_set="69 70"><RegexCharacter character_set="" /><RegexCharacter character_set="69 70">E</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="101 102">e</RegexCharacter></RegexCharacterOr>]<RegexRepeat count0="0" count1="1" non_greedy="false">[<RegexCharacterOr character_set="43 44 45 46"><RegexCharacterOr character_set="43 44"><RegexCharacter character_set="" /><RegexCharacter character_set="43 44">+</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="45 46">-</RegexCharacter></RegexCharacterOr>]?</RegexRepeat></RegexSequence><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="118" group_name="">([<RegexCharacterOr character_set="48 58"><RegexCharacter character_set="" /><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>+</RegexRepeat></RegexSequence>)</RegexGroup>)</RegexGroup>?</RegexRepeat></RegexSequence><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="119" group_name="">(<RegexGroup group_attributes="" group_index="120" group_name="">(<RegexOr><RegexOr><RegexOr><RegexCharacter character_set="102 103">f</RegexCharacter>|<RegexCharacter character_set="70 71">F</RegexCharacter></RegexOr>|<RegexCharacter character_set="108 109">l</RegexCharacter></RegexOr>|<RegexCharacter character_set="76 77">L</RegexCharacter></RegexOr>)</RegexGroup>)</RegexGroup>?</RegexRepeat></RegexSequence>)</RegexGroup></RegexGroup>                        </RegexOr><RegexGroup group_attributes="" group_index="121" group_name="F_CONSTANT"><RegexGroup group_attributes="" group_index="122" group_name="ExpressionFloatLiteral">(?<RegexSequence><RegexSequence><RegexSequence><RegexGroup group_attributes="" group_index="123" group_name="">(<RegexGroup group_attributes="" group_index="124" group_name="">(<RegexSequence><RegexCharacter character_set="48 49">0</RegexCharacter>[<RegexCharacterOr character_set="88 89 120 121"><RegexCharacterOr character_set="120 121"><RegexCharacter character_set="" /><RegexCharacter character_set="120 121">x</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="88 89">X</RegexCharacter></RegexCharacterOr>]</RegexSequence>)</RegexGroup>)</RegexGroup><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="125" group_name="">([<RegexCharacterOr character_set="48 58 65 71 97 103"><RegexCharacterOr character_set="65 71 97 103"><RegexCharacterOr character_set="97 103"><RegexCharacter character_set="" /><RegexCharacterRange character_set="97 103"><RegexCharacter character_set="97 98">a</RegexCharacter>-<RegexCharacter character_set="102 103">f</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="65 71"><RegexCharacter character_set="65 66">A</RegexCharacter>-<RegexCharacter character_set="70 71">F</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>+</RegexRepeat></RegexSequence><RegexGroup group_attributes="" group_index="126" group_name="">(<RegexGroup group_attributes="" group_index="127" group_name="">(<RegexSequence><RegexSequence>[<RegexCharacterOr character_set="80 81 112 113"><RegexCharacterOr character_set="80 81"><RegexCharacter character_set="" /><RegexCharacter character_set="80 81">P</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="112 113">p</RegexCharacter></RegexCharacterOr>]<RegexRepeat count0="0" count1="1" non_greedy="false">[<RegexCharacterOr character_set="43 44 45 46"><RegexCharacterOr character_set="43 44"><RegexCharacter character_set="" /><RegexCharacter character_set="43 44">+</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="45 46">-</RegexCharacter></RegexCharacterOr>]?</RegexRepeat></RegexSequence><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="128" group_name="">([<RegexCharacterOr character_set="48 58"><RegexCharacter character_set="" /><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>+</RegexRepeat></RegexSequence>)</RegexGroup>)</RegexGroup></RegexSequence><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="129" group_name="">(<RegexGroup group_attributes="" group_index="130" group_name="">(<RegexOr><RegexOr><RegexOr><RegexCharacter character_set="102 103">f</RegexCharacter>|<RegexCharacter character_set="70 71">F</RegexCharacter></RegexOr>|<RegexCharacter character_set="108 109">l</RegexCharacter></RegexOr>|<RegexCharacter character_set="76 77">L</RegexCharacter></RegexOr>)</RegexGroup>)</RegexGroup>?</RegexRepeat></RegexSequence>)</RegexGroup></RegexGroup>                      </RegexOr><RegexGroup group_attributes="" group_index="131" group_name="F_CONSTANT"><RegexGroup group_attributes="" group_index="132" group_name="ExpressionFloatLiteral">(?<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexGroup group_attributes="" group_index="133" group_name="">(<RegexGroup group_attributes="" group_index="134" group_name="">(<RegexSequence><RegexCharacter character_set="48 49">0</RegexCharacter>[<RegexCharacterOr character_set="88 89 120 121"><RegexCharacterOr character_set="120 121"><RegexCharacter character_set="" /><RegexCharacter character_set="120 121">x</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="88 89">X</RegexCharacter></RegexCharacterOr>]</RegexSequence>)</RegexGroup>)</RegexGroup><RegexRepeat count0="0" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="135" group_name="">([<RegexCharacterOr character_set="48 58 65 71 97 103"><RegexCharacterOr character_set="65 71 97 103"><RegexCharacterOr character_set="97 103"><RegexCharacter character_set="" /><RegexCharacterRange character_set="97 103"><RegexCharacter character_set="97 98">a</RegexCharacter>-<RegexCharacter character_set="102 103">f</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="65 71"><RegexCharacter character_set="65 66">A</RegexCharacter>-<RegexCharacter character_set="70 71">F</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>*</RegexRepeat></RegexSequence>"<RegexSequence><RegexEmpty /><RegexCharacter character_set="46 47">.</RegexCharacter></RegexSequence>"</RegexSequence><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="136" group_name="">([<RegexCharacterOr character_set="48 58 65 71 97 103"><RegexCharacterOr character_set="65 71 97 103"><RegexCharacterOr character_set="97 103"><RegexCharacter character_set="" /><RegexCharacterRange character_set="97 103"><RegexCharacter character_set="97 98">a</RegexCharacter>-<RegexCharacter character_set="102 103">f</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="65 71"><RegexCharacter character_set="65 66">A</RegexCharacter>-<RegexCharacter character_set="70 71">F</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>+</RegexRepeat></RegexSequence><RegexGroup group_attributes="" group_index="137" group_name="">(<RegexGroup group_attributes="" group_index="138" group_name="">(<RegexSequence><RegexSequence>[<RegexCharacterOr character_set="80 81 112 113"><RegexCharacterOr character_set="80 81"><RegexCharacter character_set="" /><RegexCharacter character_set="80 81">P</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="112 113">p</RegexCharacter></RegexCharacterOr>]<RegexRepeat count0="0" count1="1" non_greedy="false">[<RegexCharacterOr character_set="43 44 45 46"><RegexCharacterOr character_set="43 44"><RegexCharacter character_set="" /><RegexCharacter character_set="43 44">+</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="45 46">-</RegexCharacter></RegexCharacterOr>]?</RegexRepeat></RegexSequence><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="139" group_name="">([<RegexCharacterOr character_set="48 58"><RegexCharacter character_set="" /><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>+</RegexRepeat></RegexSequence>)</RegexGroup>)</RegexGroup></RegexSequence><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="140" group_name="">(<RegexGroup group_attributes="" group_index="141" group_name="">(<RegexOr><RegexOr><RegexOr><RegexCharacter character_set="102 103">f</RegexCharacter>|<RegexCharacter character_set="70 71">F</RegexCharacter></RegexOr>|<RegexCharacter character_set="108 109">l</RegexCharacter></RegexOr>|<RegexCharacter character_set="76 77">L</RegexCharacter></RegexOr>)</RegexGroup>)</RegexGroup>?</RegexRepeat></RegexSequence>)</RegexGroup></RegexGroup>                        </RegexOr><RegexGroup group_attributes="" group_index="142" group_name="F_CONSTANT"><RegexGroup group_attributes="" group_index="143" group_name="ExpressionFloatLiteral">(?<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexGroup group_attributes="" group_index="144" group_name="">(<RegexGroup group_attributes="" group_index="145" group_name="">(<RegexSequence><RegexCharacter character_set="48 49">0</RegexCharacter>[<RegexCharacterOr character_set="88 89 120 121"><RegexCharacterOr character_set="120 121"><RegexCharacter character_set="" /><RegexCharacter character_set="120 121">x</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="88 89">X</RegexCharacter></RegexCharacterOr>]</RegexSequence>)</RegexGroup>)</RegexGroup><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="146" group_name="">([<RegexCharacterOr character_set="48 58 65 71 97 103"><RegexCharacterOr character_set="65 71 97 103"><RegexCharacterOr character_set="97 103"><RegexCharacter character_set="" /><RegexCharacterRange character_set="97 103"><RegexCharacter character_set="97 98">a</RegexCharacter>-<RegexCharacter character_set="102 103">f</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="65 71"><RegexCharacter character_set="65 66">A</RegexCharacter>-<RegexCharacter character_set="70 71">F</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>+</RegexRepeat></RegexSequence>"<RegexSequence><RegexEmpty /><RegexCharacter character_set="46 47">.</RegexCharacter></RegexSequence>"</RegexSequence><RegexGroup group_attributes="" group_index="147" group_name="">(<RegexGroup group_attributes="" group_index="148" group_name="">(<RegexSequence><RegexSequence>[<RegexCharacterOr character_set="80 81 112 113"><RegexCharacterOr character_set="80 81"><RegexCharacter character_set="" /><RegexCharacter character_set="80 81">P</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="112 113">p</RegexCharacter></RegexCharacterOr>]<RegexRepeat count0="0" count1="1" non_greedy="false">[<RegexCharacterOr character_set="43 44 45 46"><RegexCharacterOr character_set="43 44"><RegexCharacter character_set="" /><RegexCharacter character_set="43 44">+</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="45 46">-</RegexCharacter></RegexCharacterOr>]?</RegexRepeat></RegexSequence><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="149" group_name="">([<RegexCharacterOr character_set="48 58"><RegexCharacter character_set="" /><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>])</RegexGroup>+</RegexRepeat></RegexSequence>)</RegexGroup>)</RegexGroup></RegexSequence><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="150" group_name="">(<RegexGroup group_attributes="" group_index="151" group_name="">(<RegexOr><RegexOr><RegexOr><RegexCharacter character_set="102 103">f</RegexCharacter>|<RegexCharacter character_set="70 71">F</RegexCharacter></RegexOr>|<RegexCharacter character_set="108 109">l</RegexCharacter></RegexOr>|<RegexCharacter character_set="76 77">L</RegexCharacter></RegexOr>)</RegexGroup>)</RegexGroup>?</RegexRepeat></RegexSequence>)</RegexGroup></RegexGroup>                        </RegexOr><RegexGroup group_attributes="" group_index="152" group_name="STRING_LITERAL"><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="153" group_name="">(<RegexSequence><RegexSequence><RegexSequence><RegexSequence><RegexRepeat count0="0" count1="1" non_greedy="false"><RegexGroup group_attributes="" group_index="154" group_name="">(<RegexGroup group_attributes="" group_index="155" group_name="">(<RegexOr><RegexOr><RegexOr><RegexSequence><RegexCharacter character_set="117 118">u</RegexCharacter><RegexCharacter character_set="56 57">8</RegexCharacter></RegexSequence>|<RegexCharacter character_set="117 118">u</RegexCharacter></RegexOr>|<RegexCharacter character_set="85 86">U</RegexCharacter></RegexOr>|<RegexCharacter character_set="76 77">L</RegexCharacter></RegexOr>)</RegexGroup>)</RegexGroup>?</RegexRepeat><RegexCharacter character_set="34 35">\"</RegexCharacter></RegexSequence><RegexRepeat count0="0" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="156" group_name="">(<RegexOr>[<RegexCharacterNot character_set="0 10 11 34 35 92 93 256">^<RegexCharacterOr character_set="10 11 34 35 92 93"><RegexCharacterOr character_set="34 35 92 93"><RegexCharacterOr character_set="34 35"><RegexCharacter character_set="" /><RegexCharacter character_set="34 35">"</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="92 93">\\</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="10 11">\n</RegexCharacter></RegexCharacterOr></RegexCharacterNot>]|<RegexGroup group_attributes="" group_index="157" group_name="">(<RegexGroup group_attributes="" group_index="158" group_name="">(<RegexSequence><RegexCharacter character_set="92 93">\\</RegexCharacter><RegexGroup group_attributes="" group_index="159" group_name="">(<RegexOr><RegexOr>[<RegexCharacterOr character_set="34 35 39 40 63 64 92 93 97 99 102 103 110 111 114 115 116 117 118 119"><RegexCharacterOr character_set="34 35 39 40 63 64 92 93 97 99 102 103 110 111 114 115 116 117"><RegexCharacterOr character_set="34 35 39 40 63 64 92 93 97 99 102 103 110 111 114 115"><RegexCharacterOr character_set="34 35 39 40 63 64 92 93 97 99 102 103 110 111"><RegexCharacterOr character_set="34 35 39 40 63 64 92 93 97 99 102 103"><RegexCharacterOr character_set="34 35 39 40 63 64 92 93 97 99"><RegexCharacterOr character_set="34 35 39 40 63 64 92 93 97 98"><RegexCharacterOr character_set="34 35 39 40 63 64 92 93"><RegexCharacterOr character_set="34 35 39 40 63 64"><RegexCharacterOr character_set="34 35 39 40"><RegexCharacterOr character_set="39 40"><RegexCharacter character_set="" /><RegexCharacter character_set="39 40">'</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="34 35">"</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="63 64">\?</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="92 93">\\</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="97 98">a</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="98 99">b</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="102 103">f</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="110 111">n</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="114 115">r</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="116 117">t</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="118 119">v</RegexCharacter></RegexCharacterOr>]|<RegexRepeat count0="1" count1="3" non_greedy="false">[<RegexCharacterOr character_set="48 56"><RegexCharacter character_set="" /><RegexCharacterRange character_set="48 56"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="55 56">7</RegexCharacter></RegexCharacterRange></RegexCharacterOr>]{</RegexRepeat></RegexOr>|<RegexSequence><RegexCharacter character_set="120 121">x</RegexCharacter><RegexRepeat count0="1" count1="-1" non_greedy="false">[<RegexCharacterOr character_set="48 58 65 71 97 103"><RegexCharacterOr character_set="65 71 97 103"><RegexCharacterOr character_set="97 103"><RegexCharacter character_set="" /><RegexCharacterRange character_set="97 103"><RegexCharacter character_set="97 98">a</RegexCharacter>-<RegexCharacter character_set="102 103">f</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="65 71"><RegexCharacter character_set="65 66">A</RegexCharacter>-<RegexCharacter character_set="70 71">F</RegexCharacter></RegexCharacterRange></RegexCharacterOr><RegexCharacterRange character_set="48 58"><RegexCharacter character_set="48 49">0</RegexCharacter>-<RegexCharacter character_set="57 58">9</RegexCharacter></RegexCharacterRange></RegexCharacterOr>]+</RegexRepeat></RegexSequence></RegexOr>)</RegexGroup></RegexSequence>)</RegexGroup>)</RegexGroup></RegexOr>)</RegexGroup>*</RegexRepeat></RegexSequence><RegexCharacter character_set="34 35">\"</RegexCharacter></RegexSequence><RegexRepeat count0="0" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="160" group_name="">([<RegexCharacterOr character_set="9 13 32 33"><RegexCharacterOr character_set="9 12 32 33"><RegexCharacterOr character_set="9 10 11 12 32 33"><RegexCharacterOr character_set="9 10 32 33"><RegexCharacterOr character_set="32 33"><RegexCharacter character_set="" /><RegexCharacter character_set="32 33"> </RegexCharacter></RegexCharacterOr><RegexCharacter character_set="9 10">\t</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="11 12">\v</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="10 11">\n</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="12 13">\f</RegexCharacter></RegexCharacterOr>])</RegexGroup>*</RegexRepeat></RegexSequence>)</RegexGroup>+</RegexRepeat></RegexGroup>        </RegexOr><RegexGroup group_attributes="" group_index="161" group_name="ELLIPSIS">"<RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="46 47">.</RegexCharacter></RegexSequence><RegexCharacter character_set="46 47">.</RegexCharacter></RegexSequence><RegexCharacter character_set="46 47">.</RegexCharacter></RegexSequence>"</RegexGroup>                                    </RegexOr><RegexGroup group_attributes="" group_index="162" group_name="RIGHT_ASSIGN">"<RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="62 63">&gt;</RegexCharacter></RegexSequence><RegexCharacter character_set="62 63">&gt;</RegexCharacter></RegexSequence><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence>"</RegexGroup>                                  </RegexOr><RegexGroup group_attributes="" group_index="163" group_name="LEFT_ASSIGN">"<RegexSequence><RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="60 61">&lt;</RegexCharacter></RegexSequence><RegexCharacter character_set="60 61">&lt;</RegexCharacter></RegexSequence><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence>"</RegexGroup>                                   </RegexOr><RegexGroup group_attributes="" group_index="164" group_name="ADD_ASSIGN">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="43 44">+</RegexCharacter></RegexSequence><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence>"</RegexGroup>                                 </RegexOr><RegexGroup group_attributes="" group_index="165" group_name="SUB_ASSIGN">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="45 46">-</RegexCharacter></RegexSequence><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence>"</RegexGroup>                                 </RegexOr><RegexGroup group_attributes="" group_index="166" group_name="MUL_ASSIGN">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="42 43">*</RegexCharacter></RegexSequence><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence>"</RegexGroup>                                 </RegexOr><RegexGroup group_attributes="" group_index="167" group_name="DIV_ASSIGN">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="47 48">/</RegexCharacter></RegexSequence><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence>"</RegexGroup>                                 </RegexOr><RegexGroup group_attributes="" group_index="168" group_name="MOD_ASSIGN">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="37 38">%</RegexCharacter></RegexSequence><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence>"</RegexGroup>                                 </RegexOr><RegexGroup group_attributes="" group_index="169" group_name="AND_ASSIGN">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="38 39">&amp;</RegexCharacter></RegexSequence><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence>"</RegexGroup>                                     </RegexOr><RegexGroup group_attributes="" group_index="170" group_name="XOR_ASSIGN">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="94 95">^</RegexCharacter></RegexSequence><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence>"</RegexGroup>                                 </RegexOr><RegexGroup group_attributes="" group_index="171" group_name="OR_ASSIGN">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="124 125">|</RegexCharacter></RegexSequence><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence>"</RegexGroup>                                        </RegexOr><RegexGroup group_attributes="" group_index="172" group_name="RIGHT_OP">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="62 63">&gt;</RegexCharacter></RegexSequence><RegexCharacter character_set="62 63">&gt;</RegexCharacter></RegexSequence>"</RegexGroup>                                     </RegexOr><RegexGroup group_attributes="" group_index="173" group_name="LEFT_OP">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="60 61">&lt;</RegexCharacter></RegexSequence><RegexCharacter character_set="60 61">&lt;</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="174" group_name="INC_OP">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="43 44">+</RegexCharacter></RegexSequence><RegexCharacter character_set="43 44">+</RegexCharacter></RegexSequence>"</RegexGroup>                                     </RegexOr><RegexGroup group_attributes="" group_index="175" group_name="DEC_OP">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="45 46">-</RegexCharacter></RegexSequence><RegexCharacter character_set="45 46">-</RegexCharacter></RegexSequence>"</RegexGroup>                                     </RegexOr><RegexGroup group_attributes="" group_index="176" group_name="PTR_OP">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="45 46">-</RegexCharacter></RegexSequence><RegexCharacter character_set="62 63">&gt;</RegexCharacter></RegexSequence>"</RegexGroup>                                  </RegexOr><RegexGroup group_attributes="" group_index="177" group_name="AND_OP">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="38 39">&amp;</RegexCharacter></RegexSequence><RegexCharacter character_set="38 39">&amp;</RegexCharacter></RegexSequence>"</RegexGroup>                                     </RegexOr><RegexGroup group_attributes="" group_index="178" group_name="OR_OP">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="124 125">|</RegexCharacter></RegexSequence><RegexCharacter character_set="124 125">|</RegexCharacter></RegexSequence>"</RegexGroup>                                  </RegexOr><RegexGroup group_attributes="" group_index="179" group_name="LE_OP">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="60 61">&lt;</RegexCharacter></RegexSequence><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence>"</RegexGroup>                                   </RegexOr><RegexGroup group_attributes="" group_index="180" group_name="GE_OP">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="62 63">&gt;</RegexCharacter></RegexSequence><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence>"</RegexGroup>                                   </RegexOr><RegexGroup group_attributes="" group_index="181" group_name="EQ_OP">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="182" group_name="NE_OP">"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="33 34">!</RegexCharacter></RegexSequence><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="183" group_name="X_3B">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="59 60">;</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="184" group_name="X_7B"><RegexGroup group_attributes="" group_index="185" group_name="">(<RegexOr>"<RegexSequence><RegexEmpty /><RegexCharacter character_set="123 124">{</RegexCharacter></RegexSequence>"|"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="60 61">&lt;</RegexCharacter></RegexSequence><RegexCharacter character_set="37 38">%</RegexCharacter></RegexSequence>"</RegexOr>)</RegexGroup></RegexGroup>                                </RegexOr><RegexGroup group_attributes="" group_index="186" group_name="X_7D"><RegexGroup group_attributes="" group_index="187" group_name="">(<RegexOr>"<RegexSequence><RegexEmpty /><RegexCharacter character_set="125 126">}</RegexCharacter></RegexSequence>"|"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="37 38">%</RegexCharacter></RegexSequence><RegexCharacter character_set="62 63">&gt;</RegexCharacter></RegexSequence>"</RegexOr>)</RegexGroup></RegexGroup>                                </RegexOr><RegexGroup group_attributes="" group_index="188" group_name="X_2C">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="44 45">,</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="189" group_name="X_3A">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="58 59">:</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="190" group_name="X_3D">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="61 62">=</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="191" group_name="X_28">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="40 41">(</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="192" group_name="X_29">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="41 42">)</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="193" group_name="X_5B"><RegexGroup group_attributes="" group_index="194" group_name="">(<RegexOr>"<RegexSequence><RegexEmpty /><RegexCharacter character_set="91 92">[</RegexCharacter></RegexSequence>"|"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="60 61">&lt;</RegexCharacter></RegexSequence><RegexCharacter character_set="58 59">:</RegexCharacter></RegexSequence>"</RegexOr>)</RegexGroup></RegexGroup>                          </RegexOr><RegexGroup group_attributes="" group_index="195" group_name="X_5D"><RegexGroup group_attributes="" group_index="196" group_name="">(<RegexOr>"<RegexSequence><RegexEmpty /><RegexCharacter character_set="93 94">]</RegexCharacter></RegexSequence>"|"<RegexSequence><RegexSequence><RegexEmpty /><RegexCharacter character_set="58 59">:</RegexCharacter></RegexSequence><RegexCharacter character_set="62 63">&gt;</RegexCharacter></RegexSequence>"</RegexOr>)</RegexGroup></RegexGroup>                          </RegexOr><RegexGroup group_attributes="" group_index="197" group_name="X_2E">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="46 47">.</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="198" group_name="X_26">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="38 39">&amp;</RegexCharacter></RegexSequence>"</RegexGroup>                                  </RegexOr><RegexGroup group_attributes="" group_index="199" group_name="X_21">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="33 34">!</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="200" group_name="X_7E">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="126 127">~</RegexCharacter></RegexSequence>"</RegexGroup>                                    </RegexOr><RegexGroup group_attributes="" group_index="201" group_name="X_2D">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="45 46">-</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="202" group_name="X_2B">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="43 44">+</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="203" group_name="X_2A">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="42 43">*</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="204" group_name="X_2F">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="47 48">/</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="205" group_name="X_25">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="37 38">%</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="206" group_name="X_3C">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="60 61">&lt;</RegexCharacter></RegexSequence>"</RegexGroup>                                   </RegexOr><RegexGroup group_attributes="" group_index="207" group_name="X_3E">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="62 63">&gt;</RegexCharacter></RegexSequence>"</RegexGroup>                                   </RegexOr><RegexGroup group_attributes="" group_index="208" group_name="X_5E">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="94 95">^</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="209" group_name="X_7C">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="124 125">|</RegexCharacter></RegexSequence>"</RegexGroup>                                    </RegexOr><RegexGroup group_attributes="" group_index="210" group_name="X_3F">"<RegexSequence><RegexEmpty /><RegexCharacter character_set="63 64">?</RegexCharacter></RegexSequence>"</RegexGroup>                                      </RegexOr><RegexGroup group_attributes="" group_index="211" group_name=""><RegexRepeat count0="1" count1="-1" non_greedy="false"><RegexGroup group_attributes="" group_index="212" group_name="">([<RegexCharacterOr character_set="9 13 32 33"><RegexCharacterOr character_set="9 12 32 33"><RegexCharacterOr character_set="9 10 11 12 32 33"><RegexCharacterOr character_set="9 10 32 33"><RegexCharacterOr character_set="32 33"><RegexCharacter character_set="" /><RegexCharacter character_set="32 33"> </RegexCharacter></RegexCharacterOr><RegexCharacter character_set="9 10">\t</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="11 12">\v</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="10 11">\n</RegexCharacter></RegexCharacterOr><RegexCharacter character_set="12 13">\f</RegexCharacter></RegexCharacterOr>])</RegexGroup>+</RegexRepeat></RegexGroup>                                   </RegexOr><RegexGroup group_attributes="" group_index="213" group_name=""><RegexCharacter character_set="0 10 11 256">.</RegexCharacter></RegexGroup>                                   </RegexOr></RegexAnd>
+</root>
diff --git a/ansi_c_tokens.py b/ansi_c_tokens.py
new file mode 100644 (file)
index 0000000..8814643
--- /dev/null
@@ -0,0 +1,73 @@
+IDENTIFIER = 258
+I_CONSTANT = 259
+F_CONSTANT = 260
+STRING_LITERAL = 261
+FUNC_NAME = 262
+SIZEOF = 263
+PTR_OP = 264
+INC_OP = 265
+DEC_OP = 266
+LEFT_OP = 267
+RIGHT_OP = 268
+LE_OP = 269
+GE_OP = 270
+EQ_OP = 271
+NE_OP = 272
+AND_OP = 273
+OR_OP = 274
+MUL_ASSIGN = 275
+DIV_ASSIGN = 276
+MOD_ASSIGN = 277
+ADD_ASSIGN = 278
+SUB_ASSIGN = 279
+LEFT_ASSIGN = 280
+RIGHT_ASSIGN = 281
+AND_ASSIGN = 282
+XOR_ASSIGN = 283
+OR_ASSIGN = 284
+TYPEDEF_NAME = 285
+ENUMERATION_CONSTANT = 286
+TYPEDEF = 287
+EXTERN = 288
+STATIC = 289
+AUTO = 290
+REGISTER = 291
+INLINE = 292
+CONST = 293
+RESTRICT = 294
+VOLATILE = 295
+BOOL = 296
+CHAR = 297
+SHORT = 298
+INT = 299
+LONG = 300
+SIGNED = 301
+UNSIGNED = 302
+FLOAT = 303
+DOUBLE = 304
+VOID = 305
+COMPLEX = 306
+IMAGINARY = 307
+STRUCT = 308
+UNION = 309
+ENUM = 310
+ELLIPSIS = 311
+CASE = 312
+DEFAULT = 313
+IF = 314
+ELSE = 315
+SWITCH = 316
+WHILE = 317
+DO = 318
+FOR = 319
+GOTO = 320
+CONTINUE = 321
+BREAK = 322
+RETURN = 323
+ALIGNAS = 324
+ALIGNOF = 325
+ATOMIC = 326
+GENERIC = 327
+NORETURN = 328
+STATIC_ASSERT = 329
+THREAD_LOCAL = 330
diff --git a/ansi_c_yacc.xml b/ansi_c_yacc.xml
new file mode 100644 (file)
index 0000000..99de733
--- /dev/null
@@ -0,0 +1,28 @@
+<root>
+  <Grammar associativities="" eof_terminal="256" n_terminals="331" ref="0"><Grammar_Production lhs_nonterminal="0" precedence="-1"><Grammar_Production_NamedSymbol name="block_item_list_opt" nonterminal_set="243 245" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="1" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionIdentifier"><Grammar_Production_NamedSymbol name="IDENTIFIER" nonterminal_set="" terminal_set="258 259" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="2" precedence="-1"><Grammar_Production_NamedSymbol name="constant" nonterminal_set="6 9" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="3" precedence="-1"><Grammar_Production_NamedSymbol name="string" nonterminal_set="10 12" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="4" precedence="-1"><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="expression" nonterminal_set="91 93" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production><Grammar_Production lhs_nonterminal="5" precedence="-1"><Grammar_Production_NamedSymbol name="generic_selection" nonterminal_set="12 13" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="6" precedence="-1"><Grammar_Production_NamedSymbol name="I_CONSTANT" nonterminal_set="" terminal_set="259 260" /></Grammar_Production><Grammar_Production lhs_nonterminal="7" precedence="-1"><Grammar_Production_NamedSymbol name="F_CONSTANT" nonterminal_set="" terminal_set="260 261" /></Grammar_Production><Grammar_Production lhs_nonterminal="8" precedence="-1"><Grammar_Production_NamedSymbol name="ENUMERATION_CONSTANT" nonterminal_set="" terminal_set="286 287" /></Grammar_Production><Grammar_Production lhs_nonterminal="9" precedence="-1"><Grammar_Production_NamedSymbol name="IDENTIFIER" nonterminal_set="" terminal_set="258 259" /></Grammar_Production><Grammar_Production lhs_nonterminal="10" precedence="-1"><Grammar_Production_NamedSymbol name="STRING_LITERAL" nonterminal_set="" terminal_set="261 262" /></Grammar_Production><Grammar_Production lhs_nonterminal="11" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionFunctionName"><Grammar_Production_NamedSymbol name="FUNC_NAME" nonterminal_set="" terminal_set="262 263" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="12" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="GenericSelection"><Grammar_Production_NamedSymbol name="GENERIC" nonterminal_set="" terminal_set="327 328" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="44 45" /><Grammar_Production_Group attributes="" index="1" name="GenericAssociationList"><Grammar_Production_NamedSymbol name="generic_association_list" nonterminal_set="13 15" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="13" precedence="-1"><Grammar_Production_NamedSymbol name="generic_association" nonterminal_set="15 16" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="14" precedence="-1"><Grammar_Production_NamedSymbol name="generic_association_list" nonterminal_set="13 15" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="44 45" /><Grammar_Production_NamedSymbol name="generic_association" nonterminal_set="15 16" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="15" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="GenericAssociation"><Grammar_Production_NamedSymbol name="type_name_or_default" nonterminal_set="16 18" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="58 59" /><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="16" precedence="-1"><Grammar_Production_NamedSymbol name="type_name" nonterminal_set="197 198" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="17" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DefaultTypeName"><Grammar_Production_NamedSymbol name="DEFAULT" nonterminal_set="" terminal_set="313 314" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="18" precedence="-1"><Grammar_Production_NamedSymbol name="primary_expression" nonterminal_set="1 6" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="19" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionIndex"><Grammar_Production_NamedSymbol name="postfix_expression" nonterminal_set="18 26" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="91 92" /><Grammar_Production_NamedSymbol name="expression" nonterminal_set="91 93" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="93 94" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="20" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionCall"><Grammar_Production_NamedSymbol name="postfix_expression" nonterminal_set="18 26" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_Group attributes="" index="1" name="ArgumentExpressionList"><Grammar_Production_NamedSymbol name="argument_expression_list_opt" nonterminal_set="26 28" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="21" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionField"><Grammar_Production_NamedSymbol name="postfix_expression" nonterminal_set="18 26" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="46 47" /><Grammar_Production_NamedSymbol name="IDENTIFIER" nonterminal_set="" terminal_set="258 259" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="22" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionFieldDereference"><Grammar_Production_NamedSymbol name="postfix_expression" nonterminal_set="18 26" terminal_set="" /><Grammar_Production_NamedSymbol name="PTR_OP" nonterminal_set="" terminal_set="264 265" /><Grammar_Production_NamedSymbol name="IDENTIFIER" nonterminal_set="" terminal_set="258 259" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="23" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionPostIncrement"><Grammar_Production_NamedSymbol name="postfix_expression" nonterminal_set="18 26" terminal_set="" /><Grammar_Production_NamedSymbol name="INC_OP" nonterminal_set="" terminal_set="265 266" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="24" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionPostDecrement"><Grammar_Production_NamedSymbol name="postfix_expression" nonterminal_set="18 26" terminal_set="" /><Grammar_Production_NamedSymbol name="DEC_OP" nonterminal_set="" terminal_set="266 267" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="25" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionArray"><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="type_name" nonterminal_set="197 198" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="123 124" /><Grammar_Production_Group attributes="" index="1" name="DesignatorInitializerList"><Grammar_Production_NamedSymbol name="designator_initializer_list_comma_opt" nonterminal_set="214 217" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Symbol nonterminal_set="" terminal_set="125 126" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="26" precedence="-1" /><Grammar_Production lhs_nonterminal="27" precedence="-1"><Grammar_Production_NamedSymbol name="argument_expression_list" nonterminal_set="28 30" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="28" precedence="-1"><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="29" precedence="-1"><Grammar_Production_NamedSymbol name="argument_expression_list" nonterminal_set="28 30" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="44 45" /><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="30" precedence="-1"><Grammar_Production_NamedSymbol name="postfix_expression" nonterminal_set="18 26" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="31" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionPreIncrement"><Grammar_Production_NamedSymbol name="INC_OP" nonterminal_set="" terminal_set="265 266" /><Grammar_Production_NamedSymbol name="unary_expression" nonterminal_set="30 42" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="32" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionPreDecrement"><Grammar_Production_NamedSymbol name="DEC_OP" nonterminal_set="" terminal_set="266 267" /><Grammar_Production_NamedSymbol name="unary_expression" nonterminal_set="30 42" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="33" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionAddressOf"><Grammar_Production_Symbol nonterminal_set="" terminal_set="38 39" /><Grammar_Production_NamedSymbol name="cast_expression" nonterminal_set="42 44" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="34" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionDereference"><Grammar_Production_Symbol nonterminal_set="" terminal_set="42 43" /><Grammar_Production_NamedSymbol name="cast_expression" nonterminal_set="42 44" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="35" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionPlus"><Grammar_Production_Symbol nonterminal_set="" terminal_set="43 44" /><Grammar_Production_NamedSymbol name="cast_expression" nonterminal_set="42 44" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="36" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionMinus"><Grammar_Production_Symbol nonterminal_set="" terminal_set="45 46" /><Grammar_Production_NamedSymbol name="cast_expression" nonterminal_set="42 44" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="37" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionBitwiseNot"><Grammar_Production_Symbol nonterminal_set="" terminal_set="126 127" /><Grammar_Production_NamedSymbol name="cast_expression" nonterminal_set="42 44" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="38" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionLogicalNot"><Grammar_Production_Symbol nonterminal_set="" terminal_set="33 34" /><Grammar_Production_NamedSymbol name="cast_expression" nonterminal_set="42 44" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="39" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionSizeOfExpression"><Grammar_Production_NamedSymbol name="SIZEOF" nonterminal_set="" terminal_set="263 264" /><Grammar_Production_NamedSymbol name="unary_expression" nonterminal_set="30 42" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="40" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionSizeOfType"><Grammar_Production_NamedSymbol name="SIZEOF" nonterminal_set="" terminal_set="263 264" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="type_name" nonterminal_set="197 198" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="41" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionAlignOfType"><Grammar_Production_NamedSymbol name="ALIGNOF" nonterminal_set="" terminal_set="325 326" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="type_name" nonterminal_set="197 198" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="42" precedence="-1"><Grammar_Production_NamedSymbol name="unary_expression" nonterminal_set="30 42" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="43" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionCast"><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="type_name" nonterminal_set="197 198" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /><Grammar_Production_NamedSymbol name="cast_expression" nonterminal_set="42 44" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="44" precedence="-1"><Grammar_Production_NamedSymbol name="cast_expression" nonterminal_set="42 44" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="45" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionMultiply"><Grammar_Production_NamedSymbol name="multiplicative_expression" nonterminal_set="44 48" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="42 43" /><Grammar_Production_NamedSymbol name="cast_expression" nonterminal_set="42 44" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="46" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionDivide"><Grammar_Production_NamedSymbol name="multiplicative_expression" nonterminal_set="44 48" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="47 48" /><Grammar_Production_NamedSymbol name="cast_expression" nonterminal_set="42 44" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="47" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionModulo"><Grammar_Production_NamedSymbol name="multiplicative_expression" nonterminal_set="44 48" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="37 38" /><Grammar_Production_NamedSymbol name="cast_expression" nonterminal_set="42 44" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="48" precedence="-1"><Grammar_Production_NamedSymbol name="multiplicative_expression" nonterminal_set="44 48" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="49" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionAdd"><Grammar_Production_NamedSymbol name="additive_expression" nonterminal_set="48 51" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="43 44" /><Grammar_Production_NamedSymbol name="multiplicative_expression" nonterminal_set="44 48" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="50" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionSubtract"><Grammar_Production_NamedSymbol name="additive_expression" nonterminal_set="48 51" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="45 46" /><Grammar_Production_NamedSymbol name="multiplicative_expression" nonterminal_set="44 48" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="51" precedence="-1"><Grammar_Production_NamedSymbol name="additive_expression" nonterminal_set="48 51" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="52" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionShiftLeft"><Grammar_Production_NamedSymbol name="shift_expression" nonterminal_set="51 54" terminal_set="" /><Grammar_Production_NamedSymbol name="LEFT_OP" nonterminal_set="" terminal_set="267 268" /><Grammar_Production_NamedSymbol name="additive_expression" nonterminal_set="48 51" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="53" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionShiftRight"><Grammar_Production_NamedSymbol name="shift_expression" nonterminal_set="51 54" terminal_set="" /><Grammar_Production_NamedSymbol name="RIGHT_OP" nonterminal_set="" terminal_set="268 269" /><Grammar_Production_NamedSymbol name="additive_expression" nonterminal_set="48 51" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="54" precedence="-1"><Grammar_Production_NamedSymbol name="shift_expression" nonterminal_set="51 54" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="55" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionLessThan"><Grammar_Production_NamedSymbol name="relational_expression" nonterminal_set="54 59" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="60 61" /><Grammar_Production_NamedSymbol name="shift_expression" nonterminal_set="51 54" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="56" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionGreaterThan"><Grammar_Production_NamedSymbol name="relational_expression" nonterminal_set="54 59" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="62 63" /><Grammar_Production_NamedSymbol name="shift_expression" nonterminal_set="51 54" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="57" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionLessThanOrEqual"><Grammar_Production_NamedSymbol name="relational_expression" nonterminal_set="54 59" terminal_set="" /><Grammar_Production_NamedSymbol name="LE_OP" nonterminal_set="" terminal_set="269 270" /><Grammar_Production_NamedSymbol name="shift_expression" nonterminal_set="51 54" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="58" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionGreaterThanOrEqual"><Grammar_Production_NamedSymbol name="relational_expression" nonterminal_set="54 59" terminal_set="" /><Grammar_Production_NamedSymbol name="GE_OP" nonterminal_set="" terminal_set="270 271" /><Grammar_Production_NamedSymbol name="shift_expression" nonterminal_set="51 54" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="59" precedence="-1"><Grammar_Production_NamedSymbol name="relational_expression" nonterminal_set="54 59" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="60" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionEqual"><Grammar_Production_NamedSymbol name="equality_expression" nonterminal_set="59 62" terminal_set="" /><Grammar_Production_NamedSymbol name="EQ_OP" nonterminal_set="" terminal_set="271 272" /><Grammar_Production_NamedSymbol name="relational_expression" nonterminal_set="54 59" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="61" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionNotEqual"><Grammar_Production_NamedSymbol name="equality_expression" nonterminal_set="59 62" terminal_set="" /><Grammar_Production_NamedSymbol name="NE_OP" nonterminal_set="" terminal_set="272 273" /><Grammar_Production_NamedSymbol name="relational_expression" nonterminal_set="54 59" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="62" precedence="-1"><Grammar_Production_NamedSymbol name="equality_expression" nonterminal_set="59 62" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="63" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionBitwiseAnd"><Grammar_Production_NamedSymbol name="and_expression" nonterminal_set="62 64" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="38 39" /><Grammar_Production_NamedSymbol name="equality_expression" nonterminal_set="59 62" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="64" precedence="-1"><Grammar_Production_NamedSymbol name="and_expression" nonterminal_set="62 64" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="65" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionExclusiveOr"><Grammar_Production_NamedSymbol name="exclusive_or_expression" nonterminal_set="64 66" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="94 95" /><Grammar_Production_NamedSymbol name="and_expression" nonterminal_set="62 64" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="66" precedence="-1"><Grammar_Production_NamedSymbol name="exclusive_or_expression" nonterminal_set="64 66" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="67" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionBitwiseOr"><Grammar_Production_NamedSymbol name="inclusive_or_expression" nonterminal_set="66 68" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="124 125" /><Grammar_Production_NamedSymbol name="exclusive_or_expression" nonterminal_set="64 66" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="68" precedence="-1"><Grammar_Production_NamedSymbol name="inclusive_or_expression" nonterminal_set="66 68" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="69" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionLogicalAnd"><Grammar_Production_NamedSymbol name="logical_and_expression" nonterminal_set="68 70" terminal_set="" /><Grammar_Production_NamedSymbol name="AND_OP" nonterminal_set="" terminal_set="273 274" /><Grammar_Production_NamedSymbol name="inclusive_or_expression" nonterminal_set="66 68" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="70" precedence="-1"><Grammar_Production_NamedSymbol name="logical_and_expression" nonterminal_set="68 70" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="71" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionLogicalOr"><Grammar_Production_NamedSymbol name="logical_or_expression" nonterminal_set="70 72" terminal_set="" /><Grammar_Production_NamedSymbol name="OR_OP" nonterminal_set="" terminal_set="274 275" /><Grammar_Production_NamedSymbol name="logical_and_expression" nonterminal_set="68 70" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="72" precedence="-1"><Grammar_Production_NamedSymbol name="logical_or_expression" nonterminal_set="70 72" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="73" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionConditional"><Grammar_Production_NamedSymbol name="logical_or_expression" nonterminal_set="70 72" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="63 64" /><Grammar_Production_NamedSymbol name="expression" nonterminal_set="91 93" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="58 59" /><Grammar_Production_NamedSymbol name="conditional_expression" nonterminal_set="72 74" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="74" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionEmpty" /></Grammar_Production><Grammar_Production lhs_nonterminal="75" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionAsterisk"><Grammar_Production_Symbol nonterminal_set="" terminal_set="42 43" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="76" precedence="-1"><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="77" precedence="-1"><Grammar_Production_NamedSymbol name="conditional_expression" nonterminal_set="72 74" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="78" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionAssignment"><Grammar_Production_NamedSymbol name="unary_expression" nonterminal_set="30 42" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="61 62" /><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="79" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionMultiplyAssignment"><Grammar_Production_NamedSymbol name="unary_expression" nonterminal_set="30 42" terminal_set="" /><Grammar_Production_NamedSymbol name="MUL_ASSIGN" nonterminal_set="" terminal_set="275 276" /><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="80" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionDivideAssignment"><Grammar_Production_NamedSymbol name="unary_expression" nonterminal_set="30 42" terminal_set="" /><Grammar_Production_NamedSymbol name="DIV_ASSIGN" nonterminal_set="" terminal_set="276 277" /><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="81" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionModuloAssignment"><Grammar_Production_NamedSymbol name="unary_expression" nonterminal_set="30 42" terminal_set="" /><Grammar_Production_NamedSymbol name="MOD_ASSIGN" nonterminal_set="" terminal_set="277 278" /><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="82" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionAddAssignment"><Grammar_Production_NamedSymbol name="unary_expression" nonterminal_set="30 42" terminal_set="" /><Grammar_Production_NamedSymbol name="ADD_ASSIGN" nonterminal_set="" terminal_set="278 279" /><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="83" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionSubtractAssignment"><Grammar_Production_NamedSymbol name="unary_expression" nonterminal_set="30 42" terminal_set="" /><Grammar_Production_NamedSymbol name="SUB_ASSIGN" nonterminal_set="" terminal_set="279 280" /><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="84" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionLeftShiftAssignment"><Grammar_Production_NamedSymbol name="unary_expression" nonterminal_set="30 42" terminal_set="" /><Grammar_Production_NamedSymbol name="LEFT_ASSIGN" nonterminal_set="" terminal_set="280 281" /><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="85" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionRightShiftAssignment"><Grammar_Production_NamedSymbol name="unary_expression" nonterminal_set="30 42" terminal_set="" /><Grammar_Production_NamedSymbol name="RIGHT_ASSIGN" nonterminal_set="" terminal_set="281 282" /><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="86" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionBitwiseAndAssignment"><Grammar_Production_NamedSymbol name="unary_expression" nonterminal_set="30 42" terminal_set="" /><Grammar_Production_NamedSymbol name="AND_ASSIGN" nonterminal_set="" terminal_set="282 283" /><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="87" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionExclusiveOrAssignment"><Grammar_Production_NamedSymbol name="unary_expression" nonterminal_set="30 42" terminal_set="" /><Grammar_Production_NamedSymbol name="XOR_ASSIGN" nonterminal_set="" terminal_set="283 284" /><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="88" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionBitwiseOrAssignment"><Grammar_Production_NamedSymbol name="unary_expression" nonterminal_set="30 42" terminal_set="" /><Grammar_Production_NamedSymbol name="OR_ASSIGN" nonterminal_set="" terminal_set="284 285" /><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="89" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionEmpty" /></Grammar_Production><Grammar_Production lhs_nonterminal="90" precedence="-1"><Grammar_Production_NamedSymbol name="expression" nonterminal_set="91 93" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="91" precedence="-1"><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="92" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionComma"><Grammar_Production_NamedSymbol name="expression" nonterminal_set="91 93" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="44 45" /><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="93" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ExpressionEmpty" /></Grammar_Production><Grammar_Production lhs_nonterminal="94" precedence="-1"><Grammar_Production_Symbol nonterminal_set="" terminal_set="61 62" /><Grammar_Production_NamedSymbol name="constant_expression" nonterminal_set="95 96" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="95" precedence="-1"><Grammar_Production_NamedSymbol name="conditional_expression" nonterminal_set="72 74" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="96" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="Declaration"><Grammar_Production_Group attributes="" index="1" name="DeclarationSpecifierList"><Grammar_Production_NamedSymbol name="declaration_specifier_list" nonterminal_set="98 100" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Group attributes="" index="2" name="InitDeclaratorList"><Grammar_Production_NamedSymbol name="init_declarator_list_opt" nonterminal_set="105 107" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Symbol nonterminal_set="" terminal_set="59 60" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="97" precedence="-1"><Grammar_Production_NamedSymbol name="static_assert_declaration" nonterminal_set="226 227" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="98" precedence="-1"><Grammar_Production_NamedSymbol name="declaration_specifier" nonterminal_set="100 105" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="99" precedence="-1"><Grammar_Production_NamedSymbol name="declaration_specifier_list" nonterminal_set="98 100" terminal_set="" /><Grammar_Production_NamedSymbol name="declaration_specifier" nonterminal_set="100 105" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="100" precedence="-1"><Grammar_Production_NamedSymbol name="storage_class_specifier" nonterminal_set="110 116" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="101" precedence="-1"><Grammar_Production_NamedSymbol name="type_specifier" nonterminal_set="116 133" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="102" precedence="-1"><Grammar_Production_NamedSymbol name="type_qualifier" nonterminal_set="168 172" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="103" precedence="-1"><Grammar_Production_NamedSymbol name="function_specifier" nonterminal_set="172 174" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="104" precedence="-1"><Grammar_Production_NamedSymbol name="alignment_specifier" nonterminal_set="174 176" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="105" precedence="-1" /><Grammar_Production lhs_nonterminal="106" precedence="-1"><Grammar_Production_NamedSymbol name="init_declarator_list" nonterminal_set="107 109" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="107" precedence="-1"><Grammar_Production_NamedSymbol name="init_declarator" nonterminal_set="109 110" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="108" precedence="-1"><Grammar_Production_NamedSymbol name="init_declarator_list" nonterminal_set="107 109" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="44 45" /><Grammar_Production_NamedSymbol name="init_declarator" nonterminal_set="109 110" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="109" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="InitDeclarator"><Grammar_Production_NamedSymbol name="declarator" nonterminal_set="178 180" terminal_set="" /><Grammar_Production_NamedSymbol name="equals_initializer_opt" nonterminal_set="210 212" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="110" precedence="-1"><Grammar_Production_Group attributes="1" index="0" name="StorageClassSpecifier"><Grammar_Production_NamedSymbol name="TYPEDEF" nonterminal_set="" terminal_set="287 288" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="111" precedence="-1"><Grammar_Production_Group attributes="2" index="0" name="StorageClassSpecifier"><Grammar_Production_NamedSymbol name="EXTERN" nonterminal_set="" terminal_set="288 289" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="112" precedence="-1"><Grammar_Production_Group attributes="3" index="0" name="StorageClassSpecifier"><Grammar_Production_NamedSymbol name="STATIC" nonterminal_set="" terminal_set="289 290" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="113" precedence="-1"><Grammar_Production_Group attributes="4" index="0" name="StorageClassSpecifier"><Grammar_Production_NamedSymbol name="THREAD_LOCAL" nonterminal_set="" terminal_set="330 331" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="114" precedence="-1"><Grammar_Production_Group attributes="5" index="0" name="StorageClassSpecifier"><Grammar_Production_NamedSymbol name="AUTO" nonterminal_set="" terminal_set="290 291" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="115" precedence="-1"><Grammar_Production_Group attributes="6" index="0" name="StorageClassSpecifier"><Grammar_Production_NamedSymbol name="REGISTER" nonterminal_set="" terminal_set="291 292" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="116" precedence="-1"><Grammar_Production_Group attributes="7" index="0" name="TypeSpecifier"><Grammar_Production_NamedSymbol name="VOID" nonterminal_set="" terminal_set="305 306" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="117" precedence="-1"><Grammar_Production_Group attributes="8" index="0" name="TypeSpecifier"><Grammar_Production_NamedSymbol name="CHAR" nonterminal_set="" terminal_set="297 298" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="118" precedence="-1"><Grammar_Production_Group attributes="9" index="0" name="TypeSpecifier"><Grammar_Production_NamedSymbol name="SHORT" nonterminal_set="" terminal_set="298 299" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="119" precedence="-1"><Grammar_Production_Group attributes="10" index="0" name="TypeSpecifier"><Grammar_Production_NamedSymbol name="INT" nonterminal_set="" terminal_set="299 300" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="120" precedence="-1"><Grammar_Production_Group attributes="11" index="0" name="TypeSpecifier"><Grammar_Production_NamedSymbol name="LONG" nonterminal_set="" terminal_set="300 301" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="121" precedence="-1"><Grammar_Production_Group attributes="12" index="0" name="TypeSpecifier"><Grammar_Production_NamedSymbol name="FLOAT" nonterminal_set="" terminal_set="303 304" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="122" precedence="-1"><Grammar_Production_Group attributes="13" index="0" name="TypeSpecifier"><Grammar_Production_NamedSymbol name="DOUBLE" nonterminal_set="" terminal_set="304 305" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="123" precedence="-1"><Grammar_Production_Group attributes="14" index="0" name="TypeSpecifier"><Grammar_Production_NamedSymbol name="SIGNED" nonterminal_set="" terminal_set="301 302" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="124" precedence="-1"><Grammar_Production_Group attributes="15" index="0" name="TypeSpecifier"><Grammar_Production_NamedSymbol name="UNSIGNED" nonterminal_set="" terminal_set="302 303" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="125" precedence="-1"><Grammar_Production_Group attributes="16" index="0" name="TypeSpecifier"><Grammar_Production_NamedSymbol name="BOOL" nonterminal_set="" terminal_set="296 297" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="126" precedence="-1"><Grammar_Production_Group attributes="17" index="0" name="TypeSpecifier"><Grammar_Production_NamedSymbol name="COMPLEX" nonterminal_set="" terminal_set="306 307" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="127" precedence="-1"><Grammar_Production_Group attributes="18" index="0" name="TypeSpecifier"><Grammar_Production_NamedSymbol name="IMAGINARY" nonterminal_set="" terminal_set="307 308" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="128" precedence="-1"><Grammar_Production_NamedSymbol name="atomic_type_specifier" nonterminal_set="161 162" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="129" precedence="-1"><Grammar_Production_NamedSymbol name="struct_specifier" nonterminal_set="133 135" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="130" precedence="-1"><Grammar_Production_NamedSymbol name="union_specifier" nonterminal_set="135 137" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="131" precedence="-1"><Grammar_Production_NamedSymbol name="enum_specifier" nonterminal_set="153 155" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="132" precedence="-1"><Grammar_Production_NamedSymbol name="TYPEDEF_NAME" nonterminal_set="" terminal_set="285 286" /></Grammar_Production><Grammar_Production lhs_nonterminal="133" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StructSpecifier"><Grammar_Production_NamedSymbol name="STRUCT" nonterminal_set="" terminal_set="308 309" /><Grammar_Production_NamedSymbol name="identifier_opt" nonterminal_set="260 262" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="123 124" /><Grammar_Production_Group attributes="" index="1" name="StructDeclarationList"><Grammar_Production_NamedSymbol name="struct_declaration_list_opt" nonterminal_set="137 139" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Symbol nonterminal_set="" terminal_set="125 126" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="134" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StructSpecifier"><Grammar_Production_NamedSymbol name="STRUCT" nonterminal_set="" terminal_set="308 309" /><Grammar_Production_NamedSymbol name="IDENTIFIER" nonterminal_set="" terminal_set="258 259" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="135" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="UnionSpecifier"><Grammar_Production_NamedSymbol name="UNION" nonterminal_set="" terminal_set="309 310" /><Grammar_Production_NamedSymbol name="identifier_opt" nonterminal_set="260 262" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="123 124" /><Grammar_Production_Group attributes="" index="1" name="StructDeclarationList"><Grammar_Production_NamedSymbol name="struct_declaration_list_opt" nonterminal_set="137 139" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Symbol nonterminal_set="" terminal_set="125 126" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="136" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="UnionSpecifier"><Grammar_Production_NamedSymbol name="UNION" nonterminal_set="" terminal_set="309 310" /><Grammar_Production_NamedSymbol name="IDENTIFIER" nonterminal_set="" terminal_set="258 259" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="137" precedence="-1" /><Grammar_Production lhs_nonterminal="138" precedence="-1"><Grammar_Production_NamedSymbol name="struct_declaration_list" nonterminal_set="139 141" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="139" precedence="-1"><Grammar_Production_NamedSymbol name="struct_declaration" nonterminal_set="141 143" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="140" precedence="-1"><Grammar_Production_NamedSymbol name="struct_declaration_list" nonterminal_set="139 141" terminal_set="" /><Grammar_Production_NamedSymbol name="struct_declaration" nonterminal_set="141 143" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="141" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StructDeclaration"><Grammar_Production_Group attributes="" index="1" name="SpecifierQualifierList"><Grammar_Production_NamedSymbol name="specifier_qualifier_list" nonterminal_set="143 145" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Group attributes="" index="2" name="StructDeclaratorList"><Grammar_Production_NamedSymbol name="struct_declarator_list_opt" nonterminal_set="147 149" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Symbol nonterminal_set="" terminal_set="59 60" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="142" precedence="-1"><Grammar_Production_NamedSymbol name="static_assert_declaration" nonterminal_set="226 227" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="143" precedence="-1"><Grammar_Production_NamedSymbol name="specifier_qualifier" nonterminal_set="145 147" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="144" precedence="-1"><Grammar_Production_NamedSymbol name="specifier_qualifier_list" nonterminal_set="143 145" terminal_set="" /><Grammar_Production_NamedSymbol name="specifier_qualifier" nonterminal_set="145 147" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="145" precedence="-1"><Grammar_Production_NamedSymbol name="type_specifier" nonterminal_set="116 133" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="146" precedence="-1"><Grammar_Production_NamedSymbol name="type_qualifier" nonterminal_set="168 172" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="147" precedence="-1" /><Grammar_Production lhs_nonterminal="148" precedence="-1"><Grammar_Production_NamedSymbol name="struct_declarator_list" nonterminal_set="149 151" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="149" precedence="-1"><Grammar_Production_NamedSymbol name="struct_declarator" nonterminal_set="151 153" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="150" precedence="-1"><Grammar_Production_NamedSymbol name="struct_declarator_list" nonterminal_set="149 151" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="44 45" /><Grammar_Production_NamedSymbol name="struct_declarator" nonterminal_set="151 153" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="151" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StructDeclarator"><Grammar_Production_NamedSymbol name="declarator_opt" nonterminal_set="176 178" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="58 59" /><Grammar_Production_NamedSymbol name="constant_expression" nonterminal_set="95 96" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="152" precedence="-1"><Grammar_Production_NamedSymbol name="declarator" nonterminal_set="178 180" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="153" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="EnumSpecifier"><Grammar_Production_NamedSymbol name="ENUM" nonterminal_set="" terminal_set="310 311" /><Grammar_Production_NamedSymbol name="identifier_opt" nonterminal_set="260 262" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="123 124" /><Grammar_Production_Group attributes="" index="1" name="EnumeratorList"><Grammar_Production_NamedSymbol name="enumerator_list_comma_opt" nonterminal_set="155 158" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Symbol nonterminal_set="" terminal_set="125 126" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="154" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="EnumSpecifier"><Grammar_Production_NamedSymbol name="ENUM" nonterminal_set="" terminal_set="310 311" /><Grammar_Production_NamedSymbol name="IDENTIFIER" nonterminal_set="" terminal_set="258 259" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="155" precedence="-1" /><Grammar_Production lhs_nonterminal="156" precedence="-1"><Grammar_Production_NamedSymbol name="enumerator_list" nonterminal_set="158 160" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="157" precedence="-1"><Grammar_Production_NamedSymbol name="enumerator_list" nonterminal_set="158 160" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="44 45" /></Grammar_Production><Grammar_Production lhs_nonterminal="158" precedence="-1"><Grammar_Production_NamedSymbol name="enumerator" nonterminal_set="160 161" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="159" precedence="-1"><Grammar_Production_NamedSymbol name="enumerator_list" nonterminal_set="158 160" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="44 45" /><Grammar_Production_NamedSymbol name="enumerator" nonterminal_set="160 161" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="160" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="Enumerator"><Grammar_Production_NamedSymbol name="enumeration_constant" nonterminal_set="9 10" terminal_set="" /><Grammar_Production_NamedSymbol name="equals_constant_expression_opt" nonterminal_set="93 95" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="161" precedence="-1"><Grammar_Production_NamedSymbol name="ATOMIC" nonterminal_set="" terminal_set="326 327" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="type_name" nonterminal_set="197 198" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production><Grammar_Production lhs_nonterminal="162" precedence="-1" /><Grammar_Production lhs_nonterminal="163" precedence="-1"><Grammar_Production_NamedSymbol name="type_qualifier_or_static_list" nonterminal_set="164 166" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="164" precedence="-1"><Grammar_Production_NamedSymbol name="type_qualifier_or_static" nonterminal_set="166 168" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="165" precedence="-1"><Grammar_Production_NamedSymbol name="type_qualifier_or_static_list" nonterminal_set="164 166" terminal_set="" /><Grammar_Production_NamedSymbol name="type_qualifier_or_static" nonterminal_set="166 168" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="166" precedence="-1"><Grammar_Production_NamedSymbol name="type_qualifier" nonterminal_set="168 172" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="167" precedence="-1"><Grammar_Production_Group attributes="19" index="0" name="StorageClassSpecifier"><Grammar_Production_NamedSymbol name="STATIC" nonterminal_set="" terminal_set="289 290" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="168" precedence="-1"><Grammar_Production_Group attributes="20" index="0" name="TypeQualifier"><Grammar_Production_NamedSymbol name="CONST" nonterminal_set="" terminal_set="293 294" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="169" precedence="-1"><Grammar_Production_Group attributes="21" index="0" name="TypeQualifier"><Grammar_Production_NamedSymbol name="RESTRICT" nonterminal_set="" terminal_set="294 295" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="170" precedence="-1"><Grammar_Production_Group attributes="22" index="0" name="TypeQualifier"><Grammar_Production_NamedSymbol name="VOLATILE" nonterminal_set="" terminal_set="295 296" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="171" precedence="-1"><Grammar_Production_Group attributes="23" index="0" name="TypeQualifier"><Grammar_Production_NamedSymbol name="ATOMIC" nonterminal_set="" terminal_set="326 327" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="172" precedence="-1"><Grammar_Production_Group attributes="24" index="0" name="FunctionSpecifier"><Grammar_Production_NamedSymbol name="INLINE" nonterminal_set="" terminal_set="292 293" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="173" precedence="-1"><Grammar_Production_Group attributes="25" index="0" name="FunctionSpecifier"><Grammar_Production_NamedSymbol name="NORETURN" nonterminal_set="" terminal_set="328 329" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="174" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="AlignAsType"><Grammar_Production_NamedSymbol name="ALIGNAS" nonterminal_set="" terminal_set="324 325" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="type_name" nonterminal_set="197 198" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="175" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="AlignAsExpression"><Grammar_Production_NamedSymbol name="ALIGNAS" nonterminal_set="" terminal_set="324 325" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="constant_expression" nonterminal_set="95 96" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="176" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DeclaratorEmpty" /></Grammar_Production><Grammar_Production lhs_nonterminal="177" precedence="-1"><Grammar_Production_NamedSymbol name="declarator" nonterminal_set="178 180" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="178" precedence="-1"><Grammar_Production_NamedSymbol name="direct_declarator" nonterminal_set="180 185" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="179" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DeclaratorPointer"><Grammar_Production_Symbol nonterminal_set="" terminal_set="42 43" /><Grammar_Production_Group attributes="" index="1" name="TypeQualifierList"><Grammar_Production_NamedSymbol name="type_qualifier_list_opt" nonterminal_set="185 187" terminal_set="" /></Grammar_Production_Group><Grammar_Production_NamedSymbol name="declarator" nonterminal_set="178 180" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="180" precedence="-1"><Grammar_Production_NamedSymbol name="IDENTIFIER" nonterminal_set="" terminal_set="258 259" /></Grammar_Production><Grammar_Production lhs_nonterminal="181" precedence="-1"><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="declarator" nonterminal_set="178 180" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production><Grammar_Production lhs_nonterminal="182" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DeclaratorArray"><Grammar_Production_NamedSymbol name="direct_declarator" nonterminal_set="180 185" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="91 92" /><Grammar_Production_Group attributes="" index="1" name="TypeQualifierOrStaticList"><Grammar_Production_NamedSymbol name="type_qualifier_or_static_list_opt" nonterminal_set="162 164" terminal_set="" /></Grammar_Production_Group><Grammar_Production_NamedSymbol name="assignment_expression_or_asterisk_opt" nonterminal_set="74 77" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="93 94" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="183" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DeclaratorFunctionOldStyle"><Grammar_Production_NamedSymbol name="direct_declarator" nonterminal_set="180 185" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_Group attributes="" index="1" name="IdentifierList"><Grammar_Production_NamedSymbol name="identifier_list_opt" nonterminal_set="193 195" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="184" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DeclaratorFunction"><Grammar_Production_NamedSymbol name="direct_declarator" nonterminal_set="180 185" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_Group attributes="" index="1" name="ParameterDeclarationList"><Grammar_Production_NamedSymbol name="parameter_declaration_list" nonterminal_set="189 191" terminal_set="" /></Grammar_Production_Group><Grammar_Production_NamedSymbol name="comma_ellipsis_opt" nonterminal_set="262 264" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="185" precedence="-1" /><Grammar_Production lhs_nonterminal="186" precedence="-1"><Grammar_Production_NamedSymbol name="type_qualifier_list" nonterminal_set="187 189" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="187" precedence="-1"><Grammar_Production_NamedSymbol name="type_qualifier" nonterminal_set="168 172" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="188" precedence="-1"><Grammar_Production_NamedSymbol name="type_qualifier_list" nonterminal_set="187 189" terminal_set="" /><Grammar_Production_NamedSymbol name="type_qualifier" nonterminal_set="168 172" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="189" precedence="-1"><Grammar_Production_NamedSymbol name="parameter_declaration" nonterminal_set="191 193" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="190" precedence="-1"><Grammar_Production_NamedSymbol name="parameter_declaration_list" nonterminal_set="189 191" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="44 45" /><Grammar_Production_NamedSymbol name="parameter_declaration" nonterminal_set="191 193" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="191" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ParameterDeclaration"><Grammar_Production_Group attributes="" index="1" name="DeclarationSpecifierList"><Grammar_Production_NamedSymbol name="declaration_specifier_list" nonterminal_set="98 100" terminal_set="" /></Grammar_Production_Group><Grammar_Production_NamedSymbol name="declarator" nonterminal_set="178 180" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="192" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="ParameterDeclaration"><Grammar_Production_Group attributes="" index="1" name="DeclarationSpecifierList"><Grammar_Production_NamedSymbol name="declaration_specifier_list" nonterminal_set="98 100" terminal_set="" /></Grammar_Production_Group><Grammar_Production_NamedSymbol name="abstract_declarator" nonterminal_set="198 200" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="193" precedence="-1" /><Grammar_Production lhs_nonterminal="194" precedence="-1"><Grammar_Production_NamedSymbol name="identifier_list" nonterminal_set="195 197" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="195" precedence="-1"><Grammar_Production_NamedSymbol name="IDENTIFIER" nonterminal_set="" terminal_set="258 259" /></Grammar_Production><Grammar_Production lhs_nonterminal="196" precedence="-1"><Grammar_Production_NamedSymbol name="identifier_list" nonterminal_set="195 197" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="44 45" /><Grammar_Production_NamedSymbol name="IDENTIFIER" nonterminal_set="" terminal_set="258 259" /></Grammar_Production><Grammar_Production lhs_nonterminal="197" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="TypeName"><Grammar_Production_Group attributes="" index="1" name="SpecifierQualifierList"><Grammar_Production_NamedSymbol name="specifier_qualifier_list" nonterminal_set="143 145" terminal_set="" /></Grammar_Production_Group><Grammar_Production_NamedSymbol name="abstract_declarator" nonterminal_set="198 200" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="198" precedence="-1"><Grammar_Production_NamedSymbol name="direct_abstract_declarator_opt" nonterminal_set="200 202" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="199" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DeclaratorPointer"><Grammar_Production_Symbol nonterminal_set="" terminal_set="42 43" /><Grammar_Production_Group attributes="" index="1" name="TypeQualifierList"><Grammar_Production_NamedSymbol name="type_qualifier_list_opt" nonterminal_set="185 187" terminal_set="" /></Grammar_Production_Group><Grammar_Production_NamedSymbol name="abstract_declarator" nonterminal_set="198 200" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="200" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DeclaratorAbstract" /></Grammar_Production><Grammar_Production lhs_nonterminal="201" precedence="-1"><Grammar_Production_NamedSymbol name="direct_abstract_declarator" nonterminal_set="202 210" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="202" precedence="-1"><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="direct_abstract_declarator" nonterminal_set="202 210" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production><Grammar_Production lhs_nonterminal="203" precedence="-1"><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_Group attributes="" index="0" name="DeclaratorPointer"><Grammar_Production_Symbol nonterminal_set="" terminal_set="42 43" /><Grammar_Production_Group attributes="" index="1" name="TypeQualifierList"><Grammar_Production_NamedSymbol name="type_qualifier_list_opt" nonterminal_set="185 187" terminal_set="" /></Grammar_Production_Group><Grammar_Production_NamedSymbol name="abstract_declarator" nonterminal_set="198 200" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production><Grammar_Production lhs_nonterminal="204" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DeclaratorArray"><Grammar_Production_Group attributes="" index="1" name="DeclaratorAbstract" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="91 92" /><Grammar_Production_Group attributes="" index="2" name="TypeQualifierOrStaticList"><Grammar_Production_NamedSymbol name="type_qualifier_or_static_list_opt" nonterminal_set="162 164" terminal_set="" /></Grammar_Production_Group><Grammar_Production_NamedSymbol name="assignment_expression_or_asterisk_opt" nonterminal_set="74 77" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="93 94" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="205" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DeclaratorFunction"><Grammar_Production_Group attributes="" index="1" name="DeclaratorAbstract" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_Group attributes="" index="2" name="ParameterDeclarationList" /><Grammar_Production_Group attributes="" index="3" name="CommaEllipsisEmpty" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="206" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DeclaratorFunction"><Grammar_Production_Group attributes="" index="1" name="DeclaratorAbstract" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_Group attributes="" index="2" name="ParameterDeclarationList"><Grammar_Production_NamedSymbol name="parameter_declaration_list" nonterminal_set="189 191" terminal_set="" /></Grammar_Production_Group><Grammar_Production_NamedSymbol name="comma_ellipsis_opt" nonterminal_set="262 264" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="207" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DeclaratorArray"><Grammar_Production_NamedSymbol name="direct_abstract_declarator" nonterminal_set="202 210" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="91 92" /><Grammar_Production_Group attributes="" index="1" name="TypeQualifierOrStaticList"><Grammar_Production_NamedSymbol name="type_qualifier_or_static_list_opt" nonterminal_set="162 164" terminal_set="" /></Grammar_Production_Group><Grammar_Production_NamedSymbol name="assignment_expression_or_asterisk_opt" nonterminal_set="74 77" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="93 94" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="208" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DeclaratorFunction"><Grammar_Production_NamedSymbol name="direct_abstract_declarator" nonterminal_set="202 210" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_Group attributes="" index="1" name="ParameterDeclarationList" /><Grammar_Production_Group attributes="" index="2" name="CommaEllipsisEmpty" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="209" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DeclaratorFunction"><Grammar_Production_NamedSymbol name="direct_abstract_declarator" nonterminal_set="202 210" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_Group attributes="" index="1" name="ParameterDeclarationList"><Grammar_Production_NamedSymbol name="parameter_declaration_list" nonterminal_set="189 191" terminal_set="" /></Grammar_Production_Group><Grammar_Production_NamedSymbol name="comma_ellipsis_opt" nonterminal_set="262 264" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="210" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="EqualsInitializerEmpty" /></Grammar_Production><Grammar_Production lhs_nonterminal="211" precedence="-1"><Grammar_Production_Symbol nonterminal_set="" terminal_set="61 62" /><Grammar_Production_NamedSymbol name="initializer" nonterminal_set="212 214" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="212" precedence="-1"><Grammar_Production_Symbol nonterminal_set="" terminal_set="123 124" /><Grammar_Production_Group attributes="" index="0" name="DesignatorInitializerList"><Grammar_Production_NamedSymbol name="designator_initializer_list_comma_opt" nonterminal_set="214 217" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Symbol nonterminal_set="" terminal_set="125 126" /></Grammar_Production><Grammar_Production lhs_nonterminal="213" precedence="-1"><Grammar_Production_NamedSymbol name="assignment_expression" nonterminal_set="77 89" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="214" precedence="-1" /><Grammar_Production lhs_nonterminal="215" precedence="-1"><Grammar_Production_NamedSymbol name="designator_initializer_list" nonterminal_set="217 219" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="216" precedence="-1"><Grammar_Production_NamedSymbol name="designator_initializer_list" nonterminal_set="217 219" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="44 45" /></Grammar_Production><Grammar_Production lhs_nonterminal="217" precedence="-1"><Grammar_Production_NamedSymbol name="designator_initializer" nonterminal_set="219 220" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="218" precedence="-1"><Grammar_Production_NamedSymbol name="designator_initializer_list" nonterminal_set="217 219" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="44 45" /><Grammar_Production_NamedSymbol name="designator_initializer" nonterminal_set="219 220" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="219" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DesignatorInitializer"><Grammar_Production_Group attributes="" index="1" name="DesignatorList"><Grammar_Production_NamedSymbol name="designator_list_equals_opt" nonterminal_set="220 222" terminal_set="" /></Grammar_Production_Group><Grammar_Production_NamedSymbol name="initializer" nonterminal_set="212 214" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="220" precedence="-1" /><Grammar_Production lhs_nonterminal="221" precedence="-1"><Grammar_Production_NamedSymbol name="designator_list" nonterminal_set="222 224" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="61 62" /></Grammar_Production><Grammar_Production lhs_nonterminal="222" precedence="-1"><Grammar_Production_NamedSymbol name="designator" nonterminal_set="224 226" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="223" precedence="-1"><Grammar_Production_NamedSymbol name="designator_list" nonterminal_set="222 224" terminal_set="" /><Grammar_Production_NamedSymbol name="designator" nonterminal_set="224 226" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="224" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DesignatorIndex"><Grammar_Production_Symbol nonterminal_set="" terminal_set="91 92" /><Grammar_Production_NamedSymbol name="constant_expression" nonterminal_set="95 96" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="93 94" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="225" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="DesignatorField"><Grammar_Production_Symbol nonterminal_set="" terminal_set="46 47" /><Grammar_Production_NamedSymbol name="IDENTIFIER" nonterminal_set="" terminal_set="258 259" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="226" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StaticAssertDeclaration"><Grammar_Production_NamedSymbol name="STATIC_ASSERT" nonterminal_set="" terminal_set="329 330" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="constant_expression" nonterminal_set="95 96" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="44 45" /><Grammar_Production_NamedSymbol name="STRING_LITERAL" nonterminal_set="" terminal_set="261 262" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="59 60" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="227" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StatementLabel"><Grammar_Production_NamedSymbol name="IDENTIFIER" nonterminal_set="" terminal_set="258 259" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="58 59" /><Grammar_Production_NamedSymbol name="statement" nonterminal_set="227 243" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="228" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StatementCase"><Grammar_Production_NamedSymbol name="CASE" nonterminal_set="" terminal_set="312 313" /><Grammar_Production_NamedSymbol name="constant_expression" nonterminal_set="95 96" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="58 59" /><Grammar_Production_NamedSymbol name="statement" nonterminal_set="227 243" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="229" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StatementDefault"><Grammar_Production_NamedSymbol name="DEFAULT" nonterminal_set="" terminal_set="313 314" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="58 59" /><Grammar_Production_NamedSymbol name="statement" nonterminal_set="227 243" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="230" precedence="-1"><Grammar_Production_Symbol nonterminal_set="" terminal_set="123 124" /><Grammar_Production_Group attributes="" index="0" name="BlockItemList"><Grammar_Production_NamedSymbol name="block_item_list_opt" nonterminal_set="243 245" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Symbol nonterminal_set="" terminal_set="125 126" /></Grammar_Production><Grammar_Production lhs_nonterminal="231" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StatementExpression"><Grammar_Production_NamedSymbol name="expression_opt" nonterminal_set="89 91" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="59 60" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="232" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StatementIfElse"><Grammar_Production_NamedSymbol name="IF" nonterminal_set="" terminal_set="314 315" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="expression" nonterminal_set="91 93" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /><Grammar_Production_NamedSymbol name="statement" nonterminal_set="227 243" terminal_set="" /><Grammar_Production_NamedSymbol name="ELSE" nonterminal_set="" terminal_set="315 316" /><Grammar_Production_NamedSymbol name="statement" nonterminal_set="227 243" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="233" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StatementIf"><Grammar_Production_NamedSymbol name="IF" nonterminal_set="" terminal_set="314 315" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="expression" nonterminal_set="91 93" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /><Grammar_Production_NamedSymbol name="statement" nonterminal_set="227 243" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="234" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StatementSwitch"><Grammar_Production_NamedSymbol name="SWITCH" nonterminal_set="" terminal_set="316 317" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="expression" nonterminal_set="91 93" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /><Grammar_Production_NamedSymbol name="statement" nonterminal_set="227 243" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="235" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StatementWhile"><Grammar_Production_NamedSymbol name="WHILE" nonterminal_set="" terminal_set="317 318" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="expression" nonterminal_set="91 93" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /><Grammar_Production_NamedSymbol name="statement" nonterminal_set="227 243" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="236" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StatementDoWhile"><Grammar_Production_NamedSymbol name="DO" nonterminal_set="" terminal_set="318 319" /><Grammar_Production_NamedSymbol name="statement" nonterminal_set="227 243" terminal_set="" /><Grammar_Production_NamedSymbol name="WHILE" nonterminal_set="" terminal_set="317 318" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="expression" nonterminal_set="91 93" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="59 60" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="237" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StatementFor"><Grammar_Production_NamedSymbol name="FOR" nonterminal_set="" terminal_set="319 320" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="expression_opt" nonterminal_set="89 91" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="59 60" /><Grammar_Production_NamedSymbol name="expression_opt" nonterminal_set="89 91" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="59 60" /><Grammar_Production_NamedSymbol name="expression_opt" nonterminal_set="89 91" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /><Grammar_Production_NamedSymbol name="statement" nonterminal_set="227 243" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="238" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StatementFor"><Grammar_Production_NamedSymbol name="FOR" nonterminal_set="" terminal_set="319 320" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="40 41" /><Grammar_Production_NamedSymbol name="declaration" nonterminal_set="96 98" terminal_set="" /><Grammar_Production_NamedSymbol name="expression_opt" nonterminal_set="89 91" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="59 60" /><Grammar_Production_NamedSymbol name="expression_opt" nonterminal_set="89 91" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="41 42" /><Grammar_Production_NamedSymbol name="statement" nonterminal_set="227 243" terminal_set="" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="239" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StatementGoto"><Grammar_Production_NamedSymbol name="GOTO" nonterminal_set="" terminal_set="320 321" /><Grammar_Production_NamedSymbol name="IDENTIFIER" nonterminal_set="" terminal_set="258 259" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="59 60" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="240" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StatementContinue"><Grammar_Production_NamedSymbol name="CONTINUE" nonterminal_set="" terminal_set="321 322" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="59 60" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="241" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StatementBreak"><Grammar_Production_NamedSymbol name="BREAK" nonterminal_set="" terminal_set="322 323" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="59 60" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="242" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="StatementReturn"><Grammar_Production_NamedSymbol name="RETURN" nonterminal_set="" terminal_set="323 324" /><Grammar_Production_NamedSymbol name="expression_opt" nonterminal_set="89 91" terminal_set="" /><Grammar_Production_Symbol nonterminal_set="" terminal_set="59 60" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="243" precedence="-1" /><Grammar_Production lhs_nonterminal="244" precedence="-1"><Grammar_Production_NamedSymbol name="block_item_list" nonterminal_set="245 247" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="245" precedence="-1"><Grammar_Production_NamedSymbol name="block_item" nonterminal_set="247 249" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="246" precedence="-1"><Grammar_Production_NamedSymbol name="block_item_list" nonterminal_set="245 247" terminal_set="" /><Grammar_Production_NamedSymbol name="block_item" nonterminal_set="247 249" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="247" precedence="-1"><Grammar_Production_NamedSymbol name="declaration" nonterminal_set="96 98" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="248" precedence="-1"><Grammar_Production_NamedSymbol name="statement" nonterminal_set="227 243" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="249" precedence="-1" /><Grammar_Production lhs_nonterminal="250" precedence="-1"><Grammar_Production_NamedSymbol name="translation_unit" nonterminal_set="251 253" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="251" precedence="-1"><Grammar_Production_NamedSymbol name="external_declaration" nonterminal_set="253 255" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="252" precedence="-1"><Grammar_Production_NamedSymbol name="translation_unit" nonterminal_set="251 253" terminal_set="" /><Grammar_Production_NamedSymbol name="external_declaration" nonterminal_set="253 255" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="253" precedence="-1"><Grammar_Production_NamedSymbol name="function_definition" nonterminal_set="255 256" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="254" precedence="-1"><Grammar_Production_NamedSymbol name="declaration" nonterminal_set="96 98" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="255" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="FunctionDefinition"><Grammar_Production_Group attributes="" index="1" name="DeclarationSpecifierList"><Grammar_Production_NamedSymbol name="declaration_specifier_list" nonterminal_set="98 100" terminal_set="" /></Grammar_Production_Group><Grammar_Production_NamedSymbol name="declarator" nonterminal_set="178 180" terminal_set="" /><Grammar_Production_Group attributes="" index="2" name="DeclarationList"><Grammar_Production_NamedSymbol name="declaration_list_opt" nonterminal_set="256 258" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Symbol nonterminal_set="" terminal_set="123 124" /><Grammar_Production_Group attributes="" index="3" name="BlockItemList"><Grammar_Production_NamedSymbol name="block_item_list_opt" nonterminal_set="243 245" terminal_set="" /></Grammar_Production_Group><Grammar_Production_Symbol nonterminal_set="" terminal_set="125 126" /></Grammar_Production_Group></Grammar_Production><Grammar_Production lhs_nonterminal="256" precedence="-1" /><Grammar_Production lhs_nonterminal="257" precedence="-1"><Grammar_Production_NamedSymbol name="declaration_list" nonterminal_set="258 260" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="258" precedence="-1"><Grammar_Production_NamedSymbol name="declaration" nonterminal_set="96 98" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="259" precedence="-1"><Grammar_Production_NamedSymbol name="declaration_list" nonterminal_set="258 260" terminal_set="" /><Grammar_Production_NamedSymbol name="declaration" nonterminal_set="96 98" terminal_set="" /></Grammar_Production><Grammar_Production lhs_nonterminal="260" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="IdentifierEmpty" /></Grammar_Production><Grammar_Production lhs_nonterminal="261" precedence="-1"><Grammar_Production_NamedSymbol name="IDENTIFIER" nonterminal_set="" terminal_set="258 259" /></Grammar_Production><Grammar_Production lhs_nonterminal="262" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="CommaEllipsisEmpty" /></Grammar_Production><Grammar_Production lhs_nonterminal="263" precedence="-1"><Grammar_Production_Group attributes="" index="0" name="CommaEllipsis"><Grammar_Production_Symbol nonterminal_set="" terminal_set="44 45" /><Grammar_Production_NamedSymbol name="ELLIPSIS" nonterminal_set="" terminal_set="311 312" /></Grammar_Production_Group></Grammar_Production></Grammar>
+  <Grammar_Production_Group_Attribute name="n" ref="1" value="0" />
+  <Grammar_Production_Group_Attribute name="n" ref="2" value="1" />
+  <Grammar_Production_Group_Attribute name="n" ref="3" value="2" />
+  <Grammar_Production_Group_Attribute name="n" ref="4" value="3" />
+  <Grammar_Production_Group_Attribute name="n" ref="5" value="4" />
+  <Grammar_Production_Group_Attribute name="n" ref="6" value="5" />
+  <Grammar_Production_Group_Attribute name="n" ref="7" value="0" />
+  <Grammar_Production_Group_Attribute name="n" ref="8" value="1" />
+  <Grammar_Production_Group_Attribute name="n" ref="9" value="2" />
+  <Grammar_Production_Group_Attribute name="n" ref="10" value="3" />
+  <Grammar_Production_Group_Attribute name="n" ref="11" value="4" />
+  <Grammar_Production_Group_Attribute name="n" ref="12" value="5" />
+  <Grammar_Production_Group_Attribute name="n" ref="13" value="6" />
+  <Grammar_Production_Group_Attribute name="n" ref="14" value="7" />
+  <Grammar_Production_Group_Attribute name="n" ref="15" value="8" />
+  <Grammar_Production_Group_Attribute name="n" ref="16" value="9" />
+  <Grammar_Production_Group_Attribute name="n" ref="17" value="10" />
+  <Grammar_Production_Group_Attribute name="n" ref="18" value="11" />
+  <Grammar_Production_Group_Attribute name="n" ref="19" value="2" />
+  <Grammar_Production_Group_Attribute name="n" ref="20" value="0" />
+  <Grammar_Production_Group_Attribute name="n" ref="21" value="1" />
+  <Grammar_Production_Group_Attribute name="n" ref="22" value="2" />
+  <Grammar_Production_Group_Attribute name="n" ref="23" value="3" />
+  <Grammar_Production_Group_Attribute name="n" ref="24" value="0" />
+  <Grammar_Production_Group_Attribute name="n" ref="25" value="1" />
+</root>
diff --git a/ansi_c_yacc.y b/ansi_c_yacc.y
new file mode 100644 (file)
index 0000000..c182d99
--- /dev/null
@@ -0,0 +1,563 @@
+%token IDENTIFIER I_CONSTANT F_CONSTANT STRING_LITERAL FUNC_NAME SIZEOF
+%token PTR_OP INC_OP DEC_OP LEFT_OP RIGHT_OP LE_OP GE_OP EQ_OP NE_OP
+%token AND_OP OR_OP MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN ADD_ASSIGN
+%token SUB_ASSIGN LEFT_ASSIGN RIGHT_ASSIGN AND_ASSIGN
+%token XOR_ASSIGN OR_ASSIGN
+%token TYPEDEF_NAME ENUMERATION_CONSTANT
+
+%token TYPEDEF EXTERN STATIC AUTO REGISTER INLINE
+%token CONST RESTRICT VOLATILE
+%token BOOL CHAR SHORT INT LONG SIGNED UNSIGNED FLOAT DOUBLE VOID
+%token COMPLEX IMAGINARY 
+%token STRUCT UNION ENUM ELLIPSIS
+
+%token CASE DEFAULT IF ELSE SWITCH WHILE DO FOR GOTO CONTINUE BREAK RETURN
+
+%token ALIGNAS ALIGNOF ATOMIC GENERIC NORETURN STATIC_ASSERT THREAD_LOCAL
+
+%start block_item_list_opt
+
+%%
+
+primary_expression
+       : (?<ExpressionIdentifier>IDENTIFIER)
+       | constant
+       | string
+       | '(' expression ')'
+       | generic_selection
+       ;
+
+constant
+       : I_CONSTANT
+       | F_CONSTANT
+       | ENUMERATION_CONSTANT
+       ;
+
+enumeration_constant
+       : IDENTIFIER
+       ;
+
+string
+       : STRING_LITERAL
+       | (?<ExpressionFunctionName>FUNC_NAME)
+       ;
+
+generic_selection
+       : (?<GenericSelection>GENERIC '(' assignment_expression ',' (?<GenericAssociationList>generic_association_list) ')')
+       ;
+
+generic_association_list
+       : generic_association
+       | generic_association_list ',' generic_association
+       ;
+
+generic_association
+       : (?<GenericAssociation>type_name_or_default ':' assignment_expression)
+       ;
+
+type_name_or_default
+       : type_name
+       | (?<DefaultTypeName>DEFAULT)
+       ;
+
+postfix_expression
+       : primary_expression
+       | (?<ExpressionIndex>postfix_expression '[' expression ']')
+       | (?<ExpressionCall>postfix_expression '(' (?<ArgumentExpressionList>argument_expression_list_opt) ')')
+       | (?<ExpressionField>postfix_expression '.' IDENTIFIER)
+       | (?<ExpressionFieldDereference>postfix_expression PTR_OP IDENTIFIER)
+       | (?<ExpressionPostIncrement>postfix_expression INC_OP)
+       | (?<ExpressionPostDecrement>postfix_expression DEC_OP)
+       | (?<ExpressionArray>'(' type_name ')' '{' (?<DesignatorInitializerList>designator_initializer_list_comma_opt) '}')
+       ;
+
+argument_expression_list_opt
+       :
+       | argument_expression_list
+       ;
+
+argument_expression_list
+       : assignment_expression
+       | argument_expression_list ',' assignment_expression
+       ;
+
+unary_expression
+       : postfix_expression
+       | (?<ExpressionPreIncrement>INC_OP unary_expression)
+       | (?<ExpressionPreDecrement>DEC_OP unary_expression)
+       | (?<ExpressionAddressOf>'&' cast_expression)
+       | (?<ExpressionDereference>'*' cast_expression)
+       | (?<ExpressionPlus>'+' cast_expression)
+       | (?<ExpressionMinus>'-' cast_expression)
+       | (?<ExpressionBitwiseNot>'~' cast_expression)
+       | (?<ExpressionLogicalNot>'!' cast_expression)
+       | (?<ExpressionSizeOfExpression>SIZEOF unary_expression)
+       | (?<ExpressionSizeOfType>SIZEOF '(' type_name ')')
+       | (?<ExpressionAlignOfType>ALIGNOF '(' type_name ')')
+       ;
+
+cast_expression
+       : unary_expression
+       | (?<ExpressionCast>'(' type_name ')' cast_expression)
+       ;
+
+multiplicative_expression
+       : cast_expression
+       | (?<ExpressionMultiply>multiplicative_expression '*' cast_expression)
+       | (?<ExpressionDivide>multiplicative_expression '/' cast_expression)
+       | (?<ExpressionModulo>multiplicative_expression '%' cast_expression)
+       ;
+
+additive_expression
+       : multiplicative_expression
+       | (?<ExpressionAdd>additive_expression '+' multiplicative_expression)
+       | (?<ExpressionSubtract>additive_expression '-' multiplicative_expression)
+       ;
+
+shift_expression
+       : additive_expression
+       | (?<ExpressionShiftLeft>shift_expression LEFT_OP additive_expression)
+       | (?<ExpressionShiftRight>shift_expression RIGHT_OP additive_expression)
+       ;
+
+relational_expression
+       : shift_expression
+       | (?<ExpressionLessThan>relational_expression '<' shift_expression)
+       | (?<ExpressionGreaterThan>relational_expression '>' shift_expression)
+       | (?<ExpressionLessThanOrEqual>relational_expression LE_OP shift_expression)
+       | (?<ExpressionGreaterThanOrEqual>relational_expression GE_OP shift_expression)
+       ;
+
+equality_expression
+       : relational_expression
+       | (?<ExpressionEqual>equality_expression EQ_OP relational_expression)
+       | (?<ExpressionNotEqual>equality_expression NE_OP relational_expression)
+       ;
+
+and_expression
+       : equality_expression
+       | (?<ExpressionBitwiseAnd>and_expression '&' equality_expression)
+       ;
+
+exclusive_or_expression
+       : and_expression
+       | (?<ExpressionExclusiveOr>exclusive_or_expression '^' and_expression)
+       ;
+
+inclusive_or_expression
+       : exclusive_or_expression
+       | (?<ExpressionBitwiseOr>inclusive_or_expression '|' exclusive_or_expression)
+       ;
+
+logical_and_expression
+       : inclusive_or_expression
+       | (?<ExpressionLogicalAnd>logical_and_expression AND_OP inclusive_or_expression)
+       ;
+
+logical_or_expression
+       : logical_and_expression
+       | (?<ExpressionLogicalOr>logical_or_expression OR_OP logical_and_expression)
+       ;
+
+conditional_expression
+       : logical_or_expression
+       | (?<ExpressionConditional>logical_or_expression '?' expression ':' conditional_expression)
+       ;
+
+assignment_expression_or_asterisk_opt
+       : (?<ExpressionEmpty>)
+       | (?<ExpressionAsterisk>'*')
+       | assignment_expression
+       ;
+
+assignment_expression
+       : conditional_expression
+       | (?<ExpressionAssignment>unary_expression '=' assignment_expression)
+       | (?<ExpressionMultiplyAssignment>unary_expression MUL_ASSIGN assignment_expression)
+       | (?<ExpressionDivideAssignment>unary_expression DIV_ASSIGN assignment_expression)
+       | (?<ExpressionModuloAssignment>unary_expression MOD_ASSIGN assignment_expression)
+       | (?<ExpressionAddAssignment>unary_expression ADD_ASSIGN assignment_expression)
+       | (?<ExpressionSubtractAssignment>unary_expression SUB_ASSIGN assignment_expression)
+       | (?<ExpressionLeftShiftAssignment>unary_expression LEFT_ASSIGN assignment_expression)
+       | (?<ExpressionRightShiftAssignment>unary_expression RIGHT_ASSIGN assignment_expression)
+       | (?<ExpressionBitwiseAndAssignment>unary_expression AND_ASSIGN assignment_expression)
+       | (?<ExpressionExclusiveOrAssignment>unary_expression XOR_ASSIGN assignment_expression)
+       | (?<ExpressionBitwiseOrAssignment>unary_expression OR_ASSIGN assignment_expression)
+       ;
+
+expression_opt
+       : (?<ExpressionEmpty>)
+       | expression
+       ;
+
+expression
+       : assignment_expression
+       | (?<ExpressionComma>expression ',' assignment_expression)
+       ;
+
+equals_constant_expression_opt
+       : (?<ExpressionEmpty>)
+       | '=' constant_expression
+       ;
+
+constant_expression
+       : conditional_expression
+       ;
+
+declaration
+       : (?<Declaration>(?<DeclarationSpecifierList>declaration_specifier_list) (?<InitDeclaratorList>init_declarator_list_opt) ';')
+       | static_assert_declaration
+       ;
+
+declaration_specifier_list
+       : declaration_specifier
+       | declaration_specifier_list declaration_specifier
+       ;
+
+declaration_specifier
+       : storage_class_specifier
+       | type_specifier
+       | type_qualifier
+       | function_specifier
+       | alignment_specifier
+       ;
+
+init_declarator_list_opt
+       :
+       | init_declarator_list
+       ;
+
+init_declarator_list
+       : init_declarator
+       | init_declarator_list ',' init_declarator
+       ;
+
+init_declarator
+       : (?<InitDeclarator>declarator equals_initializer_opt)
+       ;
+
+storage_class_specifier
+       : (?<StorageClassSpecifier n="0">TYPEDEF)
+       | (?<StorageClassSpecifier n="1">EXTERN)
+       | (?<StorageClassSpecifier n="2">STATIC)
+       | (?<StorageClassSpecifier n="3">THREAD_LOCAL)
+       | (?<StorageClassSpecifier n="4">AUTO)
+       | (?<StorageClassSpecifier n="5">REGISTER)
+       ;
+
+type_specifier
+       : (?<TypeSpecifier n="0">VOID)
+       | (?<TypeSpecifier n="1">CHAR)
+       | (?<TypeSpecifier n="2">SHORT)
+       | (?<TypeSpecifier n="3">INT)
+       | (?<TypeSpecifier n="4">LONG)
+       | (?<TypeSpecifier n="5">FLOAT)
+       | (?<TypeSpecifier n="6">DOUBLE)
+       | (?<TypeSpecifier n="7">SIGNED)
+       | (?<TypeSpecifier n="8">UNSIGNED)
+       | (?<TypeSpecifier n="9">BOOL)
+       | (?<TypeSpecifier n="10">COMPLEX)
+       | (?<TypeSpecifier n="11">IMAGINARY)
+       | atomic_type_specifier
+       | struct_specifier
+       | union_specifier
+       | enum_specifier
+       | TYPEDEF_NAME
+       ;
+
+struct_specifier
+       : (?<StructSpecifier>STRUCT identifier_opt '{' (?<StructDeclarationList>struct_declaration_list_opt) '}')
+       | (?<StructSpecifier>STRUCT IDENTIFIER)
+       ;
+
+union_specifier
+       : (?<UnionSpecifier>UNION identifier_opt '{' (?<StructDeclarationList>struct_declaration_list_opt) '}')
+       | (?<UnionSpecifier>UNION IDENTIFIER)
+       ;
+
+struct_declaration_list_opt
+       :
+       | struct_declaration_list
+       ;
+
+struct_declaration_list
+       : struct_declaration
+       | struct_declaration_list struct_declaration
+       ;
+
+struct_declaration
+       : (?<StructDeclaration>(?<SpecifierQualifierList>specifier_qualifier_list) (?<StructDeclaratorList>struct_declarator_list_opt) ';')
+       | static_assert_declaration
+       ;
+
+specifier_qualifier_list
+       : specifier_qualifier
+       | specifier_qualifier_list specifier_qualifier
+       ;
+
+specifier_qualifier
+       : type_specifier
+       | type_qualifier
+       ;
+
+struct_declarator_list_opt
+       :
+       | struct_declarator_list
+       ;
+
+struct_declarator_list
+       : struct_declarator
+       | struct_declarator_list ',' struct_declarator
+       ;
+
+struct_declarator
+       : (?<StructDeclarator>declarator_opt ':' constant_expression)
+       | declarator
+       ;
+
+enum_specifier
+       : (?<EnumSpecifier>ENUM identifier_opt '{' (?<EnumeratorList>enumerator_list_comma_opt) '}')
+       | (?<EnumSpecifier>ENUM IDENTIFIER)
+       ;
+
+enumerator_list_comma_opt
+       :
+       | enumerator_list
+       | enumerator_list ','
+       ;
+
+enumerator_list
+       : enumerator
+       | enumerator_list ',' enumerator
+       ;
+
+enumerator
+       : (?<Enumerator>enumeration_constant equals_constant_expression_opt)
+       ;
+
+atomic_type_specifier
+       : ATOMIC '(' type_name ')'
+       ;
+
+type_qualifier_or_static_list_opt
+       :
+       | type_qualifier_or_static_list
+       ;
+
+type_qualifier_or_static_list
+       : type_qualifier_or_static
+       | type_qualifier_or_static_list type_qualifier_or_static
+       ;
+
+type_qualifier_or_static
+       : type_qualifier
+       | (?<StorageClassSpecifier n="2">STATIC)
+       ;
+
+type_qualifier
+       : (?<TypeQualifier n="0">CONST)
+       | (?<TypeQualifier n="1">RESTRICT)
+       | (?<TypeQualifier n="2">VOLATILE)
+       | (?<TypeQualifier n="3">ATOMIC)
+       ;
+
+function_specifier
+       : (?<FunctionSpecifier n="0">INLINE)
+       | (?<FunctionSpecifier n="1">NORETURN)
+       ;
+
+alignment_specifier
+       : (?<AlignAsType>ALIGNAS '(' type_name ')')
+       | (?<AlignAsExpression>ALIGNAS '(' constant_expression ')')
+       ;
+
+declarator_opt
+       : (?<DeclaratorEmpty>)
+       | declarator
+       ;
+
+declarator
+       : direct_declarator
+       | (?<DeclaratorPointer>'*' (?<TypeQualifierList>type_qualifier_list_opt) declarator)
+       ;
+
+direct_declarator
+       : IDENTIFIER
+       | '(' declarator ')'
+       | (?<DeclaratorArray>direct_declarator '[' (?<TypeQualifierOrStaticList>type_qualifier_or_static_list_opt) assignment_expression_or_asterisk_opt ']')
+       | (?<DeclaratorFunctionOldStyle>direct_declarator '(' (?<IdentifierList>identifier_list_opt) ')')
+       | (?<DeclaratorFunction>direct_declarator '(' (?<ParameterDeclarationList>parameter_declaration_list) comma_ellipsis_opt ')')
+       ;
+
+type_qualifier_list_opt
+       :
+       | type_qualifier_list
+       ;
+
+type_qualifier_list
+       : type_qualifier
+       | type_qualifier_list type_qualifier
+       ;
+
+parameter_declaration_list
+       : parameter_declaration
+       | parameter_declaration_list ',' parameter_declaration
+       ;
+
+parameter_declaration
+       : (?<ParameterDeclaration>(?<DeclarationSpecifierList>declaration_specifier_list) declarator)
+       | (?<ParameterDeclaration>(?<DeclarationSpecifierList>declaration_specifier_list) abstract_declarator)
+       ;
+
+identifier_list_opt
+       :
+       | identifier_list
+       ;
+
+identifier_list
+       : IDENTIFIER
+       | identifier_list ',' IDENTIFIER
+       ;
+
+type_name
+       : (?<TypeName>(?<SpecifierQualifierList>specifier_qualifier_list) abstract_declarator)
+       ;
+
+abstract_declarator
+       : direct_abstract_declarator_opt
+       | (?<DeclaratorPointer>'*' (?<TypeQualifierList>type_qualifier_list_opt) abstract_declarator)
+       ;
+
+direct_abstract_declarator_opt
+       : (?<DeclaratorAbstract>)
+       | direct_abstract_declarator
+       ;
+
+direct_abstract_declarator
+       : '(' direct_abstract_declarator ')'
+       | '(' (?<DeclaratorPointer>'*' (?<TypeQualifierList>type_qualifier_list_opt) abstract_declarator) ')'
+       | (?<DeclaratorArray>(?<DeclaratorAbstract>)'[' (?<TypeQualifierOrStaticList>type_qualifier_or_static_list_opt) assignment_expression_or_asterisk_opt ']')
+       | (?<DeclaratorFunction>(?<DeclaratorAbstract>)'('(?<ParameterDeclarationList>)(?<CommaEllipsisEmpty>) ')')
+       | (?<DeclaratorFunction>(?<DeclaratorAbstract>)'(' (?<ParameterDeclarationList>parameter_declaration_list) comma_ellipsis_opt ')')
+       | (?<DeclaratorArray>direct_abstract_declarator '[' (?<TypeQualifierOrStaticList>type_qualifier_or_static_list_opt) assignment_expression_or_asterisk_opt ']')
+       | (?<DeclaratorFunction>direct_abstract_declarator '('(?<ParameterDeclarationList>)(?<CommaEllipsisEmpty>) ')')
+       | (?<DeclaratorFunction>direct_abstract_declarator '(' (?<ParameterDeclarationList>parameter_declaration_list) comma_ellipsis_opt ')')
+       ;
+
+equals_initializer_opt
+       : (?<EqualsInitializerEmpty>)
+       | '=' initializer
+       ;
+
+initializer
+       : '{' (?<DesignatorInitializerList>designator_initializer_list_comma_opt) '}'
+       | assignment_expression
+       ;
+
+designator_initializer_list_comma_opt
+       :
+       | designator_initializer_list
+       | designator_initializer_list ','
+       ;
+
+designator_initializer_list
+       : designator_initializer
+       | designator_initializer_list ',' designator_initializer
+       ;
+
+designator_initializer
+       : (?<DesignatorInitializer>(?<DesignatorList>designator_list_equals_opt) initializer)
+       ;
+
+designator_list_equals_opt
+       :
+       | designator_list '='
+       ;
+
+designator_list
+       : designator
+       | designator_list designator
+       ;
+
+designator
+       : (?<DesignatorIndex>'[' constant_expression ']')
+       | (?<DesignatorField>'.' IDENTIFIER)
+       ;
+
+static_assert_declaration
+       : (?<StaticAssertDeclaration>STATIC_ASSERT '(' constant_expression ',' STRING_LITERAL ')' ';')
+       ;
+
+statement
+       : (?<StatementLabel>IDENTIFIER ':' statement)
+       | (?<StatementCase>CASE constant_expression ':' statement)
+       | (?<StatementDefault>DEFAULT ':' statement)
+       | '{' (?<BlockItemList>block_item_list_opt) '}'
+       | (?<StatementExpression>expression_opt ';')
+       | (?<StatementIfElse>IF '(' expression ')' statement ELSE statement)
+       | (?<StatementIf>IF '(' expression ')' statement)
+       | (?<StatementSwitch>SWITCH '(' expression ')' statement)
+       | (?<StatementWhile>WHILE '(' expression ')' statement)
+       | (?<StatementDoWhile>DO statement WHILE '(' expression ')' ';')
+       | (?<StatementFor>FOR '(' expression_opt ';' expression_opt ';' expression_opt ')' statement)
+       | (?<StatementFor>FOR '(' declaration expression_opt ';' expression_opt ')' statement)
+       | (?<StatementGoto>GOTO IDENTIFIER ';')
+       | (?<StatementContinue>CONTINUE ';')
+       | (?<StatementBreak>BREAK ';')
+       | (?<StatementReturn>RETURN expression_opt ';')
+       ;
+
+block_item_list_opt
+       :
+       | block_item_list
+       ;
+
+block_item_list
+       : block_item
+       | block_item_list block_item
+       ;
+
+block_item
+       : declaration
+       | statement
+       ;
+
+translation_unit_opt
+       :
+       | translation_unit
+       ;
+
+translation_unit
+       : external_declaration
+       | translation_unit external_declaration
+       ;
+
+external_declaration
+       : function_definition
+       | declaration
+       ;
+
+function_definition
+       : (?<FunctionDefinition>(?<DeclarationSpecifierList>declaration_specifier_list) declarator (?<DeclarationList>declaration_list_opt) '{' (?<BlockItemList>block_item_list_opt) '}')
+       ;
+
+declaration_list_opt
+       :
+       | declaration_list
+       ;
+
+declaration_list
+       : declaration
+       | declaration_list declaration
+       ;
+
+identifier_opt
+       : (?<IdentifierEmpty>)
+       | IDENTIFIER
+       ;
+
+comma_ellipsis_opt
+       : (?<CommaEllipsisEmpty>)
+       | (?<CommaEllipsis>',' ELLIPSIS)
+       ;
+
diff --git a/ansi_c_yylex.py b/ansi_c_yylex.py
new file mode 100644 (file)
index 0000000..7ef46c2
--- /dev/null
@@ -0,0 +1,1869 @@
+import dfa
+
+# GENERATE DFA BEGIN
+_dfa = dfa.DFA([('', {}), ('', {}), ('AUTO', {}), ('BREAK', {}), ('CASE', {}),
+('CHAR', {}), ('CONST', {}), ('CONTINUE', {}), ('DEFAULT', {}), ('DO', {}), (
+'DOUBLE', {}), ('ELSE', {}), ('ENUM', {}), ('EXTERN', {}), ('FLOAT', {}), (
+'FOR', {}), ('GOTO', {}), ('IF', {}), ('INLINE', {}), ('INT', {}), ('LONG', {}
+), ('REGISTER', {}), ('RESTRICT', {}), ('RETURN', {}), ('SHORT', {}), (
+'SIGNED', {}), ('SIZEOF', {}), ('STATIC', {}), ('STRUCT', {}), ('SWITCH', {}),
+('TYPEDEF', {}), ('UNION', {}), ('UNSIGNED', {}), ('VOID', {}), ('VOLATILE', {}
+), ('WHILE', {}), ('ALIGNAS', {}), ('ALIGNOF', {}), ('ATOMIC', {}), ('BOOL', {}
+), ('COMPLEX', {}), ('GENERIC', {}), ('IMAGINARY', {}), ('NORETURN', {}), (
+'STATIC_ASSERT', {}), ('THREAD_LOCAL', {}), ('FUNC_NAME', {}), ('TYPEDEF_NAME',
+{}), ('IDENTIFIER', {}), ('Identifier', {}), ('', {}), ('', {}), ('I_CONSTANT',
+{}), ('ExpressionIntLiteral', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('',
+{}), ('', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('I_CONSTANT',
+{}), ('ExpressionIntLiteral', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('',
+{}), ('', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('I_CONSTANT', {}), (
+'ExpressionIntLiteral', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('', {}),
+('', {}), ('', {}), ('', {}), ('', {}), ('I_CONSTANT', {}), (
+'ExpressionIntLiteral', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('', {}),
+('', {}), ('F_CONSTANT', {}), ('ExpressionFloatLiteral', {}), ('', {}), ('', {}
+), ('', {}), ('', {}), ('', {}), ('', {}), ('F_CONSTANT', {}), (
+'ExpressionFloatLiteral', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('', {}
+), ('', {}), ('', {}), ('F_CONSTANT', {}), ('ExpressionFloatLiteral', {}), ('',
+{}), ('', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('F_CONSTANT', {}), (
+'ExpressionFloatLiteral', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('', {}
+), ('', {}), ('', {}), ('', {}), ('F_CONSTANT', {}), ('ExpressionFloatLiteral',
+{}), ('', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('',
+{}), ('', {}), ('F_CONSTANT', {}), ('ExpressionFloatLiteral', {}), ('', {}), (
+'', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('', {}), (
+'STRING_LITERAL', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('', {}), ('', {
+}), ('', {}), ('', {}), ('ELLIPSIS', {}), ('RIGHT_ASSIGN', {}), ('LEFT_ASSIGN',
+{}), ('ADD_ASSIGN', {}), ('SUB_ASSIGN', {}), ('MUL_ASSIGN', {}), ('DIV_ASSIGN',
+{}), ('MOD_ASSIGN', {}), ('AND_ASSIGN', {}), ('XOR_ASSIGN', {}), ('OR_ASSIGN',
+{}), ('RIGHT_OP', {}), ('LEFT_OP', {}), ('INC_OP', {}), ('DEC_OP', {}), (
+'PTR_OP', {}), ('AND_OP', {}), ('OR_OP', {}), ('LE_OP', {}), ('GE_OP', {}), (
+'EQ_OP', {}), ('NE_OP', {}), ('X_3B', {}), ('X_7B', {}), ('', {}), ('X_7D', {}
+), ('', {}), ('X_2C', {}), ('X_3A', {}), ('X_3D', {}), ('X_28', {}), ('X_29', {
+}), ('X_5B', {}), ('', {}), ('X_5D', {}), ('', {}), ('X_2E', {}), ('X_26', {}),
+('X_21', {}), ('X_7E', {}), ('X_2D', {}), ('X_2B', {}), ('X_2A', {}), ('X_2F',
+{}), ('X_25', {}), ('X_3C', {}), ('X_3E', {}), ('X_5E', {}), ('X_7C', {}), (
+'X_3F', {}), ('', {}), ('', {}), ('', {})], [([256], [0], 0), ([9, 10, 11, 13,
+32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 58, 59, 60,
+61, 62, 63, 64, 65, 76, 77, 85, 86, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100,
+101, 102, 103, 104, 105, 106, 108, 109, 114, 115, 116, 117, 118, 119, 120, 123,
+124, 125, 126, 127, 256], [2, 3, 4, 3, 2, 3, 5, 6, 2, 7, 8, 9, 10, 11, 12, 13,
+14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 2, 26, 27, 26, 28, 26, 29, 2,
+30, 31, 32, 2, 33, 34, 35, 36, 37, 38, 39, 26, 40, 26, 41, 26, 42, 43, 44, 45,
+46, 47, 26, 48, 49, 50, 51, 2], -1), ([9, 13, 32, 33, 256], [52, 53, 52, 53, 52
+], 1), ([61, 62, 256], [52, 54, 52], 1), ([10, 11, 34, 35, 92, 93, 256], [55,
+56, 55, 57, 55, 58, 55], 3), ([61, 62, 63, 256], [59, 60, 61, 59], 2), ([38,
+39, 61, 62, 256], [59, 62, 59, 63, 59], 2), ([10, 11, 39, 40, 92, 93, 256], [
+64, 59, 64, 59, 64, 65, 64], 2), ([61, 62, 256], [52, 66, 52], 1), ([43, 44,
+61, 62, 256], [59, 67, 59, 68, 59], 2), ([45, 46, 61, 62, 63, 256], [56, 69,
+56, 70, 71, 56], 3), ([46, 47, 48, 58, 256], [59, 72, 59, 73, 59], 2), ([42,
+43, 47, 48, 61, 62, 256], [56, 74, 56, 75, 56, 76, 56], 3), ([46, 47, 48, 56,
+58, 69, 70, 76, 77, 85, 86, 88, 89, 101, 102, 108, 109, 117, 118, 120, 121, 256
+], [77, 78, 77, 79, 80, 77, 81, 77, 82, 77, 83, 77, 84, 77, 81, 77, 85, 77, 86,
+77, 84, 77], 17), ([46, 47, 48, 58, 69, 70, 76, 77, 85, 86, 101, 102, 108, 109,
+117, 118, 256], [87, 88, 87, 89, 87, 90, 87, 91, 87, 92, 87, 90, 87, 93, 87,
+94, 87], 13), ([62, 63, 256], [52, 95, 52], 1), ([37, 38, 58, 59, 60, 61, 62,
+256], [96, 97, 96, 98, 96, 99, 100, 96], 5), ([61, 62, 256], [52, 101, 52], 1),
+([61, 62, 63, 256], [56, 102, 103, 56], 3), ([48, 58, 65, 91, 95, 96, 97, 123,
+256], [52, 104, 52, 104, 52, 104, 52, 104, 52], 1), ([34, 35, 39, 40, 48, 58,
+65, 91, 95, 96, 97, 123, 256], [56, 105, 56, 106, 56, 107, 56, 107, 56, 107,
+56, 107, 56], 3), ([61, 62, 256], [52, 108, 52], 1), ([48, 58, 65, 66, 67, 68,
+71, 72, 73, 74, 78, 79, 83, 84, 85, 91, 95, 96, 97, 123, 256], [109, 110, 109,
+111, 112, 113, 110, 114, 110, 115, 110, 116, 110, 117, 118, 110, 109, 119, 109,
+110, 109], 12), ([48, 58, 65, 91, 95, 96, 97, 117, 118, 123, 256], [59, 120,
+59, 120, 59, 120, 59, 120, 121, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97,
+114, 115, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 122, 120, 59], 2), ([
+48, 58, 65, 91, 95, 96, 97, 98, 104, 105, 111, 112, 123, 256], [96, 123, 96,
+123, 96, 123, 96, 124, 123, 125, 123, 126, 123, 96], 5), ([48, 58, 65, 91, 95,
+96, 97, 101, 102, 111, 112, 123, 256], [127, 128, 127, 128, 127, 128, 127, 128,
+129, 128, 130, 128, 127], 4), ([48, 58, 65, 91, 95, 96, 97, 108, 109, 110, 111,
+120, 121, 123, 256], [127, 128, 127, 128, 127, 128, 127, 128, 131, 128, 132,
+128, 133, 128, 127], 4), ([48, 58, 65, 91, 95, 96, 97, 108, 109, 111, 112, 123,
+256], [56, 134, 56, 134, 56, 134, 56, 134, 135, 134, 136, 134, 56], 3), ([48,
+58, 65, 91, 95, 96, 97, 111, 112, 123, 256], [59, 120, 59, 120, 59, 120, 59,
+120, 137, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 102, 103, 110, 111, 123,
+256], [127, 128, 127, 128, 127, 128, 127, 128, 138, 128, 139, 128, 127], 4), ([
+48, 58, 65, 91, 95, 96, 97, 111, 112, 123, 256], [59, 120, 59, 120, 59, 120,
+59, 120, 140, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 101, 102, 123, 256],
+[127, 128, 127, 128, 127, 128, 127, 128, 141, 128, 127], 4), ([48, 58, 65, 91,
+95, 96, 97, 104, 105, 106, 116, 117, 119, 120, 123, 256], [142, 143, 142, 143,
+142, 143, 142, 143, 144, 145, 143, 146, 143, 147, 143, 142], 8), ([48, 58, 65,
+91, 95, 96, 97, 121, 122, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 148,
+120, 59], 2), ([34, 35, 39, 40, 48, 56, 57, 58, 65, 91, 95, 96, 97, 110, 111,
+123, 256], [149, 150, 149, 151, 149, 152, 153, 152, 149, 152, 149, 152, 149,
+152, 154, 152, 149], 6), ([48, 58, 65, 91, 95, 96, 97, 111, 112, 123, 256], [
+56, 134, 56, 134, 56, 134, 56, 134, 155, 134, 56], 3), ([48, 58, 65, 91, 95,
+96, 97, 104, 105, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 156, 120, 59
+], 2), ([61, 62, 124, 125, 256], [59, 157, 59, 158, 59], 2), ([9, 13, 32, 33,
+34, 35, 76, 77, 85, 86, 117, 118, 256], [149, 159, 149, 159, 149, 160, 149,
+161, 149, 162, 149, 163, 149], 6), ([34, 35, 39, 40, 48, 56, 63, 64, 92, 93,
+97, 99, 102, 103, 110, 111, 114, 115, 116, 117, 118, 119, 120, 121, 256], [56,
+164, 56, 164, 56, 165, 56, 164, 56, 164, 56, 164, 56, 164, 56, 164, 56, 164,
+56, 164, 56, 164, 56, 166, 56], 3), ([10, 11, 39, 40, 92, 93, 256], [167, 56,
+167, 168, 167, 169, 167], 3), ([34, 35, 39, 40, 48, 56, 63, 64, 92, 93, 97, 99,
+102, 103, 110, 111, 114, 115, 116, 117, 118, 119, 120, 121, 256], [56, 170, 56,
+170, 56, 171, 56, 170, 56, 170, 56, 170, 56, 170, 56, 170, 56, 170, 56, 170,
+56, 170, 56, 172, 56], 3), ([46, 47, 256], [52, 173, 52], 1), ([48, 58, 69, 70,
+71, 76, 77, 101, 102, 103, 108, 109, 256], [149, 174, 149, 175, 176, 149, 177,
+149, 175, 178, 149, 179, 149], 6), ([10, 11, 256], [180, 52, 180], 1), ([48,
+58, 69, 70, 71, 76, 77, 101, 102, 103, 108, 109, 256], [149, 174, 149, 181,
+182, 149, 183, 149, 181, 184, 149, 185, 149], 6), ([46, 47, 48, 56, 58, 69, 70,
+76, 77, 85, 86, 101, 102, 108, 109, 117, 118, 256], [87, 88, 87, 186, 187, 87,
+90, 87, 188, 87, 189, 87, 90, 87, 190, 87, 191, 87], 13), ([46, 47, 48, 58, 69,
+70, 101, 102, 256], [149, 192, 149, 193, 149, 194, 149, 194, 149], 6), ([43,
+44, 45, 46, 48, 58, 256], [59, 195, 59, 195, 59, 196, 59], 2), ([76, 77, 85,
+86, 117, 118, 256], [56, 197, 56, 198, 56, 199, 56], 3), ([76, 77, 108, 109,
+256], [127, 200, 127, 201, 127], 4), ([46, 47, 48, 58, 65, 71, 97, 103, 256], [
+96, 202, 96, 203, 96, 203, 96, 203, 96], 5), ([85, 86, 108, 109, 117, 118, 256
+], [56, 198, 56, 197, 56, 199, 56], 3), ([76, 77, 85, 86, 117, 118, 256], [56,
+204, 56, 205, 56, 206, 56], 3), ([76, 77, 108, 109, 256], [127, 207, 127, 208,
+127], 4), ([85, 86, 108, 109, 117, 118, 256], [56, 205, 56, 204, 56, 206, 56],
+3), ([61, 62, 256], [52, 209, 52], 1), ([61, 62, 256], [52, 210, 52], 1), ([48,
+58, 65, 91, 95, 96, 97, 108, 109, 116, 117, 123, 256], [127, 128, 127, 128,
+127, 128, 127, 128, 211, 128, 212, 128, 127], 4), ([48, 58, 65, 91, 95, 96, 97,
+111, 112, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 213, 120, 59], 2), ([
+48, 58, 65, 91, 95, 96, 97, 111, 112, 123, 256], [59, 120, 59, 120, 59, 120,
+59, 120, 214, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 101, 102, 123, 256],
+[59, 120, 59, 120, 59, 120, 59, 120, 215, 120, 59], 2), ([48, 58, 65, 91, 95,
+96, 97, 109, 110, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 216, 120, 59
+], 2), ([48, 58, 65, 91, 95, 96, 97, 111, 112, 123, 256], [59, 120, 59, 120,
+59, 120, 59, 120, 217, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 116, 117,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 218, 120, 59], 2), ([48, 58,
+65, 91, 95, 96, 97, 104, 105, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120,
+219, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 102, 103, 123, 256], [59, 120,
+59, 120, 59, 120, 59, 120, 220, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97,
+116, 117, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 221, 120, 59], 2), ([
+48, 58, 65, 91, 95, 96, 97, 101, 102, 123, 256], [59, 120, 59, 120, 59, 120,
+59, 120, 222, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 115, 116, 123, 256],
+[59, 120, 59, 120, 59, 120, 59, 120, 223, 120, 59], 2), ([48, 58, 65, 91, 95,
+96, 97, 98, 123, 256], [59, 120, 59, 120, 59, 120, 59, 224, 120, 59], 2), ([48,
+58, 65, 91, 95, 96, 97, 110, 111, 123, 256], [56, 134, 56, 134, 56, 134, 56,
+134, 225, 134, 56], 3), ([48, 58, 65, 91, 95, 96, 97, 102, 103, 123, 256], [59,
+120, 59, 120, 59, 120, 59, 120, 226, 120, 59], 2), ([48, 58, 65, 91, 95, 96,
+97, 117, 118, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 227, 120, 59], 2
+), ([48, 58, 65, 91, 95, 96, 97, 115, 116, 123, 256], [59, 120, 59, 120, 59,
+120, 59, 120, 228, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 117, 118, 123,
+256], [59, 120, 59, 120, 59, 120, 59, 120, 229, 120, 59], 2), ([48, 58, 65, 91,
+95, 96, 97, 116, 117, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 230, 120,
+59], 2), ([48, 58, 65, 91, 95, 96, 97, 111, 112, 123, 256], [59, 120, 59, 120,
+59, 120, 59, 120, 231, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 114, 115,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 232, 120, 59], 2), ([48, 58,
+65, 91, 95, 96, 97, 116, 117, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120,
+233, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 108, 109, 116, 117, 123, 256],
+[56, 134, 56, 134, 56, 134, 56, 134, 234, 134, 235, 134, 56], 3), ([48, 58, 65,
+91, 95, 96, 97, 110, 111, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 236,
+120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 103, 104, 115, 116, 117, 123, 256],
+[127, 128, 127, 128, 127, 128, 127, 128, 237, 128, 238, 239, 128, 127], 4), ([
+48, 58, 65, 91, 95, 96, 97, 111, 112, 123, 256], [59, 120, 59, 120, 59, 120,
+59, 120, 240, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 103, 104, 122, 123,
+256], [127, 128, 127, 128, 127, 128, 127, 128, 241, 128, 242, 127], 4), ([48,
+58, 65, 91, 95, 96, 97, 98, 114, 115, 123, 256], [56, 134, 56, 134, 56, 134,
+56, 243, 134, 244, 134, 56], 3), ([48, 58, 65, 91, 95, 96, 97, 105, 106, 123,
+256], [59, 120, 59, 120, 59, 120, 59, 120, 245, 120, 59], 2), ([48, 58, 65, 91,
+95, 96, 97, 112, 113, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 246, 120,
+59], 2), ([34, 35, 48, 58, 65, 91, 95, 96, 97, 123, 256], [59, 247, 59, 248,
+59, 248, 59, 248, 59, 248, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 105, 106,
+115, 116, 123, 256], [56, 134, 56, 134, 56, 134, 56, 134, 249, 134, 250, 134,
+56], 3), ([48, 58, 65, 91, 95, 96, 97, 105, 106, 108, 109, 123, 256], [56, 134,
+56, 134, 56, 134, 56, 134, 251, 134, 252, 134, 56], 3), ([48, 58, 65, 91, 95,
+96, 97, 105, 106, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 253, 120, 59
+], 2), ([10, 11, 34, 35, 92, 93, 256], [254, 56, 254, 255, 254, 256, 254], 3),
+([34, 35, 256], [52, 257, 52], 1), ([34, 35, 56, 57, 256], [59, 258, 59, 259,
+59], 2), ([10, 11, 34, 35, 48, 56, 92, 93, 256], [260, 127, 260, 261, 260, 262,
+260, 263, 260], 4), ([48, 58, 65, 71, 97, 103, 256], [52, 264, 52, 264, 52,
+264, 52], 1), ([34, 35, 39, 40, 48, 56, 63, 64, 92, 93, 97, 99, 102, 103, 110,
+111, 114, 115, 116, 117, 118, 119, 120, 121, 256], [56, 170, 56, 170, 56, 265,
+56, 170, 56, 170, 56, 170, 56, 170, 56, 170, 56, 170, 56, 170, 56, 170, 56,
+266, 56], 3), ([10, 11, 39, 40, 48, 56, 92, 93, 256], [267, 127, 267, 268, 267,
+269, 267, 270, 267], 4), ([48, 58, 65, 71, 97, 103, 256], [52, 271, 52, 271,
+52, 271, 52], 1), ([43, 44, 45, 46, 48, 58, 256], [59, 272, 59, 272, 59, 273,
+59], 2), ([43, 44, 45, 46, 48, 58, 256], [59, 274, 59, 274, 59, 275, 59], 2), (
+[48, 58, 256], [52, 276, 52], 1), ([48, 58, 70, 71, 76, 77, 102, 103, 108, 109,
+256], [96, 277, 96, 278, 96, 279, 96, 280, 96, 281, 96], 5), ([85, 86, 117,
+118, 256], [59, 282, 59, 283, 59], 2), ([76, 77, 256], [52, 284, 52], 1), ([
+108, 109, 256], [52, 284, 52], 1), ([48, 58, 65, 71, 97, 103, 256], [52, 285,
+52, 285, 52, 285, 52], 1), ([46, 47, 48, 58, 65, 71, 76, 77, 80, 81, 85, 86,
+97, 103, 108, 109, 112, 113, 117, 118, 256], [87, 286, 87, 287, 87, 287, 87,
+288, 87, 289, 87, 290, 87, 287, 87, 291, 87, 289, 87, 292, 87], 13), ([85, 86,
+117, 118, 256], [59, 293, 59, 294, 59], 2), ([76, 77, 256], [52, 295, 52], 1),
+([108, 109, 256], [52, 295, 52], 1), ([48, 58, 65, 91, 95, 96, 97, 105, 106,
+123, 256], [56, 134, 56, 134, 56, 134, 56, 134, 296, 134, 56], 3), ([48, 58,
+65, 91, 95, 96, 97, 111, 112, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120,
+297, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 111, 112, 123, 256], [59, 120,
+59, 120, 59, 120, 59, 120, 298, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97,
+109, 110, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 299, 120, 59], 2), ([
+48, 58, 65, 91, 95, 96, 97, 110, 111, 123, 256], [59, 120, 59, 120, 59, 120,
+59, 120, 300, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 98, 123, 256], [59,
+120, 59, 120, 59, 120, 59, 301, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97,
+114, 115, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 302, 120, 59], 2), ([
+48, 58, 65, 91, 95, 96, 97, 98, 123, 256], [59, 120, 59, 120, 59, 120, 59, 303,
+120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 114, 115, 123, 256], [59, 120, 59,
+120, 59, 120, 59, 120, 304, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 117,
+118, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 305, 120, 59], 2), ([48,
+58, 65, 91, 95, 96, 97, 111, 112, 123, 256], [59, 120, 59, 120, 59, 120, 59,
+120, 306, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 98, 123, 256], [59, 120,
+59, 120, 59, 120, 59, 307, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 101,
+102, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 308, 120, 59], 2), ([48,
+58, 65, 91, 95, 96, 97, 114, 115, 123, 256], [59, 120, 59, 120, 59, 120, 59,
+120, 309, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 115, 116, 117, 123, 256],
+[56, 134, 56, 134, 56, 134, 56, 134, 310, 311, 134, 56], 3), ([48, 58, 65, 91,
+95, 96, 97, 98, 123, 256], [59, 120, 59, 120, 59, 120, 59, 312, 120, 59], 2), (
+[48, 58, 65, 91, 95, 96, 97, 98, 99, 123, 256], [59, 120, 59, 120, 59, 120, 59,
+120, 313, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 101, 102, 123, 256], [59,
+120, 59, 120, 59, 120, 59, 120, 314, 120, 59], 2), ([48, 58, 65, 91, 95, 96,
+97, 109, 110, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 315, 120, 59], 2
+), ([48, 58, 65, 91, 95, 96, 97, 101, 102, 123, 256], [59, 120, 59, 120, 59,
+120, 59, 120, 316, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 98, 123, 256], [
+59, 120, 59, 120, 59, 120, 59, 317, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97,
+111, 112, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 318, 120, 59], 2), ([
+48, 58, 65, 91, 95, 96, 97, 105, 106, 123, 256], [59, 120, 59, 120, 59, 120,
+59, 120, 319, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 103, 104, 123, 256],
+[59, 120, 59, 120, 59, 120, 59, 120, 320, 120, 59], 2), ([48, 58, 65, 91, 95,
+96, 97, 105, 106, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 321, 120, 59
+], 2), ([48, 58, 65, 91, 95, 96, 97, 116, 117, 123, 256], [59, 120, 59, 120,
+59, 120, 59, 120, 322, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 117, 118,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 323, 120, 59], 2), ([48, 58,
+65, 91, 95, 96, 97, 114, 115, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120,
+324, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 110, 111, 123, 256], [59, 120,
+59, 120, 59, 120, 59, 120, 325, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97,
+101, 102, 123, 256], [56, 134, 56, 134, 56, 134, 56, 134, 326, 134, 56], 3), ([
+48, 58, 65, 91, 95, 96, 97, 116, 117, 123, 256], [59, 120, 59, 120, 59, 120,
+59, 120, 327, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 117, 118, 123, 256],
+[59, 120, 59, 120, 59, 120, 59, 120, 328, 120, 59], 2), ([48, 58, 65, 91, 95,
+96, 97, 116, 117, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 329, 120, 59
+], 2), ([48, 58, 65, 91, 95, 96, 97, 101, 102, 123, 256], [59, 120, 59, 120,
+59, 120, 59, 120, 330, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 111, 112,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 331, 120, 59], 2), ([48, 58,
+65, 91, 95, 96, 97, 105, 106, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120,
+332, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 100, 101, 123, 256], [59, 120,
+59, 120, 59, 120, 59, 120, 333, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 98,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 334, 120, 59], 2), ([48, 58, 65, 91,
+95, 96, 97, 108, 109, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 335, 120,
+59], 2), ([9, 13, 32, 33, 34, 35, 76, 77, 85, 86, 117, 118, 256], [149, 336,
+149, 336, 149, 160, 149, 161, 149, 162, 149, 163, 149], 6), ([34, 35, 39, 40,
+48, 56, 63, 64, 92, 93, 97, 99, 102, 103, 110, 111, 114, 115, 116, 117, 118,
+119, 120, 121, 256], [56, 337, 56, 337, 56, 338, 56, 337, 56, 337, 56, 337, 56,
+337, 56, 337, 56, 337, 56, 337, 56, 337, 56, 339, 56], 3), ([10, 11, 34, 35,
+48, 56, 92, 93, 256], [260, 127, 260, 261, 260, 340, 260, 263, 260], 4), ([10,
+11, 34, 35, 48, 58, 65, 71, 92, 93, 97, 103, 256], [260, 127, 260, 261, 260,
+341, 260, 341, 260, 263, 260, 341, 260], 4), ([10, 11, 39, 40, 48, 56, 92, 93,
+256], [267, 127, 267, 268, 267, 342, 267, 270, 267], 4), ([48, 58, 65, 71, 97,
+103, 256], [52, 343, 52, 343, 52, 343, 52], 1), ([10, 11, 39, 40, 48, 56, 92,
+93, 256], [267, 127, 267, 268, 267, 344, 267, 270, 267], 4), ([10, 11, 39, 40,
+48, 58, 65, 71, 92, 93, 97, 103, 256], [267, 127, 267, 268, 267, 345, 267, 345,
+267, 270, 267, 345, 267], 4), ([48, 58, 256], [52, 346, 52], 1), ([48, 58, 70,
+71, 76, 77, 102, 103, 108, 109, 256], [96, 347, 96, 348, 96, 349, 96, 350, 96,
+351, 96], 5), ([48, 58, 256], [52, 352, 52], 1), ([48, 58, 70, 71, 76, 77, 102,
+103, 108, 109, 256], [96, 353, 96, 354, 96, 355, 96, 356, 96, 357, 96], 5), ([
+48, 58, 65, 71, 80, 81, 97, 103, 112, 113, 256], [59, 358, 59, 358, 59, 359,
+59, 358, 59, 359, 59], 2), ([48, 58, 65, 71, 80, 81, 97, 103, 112, 113, 256], [
+59, 358, 59, 358, 59, 360, 59, 358, 59, 360, 59], 2), ([76, 77, 85, 86, 117,
+118, 256], [56, 361, 56, 362, 56, 363, 56], 3), ([43, 44, 45, 46, 48, 58, 256],
+[59, 364, 59, 364, 59, 365, 59], 2), ([76, 77, 108, 109, 256], [127, 366, 127,
+367, 127], 4), ([85, 86, 108, 109, 117, 118, 256], [56, 362, 56, 361, 56, 363,
+56], 3), ([48, 58, 65, 91, 95, 96, 97, 103, 104, 123, 256], [56, 134, 56, 134,
+56, 134, 56, 134, 368, 134, 56], 3), ([48, 58, 65, 91, 95, 96, 97, 109, 110,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 369, 120, 59], 2), ([48, 58,
+65, 91, 95, 96, 97, 108, 109, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120,
+370, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 112, 113, 123, 256], [59, 120,
+59, 120, 59, 120, 59, 120, 371, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97,
+101, 102, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 372, 120, 59], 2), ([
+48, 58, 65, 91, 95, 96, 97, 103, 104, 123, 256], [59, 120, 59, 120, 59, 120,
+59, 120, 373, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 101, 102, 123, 256],
+[59, 120, 59, 120, 59, 120, 59, 120, 374, 120, 59], 2), ([48, 58, 65, 91, 95,
+96, 97, 116, 117, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 375, 120, 59
+], 2), ([48, 58, 65, 91, 95, 96, 97, 101, 102, 123, 256], [59, 120, 59, 120,
+59, 120, 59, 120, 376, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 110, 111,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 377, 120, 59], 2), ([48, 58,
+65, 91, 95, 96, 97, 107, 108, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120,
+378, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 116, 117, 123, 256], [59, 120,
+59, 120, 59, 120, 59, 120, 379, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97,
+105, 106, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 380, 120, 59], 2), ([
+48, 58, 65, 91, 95, 96, 97, 117, 118, 123, 256], [59, 120, 59, 120, 59, 120,
+59, 120, 381, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 108, 109, 123, 256],
+[59, 120, 59, 120, 59, 120, 59, 120, 382, 120, 59], 2), ([48, 58, 65, 91, 95,
+96, 97, 114, 115, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 383, 120, 59
+], 2), ([48, 58, 65, 91, 95, 96, 97, 116, 117, 123, 256], [59, 120, 59, 120,
+59, 120, 59, 120, 384, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 110, 111,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 385, 120, 59], 2), ([48, 58,
+65, 91, 95, 96, 97, 115, 116, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120,
+386, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 114, 115, 123, 256], [59, 120,
+59, 120, 59, 120, 59, 120, 387, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97,
+114, 115, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 388, 120, 59], 2), ([
+48, 58, 65, 91, 95, 96, 97, 116, 117, 123, 256], [59, 120, 59, 120, 59, 120,
+59, 120, 389, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 101, 102, 123, 256],
+[59, 120, 59, 120, 59, 120, 59, 120, 390, 120, 59], 2), ([48, 58, 65, 91, 95,
+96, 97, 111, 112, 123, 256], [56, 134, 56, 134, 56, 391, 56, 134, 392, 134, 56
+], 3), ([48, 58, 65, 91, 95, 96, 97, 105, 106, 123, 256], [59, 120, 59, 120,
+59, 120, 59, 120, 393, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 99, 100,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 394, 120, 59], 2), ([48, 58,
+65, 91, 95, 96, 97, 99, 100, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120,
+395, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 100, 101, 123, 256], [59, 120,
+59, 120, 59, 120, 59, 120, 396, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97,
+110, 111, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 397, 120, 59], 2), ([
+48, 58, 65, 91, 95, 96, 97, 103, 104, 123, 256], [59, 120, 59, 120, 59, 120,
+59, 120, 398, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 116, 117, 123, 256],
+[59, 120, 59, 120, 59, 120, 59, 120, 399, 120, 59], 2), ([48, 58, 65, 91, 95,
+96, 97, 101, 102, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 400, 120, 59
+], 2), ([10, 11, 34, 35, 48, 56, 92, 93, 256], [401, 127, 401, 402, 401, 403,
+401, 404, 401], 4), ([48, 58, 65, 71, 97, 103, 256], [52, 405, 52, 405, 52,
+405, 52], 1), ([10, 11, 39, 40, 48, 56, 92, 93, 256], [267, 127, 267, 268, 267,
+344, 267, 270, 267], 4), ([10, 11, 39, 40, 48, 58, 65, 71, 92, 93, 97, 103, 256
+], [267, 127, 267, 268, 267, 406, 267, 406, 267, 270, 267, 406, 267], 4), ([43,
+44, 45, 46, 48, 58, 256], [59, 407, 59, 407, 59, 408, 59], 2), ([43, 44, 45,
+46, 48, 58, 256], [59, 409, 59, 409, 59, 410, 59], 2), ([85, 86, 117, 118, 256
+], [59, 411, 59, 412, 59], 2), ([48, 58, 256], [52, 413, 52], 1), ([48, 58, 70,
+71, 76, 77, 102, 103, 108, 109, 256], [96, 414, 96, 415, 96, 416, 96, 417, 96,
+418, 96], 5), ([76, 77, 256], [52, 419, 52], 1), ([108, 109, 256], [52, 419, 52
+], 1), ([48, 58, 65, 91, 95, 96, 97, 110, 111, 123, 256], [56, 134, 56, 134,
+56, 134, 56, 134, 420, 134, 56], 3), ([48, 58, 65, 91, 95, 96, 97, 105, 106,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 421, 120, 59], 2), ([48, 58,
+65, 91, 95, 96, 97, 108, 109, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120,
+422, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 114, 115, 123, 256], [59, 120,
+59, 120, 59, 120, 59, 120, 423, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97,
+105, 106, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 424, 120, 59], 2), ([
+48, 58, 65, 91, 95, 96, 97, 116, 117, 123, 256], [59, 120, 59, 120, 59, 120,
+59, 120, 425, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 105, 106, 123, 256],
+[59, 120, 59, 120, 59, 120, 59, 120, 426, 120, 59], 2), ([48, 58, 65, 91, 95,
+96, 97, 98, 123, 256], [59, 120, 59, 120, 59, 120, 59, 427, 120, 59], 2), ([48,
+58, 65, 91, 95, 96, 97, 99, 100, 123, 256], [59, 120, 59, 120, 59, 120, 59,
+120, 428, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 110, 111, 123, 256], [59,
+120, 59, 120, 59, 120, 59, 120, 429, 120, 59], 2), ([48, 58, 65, 91, 95, 96,
+97, 108, 109, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 430, 120, 59], 2
+), ([48, 58, 65, 91, 95, 96, 97, 101, 102, 123, 256], [59, 120, 59, 120, 59,
+120, 59, 120, 431, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 110, 111, 123,
+256], [59, 120, 59, 120, 59, 120, 59, 120, 432, 120, 59], 2), ([48, 58, 65, 91,
+95, 96, 97, 101, 102, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 433, 120,
+59], 2), ([48, 58, 65, 91, 95, 96, 97, 116, 117, 123, 256], [59, 120, 59, 120,
+59, 120, 59, 120, 434, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 105, 106,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 435, 120, 59], 2), ([48, 58,
+65, 91, 95, 96, 97, 110, 111, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120,
+436, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 100, 101, 123, 256], [59, 120,
+59, 120, 59, 120, 59, 120, 437, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97,
+116, 117, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 438, 120, 59], 2), ([
+48, 58, 65, 91, 95, 96, 97, 102, 103, 123, 256], [59, 120, 59, 120, 59, 120,
+59, 120, 439, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 99, 100, 123, 256], [
+59, 120, 59, 120, 59, 120, 59, 120, 440, 120, 59], 2), ([48, 58, 65, 91, 95,
+96, 97, 116, 117, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 441, 120, 59
+], 2), ([48, 58, 65, 91, 95, 96, 97, 104, 105, 123, 256], [59, 120, 59, 120,
+59, 120, 59, 120, 442, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 101, 102,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 443, 120, 59], 2), ([48, 58,
+65, 91, 95, 96, 97, 110, 111, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120,
+444, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 105, 106, 123, 256], [59, 120,
+59, 120, 59, 120, 59, 120, 445, 120, 59], 2), ([10, 11, 34, 35, 48, 56, 92, 93,
+256], [401, 127, 401, 402, 401, 446, 401, 404, 401], 4), ([10, 11, 34, 35, 48,
+58, 65, 71, 92, 93, 97, 103, 256], [401, 127, 401, 402, 401, 447, 401, 447,
+401, 404, 401, 447, 401], 4), ([48, 58, 256], [52, 448, 52], 1), ([48, 58, 70,
+71, 76, 77, 102, 103, 108, 109, 256], [96, 449, 96, 450, 96, 451, 96, 452, 96,
+453, 96], 5), ([48, 58, 256], [52, 454, 52], 1), ([48, 58, 70, 71, 76, 77, 102,
+103, 108, 109, 256], [96, 455, 96, 456, 96, 457, 96, 458, 96, 459, 96], 5), ([
+48, 58, 65, 91, 95, 96, 97, 98, 111, 112, 123, 256], [56, 134, 56, 134, 56,
+134, 56, 460, 134, 461, 134, 56], 3), ([48, 58, 65, 91, 95, 96, 97, 99, 100,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 462, 120, 59], 2), ([48, 58,
+65, 91, 95, 96, 97, 101, 102, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120,
+463, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 105, 106, 123, 256], [59, 120,
+59, 120, 59, 120, 59, 120, 464, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97,
+110, 111, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 465, 120, 59], 2), ([
+48, 58, 65, 91, 95, 96, 97, 117, 118, 123, 256], [59, 120, 59, 120, 59, 120,
+59, 120, 466, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 99, 100, 123, 256], [
+59, 120, 59, 120, 59, 120, 59, 120, 467, 120, 59], 2), ([48, 58, 65, 91, 95,
+96, 97, 100, 101, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 468, 120, 59
+], 2), ([48, 58, 65, 91, 95, 96, 97, 123, 256], [59, 120, 59, 120, 59, 469, 59,
+120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 117, 118, 123, 256], [59, 120, 59,
+120, 59, 120, 59, 120, 470, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 116,
+117, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 471, 120, 59], 2), ([48,
+58, 65, 91, 95, 96, 97, 101, 102, 123, 256], [59, 120, 59, 120, 59, 120, 59,
+120, 472, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 99, 100, 123, 256], [59,
+120, 59, 120, 59, 120, 59, 120, 473, 120, 59], 2), ([48, 58, 65, 91, 95, 96,
+97, 102, 103, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 474, 120, 59], 2
+), ([48, 58, 65, 91, 95, 96, 97, 101, 102, 123, 256], [59, 120, 59, 120, 59,
+120, 59, 120, 475, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 108, 109, 123,
+256], [59, 120, 59, 120, 59, 120, 59, 120, 476, 120, 59], 2), ([48, 58, 65, 91,
+95, 96, 97, 115, 116, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 477, 120,
+59], 2), ([48, 58, 65, 91, 95, 96, 97, 102, 103, 123, 256], [59, 120, 59, 120,
+59, 120, 59, 120, 478, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 120, 121,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 479, 120, 59], 2), ([48, 58,
+65, 91, 95, 96, 97, 99, 100, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120,
+480, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 98, 123, 256], [59, 120, 59,
+120, 59, 120, 59, 481, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 114, 115,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 482, 120, 59], 2), ([48, 58,
+65, 91, 95, 96, 97, 123, 256], [59, 120, 59, 120, 59, 483, 59, 120, 59], 2), ([
+48, 58, 65, 91, 95, 96, 97, 123, 256], [59, 120, 59, 120, 59, 484, 59, 120, 59
+], 2), ([48, 58, 65, 91, 95, 96, 97, 123, 256], [59, 120, 59, 120, 59, 485, 59,
+120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 101, 102, 123, 256], [59, 120, 59,
+120, 59, 120, 59, 120, 486, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 114,
+115, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 487, 120, 59], 2), ([48,
+58, 65, 91, 95, 96, 97, 116, 117, 123, 256], [59, 120, 59, 120, 59, 120, 59,
+120, 488, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 100, 101, 123, 256], [59,
+120, 59, 120, 59, 120, 59, 120, 489, 120, 59], 2), ([48, 58, 65, 91, 95, 96,
+97, 101, 102, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 490, 120, 59], 2
+), ([48, 58, 65, 91, 95, 96, 97, 114, 115, 123, 256], [59, 120, 59, 120, 59,
+120, 59, 120, 491, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 110, 111, 123,
+256], [59, 120, 59, 120, 59, 120, 59, 120, 492, 120, 59], 2), ([48, 58, 65, 91,
+95, 96, 97, 98, 123, 256], [59, 120, 59, 120, 59, 120, 59, 493, 120, 59], 2), (
+[48, 58, 65, 91, 95, 96, 97, 108, 109, 123, 256], [59, 120, 59, 120, 59, 120,
+59, 120, 494, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 121, 122, 123, 256],
+[59, 120, 59, 120, 59, 120, 59, 120, 495, 120, 59], 2), ([48, 58, 65, 91, 95,
+96, 97, 115, 116, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 496, 120, 59
+], 2), ([48, 58, 65, 91, 95, 96, 97, 111, 112, 123, 256], [59, 120, 59, 120,
+59, 120, 59, 120, 497, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 115, 116,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 498, 120, 59], 2), ([48, 58,
+65, 91, 95, 96, 97, 99, 100, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120,
+499, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 101, 102, 123, 256], [59, 120,
+59, 120, 59, 120, 59, 120, 500, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 98,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 501, 120, 59], 2), ([48, 58, 65, 91,
+95, 96, 97, 114, 115, 123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 502, 120,
+59], 2), ([48, 58, 65, 91, 95, 96, 97, 108, 109, 123, 256], [59, 120, 59, 120,
+59, 120, 59, 120, 503, 120, 59], 2), ([48, 58, 65, 91, 95, 96, 97, 116, 117,
+123, 256], [59, 120, 59, 120, 59, 120, 59, 120, 504, 120, 59], 2)], [(0, []), (
+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, 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,
+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, 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,
+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, 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,
+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, 1), (1, 1), (1, 1), (1, 1), (2, 1, 0),
+(3, 1), (2, 1, 2), (3, 1), (2, 1, 4), (3, 1), (2, 1, 6), (3, 1), (2, 1, 8), (3,
+1), (2, 1, 10), (3, 1), (2, 1, 12), (3, 1), (2, 1, 14), (3, 1), (2, 1, 16), (3,
+1), (2, 1, 18), (3, 1), (2, 1, 20), (3, 1), (2, 1, 22), (3, 1), (2, 1, 24), (3,
+1), (2, 1, 26), (3, 1), (2, 1, 28), (3, 1), (2, 1, 30), (3, 1), (2, 1, 32), (3,
+1), (2, 1, 34), (3, 1), (2, 1, 36), (3, 1), (2, 1, 38), (3, 1), (2, 1, 40), (3,
+1), (2, 1, 42), (3, 1), (2, 1, 44), (3, 1), (2, 1, 46), (3, 1), (2, 1, 48), (3,
+1), (2, 1, 50), (3, 1), (2, 1, 52), (3, 1), (2, 1, 54), (3, 1), (2, 1, 56), (3,
+1), (2, 1, 58), (3, 1), (2, 1, 60), (3, 1), (2, 1, 62), (3, 1), (2, 1, 64), (3,
+1), (2, 1, 66), (3, 1), (2, 1, 68), (3, 1), (2, 1, 70), (3, 1), (2, 1, 72), (3,
+1), (2, 1, 74), (3, 1), (2, 1, 76), (3, 1), (2, 1, 78), (3, 1), (2, 1, 80), (3,
+1), (2, 1, 82), (3, 1), (2, 1, 84), (3, 1), (2, 1, 86), (3, 1), (2, 1, 88), (3,
+1), (2, 1, 90), (3, 1), (2, 1, 92), (3, 1), (2, 1, 94), (3, 1), (2, 1, 96), (2,
+1, 98), (2, 1, 100), (3, 1), (2, 1, 104), (2, 1, 106), (2, 1, 108), (2, 1, 110
+), (3, 1), (2, 1, 130), (2, 1, 132), (2, 1, 134), (3, 1), (2, 1, 154), (2, 1,
+156), (3, 1), (2, 1, 176), (2, 1, 178), (1, 1), (2, 1, 180), (2, 1, 182), (1, 1
+), (1, 1), (3, 1), (3, 1), (3, 1), (3, 1), (2, 1, 192), (2, 1, 194), (2, 1, 196
+), (3, 1), (2, 1, 208), (2, 1, 210), (1, 1), (2, 1, 212), (3, 1), (3, 1), (2,
+1, 226), (2, 1, 228), (2, 1, 230), (3, 1), (2, 1, 242), (2, 1, 244), (2, 1, 246
+), (2, 1, 248), (3, 1), (2, 1, 262), (2, 1, 264), (2, 1, 266), (2, 1, 268), (3,
+1), (2, 1, 284), (2, 1, 286), (2, 1, 288), (2, 1, 290), (3, 1), (2, 1, 304), (
+2, 1, 306), (1, 1), (2, 1, 308), (2, 1, 310), (1, 1), (1, 1), (1, 1), (3, 1), (
+3, 1), (3, 1), (3, 1), (3, 1), (2, 1, 322), (3, 1), (2, 1, 324), (3, 1), (2, 1,
+326), (3, 1), (2, 1, 328), (3, 1), (2, 1, 330), (3, 1), (2, 1, 332), (3, 1), (
+2, 1, 334), (3, 1), (2, 1, 336), (3, 1), (2, 1, 338), (3, 1), (2, 1, 340), (3,
+1), (2, 1, 342), (3, 1), (2, 1, 344), (3, 1), (2, 1, 346), (3, 1), (2, 1, 348),
+(3, 1), (2, 1, 350), (3, 1), (2, 1, 352), (3, 1), (2, 1, 354), (3, 1), (2, 1,
+356), (3, 1), (2, 1, 358), (3, 1), (2, 1, 360), (3, 1), (2, 1, 362), (3, 1), (
+2, 1, 364), (3, 1), (2, 1, 366), (3, 1), (2, 1, 368), (2, 1, 370), (1, 1), (3,
+1), (3, 1), (2, 1, 372), (2, 1, 374), (1, 1), (3, 1), (3, 1), (2, 1, 376), (3,
+1), (2, 1, 378), (3, 1), (2, 1, 380), (3, 1), (2, 1, 382), (3, 1), (2, 1, 384),
+(3, 1), (2, 1, 386), (2, 1, 388), (1, 1), (3, 1), (3, 1), (2, 1, 390), (2, 1,
+392), (1, 1), (3, 1), (3, 1), (2, 1, 394), (3, 1), (2, 1, 396), (3, 1), (2, 1,
+398), (3, 1), (2, 1, 400), (3, 1), (2, 1, 402), (3, 1), (2, 1, 404), (3, 1), (
+2, 1, 406), (3, 1), (2, 1, 408), (3, 1), (2, 1, 410), (3, 1), (2, 1, 412), (3,
+1), (2, 1, 414), (3, 1), (2, 1, 416), (3, 1), (2, 1, 418), (3, 1), (2, 1, 420),
+(3, 1), (2, 1, 422), (2, 1, 424), (3, 1), (2, 1, 426), (3, 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, 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, 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, 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, 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, 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, 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, 1), (1, 1), (1, 1), (2, 1, 0), (0, 1), (2, 1, 2), (0, 1), (
+2, 1, 4), (0, 1), (2, 1, 6), (0, 1), (2, 1, 8), (0, 1), (2, 1, 10), (0, 1), (2,
+1, 12), (0, 1), (2, 1, 14), (0, 1), (2, 1, 16), (0, 1), (2, 1, 18), (0, 1), (2,
+1, 20), (0, 1), (2, 1, 22), (0, 1), (2, 1, 24), (0, 1), (2, 1, 26), (0, 1), (2,
+1, 28), (0, 1), (2, 1, 30), (0, 1), (2, 1, 32), (0, 1), (2, 1, 34), (0, 1), (2,
+1, 36), (0, 1), (2, 1, 38), (0, 1), (2, 1, 40), (0, 1), (2, 1, 42), (0, 1), (2,
+1, 44), (0, 1), (2, 1, 46), (0, 1), (2, 1, 48), (0, 1), (2, 1, 50), (0, 1), (2,
+1, 52), (0, 1), (2, 1, 54), (0, 1), (2, 1, 56), (0, 1), (2, 1, 58), (0, 1), (2,
+1, 60), (0, 1), (2, 1, 62), (0, 1), (2, 1, 64), (0, 1), (2, 1, 66), (0, 1), (2,
+1, 68), (0, 1), (2, 1, 70), (0, 1), (2, 1, 72), (0, 1), (2, 1, 74), (0, 1), (2,
+1, 76), (0, 1), (2, 1, 78), (0, 1), (2, 1, 80), (0, 1), (2, 1, 82), (0, 1), (2,
+1, 84), (0, 1), (2, 1, 86), (0, 1), (2, 1, 88), (0, 1), (2, 1, 90), (0, 1), (2,
+1, 92), (0, 1), (2, 1, 94), (0, 1), (2, 1, 96), (2, 1, 98), (2, 1, 100), (0, 1
+), (2, 1, 104), (2, 1, 106), (2, 1, 108), (2, 1, 110), (0, 1), (2, 1, 130), (2,
+1, 132), (2, 1, 134), (0, 1), (2, 1, 154), (2, 1, 156), (0, 1), (2, 1, 176), (
+2, 1, 178), (1, 1), (2, 1, 180), (2, 1, 182), (1, 1), (1, 1), (0, 1), (0, 1), (
+0, 1), (0, 1), (2, 1, 192), (2, 1, 194), (2, 1, 196), (0, 1), (2, 1, 208), (2,
+1, 210), (1, 1), (2, 1, 212), (0, 1), (0, 1), (2, 1, 226), (2, 1, 228), (2, 1,
+230), (0, 1), (2, 1, 242), (2, 1, 244), (2, 1, 246), (2, 1, 248), (0, 1), (2,
+1, 262), (2, 1, 264), (2, 1, 266), (2, 1, 268), (0, 1), (2, 1, 284), (2, 1, 286
+), (2, 1, 288), (2, 1, 290), (0, 1), (2, 1, 304), (2, 1, 306), (1, 1), (2, 1,
+308), (2, 1, 310), (1, 1), (1, 1), (1, 1), (0, 1), (0, 1), (0, 1), (0, 1), (0,
+1), (2, 1, 322), (0, 1), (2, 1, 324), (0, 1), (2, 1, 326), (0, 1), (2, 1, 328),
+(0, 1), (2, 1, 330), (0, 1), (2, 1, 332), (0, 1), (2, 1, 334), (0, 1), (2, 1,
+336), (0, 1), (2, 1, 338), (0, 1), (2, 1, 340), (0, 1), (2, 1, 342), (0, 1), (
+2, 1, 344), (0, 1), (2, 1, 346), (0, 1), (2, 1, 348), (0, 1), (2, 1, 350), (0,
+1), (2, 1, 352), (0, 1), (2, 1, 354), (0, 1), (2, 1, 356), (0, 1), (2, 1, 358),
+(0, 1), (2, 1, 360), (0, 1), (2, 1, 362), (0, 1), (2, 1, 364), (0, 1), (2, 1,
+366), (0, 1), (2, 1, 368), (2, 1, 370), (1, 1), (0, 1), (0, 1), (2, 1, 372), (
+2, 1, 374), (1, 1), (0, 1), (0, 1), (2, 1, 376), (0, 1), (2, 1, 378), (0, 1), (
+2, 1, 380), (0, 1), (2, 1, 382), (0, 1), (2, 1, 384), (0, 1), (2, 1, 386), (2,
+1, 388), (1, 1), (0, 1), (0, 1), (2, 1, 390), (2, 1, 392), (1, 1), (0, 1), (0,
+1), (2, 1, 394), (0, 1), (2, 1, 396), (0, 1), (2, 1, 398), (0, 1), (2, 1, 400),
+(0, 1), (2, 1, 402), (0, 1), (2, 1, 404), (0, 1), (2, 1, 406), (0, 1), (2, 1,
+408), (0, 1), (2, 1, 410), (0, 1), (2, 1, 412), (0, 1), (2, 1, 414), (0, 1), (
+2, 1, 416), (0, 1), (2, 1, 418), (0, 1), (2, 1, 420), (0, 1), (2, 1, 422), (2,
+1, 424), (0, 1), (2, 1, 426), (0, 1)]), (0, [(1, 120), (0, 119), (2, 1, 427), (
+0, 120), (2, 1, 427), (3, 1)]), (2, [(1, 120), (0, 118), (2, 1, 425), (1, 1), (
+2, 1, 424), (3, 1), (2, 1, 423), (0, 1), (2, 1, 427), (0, 119), (2, 1, 425), (
+1, 1), (2, 1, 424), (0, 1), (2, 1, 423), (3, 1), (2, 1, 427), (0, 1)]), (2, [(
+1, 120), (0, 118), (2, 1, 425), (1, 1), (2, 1, 424), (3, 1), (2, 1, 423), (0,
+120), (2, 1, 425), (1, 1), (2, 1, 424), (0, 1), (2, 1, 423), (3, 1), (0, 1)]),
+(3, [(1, 120), (0, 89), (3, 1), (0, 16), (2, 1, 399), (0, 13), (2, 1, 427), (0,
+107), (2, 1, 399), (3, 1), (0, 12), (2, 1, 427), (0, 1)]), (4, [(1, 120), (0,
+67), (1, 1), (2, 1, 312), (1, 1), (3, 1), (2, 1, 314), (2, 1, 316), (3, 2), (0,
+51), (2, 1, 427), (0, 68), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314), (
+2, 1, 316), (0, 53), (2, 1, 427), (3, 1)]), (5, [(1, 120), (0, 75), (3, 1), (0,
+18), (3, 1), (0, 17), (2, 1, 411), (0, 7), (2, 1, 427), (0, 113), (2, 1, 411),
+(3, 1), (0, 6), (2, 1, 427), (0, 1)]), (6, [(1, 120), (0, 76), (3, 1), (0, 7),
+(3, 1), (0, 20), (2, 1, 397), (0, 14), (2, 1, 427), (0, 106), (2, 1, 397), (3,
+1), (0, 13), (2, 1, 427), (0, 1)]), (7, [(1, 120), (0, 55), (2, 1, 184), (1, 1
+), (3, 1), (2, 1, 186), (2, 1, 188), (3, 1), (0, 63), (2, 1, 427), (0, 56), (2,
+1, 184), (1, 1), (0, 1), (2, 1, 186), (2, 1, 188), (0, 64), (2, 1, 427), (3, 1)
+]), (0, [(1, 120), (0, 98), (2, 1, 383), (0, 21), (2, 1, 427), (0, 99), (2, 1,
+383), (3, 1), (0, 20), (2, 1, 427), (0, 1)]), (0, [(1, 120), (0, 99), (2, 1,
+385), (0, 20), (2, 1, 427), (0, 100), (2, 1, 385), (3, 1), (0, 19), (2, 1, 427
+), (0, 1)]), (8, [(1, 120), (0, 73), (3, 1), (0, 36), (2, 1, 407), (0, 9), (2,
+1, 427), (0, 111), (2, 1, 407), (3, 1), (0, 8), (2, 1, 427), (0, 1)]), (9, [(1,
+120), (0, 71), (3, 1), (0, 9), (3, 1), (0, 27), (2, 1, 405), (0, 10), (2, 1,
+427), (0, 110), (2, 1, 405), (3, 1), (0, 9), (2, 1, 427), (0, 1)]), (0, [(1,
+120), (0, 95), (2, 1, 377), (0, 24), (2, 1, 427), (0, 96), (2, 1, 377), (3, 1),
+(0, 23), (2, 1, 427), (0, 1)]), (10, [(1, 120), (0, 72), (3, 1), (0, 9), (3, 2
+), (0, 24), (2, 1, 403), (0, 11), (2, 1, 427), (0, 109), (2, 1, 403), (3, 1), (
+0, 10), (2, 1, 427), (0, 1)]), (11, [(1, 120), (0, 58), (2, 1, 214), (3, 1), (
+0, 9), (3, 1), (0, 35), (2, 1, 395), (0, 15), (2, 1, 427), (0, 59), (2, 1, 214
+), (0, 46), (2, 1, 395), (3, 1), (0, 14), (2, 1, 427), (0, 1)]), (12, [(1, 120
+), (3, 2), (0, 72), (3, 1), (0, 36), (2, 1, 409), (0, 8), (2, 1, 427), (0, 112
+), (2, 1, 409), (3, 1), (0, 7), (2, 1, 427), (0, 1)]), (13, [(1, 120), (0, 49),
+(3, 1), (0, 1), (1, 1), (2, 1, 158), (3, 1), (1, 1), (2, 1, 160), (2, 1, 162),
+(1, 1), (2, 1, 164), (2, 1, 166), (1, 1), (3, 2), (2, 1, 170), (2, 1, 172), (1,
+1), (1, 1), (1, 1), (3, 4), (2, 1, 157), (2, 1, 155), (0, 5), (2, 1, 197), (1,
+1), (2, 1, 196), (3, 1), (2, 1, 198), (2, 1, 200), (3, 1), (2, 1, 213), (1, 1),
+(2, 1, 212), (3, 2), (0, 1), (2, 1, 231), (1, 1), (2, 1, 230), (3, 5), (0, 56),
+(2, 1, 427), (0, 52), (1, 1), (2, 1, 158), (0, 1), (1, 1), (2, 1, 160), (2, 1,
+162), (1, 1), (2, 1, 164), (2, 1, 166), (1, 1), (0, 2), (2, 1, 170), (2, 1, 172
+), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 157), (2, 1, 155), (3, 1), (0, 4), (
+2, 1, 197), (1, 1), (2, 1, 196), (0, 1), (2, 1, 198), (2, 1, 200), (0, 1), (2,
+1, 213), (1, 1), (2, 1, 212), (0, 3), (2, 1, 231), (1, 1), (2, 1, 230), (0, 61
+), (2, 1, 427), (0, 1)]), (14, [(1, 120), (0, 50), (2, 1, 135), (1, 1), (2, 1,
+136), (3, 1), (1, 1), (2, 1, 138), (2, 1, 140), (1, 1), (2, 1, 142), (2, 1, 144
+), (1, 1), (3, 2), (2, 1, 148), (2, 1, 150), (1, 1), (1, 1), (1, 1), (3, 4), (
+2, 1, 133), (2, 1, 131), (0, 6), (2, 1, 197), (1, 1), (2, 1, 196), (3, 1), (2,
+1, 198), (2, 1, 200), (3, 1), (2, 1, 213), (1, 1), (2, 1, 212), (3, 2), (0, 1),
+(2, 1, 231), (1, 1), (2, 1, 230), (3, 2), (0, 59), (2, 1, 427), (0, 51), (2, 1,
+135), (1, 1), (2, 1, 136), (0, 1), (1, 1), (2, 1, 138), (2, 1, 140), (1, 1), (
+2, 1, 142), (2, 1, 144), (1, 1), (0, 2), (2, 1, 148), (2, 1, 150), (1, 1), (1,
+1), (1, 1), (0, 4), (2, 1, 133), (2, 1, 131), (3, 1), (0, 5), (2, 1, 197), (1,
+1), (2, 1, 196), (0, 1), (2, 1, 198), (2, 1, 200), (0, 1), (2, 1, 213), (1, 1),
+(2, 1, 212), (0, 3), (2, 1, 231), (1, 1), (2, 1, 230), (0, 61), (2, 1, 427), (
+0, 1)]), (15, [(1, 120), (0, 96), (2, 1, 379), (0, 7), (3, 1), (0, 15), (2, 1,
+427), (0, 97), (2, 1, 379), (3, 1), (0, 22), (2, 1, 427), (0, 1)]), (0, [(1,
+120), (0, 90), (2, 1, 367), (0, 29), (2, 1, 427), (0, 91), (2, 1, 367), (3, 1),
+(0, 28), (2, 1, 427), (0, 1)]), (16, [(1, 120), (0, 70), (3, 1), (0, 9), (3, 1
+), (0, 5), (3, 1), (0, 5), (3, 1), (0, 8), (3, 1), (0, 11), (2, 1, 413), (0, 6
+), (2, 1, 427), (0, 114), (2, 1, 413), (3, 1), (0, 5), (2, 1, 427), (0, 1)]), (
+17, [(1, 120), (0, 88), (3, 1), (0, 8), (2, 1, 381), (0, 22), (2, 1, 427), (0,
+98), (2, 1, 381), (3, 1), (0, 21), (2, 1, 427), (0, 1)]), (18, [(1, 120), (0,
+69), (3, 1), (0, 9), (3, 1), (0, 7), (3, 1), (0, 26), (2, 1, 415), (0, 5), (2,
+1, 427), (0, 115), (2, 1, 415), (3, 1), (0, 4), (2, 1, 427), (0, 1)]), (0, [(1,
+120), (0, 117), (2, 1, 421), (0, 2), (2, 1, 427), (0, 118), (2, 1, 421), (3, 1
+), (0, 1), (2, 1, 427), (0, 1)]), (19, [(1, 120), (0, 48), (2, 1, 101), (1, 1),
+(2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 71), (2, 1, 427), (0, 49), (2,
+1, 101), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 70),
+(2, 1, 427), (0, 1)]), (20, [(1, 120), (0, 48), (2, 1, 101), (1, 1), (2, 1, 102
+), (3, 1), (2, 1, 99), (2, 1, 97), (0, 6), (2, 1, 183), (2, 1, 181), (3, 1), (
+0, 11), (2, 1, 311), (2, 1, 309), (3, 1), (0, 52), (2, 1, 427), (0, 49), (2, 1,
+101), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 5), (2,
+1, 183), (2, 1, 181), (0, 12), (2, 1, 311), (2, 1, 309), (0, 53), (2, 1, 427),
+(0, 1)]), (20, [(1, 120), (0, 48), (2, 1, 101), (1, 1), (2, 1, 102), (3, 1), (
+2, 1, 99), (2, 1, 97), (0, 5), (2, 1, 183), (2, 1, 181), (3, 1), (0, 11), (2,
+1, 311), (2, 1, 309), (3, 1), (0, 53), (2, 1, 427), (0, 49), (2, 1, 101), (1, 1
+), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 4), (2, 1, 183), (
+2, 1, 181), (0, 12), (2, 1, 311), (2, 1, 309), (0, 54), (2, 1, 427), (0, 1)]),
+(0, [(1, 120), (0, 100), (2, 1, 389), (2, 1, 387), (0, 19), (2, 1, 427), (0,
+101), (2, 1, 389), (2, 1, 387), (3, 1), (0, 18), (2, 1, 427), (0, 1)]), (0, [(
+1, 120), (0, 102), (2, 1, 393), (2, 1, 391), (0, 17), (2, 1, 427), (0, 103), (
+2, 1, 393), (2, 1, 391), (3, 1), (0, 16), (2, 1, 427), (0, 1)]), (21, [(1, 120
+), (0, 77), (3, 1), (0, 37), (2, 1, 417), (0, 4), (2, 1, 427), (0, 116), (2, 1,
+417), (3, 1), (0, 3), (2, 1, 427), (0, 1)]), (22, [(1, 120), (0, 36), (3, 11),
+(0, 1), (2, 1, 101), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0,
+71), (2, 1, 427), (0, 49), (2, 1, 101), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99
+), (2, 1, 97), (3, 1), (0, 70), (2, 1, 427), (0, 1)]), (23, [(1, 120), (0, 2),
+(3, 1), (0, 45), (2, 1, 101), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1,
+97), (0, 71), (2, 1, 427), (0, 49), (2, 1, 101), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (3, 1), (0, 70), (2, 1, 427), (0, 1)]), (24, [(1, 120),
+(0, 3), (3, 1), (0, 44), (2, 1, 101), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99),
+(2, 1, 97), (0, 71), (2, 1, 427), (0, 49), (2, 1, 101), (1, 1), (2, 1, 102), (
+0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 70), (2, 1, 427), (0, 1)]), (25, [(
+1, 120), (0, 4), (3, 4), (0, 40), (2, 1, 101), (1, 1), (2, 1, 102), (3, 1), (2,
+1, 99), (2, 1, 97), (0, 71), (2, 1, 427), (0, 49), (2, 1, 101), (1, 1), (2, 1,
+102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 70), (2, 1, 427), (0, 1)]), (
+26, [(1, 120), (0, 8), (3, 3), (0, 37), (2, 1, 101), (1, 1), (2, 1, 102), (3, 1
+), (2, 1, 99), (2, 1, 97), (0, 71), (2, 1, 427), (0, 49), (2, 1, 101), (1, 1),
+(2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 70), (2, 1, 427), (0,
+1)]), (27, [(1, 120), (0, 11), (3, 3), (0, 34), (2, 1, 101), (1, 1), (2, 1, 102
+), (3, 1), (2, 1, 99), (2, 1, 97), (0, 71), (2, 1, 427), (0, 49), (2, 1, 101),
+(1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 70), (2, 1,
+427), (0, 1)]), (28, [(1, 120), (0, 14), (3, 2), (0, 32), (2, 1, 101), (1, 1),
+(2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 71), (2, 1, 427), (0, 49), (2,
+1, 101), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 70),
+(2, 1, 427), (0, 1)]), (29, [(1, 120), (0, 16), (3, 1), (0, 31), (2, 1, 101), (
+1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 71), (2, 1, 427), (0,
+49), (2, 1, 101), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1),
+(0, 70), (2, 1, 427), (0, 1)]), (30, [(1, 120), (0, 17), (3, 3), (0, 28), (2,
+1, 101), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 71), (2, 1,
+427), (0, 49), (2, 1, 101), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97
+), (3, 1), (0, 70), (2, 1, 427), (0, 1)]), (31, [(1, 120), (0, 20), (3, 1), (0,
+27), (2, 1, 101), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 71),
+(2, 1, 427), (0, 49), (2, 1, 101), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2,
+1, 97), (3, 1), (0, 70), (2, 1, 427), (0, 1)]), (32, [(1, 120), (0, 21), (3, 3
+), (0, 24), (2, 1, 101), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (
+0, 71), (2, 1, 427), (0, 49), (2, 1, 101), (1, 1), (2, 1, 102), (0, 1), (2, 1,
+99), (2, 1, 97), (3, 1), (0, 70), (2, 1, 427), (0, 1)]), (33, [(1, 120), (0, 24
+), (3, 6), (0, 17), (3, 1), (2, 1, 101), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99
+), (2, 1, 97), (0, 71), (2, 1, 427), (0, 49), (2, 1, 101), (1, 1), (2, 1, 102),
+(0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 70), (2, 1, 427), (0, 1)]), (34, [(
+1, 120), (0, 30), (3, 1), (0, 17), (2, 1, 101), (1, 1), (2, 1, 102), (3, 1), (
+2, 1, 99), (2, 1, 97), (0, 71), (2, 1, 427), (0, 49), (2, 1, 101), (1, 1), (2,
+1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 70), (2, 1, 427), (0, 1)]
+), (35, [(1, 120), (0, 31), (3, 2), (0, 15), (2, 1, 101), (1, 1), (2, 1, 102),
+(3, 1), (2, 1, 99), (2, 1, 97), (0, 4), (2, 1, 183), (2, 1, 181), (3, 1), (0,
+10), (3, 1), (2, 1, 311), (2, 1, 309), (3, 1), (0, 54), (2, 1, 427), (0, 49), (
+2, 1, 101), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 3
+), (2, 1, 183), (2, 1, 181), (0, 12), (2, 1, 311), (2, 1, 309), (0, 55), (2, 1,
+427), (0, 1)]), (36, [(1, 120), (0, 33), (3, 2), (0, 13), (2, 1, 101), (1, 1),
+(2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 71), (2, 1, 427), (0, 49), (2,
+1, 101), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 70),
+(2, 1, 427), (0, 1)]), (37, [(1, 120), (0, 35), (3, 1), (0, 12), (2, 1, 101), (
+1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 71), (2, 1, 427), (0,
+49), (2, 1, 101), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1),
+(0, 70), (2, 1, 427), (0, 1)]), (0, [(1, 120), (0, 91), (2, 1, 371), (2, 1, 369
+), (0, 28), (2, 1, 427), (0, 92), (2, 1, 371), (2, 1, 369), (3, 1), (0, 27), (
+2, 1, 427), (0, 1)]), (38, [(1, 120), (0, 78), (3, 1), (0, 6), (3, 1), (0, 30),
+(2, 1, 419), (0, 3), (2, 1, 427), (0, 117), (2, 1, 419), (3, 1), (0, 2), (2, 1,
+427), (0, 1)]), (0, [(1, 120), (0, 93), (2, 1, 375), (2, 1, 373), (0, 26), (2,
+1, 427), (0, 94), (2, 1, 375), (2, 1, 373), (3, 1), (0, 25), (2, 1, 427), (0, 1
+)]), (0, [(1, 120), (0, 107), (2, 1, 401), (0, 12), (2, 1, 427), (0, 108), (2,
+1, 401), (3, 1), (0, 11), (2, 1, 427), (0, 1)]), (0, [(1, 1), (0, 2), (3, 1)]),
+(2, [(1, 1), (2, 1, 425), (1, 1), (2, 1, 424), (3, 1), (2, 1, 423), (0, 1), (2,
+1, 425), (1, 1), (2, 1, 424), (0, 1), (2, 1, 423), (3, 1), (0, 1)]), (0, [(1, 1
+), (2, 1, 365), (0, 1), (2, 1, 365), (3, 1), (0, 1)]), (4, [(1, 3), (2, 1, 313
+), (1, 1), (2, 1, 312), (1, 1), (3, 1), (2, 1, 314), (2, 1, 316), (3, 2), (0, 2
+), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314), (2, 1, 316),
+(0, 4), (3, 1)]), (0, [(1, 3), (0, 6), (3, 1)]), (39, [(1, 3), (0, 2), (1, 1),
+(2, 1, 320), (3, 1), (2, 1, 307), (1, 1), (2, 1, 306), (1, 1), (2, 1, 308), (2,
+1, 310), (1, 1), (1, 1), (1, 1), (3, 5), (2, 1, 305), (0, 3), (1, 1), (2, 1,
+320), (0, 1), (2, 1, 307), (1, 1), (2, 1, 306), (1, 1), (2, 1, 308), (2, 1, 310
+), (1, 1), (1, 1), (1, 1), (0, 5), (2, 1, 305), (3, 1), (0, 1)]), (40, [(1, 3),
+(0, 1), (2, 1, 318), (1, 1), (1, 1), (3, 3), (0, 2), (2, 1, 318), (1, 1), (1, 1
+), (0, 4), (3, 1)]), (0, [(1, 2), (0, 4), (3, 1)]), (0, [(1, 2), (2, 1, 337), (
+0, 2), (2, 1, 337), (3, 1), (0, 2)]), (0, [(1, 2), (0, 1), (2, 1, 375), (2, 1,
+373), (0, 2), (2, 1, 375), (2, 1, 373), (3, 1), (0, 1)]), (0, [(1, 2), (0, 1),
+(2, 1, 355), (0, 2), (2, 1, 355), (3, 1), (0, 1)]), (0, [(1, 2), (2, 1, 339), (
+0, 2), (2, 1, 339), (3, 1), (0, 2)]), (41, [(1, 2), (2, 1, 185), (1, 1), (2, 1,
+184), (1, 1), (3, 1), (2, 1, 186), (2, 1, 188), (3, 2), (0, 1), (2, 1, 185), (
+1, 1), (2, 1, 184), (1, 1), (0, 1), (2, 1, 186), (2, 1, 188), (0, 3), (3, 1)]),
+(42, [(1, 2), (0, 1), (2, 1, 190), (1, 1), (1, 1), (3, 3), (0, 1), (2, 1, 190),
+(1, 1), (1, 1), (0, 3), (3, 1)]), (0, [(1, 1), (2, 1, 333), (0, 1), (2, 1, 333
+), (3, 1), (0, 1)]), (0, [(1, 2), (0, 1), (2, 1, 349), (0, 2), (2, 1, 349), (3,
+1), (0, 1)]), (0, [(1, 2), (2, 1, 329), (0, 2), (2, 1, 329), (3, 1), (0, 2)]),
+(0, [(1, 3), (0, 1), (2, 1, 351), (0, 3), (2, 1, 351), (3, 1), (0, 2)]), (0, [(
+1, 3), (2, 1, 331), (0, 3), (2, 1, 331), (3, 1), (0, 3)]), (0, [(1, 3), (0, 2),
+(2, 1, 353), (0, 3), (2, 1, 353), (3, 1), (0, 1)]), (43, [(1, 2), (0, 1), (3, 1
+), (0, 2), (3, 1)]), (44, [(1, 2), (2, 1, 215), (1, 1), (2, 1, 214), (3, 1), (
+1, 1), (2, 1, 216), (2, 1, 218), (3, 1), (1, 1), (2, 1, 222), (2, 1, 224), (1,
+1), (1, 1), (1, 1), (3, 4), (2, 1, 211), (2, 1, 209), (0, 2), (2, 1, 215), (1,
+1), (2, 1, 214), (0, 1), (1, 1), (2, 1, 216), (2, 1, 218), (0, 1), (1, 1), (2,
+1, 222), (2, 1, 224), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 211), (2, 1, 209),
+(3, 1), (0, 2)]), (0, [(1, 3), (2, 1, 1), (0, 3), (2, 1, 1), (3, 1), (0, 3)]),
+(45, [(1, 3), (0, 1), (1, 1), (3, 1), (2, 1, 3), (0, 3), (1, 1), (0, 1), (2, 1,
+3), (3, 1), (0, 2)]), (0, [(1, 3), (0, 2), (2, 1, 335), (0, 3), (2, 1, 335), (
+3, 1), (0, 1)]), (0, [(1, 17), (0, 34), (3, 1)]), (46, [(1, 17), (0, 11), (2,
+1, 214), (3, 1), (0, 1), (1, 1), (2, 1, 232), (2, 1, 234), (3, 1), (1, 1), (2,
+1, 238), (2, 1, 240), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 229), (2, 1, 227),
+(0, 15), (2, 1, 214), (0, 2), (1, 1), (2, 1, 232), (2, 1, 234), (0, 1), (1, 1),
+(2, 1, 238), (2, 1, 240), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 229), (2, 1,
+227), (3, 1), (0, 4)]), (47, [(1, 17), (0, 1), (2, 1, 159), (1, 1), (2, 1, 158
+), (3, 1), (1, 1), (2, 1, 160), (2, 1, 162), (1, 1), (2, 1, 164), (2, 1, 166),
+(1, 1), (3, 2), (2, 1, 170), (2, 1, 172), (1, 1), (1, 1), (1, 1), (3, 4), (2,
+1, 157), (2, 1, 155), (0, 7), (2, 1, 197), (1, 1), (2, 1, 196), (3, 1), (2, 1,
+198), (2, 1, 200), (3, 1), (0, 1), (2, 1, 213), (1, 1), (2, 1, 212), (3, 2), (
+0, 1), (2, 1, 231), (1, 1), (2, 1, 230), (3, 2), (0, 5), (2, 1, 159), (1, 1), (
+2, 1, 158), (0, 1), (1, 1), (2, 1, 160), (2, 1, 162), (1, 1), (2, 1, 164), (2,
+1, 166), (1, 1), (0, 2), (2, 1, 170), (2, 1, 172), (1, 1), (1, 1), (1, 1), (0,
+4), (2, 1, 157), (2, 1, 155), (3, 1), (0, 6), (2, 1, 197), (1, 1), (2, 1, 196),
+(0, 1), (2, 1, 198), (2, 1, 200), (0, 2), (2, 1, 213), (1, 1), (2, 1, 212), (0,
+3), (2, 1, 231), (1, 1), (2, 1, 230), (0, 7)]), (48, [(1, 17), (0, 8), (2, 1,
+197), (1, 1), (2, 1, 196), (3, 1), (2, 1, 198), (2, 1, 200), (3, 1), (0, 1), (
+2, 1, 213), (1, 1), (2, 1, 212), (3, 2), (0, 1), (2, 1, 231), (1, 1), (2, 1,
+230), (3, 2), (0, 12), (2, 1, 197), (1, 1), (2, 1, 196), (0, 1), (2, 1, 198), (
+2, 1, 200), (0, 2), (2, 1, 213), (1, 1), (2, 1, 212), (0, 3), (2, 1, 231), (1,
+1), (2, 1, 230), (0, 6), (3, 1)]), (49, [(1, 17), (0, 9), (1, 1), (3, 1), (2,
+1, 202), (3, 1), (0, 16), (1, 1), (0, 1), (2, 1, 202), (0, 8), (3, 1)]), (50, [
+(1, 17), (0, 5), (2, 1, 173), (1, 1), (2, 1, 174), (1, 1), (3, 2), (2, 1, 171),
+(2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (0, 2), (3, 1), (0, 14), (
+2, 1, 173), (1, 1), (2, 1, 174), (1, 1), (0, 2), (2, 1, 171), (2, 1, 163), (2,
+1, 161), (2, 1, 157), (2, 1, 155), (3, 1), (0, 12)]), (51, [(1, 17), (0, 3), (
+2, 1, 167), (1, 1), (2, 1, 168), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 165), (
+2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (0, 17), (2, 1, 167), (1, 1
+), (2, 1, 168), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 165), (2, 1, 163), (2,
+1, 161), (2, 1, 157), (2, 1, 155), (3, 1), (0, 14)]), (52, [(1, 17), (2, 1, 111
+), (2, 1, 109), (2, 1, 112), (3, 1), (0, 13), (2, 1, 249), (2, 1, 247), (2, 1,
+250), (3, 1), (2, 1, 269), (2, 1, 267), (1, 1), (2, 1, 270), (3, 2), (2, 1, 291
+), (2, 1, 289), (2, 1, 292), (3, 1), (2, 1, 111), (2, 1, 109), (2, 1, 112), (0,
+14), (2, 1, 249), (2, 1, 247), (2, 1, 250), (0, 1), (2, 1, 269), (2, 1, 267), (
+1, 1), (2, 1, 270), (0, 2), (2, 1, 291), (2, 1, 289), (2, 1, 292), (0, 1), (3,
+1)]), (53, [(1, 17), (0, 4), (2, 1, 173), (1, 1), (2, 1, 174), (1, 1), (3, 2),
+(2, 1, 171), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (0, 2), (3, 1
+), (0, 14), (2, 1, 173), (1, 1), (2, 1, 174), (1, 1), (0, 2), (2, 1, 171), (2,
+1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (3, 1), (0, 13)]), (51, [(1, 17
+), (0, 2), (2, 1, 167), (1, 1), (2, 1, 168), (1, 1), (1, 1), (1, 1), (3, 4), (
+2, 1, 165), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (0, 17), (2, 1,
+167), (1, 1), (2, 1, 168), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 165), (2, 1,
+163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (3, 1), (0, 15)]), (0, [(1, 13), (
+0, 26), (3, 1)]), (46, [(1, 13), (0, 10), (2, 1, 214), (3, 1), (0, 1), (1, 1),
+(2, 1, 232), (2, 1, 234), (3, 1), (1, 1), (2, 1, 238), (2, 1, 240), (1, 1), (1,
+1), (1, 1), (3, 4), (2, 1, 229), (2, 1, 227), (0, 11), (2, 1, 214), (0, 2), (1,
+1), (2, 1, 232), (2, 1, 234), (0, 1), (1, 1), (2, 1, 238), (2, 1, 240), (1, 1),
+(1, 1), (1, 1), (0, 4), (2, 1, 229), (2, 1, 227), (3, 1), (0, 1)]), (14, [(1,
+13), (2, 1, 137), (1, 1), (2, 1, 136), (3, 1), (1, 1), (2, 1, 138), (2, 1, 140
+), (1, 1), (2, 1, 142), (2, 1, 144), (1, 1), (3, 2), (2, 1, 148), (2, 1, 150),
+(1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 133), (2, 1, 131), (0, 7), (2, 1, 197),
+(1, 1), (2, 1, 196), (3, 1), (2, 1, 198), (2, 1, 200), (3, 1), (0, 1), (2, 1,
+213), (1, 1), (2, 1, 212), (3, 2), (0, 1), (2, 1, 231), (1, 1), (2, 1, 230), (
+3, 2), (0, 1), (2, 1, 137), (1, 1), (2, 1, 136), (0, 1), (1, 1), (2, 1, 138), (
+2, 1, 140), (1, 1), (2, 1, 142), (2, 1, 144), (1, 1), (0, 2), (2, 1, 148), (2,
+1, 150), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 133), (2, 1, 131), (3, 1), (0,
+6), (2, 1, 197), (1, 1), (2, 1, 196), (0, 1), (2, 1, 198), (2, 1, 200), (0, 2),
+(2, 1, 213), (1, 1), (2, 1, 212), (0, 3), (2, 1, 231), (1, 1), (2, 1, 230), (0,
+4)]), (49, [(1, 13), (0, 8), (1, 1), (3, 1), (2, 1, 202), (3, 1), (0, 12), (1,
+1), (0, 1), (2, 1, 202), (0, 5), (3, 1)]), (54, [(1, 13), (0, 4), (2, 1, 151),
+(1, 1), (2, 1, 152), (1, 1), (3, 2), (2, 1, 149), (2, 1, 141), (2, 1, 139), (2,
+1, 133), (2, 1, 131), (0, 2), (3, 1), (0, 10), (2, 1, 151), (1, 1), (2, 1, 152
+), (1, 1), (0, 2), (2, 1, 149), (2, 1, 141), (2, 1, 139), (2, 1, 133), (2, 1,
+131), (3, 1), (0, 9)]), (55, [(1, 13), (0, 2), (2, 1, 145), (1, 1), (2, 1, 146
+), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 143), (2, 1, 141), (2, 1, 139), (2,
+1, 133), (2, 1, 131), (0, 13), (2, 1, 145), (1, 1), (2, 1, 146), (1, 1), (1, 1
+), (1, 1), (0, 4), (2, 1, 143), (2, 1, 141), (2, 1, 139), (2, 1, 133), (2, 1,
+131), (3, 1), (0, 11)]), (56, [(1, 13), (0, 3), (2, 1, 151), (1, 1), (2, 1, 152
+), (1, 1), (3, 2), (2, 1, 149), (2, 1, 141), (2, 1, 139), (2, 1, 133), (2, 1,
+131), (0, 2), (3, 1), (0, 10), (2, 1, 151), (1, 1), (2, 1, 152), (1, 1), (0, 2
+), (2, 1, 149), (2, 1, 141), (2, 1, 139), (2, 1, 133), (2, 1, 131), (3, 1), (0,
+10)]), (55, [(1, 13), (0, 1), (2, 1, 145), (1, 1), (2, 1, 146), (1, 1), (1, 1),
+(1, 1), (3, 4), (2, 1, 143), (2, 1, 141), (2, 1, 139), (2, 1, 133), (2, 1, 131
+), (0, 13), (2, 1, 145), (1, 1), (2, 1, 146), (1, 1), (1, 1), (1, 1), (0, 4), (
+2, 1, 143), (2, 1, 141), (2, 1, 139), (2, 1, 133), (2, 1, 131), (3, 1), (0, 12)
+]), (0, [(1, 1), (2, 1, 393), (2, 1, 391), (0, 1), (2, 1, 393), (2, 1, 391), (
+3, 1), (0, 1)]), (0, [(1, 5), (0, 10), (3, 1)]), (0, [(1, 5), (0, 3), (2, 1,
+371), (2, 1, 369), (0, 5), (2, 1, 371), (2, 1, 369), (3, 1), (0, 2)]), (0, [(1,
+5), (0, 4), (2, 1, 389), (2, 1, 387), (0, 5), (2, 1, 389), (2, 1, 387), (3, 1),
+(0, 1)]), (57, [(1, 5), (3, 1), (2, 1, 347), (0, 5), (2, 1, 347), (3, 1), (0, 4
+)]), (0, [(1, 5), (0, 2), (2, 1, 359), (0, 5), (2, 1, 359), (3, 1), (0, 3)]), (
+0, [(1, 1), (2, 1, 363), (0, 1), (2, 1, 363), (3, 1), (0, 1)]), (0, [(1, 3), (
+0, 2), (2, 1, 361), (0, 3), (2, 1, 361), (3, 1), (0, 1)]), (58, [(1, 3), (3, 1
+), (2, 1, 345), (0, 3), (2, 1, 345), (3, 1), (0, 2)]), (19, [(1, 1), (2, 1, 103
+), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 103), (
+1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (4, [(1,
+3), (0, 2), (1, 1), (2, 1, 312), (1, 1), (3, 1), (2, 1, 314), (2, 1, 316), (3,
+2), (0, 2), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314), (2, 1, 316), (0,
+2), (3, 1)]), (7, [(1, 3), (0, 1), (2, 1, 184), (1, 1), (3, 1), (2, 1, 186), (
+2, 1, 188), (3, 1), (0, 2), (2, 1, 184), (1, 1), (0, 1), (2, 1, 186), (2, 1,
+188), (0, 2), (3, 1)]), (19, [(1, 3), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1),
+(2, 1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2,
+1, 99), (2, 1, 97), (3, 1), (0, 3)]), (0, [(1, 1), (2, 1, 341), (0, 1), (2, 1,
+341), (3, 1), (0, 1)]), (0, [(1, 12), (0, 24), (3, 1)]), (19, [(1, 12), (0, 11
+), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 12), (
+2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)
+]), (59, [(1, 12), (3, 3), (0, 8), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (
+2, 1, 99), (2, 1, 97), (0, 12), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2,
+1, 99), (2, 1, 97), (3, 1), (0, 1)]), (60, [(1, 12), (0, 3), (3, 1), (0, 7), (
+2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 12), (2,
+1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]),
+(61, [(1, 12), (0, 4), (3, 1), (0, 6), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1
+), (2, 1, 99), (2, 1, 97), (0, 12), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (62, [(1, 12), (0, 5), (3, 1), (0, 5),
+(2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 12), (2,
+1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]),
+(63, [(1, 12), (0, 6), (3, 1), (0, 4), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1
+), (2, 1, 99), (2, 1, 97), (0, 12), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (64, [(1, 12), (0, 7), (3, 1), (0, 3),
+(2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 12), (2,
+1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]),
+(65, [(1, 12), (0, 8), (3, 1), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1
+), (2, 1, 99), (2, 1, 97), (0, 12), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (66, [(1, 12), (0, 9), (3, 1), (0, 1),
+(2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 12), (2,
+1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]),
+(67, [(1, 12), (0, 10), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2,
+1, 99), (2, 1, 97), (0, 12), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1,
+99), (2, 1, 97), (3, 1), (0, 1)]), (19, [(1, 2), (0, 1), (2, 1, 103), (1, 1), (
+2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1,
+102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (68, [(1, 2), (3, 1), (
+2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1,
+103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (
+69, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2,
+1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97
+), (3, 1), (0, 1)]), (19, [(1, 5), (0, 4), (2, 1, 103), (1, 1), (2, 1, 102), (
+3, 1), (2, 1, 99), (2, 1, 97), (0, 5), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1
+), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (70, [(1, 5), (3, 1), (0, 3), (2,
+1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 5), (2, 1,
+103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (
+71, [(1, 5), (0, 1), (3, 1), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1),
+(2, 1, 99), (2, 1, 97), (0, 5), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2,
+1, 99), (2, 1, 97), (3, 1), (0, 1)]), (72, [(1, 5), (0, 2), (3, 2), (2, 1, 103
+), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 5), (2, 1, 103), (
+1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (0, [(1,
+4), (0, 8), (3, 1)]), (19, [(1, 4), (0, 3), (2, 1, 103), (1, 1), (2, 1, 102), (
+3, 1), (2, 1, 99), (2, 1, 97), (0, 4), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1
+), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (73, [(1, 4), (3, 1), (0, 2), (2,
+1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 4), (2, 1,
+103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (
+74, [(1, 4), (0, 1), (2, 1, 19), (0, 1), (3, 1), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 19), (3, 1), (0, 1), (2,
+1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (75, [(
+1, 4), (3, 1), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (
+2, 1, 97), (0, 4), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1,
+97), (3, 1), (0, 1)]), (76, [(1, 4), (0, 1), (3, 1), (0, 1), (2, 1, 103), (1, 1
+), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 4), (2, 1, 103), (1, 1), (
+2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (77, [(1, 4), (0,
+2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (
+0, 4), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1
+), (0, 1)]), (19, [(1, 3), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (
+2, 1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1,
+99), (2, 1, 97), (3, 1), (0, 1)]), (78, [(1, 3), (3, 1), (0, 1), (2, 1, 103), (
+1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1
+), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (79, [(1, 3),
+(0, 1), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97
+), (0, 3), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (
+3, 1), (0, 1)]), (80, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1
+), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (19, [(1, 4), (2, 1, 35), (0, 3), (2,
+1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 35
+), (3, 1), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1,
+97), (0, 2)]), (81, [(1, 4), (0, 1), (3, 2), (2, 1, 103), (1, 1), (2, 1, 102),
+(3, 1), (2, 1, 99), (2, 1, 97), (0, 4), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1
+), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (82, [(1, 2), (3, 1), (2, 1, 103),
+(1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1
+), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (83, [(1, 4),
+(3, 3), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 4
+), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (
+0, 1)]), (0, [(1, 8), (0, 16), (3, 1)]), (19, [(1, 8), (0, 7), (2, 1, 103), (1,
+1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 8), (2, 1, 103), (1, 1), (
+2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (84, [(1, 8), (3,
+1), (0, 6), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (
+0, 8), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1
+), (0, 1)]), (85, [(1, 8), (0, 1), (3, 2), (0, 3), (3, 1), (2, 1, 103), (1, 1),
+(2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 8), (2, 1, 103), (1, 1), (2,
+1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (86, [(1, 8), (0, 3
+), (3, 2), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1,
+97), (0, 8), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97),
+(3, 1), (0, 1)]), (87, [(1, 8), (0, 5), (3, 1), (0, 1), (2, 1, 103), (1, 1), (
+2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 8), (2, 1, 103), (1, 1), (2, 1,
+102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (88, [(1, 2), (3, 1), (
+2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1,
+103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (
+0, [(1, 6), (0, 12), (3, 1)]), (4, [(1, 6), (0, 5), (1, 1), (2, 1, 312), (1, 1
+), (3, 1), (2, 1, 314), (2, 1, 316), (3, 2), (0, 5), (1, 1), (2, 1, 312), (1, 1
+), (0, 1), (2, 1, 314), (2, 1, 316), (0, 2), (3, 1)]), (7, [(1, 6), (0, 3), (2,
+1, 184), (1, 1), (3, 1), (2, 1, 186), (2, 1, 188), (3, 1), (0, 5), (2, 1, 184),
+(1, 1), (0, 1), (2, 1, 186), (2, 1, 188), (0, 3), (3, 1)]), (19, [(1, 6), (0, 2
+), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 6), (
+2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 4)
+]), (89, [(1, 6), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99),
+(2, 1, 97), (0, 2), (2, 1, 311), (2, 1, 309), (3, 1), (0, 3), (2, 1, 103), (1,
+1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1), (2, 1, 311), (
+2, 1, 309), (0, 3)]), (90, [(1, 6), (3, 2), (2, 1, 103), (1, 1), (2, 1, 102), (
+3, 1), (2, 1, 99), (2, 1, 97), (0, 6), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1
+), (2, 1, 99), (2, 1, 97), (3, 1), (0, 4)]), (91, [(1, 3), (3, 2), (2, 1, 103),
+(1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1
+), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (92, [(1, 2),
+(3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2
+), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (
+0, 1)]), (0, [(1, 2), (2, 1, 343), (0, 2), (2, 1, 343), (3, 1), (0, 2)]), (0, [
+(1, 2), (0, 1), (2, 1, 357), (0, 2), (2, 1, 357), (3, 1), (0, 1)]), (39, [(1, 6
+), (2, 1, 321), (1, 1), (2, 1, 320), (3, 1), (2, 1, 307), (1, 1), (2, 1, 306),
+(1, 1), (2, 1, 308), (2, 1, 310), (1, 1), (1, 1), (1, 1), (3, 5), (2, 1, 305),
+(0, 6), (2, 1, 321), (1, 1), (2, 1, 320), (0, 1), (2, 1, 307), (1, 1), (2, 1,
+306), (1, 1), (2, 1, 308), (2, 1, 310), (1, 1), (1, 1), (1, 1), (0, 5), (2, 1,
+305), (3, 1), (0, 6)]), (93, [(1, 6), (0, 5), (1, 1), (2, 1, 312), (1, 1), (3,
+1), (2, 1, 314), (2, 1, 316), (3, 2), (0, 5), (1, 1), (2, 1, 312), (1, 1), (0,
+1), (2, 1, 314), (2, 1, 316), (0, 2), (3, 1)]), (94, [(1, 6), (0, 4), (2, 1,
+311), (2, 1, 309), (3, 1), (0, 5), (2, 1, 311), (2, 1, 309), (0, 2), (3, 1)]),
+(94, [(1, 6), (0, 3), (2, 1, 311), (2, 1, 309), (3, 1), (0, 5), (2, 1, 311), (
+2, 1, 309), (0, 3), (3, 1)]), (95, [(1, 6), (0, 1), (3, 1), (2, 1, 311), (2, 1,
+309), (3, 1), (0, 5), (2, 1, 311), (2, 1, 309), (0, 4), (3, 1)]), (4, [(1, 3),
+(2, 1, 319), (2, 1, 317), (2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1
+), (3, 1), (2, 1, 314), (2, 1, 316), (3, 2), (0, 2), (2, 1, 319), (2, 1, 317),
+(2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314), (2,
+1, 316), (0, 4), (3, 1)]), (96, [(1, 3), (0, 1), (1, 1), (3, 1), (2, 1, 319), (
+2, 1, 317), (2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (3, 1), (2,
+1, 314), (2, 1, 316), (3, 2), (0, 2), (1, 1), (0, 1), (2, 1, 319), (2, 1, 317),
+(2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314), (2,
+1, 316), (0, 3), (3, 1)]), (97, [(1, 3), (0, 2), (3, 1), (0, 3), (3, 1)]), (41,
+[(1, 3), (2, 1, 185), (1, 1), (2, 1, 184), (1, 1), (3, 1), (2, 1, 186), (2, 1,
+188), (3, 2), (0, 2), (2, 1, 185), (1, 1), (2, 1, 184), (1, 1), (0, 1), (2, 1,
+186), (2, 1, 188), (0, 4), (3, 1)]), (0, [(1, 3), (0, 2), (2, 1, 179), (2, 1,
+177), (0, 3), (2, 1, 179), (2, 1, 177), (3, 1), (0, 1)]), (98, [(1, 3), (0, 1),
+(2, 1, 190), (1, 1), (1, 1), (3, 3), (0, 2), (2, 1, 190), (1, 1), (1, 1), (0, 4
+), (3, 1)]), (41, [(1, 3), (2, 1, 191), (2, 1, 189), (2, 1, 187), (2, 1, 185),
+(1, 1), (2, 1, 184), (1, 1), (3, 1), (2, 1, 186), (2, 1, 188), (3, 2), (0, 2),
+(2, 1, 191), (2, 1, 189), (2, 1, 187), (2, 1, 185), (1, 1), (2, 1, 184), (1, 1
+), (0, 1), (2, 1, 186), (2, 1, 188), (0, 4), (3, 1)]), (99, [(1, 3), (0, 1), (
+1, 1), (3, 1), (2, 1, 191), (2, 1, 189), (2, 1, 187), (2, 1, 185), (1, 1), (2,
+1, 184), (1, 1), (3, 1), (2, 1, 186), (2, 1, 188), (3, 2), (0, 2), (1, 1), (0,
+1), (2, 1, 191), (2, 1, 189), (2, 1, 187), (2, 1, 185), (1, 1), (2, 1, 184), (
+1, 1), (0, 1), (2, 1, 186), (2, 1, 188), (0, 3), (3, 1)]), (100, [(1, 3), (0, 2
+), (3, 1), (0, 3), (3, 1)]), (0, [(1, 1), (2, 1, 323), (0, 1), (2, 1, 323), (3,
+1), (0, 1)]), (44, [(1, 6), (2, 1, 215), (1, 1), (2, 1, 214), (3, 1), (1, 1), (
+2, 1, 216), (2, 1, 218), (3, 1), (1, 1), (2, 1, 222), (2, 1, 224), (1, 1), (1,
+1), (1, 1), (3, 4), (2, 1, 211), (2, 1, 209), (0, 6), (2, 1, 215), (1, 1), (2,
+1, 214), (0, 1), (1, 1), (2, 1, 216), (2, 1, 218), (0, 1), (1, 1), (2, 1, 222),
+(2, 1, 224), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 211), (2, 1, 209), (3, 1),
+(0, 6)]), (101, [(1, 6), (0, 1), (1, 1), (3, 1), (2, 1, 220), (3, 1), (0, 5), (
+1, 1), (0, 1), (2, 1, 220), (0, 5), (3, 1)]), (0, [(1, 6), (0, 3), (2, 1, 225),
+(2, 1, 223), (2, 1, 211), (2, 1, 209), (0, 6), (2, 1, 225), (2, 1, 223), (2, 1,
+211), (2, 1, 209), (3, 1), (0, 3)]), (0, [(1, 6), (0, 5), (2, 1, 225), (2, 1,
+223), (2, 1, 211), (2, 1, 209), (0, 6), (2, 1, 225), (2, 1, 223), (2, 1, 211),
+(2, 1, 209), (3, 1), (0, 1)]), (0, [(1, 6), (0, 2), (2, 1, 225), (2, 1, 223), (
+2, 1, 211), (2, 1, 209), (0, 6), (2, 1, 225), (2, 1, 223), (2, 1, 211), (2, 1,
+209), (3, 1), (0, 4)]), (0, [(1, 6), (0, 4), (2, 1, 225), (2, 1, 223), (2, 1,
+211), (2, 1, 209), (0, 6), (2, 1, 225), (2, 1, 223), (2, 1, 211), (2, 1, 209),
+(3, 1), (0, 2)]), (45, [(1, 1), (1, 1), (3, 1), (2, 1, 3), (0, 1), (1, 1), (0,
+1), (2, 1, 3), (3, 1), (0, 1)]), (102, [(1, 6), (0, 1), (1, 1), (3, 1), (2, 1,
+236), (3, 1), (0, 5), (1, 1), (0, 1), (2, 1, 236), (0, 5), (3, 1)]), (0, [(1, 6
+), (0, 3), (2, 1, 241), (2, 1, 239), (2, 1, 229), (2, 1, 227), (0, 6), (2, 1,
+241), (2, 1, 239), (2, 1, 229), (2, 1, 227), (3, 1), (0, 3)]), (0, [(1, 6), (0,
+5), (2, 1, 241), (2, 1, 239), (2, 1, 229), (2, 1, 227), (0, 6), (2, 1, 241), (
+2, 1, 239), (2, 1, 229), (2, 1, 227), (3, 1), (0, 1)]), (0, [(1, 6), (0, 2), (
+2, 1, 241), (2, 1, 239), (2, 1, 229), (2, 1, 227), (0, 6), (2, 1, 241), (2, 1,
+239), (2, 1, 229), (2, 1, 227), (3, 1), (0, 4)]), (0, [(1, 6), (0, 4), (2, 1,
+241), (2, 1, 239), (2, 1, 229), (2, 1, 227), (0, 6), (2, 1, 241), (2, 1, 239),
+(2, 1, 229), (2, 1, 227), (3, 1), (0, 2)]), (47, [(1, 13), (2, 1, 159), (1, 1),
+(2, 1, 158), (3, 1), (1, 1), (2, 1, 160), (2, 1, 162), (1, 1), (2, 1, 164), (2,
+1, 166), (1, 1), (3, 2), (2, 1, 170), (2, 1, 172), (1, 1), (1, 1), (1, 1), (3,
+4), (2, 1, 157), (2, 1, 155), (0, 7), (2, 1, 197), (1, 1), (2, 1, 196), (3, 1),
+(2, 1, 198), (2, 1, 200), (3, 1), (0, 1), (2, 1, 213), (1, 1), (2, 1, 212), (3,
+2), (0, 1), (2, 1, 231), (1, 1), (2, 1, 230), (3, 2), (0, 1), (2, 1, 159), (1,
+1), (2, 1, 158), (0, 1), (1, 1), (2, 1, 160), (2, 1, 162), (1, 1), (2, 1, 164),
+(2, 1, 166), (1, 1), (0, 2), (2, 1, 170), (2, 1, 172), (1, 1), (1, 1), (1, 1),
+(0, 4), (2, 1, 157), (2, 1, 155), (3, 1), (0, 6), (2, 1, 197), (1, 1), (2, 1,
+196), (0, 1), (2, 1, 198), (2, 1, 200), (0, 2), (2, 1, 213), (1, 1), (2, 1, 212
+), (0, 3), (2, 1, 231), (1, 1), (2, 1, 230), (0, 4)]), (48, [(1, 13), (0, 7), (
+2, 1, 197), (1, 1), (2, 1, 196), (3, 1), (2, 1, 198), (2, 1, 200), (3, 1), (0,
+1), (2, 1, 213), (1, 1), (2, 1, 212), (3, 2), (0, 1), (2, 1, 231), (1, 1), (2,
+1, 230), (3, 2), (0, 8), (2, 1, 197), (1, 1), (2, 1, 196), (0, 1), (2, 1, 198),
+(2, 1, 200), (0, 2), (2, 1, 213), (1, 1), (2, 1, 212), (0, 3), (2, 1, 231), (1,
+1), (2, 1, 230), (0, 3), (3, 1)]), (50, [(1, 13), (0, 4), (2, 1, 173), (1, 1),
+(2, 1, 174), (1, 1), (3, 2), (2, 1, 171), (2, 1, 163), (2, 1, 161), (2, 1, 157
+), (2, 1, 155), (0, 2), (3, 1), (0, 10), (2, 1, 173), (1, 1), (2, 1, 174), (1,
+1), (0, 2), (2, 1, 171), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (
+3, 1), (0, 9)]), (51, [(1, 13), (0, 2), (2, 1, 167), (1, 1), (2, 1, 168), (1, 1
+), (1, 1), (1, 1), (3, 4), (2, 1, 165), (2, 1, 163), (2, 1, 161), (2, 1, 157),
+(2, 1, 155), (0, 13), (2, 1, 167), (1, 1), (2, 1, 168), (1, 1), (1, 1), (1, 1),
+(0, 4), (2, 1, 165), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (3, 1
+), (0, 11)]), (53, [(1, 13), (0, 3), (2, 1, 173), (1, 1), (2, 1, 174), (1, 1),
+(3, 2), (2, 1, 171), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (0, 2
+), (3, 1), (0, 10), (2, 1, 173), (1, 1), (2, 1, 174), (1, 1), (0, 2), (2, 1,
+171), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (3, 1), (0, 10)]), (
+51, [(1, 13), (0, 1), (2, 1, 167), (1, 1), (2, 1, 168), (1, 1), (1, 1), (1, 1),
+(3, 4), (2, 1, 165), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (0, 13
+), (2, 1, 167), (1, 1), (2, 1, 168), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 165
+), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (3, 1), (0, 12)]), (46,
+[(1, 6), (0, 3), (2, 1, 214), (3, 1), (0, 1), (1, 1), (2, 1, 232), (2, 1, 234),
+(3, 1), (1, 1), (2, 1, 238), (2, 1, 240), (1, 1), (1, 1), (1, 1), (3, 4), (2,
+1, 229), (2, 1, 227), (0, 4), (2, 1, 214), (0, 2), (1, 1), (2, 1, 232), (2, 1,
+234), (0, 1), (1, 1), (2, 1, 238), (2, 1, 240), (1, 1), (1, 1), (1, 1), (0, 4),
+(2, 1, 229), (2, 1, 227), (3, 1), (0, 1)]), (48, [(1, 6), (2, 1, 197), (1, 1),
+(2, 1, 196), (3, 1), (2, 1, 198), (2, 1, 200), (3, 1), (0, 1), (2, 1, 213), (1,
+1), (2, 1, 212), (3, 2), (0, 1), (2, 1, 231), (1, 1), (2, 1, 230), (3, 2), (0,
+1), (2, 1, 197), (1, 1), (2, 1, 196), (0, 1), (2, 1, 198), (2, 1, 200), (0, 2),
+(2, 1, 213), (1, 1), (2, 1, 212), (0, 3), (2, 1, 231), (1, 1), (2, 1, 230), (0,
+3), (3, 1)]), (49, [(1, 6), (0, 1), (1, 1), (3, 1), (2, 1, 202), (3, 1), (0, 5
+), (1, 1), (0, 1), (2, 1, 202), (0, 5), (3, 1)]), (103, [(1, 2), (2, 1, 202), (
+3, 1), (0, 1), (2, 1, 202), (0, 2), (3, 1)]), (104, [(1, 2), (0, 1), (2, 1, 203
+), (1, 1), (2, 1, 202), (3, 1), (2, 1, 201), (2, 1, 199), (1, 1), (2, 1, 204),
+(2, 1, 206), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 195), (2, 1, 193), (0, 2),
+(2, 1, 203), (1, 1), (2, 1, 202), (0, 1), (2, 1, 201), (2, 1, 199), (1, 1), (2,
+1, 204), (2, 1, 206), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 195), (2, 1, 193),
+(3, 1), (0, 1)]), (105, [(1, 3), (0, 2), (2, 1, 173), (1, 1), (2, 1, 174), (1,
+1), (3, 2), (2, 1, 171), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (
+0, 3), (2, 1, 173), (1, 1), (2, 1, 174), (1, 1), (0, 2), (2, 1, 171), (2, 1,
+163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (3, 1), (0, 1)]), (0, [(1, 3), (0,
+1), (2, 1, 175), (2, 1, 171), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155
+), (0, 3), (2, 1, 175), (2, 1, 171), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2,
+1, 155), (3, 1), (0, 2)]), (0, [(1, 3), (2, 1, 175), (2, 1, 171), (2, 1, 163),
+(2, 1, 161), (2, 1, 157), (2, 1, 155), (0, 3), (2, 1, 175), (2, 1, 171), (2, 1,
+163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (3, 1), (0, 3)]), (106, [(1, 4), (
+0, 1), (2, 1, 169), (2, 1, 165), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1,
+155), (0, 2), (3, 1), (0, 1), (2, 1, 169), (2, 1, 165), (2, 1, 163), (2, 1, 161
+), (2, 1, 157), (2, 1, 155), (3, 1), (0, 3)]), (107, [(1, 4), (2, 1, 169), (2,
+1, 165), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (0, 2), (3, 1), (
+0, 1), (2, 1, 169), (2, 1, 165), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1,
+155), (3, 1), (0, 4)]), (108, [(1, 5), (0, 3), (2, 1, 272), (3, 1), (0, 4), (2,
+1, 272), (0, 2), (3, 1)]), (109, [(1, 5), (2, 1, 113), (1, 1), (2, 1, 112), (3,
+1), (1, 1), (2, 1, 114), (2, 1, 116), (1, 1), (2, 1, 118), (2, 1, 120), (1, 1),
+(3, 2), (2, 1, 124), (2, 1, 126), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 107),
+(2, 1, 105), (0, 1), (2, 1, 251), (1, 1), (2, 1, 250), (3, 1), (2, 1, 252), (2,
+1, 254), (3, 1), (2, 1, 271), (1, 1), (2, 1, 270), (3, 2), (0, 1), (2, 1, 293),
+(1, 1), (2, 1, 292), (3, 2), (2, 1, 113), (1, 1), (2, 1, 112), (0, 1), (1, 1),
+(2, 1, 114), (2, 1, 116), (1, 1), (2, 1, 118), (2, 1, 120), (1, 1), (0, 2), (2,
+1, 124), (2, 1, 126), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 107), (2, 1, 105),
+(3, 1), (2, 1, 251), (1, 1), (2, 1, 250), (0, 1), (2, 1, 252), (2, 1, 254), (0,
+1), (2, 1, 271), (1, 1), (2, 1, 270), (0, 3), (2, 1, 293), (1, 1), (2, 1, 292),
+(0, 3)]), (110, [(1, 3), (0, 2), (2, 1, 151), (1, 1), (2, 1, 152), (1, 1), (3,
+2), (2, 1, 149), (2, 1, 141), (2, 1, 139), (2, 1, 133), (2, 1, 131), (0, 3), (
+2, 1, 151), (1, 1), (2, 1, 152), (1, 1), (0, 2), (2, 1, 149), (2, 1, 141), (2,
+1, 139), (2, 1, 133), (2, 1, 131), (3, 1), (0, 1)]), (0, [(1, 3), (0, 1), (2,
+1, 153), (2, 1, 149), (2, 1, 141), (2, 1, 139), (2, 1, 133), (2, 1, 131), (0, 3
+), (2, 1, 153), (2, 1, 149), (2, 1, 141), (2, 1, 139), (2, 1, 133), (2, 1, 131
+), (3, 1), (0, 2)]), (0, [(1, 3), (2, 1, 153), (2, 1, 149), (2, 1, 141), (2, 1,
+139), (2, 1, 133), (2, 1, 131), (0, 3), (2, 1, 153), (2, 1, 149), (2, 1, 141),
+(2, 1, 139), (2, 1, 133), (2, 1, 131), (3, 1), (0, 3)]), (111, [(1, 4), (0, 1),
+(2, 1, 147), (2, 1, 143), (2, 1, 141), (2, 1, 139), (2, 1, 133), (2, 1, 131), (
+0, 2), (3, 1), (0, 1), (2, 1, 147), (2, 1, 143), (2, 1, 141), (2, 1, 139), (2,
+1, 133), (2, 1, 131), (3, 1), (0, 3)]), (112, [(1, 4), (2, 1, 147), (2, 1, 143
+), (2, 1, 141), (2, 1, 139), (2, 1, 133), (2, 1, 131), (0, 2), (3, 1), (0, 1),
+(2, 1, 147), (2, 1, 143), (2, 1, 141), (2, 1, 139), (2, 1, 133), (2, 1, 131), (
+3, 1), (0, 4)]), (0, [(1, 1), (2, 1, 327), (0, 1), (2, 1, 327), (3, 1), (0, 1)]
+), (0, [(1, 1), (2, 1, 325), (0, 1), (2, 1, 325), (3, 1), (0, 1)]), (113, [(1,
+4), (3, 2), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2,
+1, 97), (0, 4), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97
+), (3, 1), (0, 1)]), (114, [(1, 4), (0, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 4), (2, 1, 103), (1, 1), (2, 1, 102),
+(0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (115, [(1, 2), (3, 1), (2, 1,
+103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103),
+(1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (116, [(
+1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97
+), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (
+3, 1), (0, 1)]), (117, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1
+), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (118, [(1, 2), (3, 1), (2, 1, 103), (
+1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1
+), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (119, [(1, 2
+), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (
+0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1
+), (0, 1)]), (120, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (
+2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1,
+99), (2, 1, 97), (3, 1), (0, 1)]), (121, [(1, 2), (3, 1), (2, 1, 103), (1, 1),
+(2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2,
+1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (122, [(1, 2), (3, 1
+), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (
+2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)
+]), (123, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99
+), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (
+2, 1, 97), (3, 1), (0, 1)]), (124, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102),
+(0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (125, [(1, 2), (3, 1), (2, 1,
+103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103),
+(1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (126, [(
+1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97
+), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (
+3, 1), (0, 1)]), (127, [(1, 3), (3, 2), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1
+), (2, 1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (128, [(1, 2), (3, 1), (2, 1, 103), (
+1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1
+), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (129, [(1, 2
+), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (
+0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1
+), (0, 1)]), (130, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (
+2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1,
+99), (2, 1, 97), (3, 1), (0, 1)]), (131, [(1, 2), (3, 1), (2, 1, 103), (1, 1),
+(2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2,
+1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (132, [(1, 2), (3, 1
+), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (
+2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)
+]), (133, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99
+), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (
+2, 1, 97), (3, 1), (0, 1)]), (19, [(1, 2), (2, 1, 31), (0, 1), (2, 1, 103), (1,
+1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 31), (3, 1), (
+2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (
+134, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2,
+1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97
+), (3, 1), (0, 1)]), (135, [(1, 3), (3, 1), (0, 1), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (2, 1, 102),
+(0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (19, [(1, 3), (0, 1), (2, 1,
+39), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97),
+(0, 2), (2, 1, 39), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99
+), (2, 1, 97), (0, 2)]), (136, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102
+), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (
+0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (137, [(1, 4), (3, 1), (0, 2),
+(2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 4), (2,
+1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]),
+(138, [(1, 4), (0, 1), (3, 1), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1
+), (2, 1, 99), (2, 1, 97), (0, 4), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (139, [(1, 4), (0, 2), (3, 1), (2, 1,
+103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 4), (2, 1, 103),
+(1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (140, [(
+1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97
+), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (
+3, 1), (0, 1)]), (141, [(1, 4), (3, 1), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102
+), (3, 1), (2, 1, 99), (2, 1, 97), (0, 4), (2, 1, 103), (1, 1), (2, 1, 102), (
+0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (142, [(1, 4), (0, 1), (3, 2),
+(2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 4), (2,
+1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]),
+(143, [(1, 3), (3, 1), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1,
+99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99),
+(2, 1, 97), (3, 1), (0, 1)]), (144, [(1, 3), (0, 1), (3, 1), (2, 1, 103), (1, 1
+), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (
+2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (145, [(1, 2), (
+3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2
+), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (
+0, 1)]), (146, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2,
+1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99
+), (2, 1, 97), (3, 1), (0, 1)]), (4, [(1, 2), (0, 1), (1, 1), (2, 1, 312), (1,
+1), (3, 1), (2, 1, 314), (2, 1, 316), (3, 2), (0, 1), (1, 1), (2, 1, 312), (1,
+1), (0, 1), (2, 1, 314), (2, 1, 316), (0, 2), (3, 1)]), (19, [(1, 2), (2, 1,
+103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103),
+(1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 2)]), (147, [(
+1, 3), (3, 1), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (
+2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1,
+97), (3, 1), (0, 1)]), (148, [(1, 3), (0, 1), (3, 1), (2, 1, 103), (1, 1), (2,
+1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (2, 1,
+102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (149, [(1, 3), (3, 1),
+(0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 3
+), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (
+0, 1)]), (150, [(1, 3), (0, 1), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1
+), (2, 1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (151, [(1, 2), (3, 1), (2, 1, 103), (
+1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1
+), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (93, [(1, 3),
+(2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (3, 1), (2, 1, 314), (2, 1, 316), (3,
+2), (0, 2), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314), (2,
+1, 316), (0, 4), (3, 1)]), (152, [(1, 3), (0, 2), (1, 1), (2, 1, 320), (3, 1),
+(2, 1, 307), (1, 1), (2, 1, 306), (1, 1), (2, 1, 308), (2, 1, 310), (1, 1), (1,
+1), (1, 1), (3, 5), (2, 1, 305), (0, 3), (1, 1), (2, 1, 320), (0, 1), (2, 1,
+307), (1, 1), (2, 1, 306), (1, 1), (2, 1, 308), (2, 1, 310), (1, 1), (1, 1), (
+1, 1), (0, 5), (2, 1, 305), (3, 1), (0, 1)]), (153, [(1, 3), (0, 1), (2, 1, 318
+), (1, 1), (1, 1), (3, 3), (0, 2), (2, 1, 318), (1, 1), (1, 1), (0, 4), (3, 1)]
+), (93, [(1, 1), (1, 1), (2, 1, 312), (1, 1), (3, 1), (2, 1, 314), (2, 1, 316),
+(3, 2), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314), (2, 1, 316), (0, 2),
+(3, 1)]), (93, [(1, 2), (0, 1), (1, 1), (2, 1, 312), (1, 1), (3, 1), (2, 1, 314
+), (2, 1, 316), (3, 2), (0, 1), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314
+), (2, 1, 316), (0, 2), (3, 1)]), (94, [(1, 2), (2, 1, 311), (2, 1, 309), (3, 1
+), (0, 1), (2, 1, 311), (2, 1, 309), (0, 2), (3, 1)]), (4, [(1, 4), (0, 1), (2,
+1, 313), (1, 1), (2, 1, 312), (1, 1), (3, 1), (2, 1, 314), (2, 1, 316), (3, 2),
+(0, 3), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314), (2, 1,
+316), (0, 4), (3, 1)]), (39, [(1, 4), (0, 3), (1, 1), (2, 1, 320), (3, 1), (2,
+1, 307), (1, 1), (2, 1, 306), (1, 1), (2, 1, 308), (2, 1, 310), (1, 1), (1, 1),
+(1, 1), (3, 5), (2, 1, 305), (0, 4), (1, 1), (2, 1, 320), (0, 1), (2, 1, 307),
+(1, 1), (2, 1, 306), (1, 1), (2, 1, 308), (2, 1, 310), (1, 1), (1, 1), (1, 1),
+(0, 5), (2, 1, 305), (3, 1), (0, 1)]), (154, [(1, 4), (1, 1), (3, 1), (2, 1,
+319), (2, 1, 317), (2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (3, 1
+), (2, 1, 314), (2, 1, 316), (3, 2), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1),
+(0, 1), (2, 1, 314), (2, 1, 316), (0, 4), (1, 1), (0, 1), (2, 1, 319), (2, 1,
+317), (2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314
+), (2, 1, 316), (0, 2), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2,
+1, 314), (2, 1, 316), (0, 4), (3, 1)]), (40, [(1, 4), (0, 2), (2, 1, 318), (1,
+1), (1, 1), (3, 3), (0, 3), (2, 1, 318), (1, 1), (1, 1), (0, 4), (3, 1)]), (
+155, [(1, 1), (1, 1), (3, 1), (2, 1, 319), (2, 1, 317), (2, 1, 315), (2, 1, 313
+), (1, 1), (2, 1, 312), (1, 1), (3, 1), (2, 1, 314), (2, 1, 316), (3, 2), (1, 1
+), (0, 1), (2, 1, 319), (2, 1, 317), (2, 1, 315), (2, 1, 313), (1, 1), (2, 1,
+312), (1, 1), (0, 1), (2, 1, 314), (2, 1, 316), (0, 2), (3, 1)]), (156, [(1, 3
+), (0, 1), (1, 1), (3, 1), (2, 1, 191), (2, 1, 189), (2, 1, 187), (2, 1, 185),
+(1, 1), (2, 1, 184), (1, 1), (3, 1), (2, 1, 186), (2, 1, 188), (3, 2), (0, 2),
+(1, 1), (0, 1), (2, 1, 191), (2, 1, 189), (2, 1, 187), (2, 1, 185), (1, 1), (2,
+1, 184), (1, 1), (0, 1), (2, 1, 186), (2, 1, 188), (0, 3), (3, 1)]), (157, [(1,
+3), (0, 2), (3, 1), (0, 3), (3, 1)]), (41, [(1, 4), (0, 1), (2, 1, 185), (1, 1
+), (2, 1, 184), (1, 1), (3, 1), (2, 1, 186), (2, 1, 188), (3, 2), (0, 3), (2,
+1, 185), (1, 1), (2, 1, 184), (1, 1), (0, 1), (2, 1, 186), (2, 1, 188), (0, 4),
+(3, 1)]), (0, [(1, 4), (0, 3), (2, 1, 179), (2, 1, 177), (0, 4), (2, 1, 179), (
+2, 1, 177), (3, 1), (0, 1)]), (158, [(1, 4), (1, 1), (3, 1), (2, 1, 191), (2,
+1, 189), (2, 1, 187), (2, 1, 185), (1, 1), (2, 1, 184), (1, 1), (3, 1), (2, 1,
+186), (2, 1, 188), (3, 2), (2, 1, 185), (1, 1), (2, 1, 184), (1, 1), (0, 1), (
+2, 1, 186), (2, 1, 188), (0, 4), (1, 1), (0, 1), (2, 1, 191), (2, 1, 189), (2,
+1, 187), (2, 1, 185), (1, 1), (2, 1, 184), (1, 1), (0, 1), (2, 1, 186), (2, 1,
+188), (0, 2), (2, 1, 185), (1, 1), (2, 1, 184), (1, 1), (0, 1), (2, 1, 186), (
+2, 1, 188), (0, 4), (3, 1)]), (98, [(1, 4), (0, 2), (2, 1, 190), (1, 1), (1, 1
+), (3, 3), (0, 3), (2, 1, 190), (1, 1), (1, 1), (0, 4), (3, 1)]), (159, [(1, 1
+), (1, 1), (3, 1), (2, 1, 191), (2, 1, 189), (2, 1, 187), (2, 1, 185), (1, 1),
+(2, 1, 184), (1, 1), (3, 1), (2, 1, 186), (2, 1, 188), (3, 2), (1, 1), (0, 1),
+(2, 1, 191), (2, 1, 189), (2, 1, 187), (2, 1, 185), (1, 1), (2, 1, 184), (1, 1
+), (0, 1), (2, 1, 186), (2, 1, 188), (0, 2), (3, 1)]), (160, [(1, 2), (2, 1,
+220), (3, 1), (0, 1), (2, 1, 220), (0, 2), (3, 1)]), (161, [(1, 2), (0, 1), (2,
+1, 221), (1, 1), (2, 1, 220), (3, 1), (2, 1, 219), (2, 1, 217), (1, 1), (2, 1,
+222), (2, 1, 224), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 211), (2, 1, 209), (
+0, 2), (2, 1, 221), (1, 1), (2, 1, 220), (0, 1), (2, 1, 219), (2, 1, 217), (1,
+1), (2, 1, 222), (2, 1, 224), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 211), (2,
+1, 209), (3, 1), (0, 1)]), (162, [(1, 2), (2, 1, 236), (3, 1), (0, 1), (2, 1,
+236), (0, 2), (3, 1)]), (163, [(1, 2), (0, 1), (2, 1, 237), (1, 1), (2, 1, 236
+), (3, 1), (2, 1, 235), (2, 1, 233), (1, 1), (2, 1, 238), (2, 1, 240), (1, 1),
+(1, 1), (1, 1), (3, 4), (2, 1, 229), (2, 1, 227), (0, 2), (2, 1, 237), (1, 1),
+(2, 1, 236), (0, 1), (2, 1, 235), (2, 1, 233), (1, 1), (2, 1, 238), (2, 1, 240
+), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 229), (2, 1, 227), (3, 1), (0, 1)]),
+(104, [(1, 1), (2, 1, 203), (1, 1), (2, 1, 202), (3, 1), (2, 1, 201), (2, 1,
+199), (1, 1), (2, 1, 204), (2, 1, 206), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1,
+195), (2, 1, 193), (0, 1), (2, 1, 203), (1, 1), (2, 1, 202), (0, 1), (2, 1, 201
+), (2, 1, 199), (1, 1), (2, 1, 204), (2, 1, 206), (1, 1), (1, 1), (1, 1), (0, 4
+), (2, 1, 195), (2, 1, 193), (3, 1), (0, 1)]), (104, [(1, 5), (2, 1, 203), (1,
+1), (2, 1, 202), (3, 1), (2, 1, 201), (2, 1, 199), (1, 1), (2, 1, 204), (2, 1,
+206), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 195), (2, 1, 193), (0, 5), (2, 1,
+203), (1, 1), (2, 1, 202), (0, 1), (2, 1, 201), (2, 1, 199), (1, 1), (2, 1, 204
+), (2, 1, 206), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 195), (2, 1, 193), (3, 1
+), (0, 5)]), (0, [(1, 5), (0, 2), (2, 1, 207), (2, 1, 205), (2, 1, 195), (2, 1,
+193), (0, 5), (2, 1, 207), (2, 1, 205), (2, 1, 195), (2, 1, 193), (3, 1), (0, 3
+)]), (0, [(1, 5), (0, 4), (2, 1, 207), (2, 1, 205), (2, 1, 195), (2, 1, 193), (
+0, 5), (2, 1, 207), (2, 1, 205), (2, 1, 195), (2, 1, 193), (3, 1), (0, 1)]), (
+0, [(1, 5), (0, 1), (2, 1, 207), (2, 1, 205), (2, 1, 195), (2, 1, 193), (0, 5),
+(2, 1, 207), (2, 1, 205), (2, 1, 195), (2, 1, 193), (3, 1), (0, 4)]), (0, [(1,
+5), (0, 3), (2, 1, 207), (2, 1, 205), (2, 1, 195), (2, 1, 193), (0, 5), (2, 1,
+207), (2, 1, 205), (2, 1, 195), (2, 1, 193), (3, 1), (0, 2)]), (0, [(1, 2), (0,
+1), (2, 1, 175), (2, 1, 171), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155
+), (0, 2), (2, 1, 175), (2, 1, 171), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2,
+1, 155), (3, 1), (0, 1)]), (0, [(1, 2), (2, 1, 175), (2, 1, 171), (2, 1, 163),
+(2, 1, 161), (2, 1, 157), (2, 1, 155), (0, 2), (2, 1, 175), (2, 1, 171), (2, 1,
+163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (3, 1), (0, 2)]), (0, [(1, 1), (2,
+1, 169), (2, 1, 165), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155), (0, 1
+), (2, 1, 169), (2, 1, 165), (2, 1, 163), (2, 1, 161), (2, 1, 157), (2, 1, 155
+), (3, 1), (0, 1)]), (164, [(1, 1), (2, 1, 273), (1, 1), (2, 1, 272), (3, 1), (
+2, 1, 274), (2, 1, 276), (3, 1), (2, 1, 273), (1, 1), (2, 1, 272), (0, 1), (2,
+1, 274), (2, 1, 276), (0, 1), (3, 1)]), (165, [(1, 13), (0, 10), (2, 1, 272), (
+3, 1), (0, 1), (2, 1, 294), (2, 1, 296), (3, 1), (0, 10), (2, 1, 272), (0, 2),
+(2, 1, 294), (2, 1, 296), (0, 1), (3, 1)]), (109, [(1, 13), (2, 1, 113), (1, 1
+), (2, 1, 112), (3, 1), (1, 1), (2, 1, 114), (2, 1, 116), (1, 1), (2, 1, 118),
+(2, 1, 120), (1, 1), (3, 2), (2, 1, 124), (2, 1, 126), (1, 1), (1, 1), (1, 1),
+(3, 4), (2, 1, 107), (2, 1, 105), (0, 7), (2, 1, 251), (1, 1), (2, 1, 250), (3,
+1), (2, 1, 252), (2, 1, 254), (3, 1), (0, 1), (2, 1, 271), (1, 1), (2, 1, 270),
+(3, 2), (0, 1), (2, 1, 293), (1, 1), (2, 1, 292), (3, 2), (0, 1), (2, 1, 113),
+(1, 1), (2, 1, 112), (0, 1), (1, 1), (2, 1, 114), (2, 1, 116), (1, 1), (2, 1,
+118), (2, 1, 120), (1, 1), (0, 2), (2, 1, 124), (2, 1, 126), (1, 1), (1, 1), (
+1, 1), (0, 4), (2, 1, 107), (2, 1, 105), (3, 1), (0, 6), (2, 1, 251), (1, 1), (
+2, 1, 250), (0, 1), (2, 1, 252), (2, 1, 254), (0, 2), (2, 1, 271), (1, 1), (2,
+1, 270), (0, 3), (2, 1, 293), (1, 1), (2, 1, 292), (0, 4)]), (166, [(1, 13), (
+0, 4), (2, 1, 127), (1, 1), (2, 1, 128), (1, 1), (3, 2), (2, 1, 125), (2, 1,
+117), (2, 1, 115), (2, 1, 107), (2, 1, 105), (0, 2), (3, 1), (0, 10), (2, 1,
+127), (1, 1), (2, 1, 128), (1, 1), (0, 2), (2, 1, 125), (2, 1, 117), (2, 1, 115
+), (2, 1, 107), (2, 1, 105), (3, 1), (0, 9)]), (167, [(1, 13), (0, 8), (1, 1),
+(3, 1), (2, 1, 256), (3, 1), (0, 12), (1, 1), (0, 1), (2, 1, 256), (0, 5), (3,
+1)]), (168, [(1, 13), (0, 2), (2, 1, 121), (1, 1), (2, 1, 122), (1, 1), (1, 1),
+(1, 1), (3, 4), (2, 1, 119), (2, 1, 117), (2, 1, 115), (2, 1, 107), (2, 1, 105
+), (0, 13), (2, 1, 121), (1, 1), (2, 1, 122), (1, 1), (1, 1), (1, 1), (0, 4), (
+2, 1, 119), (2, 1, 117), (2, 1, 115), (2, 1, 107), (2, 1, 105), (3, 1), (0, 11)
+]), (169, [(1, 13), (0, 3), (2, 1, 127), (1, 1), (2, 1, 128), (1, 1), (3, 2), (
+2, 1, 125), (2, 1, 117), (2, 1, 115), (2, 1, 107), (2, 1, 105), (0, 2), (3, 1),
+(0, 10), (2, 1, 127), (1, 1), (2, 1, 128), (1, 1), (0, 2), (2, 1, 125), (2, 1,
+117), (2, 1, 115), (2, 1, 107), (2, 1, 105), (3, 1), (0, 10)]), (168, [(1, 13),
+(0, 1), (2, 1, 121), (1, 1), (2, 1, 122), (1, 1), (1, 1), (1, 1), (3, 4), (2,
+1, 119), (2, 1, 117), (2, 1, 115), (2, 1, 107), (2, 1, 105), (0, 13), (2, 1,
+121), (1, 1), (2, 1, 122), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 119), (2, 1,
+117), (2, 1, 115), (2, 1, 107), (2, 1, 105), (3, 1), (0, 12)]), (0, [(1, 2), (
+0, 1), (2, 1, 153), (2, 1, 149), (2, 1, 141), (2, 1, 139), (2, 1, 133), (2, 1,
+131), (0, 2), (2, 1, 153), (2, 1, 149), (2, 1, 141), (2, 1, 139), (2, 1, 133),
+(2, 1, 131), (3, 1), (0, 1)]), (0, [(1, 2), (2, 1, 153), (2, 1, 149), (2, 1,
+141), (2, 1, 139), (2, 1, 133), (2, 1, 131), (0, 2), (2, 1, 153), (2, 1, 149),
+(2, 1, 141), (2, 1, 139), (2, 1, 133), (2, 1, 131), (3, 1), (0, 2)]), (0, [(1,
+1), (2, 1, 147), (2, 1, 143), (2, 1, 141), (2, 1, 139), (2, 1, 133), (2, 1, 131
+), (0, 1), (2, 1, 147), (2, 1, 143), (2, 1, 141), (2, 1, 139), (2, 1, 133), (2,
+1, 131), (3, 1), (0, 1)]), (170, [(1, 3), (3, 2), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (2, 1, 102),
+(0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (171, [(1, 2), (3, 1), (2, 1,
+103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103),
+(1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (172, [(
+1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97
+), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (
+3, 1), (0, 1)]), (173, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1
+), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (174, [(1, 2), (3, 1), (2, 1, 103), (
+1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1
+), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (175, [(1, 2
+), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (
+0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1
+), (0, 1)]), (176, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (
+2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1,
+99), (2, 1, 97), (3, 1), (0, 1)]), (177, [(1, 2), (3, 1), (2, 1, 103), (1, 1),
+(2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2,
+1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (178, [(1, 2), (3, 1
+), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (
+2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)
+]), (179, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99
+), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (
+2, 1, 97), (3, 1), (0, 1)]), (19, [(1, 2), (2, 1, 5), (0, 1), (2, 1, 103), (1,
+1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 5), (3, 1), (2,
+1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (180, [
+(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97
+), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (
+3, 1), (0, 1)]), (19, [(1, 2), (2, 1, 9), (0, 1), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 9), (3, 1), (2, 1, 103), (
+1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (19, [(1, 2), (2,
+1, 11), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97
+), (0, 1), (2, 1, 11), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1,
+99), (2, 1, 97), (0, 2)]), (181, [(1, 3), (3, 1), (0, 1), (2, 1, 103), (1, 1),
+(2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (2,
+1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (182, [(1, 3), (0, 1
+), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (
+0, 3), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1
+), (0, 1)]), (183, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (
+2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1,
+99), (2, 1, 97), (3, 1), (0, 1)]), (184, [(1, 2), (3, 1), (2, 1, 103), (1, 1),
+(2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2,
+1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (19, [(1, 2), (2, 1,
+23), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97),
+(0, 1), (2, 1, 23), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99
+), (2, 1, 97), (0, 2)]), (19, [(1, 2), (2, 1, 25), (0, 1), (2, 1, 103), (1, 1),
+(2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 25), (3, 1), (2, 1,
+103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (185, [(1,
+2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (
+0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1
+), (0, 1)]), (186, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (
+2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1,
+99), (2, 1, 97), (3, 1), (0, 1)]), (19, [(1, 2), (2, 1, 33), (0, 1), (2, 1, 103
+), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 33), (3,
+1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]),
+(187, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (
+2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1,
+97), (3, 1), (0, 1)]), (19, [(1, 2), (2, 1, 41), (0, 1), (2, 1, 103), (1, 1), (
+2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 41), (3, 1), (2, 1,
+103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (188, [(1,
+2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (
+0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1
+), (0, 1)]), (189, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (
+2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1,
+99), (2, 1, 97), (3, 1), (0, 1)]), (190, [(1, 2), (3, 1), (2, 1, 103), (1, 1),
+(2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2,
+1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (191, [(1, 2), (3, 1
+), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (
+2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)
+]), (192, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99
+), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (
+2, 1, 97), (3, 1), (0, 1)]), (193, [(1, 3), (3, 2), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (2, 1, 102),
+(0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (194, [(1, 2), (3, 1), (2, 1,
+103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103),
+(1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (195, [(
+1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97
+), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (
+3, 1), (0, 1)]), (196, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1
+), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (197, [(1, 2), (3, 1), (2, 1, 103), (
+1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1
+), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (198, [(1, 2
+), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (
+0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1
+), (0, 1)]), (199, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (
+2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1,
+99), (2, 1, 97), (3, 1), (0, 1)]), (19, [(1, 2), (2, 1, 67), (0, 1), (2, 1, 103
+), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 67), (3,
+1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]),
+(200, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (
+2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1,
+97), (3, 1), (0, 1)]), (201, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102),
+(3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1
+), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (152, [(1, 6), (2, 1, 321), (1, 1
+), (2, 1, 320), (3, 1), (2, 1, 307), (1, 1), (2, 1, 306), (1, 1), (2, 1, 308),
+(2, 1, 310), (1, 1), (1, 1), (1, 1), (3, 5), (2, 1, 305), (0, 6), (2, 1, 321),
+(1, 1), (2, 1, 320), (0, 1), (2, 1, 307), (1, 1), (2, 1, 306), (1, 1), (2, 1,
+308), (2, 1, 310), (1, 1), (1, 1), (1, 1), (0, 5), (2, 1, 305), (3, 1), (0, 6)]
+), (93, [(1, 3), (2, 1, 319), (2, 1, 317), (2, 1, 315), (2, 1, 313), (1, 1), (
+2, 1, 312), (1, 1), (3, 1), (2, 1, 314), (2, 1, 316), (3, 2), (0, 2), (2, 1,
+319), (2, 1, 317), (2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1
+), (2, 1, 314), (2, 1, 316), (0, 4), (3, 1)]), (202, [(1, 3), (0, 1), (1, 1), (
+3, 1), (2, 1, 319), (2, 1, 317), (2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312),
+(1, 1), (3, 1), (2, 1, 314), (2, 1, 316), (3, 2), (0, 2), (1, 1), (0, 1), (2,
+1, 319), (2, 1, 317), (2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (
+0, 1), (2, 1, 314), (2, 1, 316), (0, 3), (3, 1)]), (203, [(1, 3), (0, 2), (3, 1
+), (0, 3), (3, 1)]), (4, [(1, 4), (2, 1, 319), (2, 1, 317), (2, 1, 315), (2, 1,
+313), (1, 1), (2, 1, 312), (1, 1), (3, 1), (2, 1, 314), (2, 1, 316), (3, 2), (
+2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314), (2, 1, 316), (0,
+4), (2, 1, 319), (2, 1, 317), (2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312), (
+1, 1), (0, 1), (2, 1, 314), (2, 1, 316), (0, 2), (2, 1, 313), (1, 1), (2, 1,
+312), (1, 1), (0, 1), (2, 1, 314), (2, 1, 316), (0, 4), (3, 1)]), (155, [(1, 4
+), (1, 1), (3, 1), (2, 1, 319), (2, 1, 317), (2, 1, 315), (2, 1, 313), (1, 1),
+(2, 1, 312), (1, 1), (3, 1), (2, 1, 314), (2, 1, 316), (3, 2), (2, 1, 313), (1,
+1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314), (2, 1, 316), (0, 4), (1, 1), (0,
+1), (2, 1, 319), (2, 1, 317), (2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312), (
+1, 1), (0, 1), (2, 1, 314), (2, 1, 316), (0, 2), (2, 1, 313), (1, 1), (2, 1,
+312), (1, 1), (0, 1), (2, 1, 314), (2, 1, 316), (0, 4), (3, 1)]), (204, [(1, 4
+), (1, 1), (3, 1), (2, 1, 191), (2, 1, 189), (2, 1, 187), (2, 1, 185), (1, 1),
+(2, 1, 184), (1, 1), (3, 1), (2, 1, 186), (2, 1, 188), (3, 2), (2, 1, 185), (1,
+1), (2, 1, 184), (1, 1), (0, 1), (2, 1, 186), (2, 1, 188), (0, 4), (1, 1), (0,
+1), (2, 1, 191), (2, 1, 189), (2, 1, 187), (2, 1, 185), (1, 1), (2, 1, 184), (
+1, 1), (0, 1), (2, 1, 186), (2, 1, 188), (0, 2), (2, 1, 185), (1, 1), (2, 1,
+184), (1, 1), (0, 1), (2, 1, 186), (2, 1, 188), (0, 4), (3, 1)]), (205, [(1, 1
+), (1, 1), (3, 1), (2, 1, 191), (2, 1, 189), (2, 1, 187), (2, 1, 185), (1, 1),
+(2, 1, 184), (1, 1), (3, 1), (2, 1, 186), (2, 1, 188), (3, 2), (1, 1), (0, 1),
+(2, 1, 191), (2, 1, 189), (2, 1, 187), (2, 1, 185), (1, 1), (2, 1, 184), (1, 1
+), (0, 1), (2, 1, 186), (2, 1, 188), (0, 2), (3, 1)]), (41, [(1, 4), (2, 1, 191
+), (2, 1, 189), (2, 1, 187), (2, 1, 185), (1, 1), (2, 1, 184), (1, 1), (3, 1),
+(2, 1, 186), (2, 1, 188), (3, 2), (2, 1, 185), (1, 1), (2, 1, 184), (1, 1), (0,
+1), (2, 1, 186), (2, 1, 188), (0, 4), (2, 1, 191), (2, 1, 189), (2, 1, 187), (
+2, 1, 185), (1, 1), (2, 1, 184), (1, 1), (0, 1), (2, 1, 186), (2, 1, 188), (0,
+2), (2, 1, 185), (1, 1), (2, 1, 184), (1, 1), (0, 1), (2, 1, 186), (2, 1, 188),
+(0, 4), (3, 1)]), (159, [(1, 4), (1, 1), (3, 1), (2, 1, 191), (2, 1, 189), (2,
+1, 187), (2, 1, 185), (1, 1), (2, 1, 184), (1, 1), (3, 1), (2, 1, 186), (2, 1,
+188), (3, 2), (2, 1, 185), (1, 1), (2, 1, 184), (1, 1), (0, 1), (2, 1, 186), (
+2, 1, 188), (0, 4), (1, 1), (0, 1), (2, 1, 191), (2, 1, 189), (2, 1, 187), (2,
+1, 185), (1, 1), (2, 1, 184), (1, 1), (0, 1), (2, 1, 186), (2, 1, 188), (0, 2),
+(2, 1, 185), (1, 1), (2, 1, 184), (1, 1), (0, 1), (2, 1, 186), (2, 1, 188), (0,
+4), (3, 1)]), (161, [(1, 1), (2, 1, 221), (1, 1), (2, 1, 220), (3, 1), (2, 1,
+219), (2, 1, 217), (1, 1), (2, 1, 222), (2, 1, 224), (1, 1), (1, 1), (1, 1), (
+3, 4), (2, 1, 211), (2, 1, 209), (0, 1), (2, 1, 221), (1, 1), (2, 1, 220), (0,
+1), (2, 1, 219), (2, 1, 217), (1, 1), (2, 1, 222), (2, 1, 224), (1, 1), (1, 1),
+(1, 1), (0, 4), (2, 1, 211), (2, 1, 209), (3, 1), (0, 1)]), (161, [(1, 5), (2,
+1, 221), (1, 1), (2, 1, 220), (3, 1), (2, 1, 219), (2, 1, 217), (1, 1), (2, 1,
+222), (2, 1, 224), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 211), (2, 1, 209), (
+0, 5), (2, 1, 221), (1, 1), (2, 1, 220), (0, 1), (2, 1, 219), (2, 1, 217), (1,
+1), (2, 1, 222), (2, 1, 224), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 211), (2,
+1, 209), (3, 1), (0, 5)]), (0, [(1, 5), (0, 2), (2, 1, 225), (2, 1, 223), (2,
+1, 211), (2, 1, 209), (0, 5), (2, 1, 225), (2, 1, 223), (2, 1, 211), (2, 1, 209
+), (3, 1), (0, 3)]), (0, [(1, 5), (0, 4), (2, 1, 225), (2, 1, 223), (2, 1, 211
+), (2, 1, 209), (0, 5), (2, 1, 225), (2, 1, 223), (2, 1, 211), (2, 1, 209), (3,
+1), (0, 1)]), (0, [(1, 5), (0, 1), (2, 1, 225), (2, 1, 223), (2, 1, 211), (2,
+1, 209), (0, 5), (2, 1, 225), (2, 1, 223), (2, 1, 211), (2, 1, 209), (3, 1), (
+0, 4)]), (0, [(1, 5), (0, 3), (2, 1, 225), (2, 1, 223), (2, 1, 211), (2, 1, 209
+), (0, 5), (2, 1, 225), (2, 1, 223), (2, 1, 211), (2, 1, 209), (3, 1), (0, 2)]
+), (163, [(1, 1), (2, 1, 237), (1, 1), (2, 1, 236), (3, 1), (2, 1, 235), (2, 1,
+233), (1, 1), (2, 1, 238), (2, 1, 240), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1,
+229), (2, 1, 227), (0, 1), (2, 1, 237), (1, 1), (2, 1, 236), (0, 1), (2, 1, 235
+), (2, 1, 233), (1, 1), (2, 1, 238), (2, 1, 240), (1, 1), (1, 1), (1, 1), (0, 4
+), (2, 1, 229), (2, 1, 227), (3, 1), (0, 1)]), (163, [(1, 5), (2, 1, 237), (1,
+1), (2, 1, 236), (3, 1), (2, 1, 235), (2, 1, 233), (1, 1), (2, 1, 238), (2, 1,
+240), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 229), (2, 1, 227), (0, 5), (2, 1,
+237), (1, 1), (2, 1, 236), (0, 1), (2, 1, 235), (2, 1, 233), (1, 1), (2, 1, 238
+), (2, 1, 240), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 229), (2, 1, 227), (3, 1
+), (0, 5)]), (0, [(1, 5), (0, 2), (2, 1, 241), (2, 1, 239), (2, 1, 229), (2, 1,
+227), (0, 5), (2, 1, 241), (2, 1, 239), (2, 1, 229), (2, 1, 227), (3, 1), (0, 3
+)]), (0, [(1, 5), (0, 4), (2, 1, 241), (2, 1, 239), (2, 1, 229), (2, 1, 227), (
+0, 5), (2, 1, 241), (2, 1, 239), (2, 1, 229), (2, 1, 227), (3, 1), (0, 1)]), (
+0, [(1, 5), (0, 1), (2, 1, 241), (2, 1, 239), (2, 1, 229), (2, 1, 227), (0, 5),
+(2, 1, 241), (2, 1, 239), (2, 1, 229), (2, 1, 227), (3, 1), (0, 4)]), (0, [(1,
+5), (0, 3), (2, 1, 241), (2, 1, 239), (2, 1, 229), (2, 1, 227), (0, 5), (2, 1,
+241), (2, 1, 239), (2, 1, 229), (2, 1, 227), (3, 1), (0, 2)]), (164, [(1, 2), (
+2, 1, 273), (1, 1), (2, 1, 272), (3, 1), (2, 1, 274), (2, 1, 276), (3, 1), (0,
+1), (2, 1, 273), (1, 1), (2, 1, 272), (0, 1), (2, 1, 274), (2, 1, 276), (0, 2),
+(3, 1)]), (206, [(1, 2), (0, 1), (1, 1), (3, 1), (2, 1, 278), (3, 1), (0, 1), (
+1, 1), (0, 1), (2, 1, 278), (0, 1), (3, 1)]), (207, [(1, 2), (0, 1), (1, 1), (
+3, 1), (2, 1, 298), (3, 1), (0, 1), (1, 1), (0, 1), (2, 1, 298), (0, 1), (3, 1)
+]), (208, [(1, 3), (0, 2), (2, 1, 127), (1, 1), (2, 1, 128), (1, 1), (3, 2), (
+2, 1, 125), (2, 1, 117), (2, 1, 115), (2, 1, 107), (2, 1, 105), (0, 3), (2, 1,
+127), (1, 1), (2, 1, 128), (1, 1), (0, 2), (2, 1, 125), (2, 1, 117), (2, 1, 115
+), (2, 1, 107), (2, 1, 105), (3, 1), (0, 1)]), (0, [(1, 3), (0, 1), (2, 1, 129
+), (2, 1, 125), (2, 1, 117), (2, 1, 115), (2, 1, 107), (2, 1, 105), (0, 3), (2,
+1, 129), (2, 1, 125), (2, 1, 117), (2, 1, 115), (2, 1, 107), (2, 1, 105), (3, 1
+), (0, 2)]), (0, [(1, 3), (2, 1, 129), (2, 1, 125), (2, 1, 117), (2, 1, 115), (
+2, 1, 107), (2, 1, 105), (0, 3), (2, 1, 129), (2, 1, 125), (2, 1, 117), (2, 1,
+115), (2, 1, 107), (2, 1, 105), (3, 1), (0, 3)]), (209, [(1, 2), (2, 1, 256), (
+3, 1), (0, 1), (2, 1, 256), (0, 2), (3, 1)]), (210, [(1, 2), (0, 1), (2, 1, 257
+), (1, 1), (2, 1, 256), (3, 1), (2, 1, 255), (2, 1, 253), (1, 1), (2, 1, 258),
+(2, 1, 260), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 245), (2, 1, 243), (0, 2),
+(2, 1, 257), (1, 1), (2, 1, 256), (0, 1), (2, 1, 255), (2, 1, 253), (1, 1), (2,
+1, 258), (2, 1, 260), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 245), (2, 1, 243),
+(3, 1), (0, 1)]), (211, [(1, 4), (0, 1), (2, 1, 123), (2, 1, 119), (2, 1, 117),
+(2, 1, 115), (2, 1, 107), (2, 1, 105), (0, 2), (3, 1), (0, 1), (2, 1, 123), (2,
+1, 119), (2, 1, 117), (2, 1, 115), (2, 1, 107), (2, 1, 105), (3, 1), (0, 3)]),
+(212, [(1, 4), (2, 1, 123), (2, 1, 119), (2, 1, 117), (2, 1, 115), (2, 1, 107),
+(2, 1, 105), (0, 2), (3, 1), (0, 1), (2, 1, 123), (2, 1, 119), (2, 1, 117), (2,
+1, 115), (2, 1, 107), (2, 1, 105), (3, 1), (0, 4)]), (213, [(1, 3), (3, 2), (2,
+1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 3), (2, 1,
+103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (
+214, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2,
+1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97
+), (3, 1), (0, 1)]), (19, [(1, 2), (2, 1, 79), (0, 1), (2, 1, 103), (1, 1), (2,
+1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 79), (3, 1), (2, 1, 103
+), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (215, [(1, 2
+), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (
+0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1
+), (0, 1)]), (216, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (
+2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1,
+99), (2, 1, 97), (3, 1), (0, 1)]), (217, [(1, 2), (3, 1), (2, 1, 103), (1, 1),
+(2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2,
+1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (218, [(1, 2), (3, 1
+), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (
+2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)
+]), (219, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99
+), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (
+2, 1, 97), (3, 1), (0, 1)]), (220, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102),
+(0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (221, [(1, 2), (3, 1), (2, 1,
+103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103),
+(1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (19, [(
+1, 2), (2, 1, 7), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99),
+(2, 1, 97), (0, 1), (2, 1, 7), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1
+), (2, 1, 99), (2, 1, 97), (0, 2)]), (19, [(1, 2), (2, 1, 13), (0, 1), (2, 1,
+103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 13),
+(3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2
+)]), (222, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99
+), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (
+2, 1, 97), (3, 1), (0, 1)]), (223, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102),
+(0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (224, [(1, 2), (3, 1), (2, 1,
+103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103),
+(1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (225, [(
+1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97
+), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (
+3, 1), (0, 1)]), (19, [(1, 2), (2, 1, 29), (0, 1), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 29), (3, 1), (2, 1, 103),
+(1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (226, [(1, 2), (
+3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2
+), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (
+0, 1)]), (227, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2,
+1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99
+), (2, 1, 97), (3, 1), (0, 1)]), (228, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (
+2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1,
+102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (229, [(1, 2), (3, 1),
+(2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2,
+1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]),
+(19, [(1, 2), (2, 1, 49), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2,
+1, 99), (2, 1, 97), (0, 1), (2, 1, 49), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102
+), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (230, [(1, 2), (3, 1), (2, 1, 103
+), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (
+1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (231, [(
+1, 3), (0, 1), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (
+2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1,
+97), (3, 1), (0, 1)]), (232, [(1, 3), (3, 1), (0, 1), (2, 1, 103), (1, 1), (2,
+1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (2, 1,
+102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (233, [(1, 2), (3, 1),
+(2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2,
+1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]),
+(234, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (
+2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1,
+97), (3, 1), (0, 1)]), (235, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102),
+(3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1
+), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (236, [(1, 2), (3, 1), (2, 1, 103
+), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (
+1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (19, [(1,
+2), (2, 1, 63), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (
+2, 1, 97), (0, 1), (2, 1, 63), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1
+), (2, 1, 99), (2, 1, 97), (0, 2)]), (237, [(1, 2), (3, 1), (2, 1, 103), (1, 1
+), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (
+2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (238, [(1, 2), (
+3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2
+), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (
+0, 1)]), (19, [(1, 2), (2, 1, 71), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (
+3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 71), (3, 1), (2, 1, 103), (1, 1),
+(2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (93, [(1, 4), (0, 1), (
+2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (3, 1), (2, 1, 314), (2, 1, 316), (3,
+2), (0, 3), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314), (2,
+1, 316), (0, 4), (3, 1)]), (152, [(1, 4), (0, 3), (1, 1), (2, 1, 320), (3, 1),
+(2, 1, 307), (1, 1), (2, 1, 306), (1, 1), (2, 1, 308), (2, 1, 310), (1, 1), (1,
+1), (1, 1), (3, 5), (2, 1, 305), (0, 4), (1, 1), (2, 1, 320), (0, 1), (2, 1,
+307), (1, 1), (2, 1, 306), (1, 1), (2, 1, 308), (2, 1, 310), (1, 1), (1, 1), (
+1, 1), (0, 5), (2, 1, 305), (3, 1), (0, 1)]), (239, [(1, 4), (1, 1), (3, 1), (
+2, 1, 319), (2, 1, 317), (2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1),
+(3, 1), (2, 1, 314), (2, 1, 316), (3, 2), (2, 1, 313), (1, 1), (2, 1, 312), (1,
+1), (0, 1), (2, 1, 314), (2, 1, 316), (0, 4), (1, 1), (0, 1), (2, 1, 319), (2,
+1, 317), (2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1,
+314), (2, 1, 316), (0, 2), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1), (
+2, 1, 314), (2, 1, 316), (0, 4), (3, 1)]), (153, [(1, 4), (0, 2), (2, 1, 318),
+(1, 1), (1, 1), (3, 3), (0, 3), (2, 1, 318), (1, 1), (1, 1), (0, 4), (3, 1)]),
+(240, [(1, 1), (1, 1), (3, 1), (2, 1, 319), (2, 1, 317), (2, 1, 315), (2, 1,
+313), (1, 1), (2, 1, 312), (1, 1), (3, 1), (2, 1, 314), (2, 1, 316), (3, 2), (
+1, 1), (0, 1), (2, 1, 319), (2, 1, 317), (2, 1, 315), (2, 1, 313), (1, 1), (2,
+1, 312), (1, 1), (0, 1), (2, 1, 314), (2, 1, 316), (0, 2), (3, 1)]), (205, [(1,
+4), (1, 1), (3, 1), (2, 1, 191), (2, 1, 189), (2, 1, 187), (2, 1, 185), (1, 1),
+(2, 1, 184), (1, 1), (3, 1), (2, 1, 186), (2, 1, 188), (3, 2), (2, 1, 185), (1,
+1), (2, 1, 184), (1, 1), (0, 1), (2, 1, 186), (2, 1, 188), (0, 4), (1, 1), (0,
+1), (2, 1, 191), (2, 1, 189), (2, 1, 187), (2, 1, 185), (1, 1), (2, 1, 184), (
+1, 1), (0, 1), (2, 1, 186), (2, 1, 188), (0, 2), (2, 1, 185), (1, 1), (2, 1,
+184), (1, 1), (0, 1), (2, 1, 186), (2, 1, 188), (0, 4), (3, 1)]), (241, [(1, 2
+), (2, 1, 278), (3, 1), (0, 1), (2, 1, 278), (0, 2), (3, 1)]), (242, [(1, 2), (
+0, 1), (2, 1, 279), (1, 1), (2, 1, 278), (3, 1), (2, 1, 277), (2, 1, 275), (1,
+1), (2, 1, 280), (2, 1, 282), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 265), (2,
+1, 263), (0, 2), (2, 1, 279), (1, 1), (2, 1, 278), (0, 1), (2, 1, 277), (2, 1,
+275), (1, 1), (2, 1, 280), (2, 1, 282), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1,
+265), (2, 1, 263), (3, 1), (0, 1)]), (243, [(1, 2), (2, 1, 298), (3, 1), (0, 1
+), (2, 1, 298), (0, 2), (3, 1)]), (244, [(1, 2), (0, 1), (2, 1, 299), (1, 1), (
+2, 1, 298), (3, 1), (2, 1, 297), (2, 1, 295), (1, 1), (2, 1, 300), (2, 1, 302),
+(1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 287), (2, 1, 285), (0, 2), (2, 1, 299),
+(1, 1), (2, 1, 298), (0, 1), (2, 1, 297), (2, 1, 295), (1, 1), (2, 1, 300), (2,
+1, 302), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 287), (2, 1, 285), (3, 1), (0,
+1)]), (0, [(1, 2), (0, 1), (2, 1, 129), (2, 1, 125), (2, 1, 117), (2, 1, 115),
+(2, 1, 107), (2, 1, 105), (0, 2), (2, 1, 129), (2, 1, 125), (2, 1, 117), (2, 1,
+115), (2, 1, 107), (2, 1, 105), (3, 1), (0, 1)]), (0, [(1, 2), (2, 1, 129), (2,
+1, 125), (2, 1, 117), (2, 1, 115), (2, 1, 107), (2, 1, 105), (0, 2), (2, 1, 129
+), (2, 1, 125), (2, 1, 117), (2, 1, 115), (2, 1, 107), (2, 1, 105), (3, 1), (0,
+2)]), (210, [(1, 1), (2, 1, 257), (1, 1), (2, 1, 256), (3, 1), (2, 1, 255), (2,
+1, 253), (1, 1), (2, 1, 258), (2, 1, 260), (1, 1), (1, 1), (1, 1), (3, 4), (2,
+1, 245), (2, 1, 243), (0, 1), (2, 1, 257), (1, 1), (2, 1, 256), (0, 1), (2, 1,
+255), (2, 1, 253), (1, 1), (2, 1, 258), (2, 1, 260), (1, 1), (1, 1), (1, 1), (
+0, 4), (2, 1, 245), (2, 1, 243), (3, 1), (0, 1)]), (210, [(1, 5), (2, 1, 257),
+(1, 1), (2, 1, 256), (3, 1), (2, 1, 255), (2, 1, 253), (1, 1), (2, 1, 258), (2,
+1, 260), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 245), (2, 1, 243), (0, 5), (2,
+1, 257), (1, 1), (2, 1, 256), (0, 1), (2, 1, 255), (2, 1, 253), (1, 1), (2, 1,
+258), (2, 1, 260), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 245), (2, 1, 243), (
+3, 1), (0, 5)]), (0, [(1, 5), (0, 2), (2, 1, 261), (2, 1, 259), (2, 1, 245), (
+2, 1, 243), (0, 5), (2, 1, 261), (2, 1, 259), (2, 1, 245), (2, 1, 243), (3, 1),
+(0, 3)]), (0, [(1, 5), (0, 4), (2, 1, 261), (2, 1, 259), (2, 1, 245), (2, 1,
+243), (0, 5), (2, 1, 261), (2, 1, 259), (2, 1, 245), (2, 1, 243), (3, 1), (0, 1
+)]), (0, [(1, 5), (0, 1), (2, 1, 261), (2, 1, 259), (2, 1, 245), (2, 1, 243), (
+0, 5), (2, 1, 261), (2, 1, 259), (2, 1, 245), (2, 1, 243), (3, 1), (0, 4)]), (
+0, [(1, 5), (0, 3), (2, 1, 261), (2, 1, 259), (2, 1, 245), (2, 1, 243), (0, 5),
+(2, 1, 261), (2, 1, 259), (2, 1, 245), (2, 1, 243), (3, 1), (0, 2)]), (0, [(1,
+1), (2, 1, 123), (2, 1, 119), (2, 1, 117), (2, 1, 115), (2, 1, 107), (2, 1, 105
+), (0, 1), (2, 1, 123), (2, 1, 119), (2, 1, 117), (2, 1, 115), (2, 1, 107), (2,
+1, 105), (3, 1), (0, 1)]), (245, [(1, 3), (3, 2), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (2, 1, 102),
+(0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (246, [(1, 2), (3, 1), (2, 1,
+103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103),
+(1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (247, [(
+1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97
+), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (
+3, 1), (0, 1)]), (248, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1
+), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (249, [(1, 2), (3, 1), (2, 1, 103), (
+1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1
+), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (250, [(1, 2
+), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (
+0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1
+), (0, 1)]), (251, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (
+2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1,
+99), (2, 1, 97), (3, 1), (0, 1)]), (252, [(1, 2), (3, 1), (2, 1, 103), (1, 1),
+(2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2,
+1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (253, [(1, 2), (3, 1
+), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (
+2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)
+]), (254, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99
+), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (
+2, 1, 97), (3, 1), (0, 1)]), (255, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102),
+(0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (19, [(1, 2), (2, 1, 21), (0,
+1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (
+2, 1, 21), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1,
+97), (0, 2)]), (19, [(1, 2), (2, 1, 27), (0, 1), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 27), (3, 1), (2, 1, 103),
+(1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (19, [(1, 2), (
+2, 1, 37), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1,
+97), (0, 1), (2, 1, 37), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2,
+1, 99), (2, 1, 97), (0, 2)]), (256, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2,
+1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1,
+102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (257, [(1, 2), (3, 1),
+(2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2,
+1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]),
+(19, [(1, 2), (2, 1, 47), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2,
+1, 99), (2, 1, 97), (0, 1), (2, 1, 47), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102
+), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (19, [(1, 2), (2, 1, 51), (0, 1),
+(2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2,
+1, 51), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97
+), (0, 2)]), (19, [(1, 2), (2, 1, 95), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102
+), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 95), (3, 1), (2, 1, 103), (1,
+1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (19, [(1, 2), (2, 1,
+53), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97),
+(0, 1), (2, 1, 53), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99
+), (2, 1, 97), (0, 2)]), (19, [(1, 2), (2, 1, 55), (0, 1), (2, 1, 103), (1, 1),
+(2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 55), (3, 1), (2, 1,
+103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (19, [(1,
+2), (2, 1, 57), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (
+2, 1, 97), (0, 1), (2, 1, 57), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1
+), (2, 1, 99), (2, 1, 97), (0, 2)]), (19, [(1, 2), (2, 1, 59), (0, 1), (2, 1,
+103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 59),
+(3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2
+)]), (258, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99
+), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (
+2, 1, 97), (3, 1), (0, 1)]), (259, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102),
+(0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (260, [(1, 2), (3, 1), (2, 1,
+103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103),
+(1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (93, [(
+1, 4), (2, 1, 319), (2, 1, 317), (2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312),
+(1, 1), (3, 1), (2, 1, 314), (2, 1, 316), (3, 2), (2, 1, 313), (1, 1), (2, 1,
+312), (1, 1), (0, 1), (2, 1, 314), (2, 1, 316), (0, 4), (2, 1, 319), (2, 1, 317
+), (2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314),
+(2, 1, 316), (0, 2), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1,
+314), (2, 1, 316), (0, 4), (3, 1)]), (240, [(1, 4), (1, 1), (3, 1), (2, 1, 319
+), (2, 1, 317), (2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (3, 1),
+(2, 1, 314), (2, 1, 316), (3, 2), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0,
+1), (2, 1, 314), (2, 1, 316), (0, 4), (1, 1), (0, 1), (2, 1, 319), (2, 1, 317),
+(2, 1, 315), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314), (2,
+1, 316), (0, 2), (2, 1, 313), (1, 1), (2, 1, 312), (1, 1), (0, 1), (2, 1, 314),
+(2, 1, 316), (0, 4), (3, 1)]), (242, [(1, 1), (2, 1, 279), (1, 1), (2, 1, 278),
+(3, 1), (2, 1, 277), (2, 1, 275), (1, 1), (2, 1, 280), (2, 1, 282), (1, 1), (1,
+1), (1, 1), (3, 4), (2, 1, 265), (2, 1, 263), (0, 1), (2, 1, 279), (1, 1), (2,
+1, 278), (0, 1), (2, 1, 277), (2, 1, 275), (1, 1), (2, 1, 280), (2, 1, 282), (
+1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 265), (2, 1, 263), (3, 1), (0, 1)]), (
+242, [(1, 5), (2, 1, 279), (1, 1), (2, 1, 278), (3, 1), (2, 1, 277), (2, 1, 275
+), (1, 1), (2, 1, 280), (2, 1, 282), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 265
+), (2, 1, 263), (0, 5), (2, 1, 279), (1, 1), (2, 1, 278), (0, 1), (2, 1, 277),
+(2, 1, 275), (1, 1), (2, 1, 280), (2, 1, 282), (1, 1), (1, 1), (1, 1), (0, 4),
+(2, 1, 265), (2, 1, 263), (3, 1), (0, 5)]), (0, [(1, 5), (0, 2), (2, 1, 283), (
+2, 1, 281), (2, 1, 265), (2, 1, 263), (0, 5), (2, 1, 283), (2, 1, 281), (2, 1,
+265), (2, 1, 263), (3, 1), (0, 3)]), (0, [(1, 5), (0, 4), (2, 1, 283), (2, 1,
+281), (2, 1, 265), (2, 1, 263), (0, 5), (2, 1, 283), (2, 1, 281), (2, 1, 265),
+(2, 1, 263), (3, 1), (0, 1)]), (0, [(1, 5), (0, 1), (2, 1, 283), (2, 1, 281), (
+2, 1, 265), (2, 1, 263), (0, 5), (2, 1, 283), (2, 1, 281), (2, 1, 265), (2, 1,
+263), (3, 1), (0, 4)]), (0, [(1, 5), (0, 3), (2, 1, 283), (2, 1, 281), (2, 1,
+265), (2, 1, 263), (0, 5), (2, 1, 283), (2, 1, 281), (2, 1, 265), (2, 1, 263),
+(3, 1), (0, 2)]), (244, [(1, 1), (2, 1, 299), (1, 1), (2, 1, 298), (3, 1), (2,
+1, 297), (2, 1, 295), (1, 1), (2, 1, 300), (2, 1, 302), (1, 1), (1, 1), (1, 1),
+(3, 4), (2, 1, 287), (2, 1, 285), (0, 1), (2, 1, 299), (1, 1), (2, 1, 298), (0,
+1), (2, 1, 297), (2, 1, 295), (1, 1), (2, 1, 300), (2, 1, 302), (1, 1), (1, 1),
+(1, 1), (0, 4), (2, 1, 287), (2, 1, 285), (3, 1), (0, 1)]), (244, [(1, 5), (2,
+1, 299), (1, 1), (2, 1, 298), (3, 1), (2, 1, 297), (2, 1, 295), (1, 1), (2, 1,
+300), (2, 1, 302), (1, 1), (1, 1), (1, 1), (3, 4), (2, 1, 287), (2, 1, 285), (
+0, 5), (2, 1, 299), (1, 1), (2, 1, 298), (0, 1), (2, 1, 297), (2, 1, 295), (1,
+1), (2, 1, 300), (2, 1, 302), (1, 1), (1, 1), (1, 1), (0, 4), (2, 1, 287), (2,
+1, 285), (3, 1), (0, 5)]), (0, [(1, 5), (0, 2), (2, 1, 303), (2, 1, 301), (2,
+1, 287), (2, 1, 285), (0, 5), (2, 1, 303), (2, 1, 301), (2, 1, 287), (2, 1, 285
+), (3, 1), (0, 3)]), (0, [(1, 5), (0, 4), (2, 1, 303), (2, 1, 301), (2, 1, 287
+), (2, 1, 285), (0, 5), (2, 1, 303), (2, 1, 301), (2, 1, 287), (2, 1, 285), (3,
+1), (0, 1)]), (0, [(1, 5), (0, 1), (2, 1, 303), (2, 1, 301), (2, 1, 287), (2,
+1, 285), (0, 5), (2, 1, 303), (2, 1, 301), (2, 1, 287), (2, 1, 285), (3, 1), (
+0, 4)]), (0, [(1, 5), (0, 3), (2, 1, 303), (2, 1, 301), (2, 1, 287), (2, 1, 285
+), (0, 5), (2, 1, 303), (2, 1, 301), (2, 1, 287), (2, 1, 285), (3, 1), (0, 2)]
+), (261, [(1, 3), (3, 1), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2,
+1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99
+), (2, 1, 97), (3, 1), (0, 1)]), (262, [(1, 3), (0, 1), (3, 1), (2, 1, 103), (
+1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 3), (2, 1, 103), (1, 1
+), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (19, [(1, 2),
+(2, 1, 77), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2,
+1, 97), (0, 1), (2, 1, 77), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (0, 2)]), (263, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (
+2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1,
+102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (264, [(1, 2), (3, 1),
+(2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2,
+1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]),
+(265, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (
+2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1,
+97), (3, 1), (0, 1)]), (266, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102),
+(3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1
+), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (267, [(1, 2), (3, 1), (2, 1, 103
+), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (
+1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (268, [(
+1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97
+), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (
+3, 1), (0, 1)]), (269, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1
+), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (270, [(1, 2), (3, 1), (2, 1, 103), (
+1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1
+), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (19, [(1, 2),
+(2, 1, 17), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2,
+1, 97), (0, 1), (2, 1, 17), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (0, 2)]), (271, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (
+2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1,
+102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (272, [(1, 2), (3, 1),
+(2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2,
+1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]),
+(19, [(1, 2), (2, 1, 61), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2,
+1, 99), (2, 1, 97), (0, 1), (2, 1, 61), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102
+), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (273, [(1, 2), (3, 1), (2, 1, 103
+), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (
+1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (274, [(
+1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97
+), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (
+3, 1), (0, 1)]), (19, [(1, 2), (2, 1, 73), (0, 1), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 73), (3, 1), (2, 1, 103),
+(1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (19, [(1, 2), (
+2, 1, 75), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1,
+97), (0, 1), (2, 1, 75), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2,
+1, 99), (2, 1, 97), (0, 2)]), (19, [(1, 2), (2, 1, 81), (0, 1), (2, 1, 103), (
+1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 81), (3, 1),
+(2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (
+19, [(1, 2), (2, 1, 83), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2,
+1, 99), (2, 1, 97), (0, 1), (2, 1, 83), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102
+), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (275, [(1, 2), (3, 1), (2, 1, 103
+), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (
+1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (276, [(
+1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97
+), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (
+3, 1), (0, 1)]), (277, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1
+), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (278, [(1, 2), (3, 1), (2, 1, 103), (
+1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1
+), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (19, [(1, 2),
+(2, 1, 93), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2,
+1, 97), (0, 1), (2, 1, 93), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (0, 2)]), (19, [(1, 2), (2, 1, 15), (0, 1), (2, 1, 103),
+(1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 15), (3, 1
+), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]),
+(19, [(1, 2), (2, 1, 43), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2,
+1, 99), (2, 1, 97), (0, 1), (2, 1, 43), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102
+), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (19, [(1, 2), (2, 1, 45), (0, 1),
+(2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2,
+1, 45), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97
+), (0, 2)]), (19, [(1, 2), (2, 1, 65), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102
+), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 65), (3, 1), (2, 1, 103), (1,
+1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]), (19, [(1, 2), (2, 1,
+69), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97),
+(0, 1), (2, 1, 69), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99
+), (2, 1, 97), (0, 2)]), (279, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102
+), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (
+0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (19, [(1, 2), (2, 1, 87), (0,
+1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (
+2, 1, 87), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1,
+97), (0, 2)]), (280, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1),
+(2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2,
+1, 99), (2, 1, 97), (3, 1), (0, 1)]), (281, [(1, 2), (3, 1), (2, 1, 103), (1, 1
+), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (
+2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (19, [(1, 2), (2,
+1, 85), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97
+), (0, 1), (2, 1, 85), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1,
+99), (2, 1, 97), (0, 2)]), (282, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1,
+102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102),
+(0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (283, [(1, 2), (3, 1), (2, 1,
+103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103),
+(1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (284, [(
+1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97
+), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (
+3, 1), (0, 1)]), (285, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1
+), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (
+2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (286, [(1, 2), (3, 1), (2, 1, 103), (
+1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1
+), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1), (0, 1)]), (287, [(1, 2
+), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (
+0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (3, 1
+), (0, 1)]), (288, [(1, 2), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (
+2, 1, 99), (2, 1, 97), (0, 2), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1,
+99), (2, 1, 97), (3, 1), (0, 1)]), (19, [(1, 2), (2, 1, 91), (0, 1), (2, 1, 103
+), (1, 1), (2, 1, 102), (3, 1), (2, 1, 99), (2, 1, 97), (0, 1), (2, 1, 91), (3,
+1), (2, 1, 103), (1, 1), (2, 1, 102), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)]),
+(19, [(1, 2), (2, 1, 89), (0, 1), (2, 1, 103), (1, 1), (2, 1, 102), (3, 1), (2,
+1, 99), (2, 1, 97), (0, 1), (2, 1, 89), (3, 1), (2, 1, 103), (1, 1), (2, 1, 102
+), (0, 1), (2, 1, 99), (2, 1, 97), (0, 2)])], [1])
+# GENERATE END
+
+# GENERATE TOKENS BEGIN
+tokens = [-1, -1, 290, 322, 312, 297, 293, 321, 313, 318, 304, 315, 310, 288,
+303, 319, 320, 314, 292, 299, 300, 291, 294, 323, 298, 301, 263, 289, 308, 316,
+287, 309, 302, 305, 295, 317, 324, 325, 326, 296, 306, 327, 307, 328, 329, 330,
+262, 285, 258, -1, -1, -1, 259, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+259, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 259, -1, -1, -1, -1, -1, -1,
+-1, -1, -1, -1, 259, -1, -1, -1, -1, -1, -1, -1, 260, -1, -1, -1, -1, -1, -1,
+-1, 260, -1, -1, -1, -1, -1, -1, -1, -1, 260, -1, -1, -1, -1, -1, -1, -1, 260,
+-1, -1, -1, -1, -1, -1, -1, -1, -1, 260, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+-1, 260, -1, -1, -1, -1, -1, -1, -1, -1, -1, 261, -1, -1, -1, -1, -1, -1, -1,
+-1, 311, 281, 280, 278, 279, 275, 276, 277, 282, 283, 284, 268, 267, 265, 266,
+264, 273, 274, 269, 270, 271, 272, 59, 123, -1, 125, -1, 44, 58, 61, 40, 41,
+91, -1, 93, -1, 46, 38, 33, 126, 45, 43, 42, 47, 37, 60, 62, 94, 124, 63, -1,
+-1, -1]
+# GENERATE END
+
+def yylex(root, pos, off, factory, yychunk_iter):
+  for end_pos, end_off, group_index in (
+    _dfa.yylex(root, pos, off, factory, yychunk_iter)
+  ):
+    token = tokens[group_index]
+    #print('end_pos', end_pos, 'end_off', end_off, 'group_index', group_index, 'token', token)
+    if token != -1:
+      yield end_pos, end_off, token
+
+if __name__ == '__main__':
+  import ansi_c
+  import element
+  import sys
+  import work
+  import xml.etree.ElementTree
+
+  root = element.Element('root')
+  pos = 0
+  off = 0
+  for end_pos, end_off, group_index in _dfa.yylex(
+    root,
+    pos,
+    off,
+    ansi_c.factory,
+    work.yychunk_line(root, sys.stdin)
+  ):
+    tag, kwargs = _dfa.groups[group_index]
+    if tag != '':
+      work.apply_markup(
+        root,
+        pos,
+        off,
+        end_pos,
+        end_off,
+        ansi_c.factory,
+        tag,
+        **kwargs
+      )
+    pos, off = element.to_start_relative(root, end_pos, end_off)
+  xml.etree.ElementTree.dump(root)
diff --git a/ansi_c_yylex.sh b/ansi_c_yylex.sh
new file mode 100755 (executable)
index 0000000..57a7185
--- /dev/null
@@ -0,0 +1,7 @@
+#!/bin/sh
+if ../plex.git/plex.py ansi_c_lex.l ansi_c_tokens.py <ansi_c_yylex.py >ansi_c_yylex.py.new && ! diff -q ansi_c_yylex.py ansi_c_yylex.py.new
+ then
+  mv ansi_c_yylex.py.new ansi_c_yylex.py
+else
+  rm -f ansi_c_yylex.py.new
+fi
diff --git a/ansi_c_yyparse.py b/ansi_c_yyparse.py
new file mode 100644 (file)
index 0000000..99f4703
--- /dev/null
@@ -0,0 +1,1368 @@
+import lr1dfa
+
+# GENERATE LALR1 BEGIN
+lalr1 = lr1dfa.LR1DFA([([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 59, 60,
+123, 124, 126, 127, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267,
+285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300,
+301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316,
+317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331], [
+-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 179, -1, 14, -1, 16, -1, 487, -1,
+18, 20, 22, 24, 26, 28, -1, 30, 32, -1, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52,
+54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, -1, 86, 88, 90,
+-1, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120], [1,
+6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72,
+74, 77, 89, 91, 93, 96, 98, 100, 105, 110, 116, 133, 135, 137, 153, 155, 161,
+162, 168, 172, 174, 176, 226, 227, 243, 245, 247, 249, 264], [-1, 61, 62, -1,
+63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 79,
+80, 81, -1, 82, 83, 84, -1, 85, 86, 87, 88, -1, 89, -1, 90, -1, 91, 92, 93, -1,
+94, 95, 96, 97, 98, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126,
+127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327,
+328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22,
+24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13,
+18, 26, 30, 42, 44, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 101, -1]),
+([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261,
+262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1,
+4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32,
+-1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 264],
+[-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 102, -1]), ([33, 34, 38, 39, 40, 41,
+42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267,
+285, 286, 287, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305,
+306, 307, 308, 309, 310, 311, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6,
+-1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 34, 36,
+-1, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, -1,
+110, 112, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59,
+62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93, 116, 133, 135, 137, 143, 145, 147,
+153, 155, 161, 162, 168, 172, 197, 198, 264], [-1, 61, 62, -1, 63, 64, -1, 65,
+-1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 79, -1, 103, -1,
+104, 87, 88, -1, 105, 106, -1, 89, -1, 90, -1, 107, -1, 108, -1]), ([33, 34,
+38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263,
+264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6,
+-1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1,
+110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 264], [-1, 61, 62,
+-1, 63, 64, -1, 65, -1, 100, 109, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44,
+45, 46, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287,
+325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1,
+198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9,
+10, 12, 13, 18, 26, 30, 42, 44, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100,
+110, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259,
+260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [
+-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28,
+-1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30,
+42, 44, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 111, -1]), ([33, 34,
+38, 39, 40, 41, 42, 43, 44, 45, 46, 59, 60, 123, 124, 125, 126, 127, 258, 259,
+260, 261, 262, 263, 264, 265, 266, 267, 285, 286, 287, 288, 289, 290, 291, 292,
+293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308,
+309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324,
+325, 326, 327, 328, 329, 330, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12,
+-1, 179, -1, 14, -1, 487, 16, -1, 18, 20, 22, 24, 26, 28, -1, 30, 32, -1, 34,
+36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74,
+76, 78, 80, 82, 84, -1, 86, 88, 90, -1, 92, 94, 96, 98, 100, 102, 104, 106,
+108, 110, 112, 114, 116, 118, 120], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44,
+48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93, 96, 98, 100, 105,
+110, 116, 133, 135, 137, 153, 155, 161, 162, 168, 172, 174, 176, 226, 227, 243,
+245, 247, 249, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70,
+71, 72, 73, 74, 75, 76, 77, 78, -1, 79, 80, 81, -1, 82, 83, 84, -1, 85, 86, 87,
+88, -1, 89, -1, 90, -1, 91, 92, 93, -1, 94, 95, 112, 97, 98, -1]), ([33, 34,
+38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263,
+264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6,
+-1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1,
+110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 264], [-1, 61, 62,
+-1, 63, 64, -1, 65, -1, 100, 113, -1]), ([37, 39, 40, 41, 42, 48, 58, 59, 64,
+91, 92, 94, 95, 124, 125, 264, 285, 331], [-1, 3, -1, 3, -1, 3, -1, 228, 3, -1,
+3, -1, 3, -1, 3, -1, 3, -1], [264], [-1]), ([37, 39, 40, 48, 58, 64, 91, 92,
+93, 95, 124, 126, 264, 285, 331], [-1, 13, -1, 13, -1, 13, -1, 13, -1, 13, -1,
+13, -1, 13, -1], [264], [-1]), ([37, 39, 40, 48, 58, 64, 91, 92, 93, 95, 124,
+126, 264, 285, 331], [-1, 15, -1, 15, -1, 15, -1, 15, -1, 15, -1, 15, -1, 15,
+-1], [264], [-1]), ([37, 39, 40, 48, 58, 64, 91, 92, 93, 95, 124, 126, 264,
+285, 331], [-1, 21, -1, 21, -1, 21, -1, 21, -1, 21, -1, 21, -1, 21, -1], [264],
+[-1]), ([37, 39, 40, 48, 58, 64, 91, 92, 93, 95, 124, 126, 264, 285, 331], [-1,
+23, -1, 23, -1, 23, -1, 23, -1, 23, -1, 23, -1, 23, -1], [264], [-1]), ([33,
+34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263,
+264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 230,
+-1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1,
+110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 264], [-1, 61, 62, -1,
+63, 64, -1, 65, -1, 116, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326,
+327, 328, 331], [-1, 2, -1, 4, -1, 234, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20,
+22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12,
+13, 18, 26, 30, 42, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 118, -1]), ([33,
+34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263,
+264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 234,
+-1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1,
+110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 264], [-1, 61, 62, -1,
+63, 64, -1, 65, -1, 119, -1]), ([40, 43, 44, 45, 58, 60, 91, 92, 258, 259, 285,
+286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1, 265, -1, 265, -1,
+265, -1, 265, -1, 265, -1, 265, -1, 265, -1, 265, -1, 265, -1, 265, -1, 265], [
+264], [-1]), ([37, 39, 40, 48, 58, 64, 91, 92, 93, 95, 124, 126, 264, 285, 331
+], [-1, 17, -1, 17, -1, 17, -1, 17, -1, 17, -1, 17, -1, 17, -1], [264], [-1]),
+([40, 43, 44, 45, 59, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324, 325, 326,
+327, 328, 329, 330, 331], [-1, 221, -1, 221, -1, 221, -1, 221, -1, 221, -1,
+221, -1, 221, -1, 221, -1, 221, -1, 221, -1, 221], [264], [-1]), ([40, 43, 44,
+45, 59, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329,
+330, 331], [-1, 223, -1, 223, -1, 223, -1, 223, -1, 223, -1, 223, -1, 223, -1,
+223, -1, 223, -1, 223, -1, 223], [264], [-1]), ([40, 43, 44, 45, 59, 60, 91,
+92, 258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1,
+225, -1, 225, -1, 225, -1, 225, -1, 225, -1, 225, -1, 225, -1, 225, -1, 225,
+-1, 225, -1, 225], [264], [-1]), ([40, 43, 44, 45, 59, 60, 91, 92, 258, 259,
+285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1, 229, -1, 229,
+-1, 229, -1, 229, -1, 229, -1, 229, -1, 229, -1, 229, -1, 229, -1, 229, -1, 229
+], [264], [-1]), ([40, 43, 44, 45, 59, 60, 91, 92, 258, 259, 285, 286, 287,
+311, 324, 325, 326, 327, 328, 329, 330, 331], [-1, 231, -1, 231, -1, 231, -1,
+231, -1, 231, -1, 231, -1, 231, -1, 231, -1, 231, -1, 231, -1, 231], [264], [-1
+]), ([40, 43, 44, 45, 59, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324, 325,
+326, 327, 328, 329, 330, 331], [-1, 345, -1, 345, -1, 345, -1, 345, -1, 345,
+-1, 345, -1, 345, -1, 345, -1, 345, -1, 345, -1, 345], [264], [-1]), ([33, 34,
+38, 39, 40, 46, 58, 60, 91, 92, 93, 94, 126, 127, 258, 264, 265, 267, 285, 311,
+324, 329, 330, 331], [-1, 337, -1, 337, -1, 337, -1, 337, -1, 337, -1, 337, -1,
+337, -1, 337, -1, 337, -1, 337, -1, 337, -1, 337], [264], [-1]), ([33, 34, 38,
+39, 40, 46, 58, 60, 91, 92, 93, 94, 126, 127, 258, 264, 265, 267, 285, 311,
+324, 329, 330, 331], [-1, 339, -1, 339, -1, 339, -1, 339, -1, 339, -1, 339, -1,
+339, -1, 339, -1, 339, -1, 339, -1, 339, -1, 339], [264], [-1]), ([33, 34, 38,
+39, 40, 46, 58, 60, 91, 92, 93, 94, 126, 127, 258, 264, 265, 267, 285, 311,
+324, 329, 330, 331], [-1, 341, -1, 341, -1, 341, -1, 341, -1, 341, -1, 341, -1,
+341, -1, 341, -1, 341, -1, 341, -1, 341, -1, 341], [264], [-1]), ([40, 43, 44,
+45, 58, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329,
+330, 331], [-1, 251, -1, 251, -1, 251, -1, 251, -1, 251, -1, 251, -1, 251, -1,
+251, -1, 251, -1, 251, -1, 251], [264], [-1]), ([40, 43, 44, 45, 58, 60, 91,
+92, 258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1,
+235, -1, 235, -1, 235, -1, 235, -1, 235, -1, 235, -1, 235, -1, 235, -1, 235,
+-1, 235, -1, 235], [264], [-1]), ([40, 43, 44, 45, 58, 60, 91, 92, 258, 259,
+285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1, 237, -1, 237,
+-1, 237, -1, 237, -1, 237, -1, 237, -1, 237, -1, 237, -1, 237, -1, 237, -1, 237
+], [264], [-1]), ([40, 43, 44, 45, 58, 60, 91, 92, 258, 259, 285, 286, 287,
+311, 324, 325, 326, 327, 328, 329, 330, 331], [-1, 239, -1, 239, -1, 239, -1,
+239, -1, 239, -1, 239, -1, 239, -1, 239, -1, 239, -1, 239, -1, 239], [264], [-1
+]), ([40, 43, 44, 45, 58, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324, 325,
+326, 327, 328, 329, 330, 331], [-1, 241, -1, 241, -1, 241, -1, 241, -1, 241,
+-1, 241, -1, 241, -1, 241, -1, 241, -1, 241, -1, 241], [264], [-1]), ([40, 43,
+44, 45, 58, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328,
+329, 330, 331], [-1, 247, -1, 247, -1, 247, -1, 247, -1, 247, -1, 247, -1, 247,
+-1, 247, -1, 247, -1, 247, -1, 247], [264], [-1]), ([40, 43, 44, 45, 58, 60,
+91, 92, 258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331],
+[-1, 249, -1, 249, -1, 249, -1, 249, -1, 249, -1, 249, -1, 249, -1, 249, -1,
+249, -1, 249, -1, 249], [264], [-1]), ([40, 43, 44, 45, 58, 60, 91, 92, 258,
+259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1, 243, -1,
+243, -1, 243, -1, 243, -1, 243, -1, 243, -1, 243, -1, 243, -1, 243, -1, 243,
+-1, 243], [264], [-1]), ([40, 43, 44, 45, 58, 60, 91, 92, 258, 259, 285, 286,
+287, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1, 245, -1, 245, -1, 245,
+-1, 245, -1, 245, -1, 245, -1, 245, -1, 245, -1, 245, -1, 245, -1, 245], [264],
+[-1]), ([40, 43, 44, 45, 58, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324,
+325, 326, 327, 328, 329, 330, 331], [-1, 233, -1, 233, -1, 233, -1, 233, -1,
+233, -1, 233, -1, 233, -1, 233, -1, 233, -1, 233, -1, 233], [264], [-1]), ([40,
+43, 44, 45, 58, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324, 325, 326, 327,
+328, 329, 330, 331], [-1, 253, -1, 253, -1, 253, -1, 253, -1, 253, -1, 253, -1,
+253, -1, 253, -1, 253, -1, 253, -1, 253], [264], [-1]), ([40, 43, 44, 45, 58,
+60, 91, 92, 258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330,
+331], [-1, 255, -1, 255, -1, 255, -1, 255, -1, 255, -1, 255, -1, 255, -1, 255,
+-1, 255, -1, 255, -1, 255], [264], [-1]), ([123, 124, 258, 259, 331], [-1, 521,
+-1, 240, -1], [260, 262, 264], [-1, 121, -1]), ([123, 124, 258, 259, 331], [-1,
+521, -1, 244, -1], [260, 262, 264], [-1, 123, -1]), ([123, 124, 258, 259, 331],
+[-1, 521, -1, 248, -1], [260, 262, 264], [-1, 125, -1]), ([33, 34, 38, 39, 40,
+41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266,
+267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1,
+12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114,
+-1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68,
+70, 72, 74, 95, 96, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 67, 68, 69,
+70, 71, 72, 73, 74, 75, 76, 77, 126, -1, 127, -1]), ([58, 59, 331], [-1, 256,
+-1], [264], [-1]), ([40, 41, 331], [-1, 258, -1], [264], [-1]), ([40, 41, 331],
+[-1, 260, -1], [264], [-1]), ([40, 41, 331], [-1, 262, -1], [264], [-1]), ([33,
+34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 59, 60, 123, 124, 126, 127, 258, 259,
+260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 312, 313, 314, 315, 316, 317,
+318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1,
+6, -1, 8, 10, -1, 12, -1, 179, -1, 14, -1, 16, -1, 18, 20, 22, 24, 26, 28, -1,
+30, 32, -1, 36, -1, 86, 88, 90, -1, 92, 94, 96, 98, 100, 102, 104, 106, -1,
+110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59,
+62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93, 227, 243, 264], [-1, 61, 62, -1,
+63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 79,
+80, 81, -1, 132, -1]), ([40, 41, 331], [-1, 266, -1], [264], [-1]), ([258, 259,
+331], [-1, 268, -1], [264], [-1]), ([59, 60, 331], [-1, 270, -1], [264], [-1]),
+([59, 60, 331], [-1, 272, -1], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 43,
+44, 45, 46, 59, 60, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267,
+286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12,
+-1, 179, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1,
+114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66,
+68, 70, 72, 74, 77, 89, 91, 93, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 66,
+67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 79, 137, 81, -1]), ([40,
+41, 331], [-1, 276, -1], [264], [-1]), ([40, 41, 331], [-1, 278, -1], [264], [
+-1]), ([40, 41, 43, 44, 45, 58, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324,
+325, 326, 327, 328, 329, 330, 331], [-1, 280, 343, -1, 343, -1, 343, -1, 343,
+-1, 343, -1, 343, -1, 343, -1, 343, -1, 343, -1, 343, -1, 343], [264], [-1]), (
+[40, 41, 331], [-1, 282, -1], [264], [-1]), ([40, 43, 44, 45, 59, 60, 91, 92,
+258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1,
+347, -1, 347, -1, 347, -1, 347, -1, 347, -1, 347, -1, 347, -1, 347, -1, 347,
+-1, 347, -1, 347], [264], [-1]), ([40, 41, 331], [-1, 284, -1], [264], [-1]), (
+[40, 43, 44, 45, 59, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324, 325, 326,
+327, 328, 329, 330, 331], [-1, 227, -1, 227, -1, 227, -1, 227, -1, 227, -1,
+227, -1, 227, -1, 227, -1, 227, -1, 227, -1, 227], [264], [-1]), ([37, 39, 40,
+48, 58, 64, 91, 92, 93, 95, 124, 126, 264, 285, 331], [-1, 37, -1, 37, -1, 37,
+-1, 37, -1, 37, -1, 37, -1, 37, -1], [264], [-1]), ([37, 39, 40, 48, 58, 64,
+91, 92, 93, 95, 124, 126, 264, 285, 331], [-1, 5, -1, 5, -1, 5, -1, 5, -1, 5,
+-1, 5, -1, 5, -1], [264], [-1]), ([37, 39, 40, 48, 58, 64, 91, 92, 93, 95, 124,
+126, 264, 285, 331], [-1, 7, -1, 7, -1, 7, -1, 7, -1, 7, -1, 7, -1, 7, -1], [
+264], [-1]), ([37, 39, 40, 48, 58, 64, 91, 92, 93, 95, 124, 126, 264, 285, 331
+], [-1, 11, -1, 11, -1, 11, -1, 11, -1, 11, -1, 11, -1, 11, -1], [264], [-1]),
+([37, 39, 40, 41, 46, 47, 48, 58, 64, 91, 92, 93, 95, 124, 126, 264, 265, 266,
+267, 285, 331], [-1, 61, -1, 286, 61, 288, 61, -1, 61, -1, 290, -1, 61, -1, 61,
+-1, 292, 294, 296, 61, -1], [264], [-1]), ([37, 39, 41, 46, 47, 48, 58, 61, 62,
+64, 93, 95, 124, 126, 267, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
+285, 331], [-1, 85, -1, 85, -1, 85, -1, 85, 298, 85, -1, 85, -1, 85, -1, 85,
+300, 302, 304, 306, 308, 310, 312, 314, 316, 318, -1], [264], [-1]), ([37, 39,
+41, 46, 47, 48, 58, 61, 62, 64, 93, 95, 124, 126, 267, 275, 331], [-1, 89, -1,
+89, -1, 89, -1, 89, -1, 89, -1, 89, -1, 89, -1, 89, -1], [264], [-1]), ([37,
+38, 39, 41, 42, 43, 46, 47, 48, 58, 61, 62, 64, 93, 95, 124, 126, 267, 275, 331
+], [-1, 320, 97, -1, 97, 322, 97, -1, 324, -1, 97, -1, 97, -1, 97, -1, 97, -1,
+97, -1], [264], [-1]), ([38, 39, 41, 42, 43, 44, 45, 46, 58, 61, 62, 64, 93,
+95, 124, 126, 267, 275, 331], [-1, 103, -1, 103, -1, 326, 103, 328, -1, 103,
+-1, 103, -1, 103, -1, 103, -1, 103, -1], [264], [-1]), ([38, 39, 41, 42, 44,
+45, 58, 61, 62, 64, 93, 95, 124, 126, 267, 268, 269, 275, 331], [-1, 109, -1,
+109, -1, 109, -1, 109, -1, 109, -1, 109, -1, 109, -1, 330, 332, 109, -1], [264
+], [-1]), ([38, 39, 41, 42, 44, 45, 58, 60, 61, 62, 63, 64, 93, 95, 124, 126,
+269, 270, 271, 275, 331], [-1, 119, -1, 119, -1, 119, -1, 119, 334, -1, 336,
+119, -1, 119, -1, 119, -1, 338, 340, 119, -1], [264], [-1]), ([38, 39, 41, 42,
+44, 45, 58, 60, 63, 64, 93, 95, 124, 126, 271, 272, 273, 275, 331], [-1, 125,
+-1, 125, -1, 125, -1, 125, -1, 125, -1, 125, -1, 125, -1, 342, 344, 125, -1], [
+264], [-1]), ([38, 39, 41, 42, 44, 45, 58, 60, 63, 64, 93, 95, 124, 126, 273,
+275, 331], [-1, 346, -1, 129, -1, 129, -1, 129, -1, 129, -1, 129, -1, 129, -1,
+129, -1], [264], [-1]), ([41, 42, 44, 45, 58, 60, 63, 64, 93, 94, 95, 124, 126,
+273, 275, 331], [-1, 133, -1, 133, -1, 133, -1, 133, -1, 133, 348, -1, 133, -1,
+133, -1], [264], [-1]), ([41, 42, 44, 45, 58, 60, 63, 64, 93, 94, 124, 125,
+126, 273, 275, 331], [-1, 137, -1, 137, -1, 137, -1, 137, -1, 137, -1, 350,
+137, -1, 137, -1], [264], [-1]), ([41, 42, 44, 45, 58, 60, 63, 64, 93, 94, 125,
+126, 273, 274, 275, 331], [-1, 141, -1, 141, -1, 141, -1, 141, -1, 141, -1,
+141, -1, 352, 141, -1], [264], [-1]), ([41, 42, 44, 45, 58, 60, 63, 64, 93, 94,
+125, 126, 274, 275, 331], [-1, 145, -1, 145, -1, 145, -1, 354, -1, 145, -1,
+145, -1, 356, -1], [264], [-1]), ([41, 42, 44, 45, 58, 60, 93, 94, 125, 126,
+331], [-1, 155, -1, 155, -1, 155, -1, 155, -1, 155, -1], [264], [-1]), ([41,
+42, 44, 45, 58, 60, 93, 94, 331], [-1, 183, -1, 183, -1, 183, -1, 183, -1], [
+264], [-1]), ([59, 60, 331], [-1, 358, -1], [264], [-1]), ([41, 42, 44, 45, 59,
+60, 331], [-1, 181, -1, 360, -1, 181, -1], [264], [-1]), ([33, 34, 38, 39, 40,
+41, 42, 44, 45, 46, 59, 60, 123, 124, 125, 127, 256, 257, 258, 264, 265, 267,
+285, 311, 312, 315, 316, 331], [-1, 495, -1, 495, -1, 495, -1, 495, -1, 495,
+-1, 495, -1, 495, -1, 495, -1, 495, -1, 495, -1, 495, -1, 495, -1, 495, -1, 495
+], [264], [-1]), ([40, 41, 42, 43, 59, 60, 258, 259, 285, 286, 287, 288, 289,
+290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305,
+306, 307, 308, 309, 310, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1,
+362, -1, 364, -1, 211, -1, 366, -1, 34, -1, 38, 40, 42, 44, 46, 48, 50, 52, 54,
+56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, -1, 108, -1, 112,
+-1, 116, -1, 120], [100, 105, 107, 109, 110, 116, 133, 135, 137, 153, 155, 161,
+162, 168, 172, 174, 176, 178, 180, 185, 264], [-1, 184, 185, 186, 187, 85, 86,
+87, 88, -1, 89, -1, 90, -1, 91, 92, 93, -1, 188, 189, -1]), ([40, 43, 44, 45,
+59, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329,
+330, 331], [-1, 197, -1, 197, -1, 197, -1, 197, -1, 197, -1, 197, -1, 197, -1,
+197, -1, 197, -1, 197, -1, 197], [264], [-1]), ([40, 43, 44, 45, 59, 60, 91,
+92, 258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1,
+201, -1, 201, -1, 201, -1, 201, -1, 201, -1, 201, -1, 201, -1, 201, -1, 201,
+-1, 201, -1, 201], [264], [-1]), ([40, 43, 44, 45, 59, 60, 91, 92, 258, 259,
+285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1, 203, -1, 203,
+-1, 203, -1, 203, -1, 203, -1, 203, -1, 203, -1, 203, -1, 203, -1, 203, -1, 203
+], [264], [-1]), ([40, 43, 44, 45, 58, 60, 91, 92, 258, 259, 285, 286, 287,
+311, 324, 325, 326, 327, 328, 329, 330, 331], [-1, 259, -1, 259, -1, 259, -1,
+259, -1, 259, -1, 259, -1, 259, -1, 259, -1, 259, -1, 259, -1, 259], [264], [-1
+]), ([40, 43, 44, 45, 58, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324, 325,
+326, 327, 328, 329, 330, 331], [-1, 261, -1, 261, -1, 261, -1, 261, -1, 261,
+-1, 261, -1, 261, -1, 261, -1, 261, -1, 261, -1, 261], [264], [-1]), ([40, 43,
+44, 45, 58, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328,
+329, 330, 331], [-1, 263, -1, 263, -1, 263, -1, 263, -1, 263, -1, 263, -1, 263,
+-1, 263, -1, 263, -1, 263, -1, 263], [264], [-1]), ([40, 43, 44, 45, 58, 60,
+91, 92, 258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331],
+[-1, 257, -1, 257, -1, 257, -1, 257, -1, 257, -1, 257, -1, 257, -1, 257, -1,
+257, -1, 257, -1, 257], [264], [-1]), ([40, 43, 44, 45, 59, 60, 91, 92, 258,
+259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1, 205, -1,
+205, -1, 205, -1, 205, -1, 205, -1, 205, -1, 205, -1, 205, -1, 205, -1, 205,
+-1, 205], [264], [-1]), ([40, 43, 44, 45, 59, 60, 91, 92, 258, 259, 285, 286,
+287, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1, 207, -1, 207, -1, 207,
+-1, 207, -1, 207, -1, 207, -1, 207, -1, 207, -1, 207, -1, 207, -1, 207], [264],
+[-1]), ([40, 43, 44, 45, 59, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324,
+325, 326, 327, 328, 329, 330, 331], [-1, 209, -1, 209, -1, 209, -1, 209, -1,
+209, -1, 209, -1, 209, -1, 209, -1, 209, -1, 209, -1, 209], [264], [-1]), ([33,
+34, 38, 39, 40, 41, 42, 44, 45, 46, 59, 60, 123, 124, 125, 127, 256, 257, 258,
+264, 265, 267, 285, 311, 312, 315, 316, 331], [-1, 195, -1, 195, -1, 195, -1,
+195, -1, 195, -1, 195, -1, 195, -1, 195, -1, 195, -1, 195, -1, 195, -1, 195,
+-1, 195, -1, 195], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45, 46, 59,
+60, 123, 124, 125, 127, 256, 257, 258, 264, 265, 267, 285, 311, 312, 315, 316,
+331], [-1, 497, -1, 497, -1, 497, -1, 497, -1, 497, -1, 497, -1, 497, -1, 497,
+-1, 497, -1, 497, -1, 497, -1, 497, -1, 497, -1, 497], [264], [-1]), ([256,
+257, 331], [-1, 1, -1], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45,
+46, 59, 60, 123, 124, 125, 126, 127, 256, 257, 258, 259, 260, 261, 262, 263,
+264, 265, 266, 267, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296,
+297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312,
+313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328,
+329, 330, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 179, -1, 14, -1,
+489, 16, -1, 489, -1, 18, 20, 22, 24, 26, 28, -1, 30, 32, -1, 34, 36, 38, 40,
+42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80,
+82, 84, -1, 86, 88, 90, -1, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112,
+114, 116, 118, 120], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59,
+62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93, 96, 98, 100, 105, 110, 116, 133,
+135, 137, 153, 155, 161, 162, 168, 172, 174, 176, 226, 227, 243, 247, 249, 264
+], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
+76, 77, 78, -1, 79, 80, 81, -1, 82, 83, 84, -1, 85, 86, 87, 88, -1, 89, -1, 90,
+-1, 91, 92, 93, -1, 94, 95, -1, 190, -1]), ([33, 34, 38, 39, 40, 41, 42, 44,
+45, 46, 59, 60, 123, 124, 125, 127, 256, 257, 258, 264, 265, 267, 285, 311,
+312, 315, 316, 331], [-1, 491, -1, 491, -1, 491, -1, 491, -1, 491, -1, 491, -1,
+491, -1, 491, -1, 491, -1, 491, -1, 491, -1, 491, -1, 491, -1, 491], [264], [-1
+]), ([37, 39, 40, 48, 58, 64, 91, 92, 93, 95, 124, 126, 264, 285, 331], [-1, 3,
+-1, 3, -1, 3, -1, 3, -1, 3, -1, 3, -1, 3, -1], [264], [-1]), ([37, 39, 41, 46,
+47, 48, 58, 64, 93, 95, 124, 126, 267, 285, 331], [-1, 85, -1, 85, -1, 85, -1,
+85, -1, 85, -1, 85, -1, 85, -1], [264], [-1]), ([37, 39, 41, 46, 47, 48, 58,
+64, 93, 95, 124, 126, 267, 285, 331], [-1, 77, -1, 77, -1, 77, -1, 77, -1, 77,
+-1, 77, -1, 77, -1], [264], [-1]), ([37, 39, 41, 46, 47, 48, 58, 64, 93, 95,
+124, 126, 267, 285, 331], [-1, 67, -1, 67, -1, 67, -1, 67, -1, 67, -1, 67, -1,
+67, -1], [264], [-1]), ([41, 42, 44, 45, 331], [-1, 382, -1, 360, -1], [264], [
+-1]), ([40, 43, 58, 60, 91, 92, 258, 259, 285, 286, 293, 311, 326, 327, 331], [
+-1, 291, -1, 291, -1, 291, -1, 291, -1, 291, -1, 291, -1, 291, -1], [264], [-1]
+), ([40, 41, 42, 43, 58, 59, 91, 92, 285, 286, 293, 294, 295, 296, 297, 298,
+299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 326, 327, 331
+], [-1, 384, 401, 386, -1, 401, -1, 388, -1, 34, -1, 50, 52, 54, 56, 58, 60,
+62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, -1, 112, -1], [116, 133, 135,
+137, 145, 147, 153, 155, 161, 162, 168, 172, 198, 200, 202, 210, 264], [-1,
+104, 87, 88, -1, 195, -1, 89, -1, 90, -1, 107, -1, 196, 197, 198, -1]), ([40,
+43, 58, 60, 91, 92, 258, 259, 285, 286, 293, 311, 326, 327, 331], [-1, 287, -1,
+287, -1, 287, -1, 287, -1, 287, -1, 287, -1, 287, -1], [264], [-1]), ([40, 43,
+58, 60, 91, 92, 258, 259, 285, 286, 293, 311, 326, 327, 331], [-1, 293, -1,
+293, -1, 293, -1, 293, -1, 293, -1, 293, -1, 293, -1], [264], [-1]), ([41, 42,
+331], [-1, 398, -1], [264], [-1]), ([37, 39, 41, 46, 47, 48, 58, 64, 93, 95,
+124, 126, 267, 285, 331], [-1, 69, -1, 69, -1, 69, -1, 69, -1, 69, -1, 69, -1,
+69, -1], [264], [-1]), ([37, 39, 41, 46, 47, 48, 58, 64, 93, 95, 124, 126, 267,
+285, 331], [-1, 71, -1, 71, -1, 71, -1, 71, -1, 71, -1, 71, -1, 71, -1], [264],
+[-1]), ([37, 39, 41, 46, 47, 48, 58, 64, 93, 95, 124, 126, 267, 285, 331], [-1,
+73, -1, 73, -1, 73, -1, 73, -1, 73, -1, 73, -1, 73, -1], [264], [-1]), ([125,
+126, 331], [-1, 400, -1], [264], [-1]), ([37, 39, 41, 46, 47, 48, 58, 64, 93,
+95, 124, 126, 267, 285, 331], [-1, 75, -1, 75, -1, 75, -1, 75, -1, 75, -1, 75,
+-1, 75, -1], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 59,
+60, 123, 124, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286,
+287, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326,
+327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 179, -1, 14, -1,
+16, -1, 18, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 86, 88, 90, -1, 92, 94,
+96, 98, 100, 102, 104, 106, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18,
+26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93,
+227, 243, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71,
+72, 73, 74, 75, 76, 77, 78, -1, 79, 80, 81, -1, 201, -1]), ([33, 34, 38, 39,
+40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265,
+266, 267, 285, 286, 287, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303,
+304, 305, 306, 307, 308, 309, 310, 311, 325, 326, 327, 328, 331], [-1, 2, -1,
+4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32,
+-1, 34, 36, -1, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80,
+82, 84, -1, 110, 112, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48,
+51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93, 116, 133, 135, 137,
+143, 145, 147, 153, 155, 161, 162, 168, 172, 197, 198, 264], [-1, 61, 62, -1,
+63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 79,
+-1, 103, -1, 104, 87, 88, -1, 105, 106, -1, 89, -1, 90, -1, 107, -1, 202, -1]),
+([37, 39, 41, 46, 47, 48, 58, 64, 93, 95, 124, 126, 267, 285, 331], [-1, 79,
+-1, 79, -1, 79, -1, 79, -1, 79, -1, 79, -1, 79, -1], [264], [-1]), ([33, 34,
+38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263,
+264, 265, 266, 267, 285, 286, 287, 293, 294, 295, 296, 297, 298, 299, 300, 301,
+302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 325, 326, 327, 328, 331], [
+-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28,
+-1, 30, 32, -1, 34, 36, -1, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74,
+76, 78, 80, 82, 84, -1, 110, 112, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30,
+42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93, 116, 133,
+135, 137, 143, 145, 147, 153, 155, 161, 162, 168, 172, 197, 198, 264], [-1, 61,
+62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+-1, 79, -1, 103, -1, 104, 87, 88, -1, 105, 106, -1, 89, -1, 90, -1, 107, -1,
+203, -1]), ([37, 39, 41, 46, 47, 48, 58, 64, 93, 95, 124, 126, 267, 285, 331],
+[-1, 63, -1, 63, -1, 63, -1, 63, -1, 63, -1, 63, -1, 63, -1], [264], [-1]), ([
+37, 39, 41, 46, 47, 48, 58, 64, 93, 95, 124, 126, 267, 285, 331], [-1, 65, -1,
+65, -1, 65, -1, 65, -1, 65, -1, 65, -1, 65, -1], [264], [-1]), ([40, 43, 44,
+45, 58, 60, 91, 92, 123, 124, 258, 259, 285, 286, 287, 311, 324, 325, 326, 327,
+328, 329, 330, 331], [-1, 269, -1, 269, -1, 269, -1, 269, -1, 523, -1, 269, -1,
+269, -1, 269, -1, 269, -1, 269, -1, 269, -1, 269], [264], [-1]), ([123, 124,
+331], [-1, 408, -1], [264], [-1]), ([40, 43, 44, 45, 58, 60, 91, 92, 123, 124,
+258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1,
+273, -1, 273, -1, 273, -1, 273, -1, 523, -1, 273, -1, 273, -1, 273, -1, 273,
+-1, 273, -1, 273, -1, 273], [264], [-1]), ([123, 124, 331], [-1, 410, -1], [264
+], [-1]), ([40, 43, 44, 45, 58, 60, 91, 92, 123, 124, 258, 259, 285, 286, 287,
+311, 324, 325, 326, 327, 328, 329, 330, 331], [-1, 309, -1, 309, -1, 309, -1,
+309, -1, 523, -1, 309, -1, 309, -1, 309, -1, 309, -1, 309, -1, 309, -1, 309], [
+264], [-1]), ([123, 124, 331], [-1, 412, -1], [264], [-1]), ([41, 42, 44, 45,
+58, 60, 93, 94, 125, 126, 331], [-1, 191, -1, 191, -1, 191, -1, 191, -1, 191,
+-1], [264], [-1]), ([58, 59, 331], [-1, 414, -1], [264], [-1]), ([33, 34, 38,
+39, 40, 41, 42, 43, 44, 45, 46, 59, 60, 123, 124, 126, 127, 258, 259, 260, 261,
+262, 263, 264, 265, 266, 267, 286, 287, 312, 313, 314, 315, 316, 317, 318, 319,
+320, 321, 322, 323, 324, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8,
+10, -1, 12, -1, 179, -1, 14, -1, 16, -1, 18, 20, 22, 24, 26, 28, -1, 30, 32,
+-1, 36, -1, 86, 88, 90, -1, 92, 94, 96, 98, 100, 102, 104, 106, -1, 110, -1,
+114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66,
+68, 70, 72, 74, 77, 89, 91, 93, 227, 243, 264], [-1, 61, 62, -1, 63, 64, -1,
+65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 79, 80, 81, -1,
+208, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259,
+260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [
+-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28,
+-1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30,
+42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93, 264], [-1,
+61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+78, -1, 79, -1, 209, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126,
+127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327,
+328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22,
+24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13,
+18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93,
+264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74,
+75, 76, 77, 78, -1, 79, -1, 210, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44,
+45, 46, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287,
+325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1,
+198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9,
+10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77,
+89, 91, 93, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71,
+72, 73, 74, 75, 76, 77, 78, -1, 79, -1, 211, -1]), ([317, 318, 331], [-1, 424,
+-1], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 59, 60, 126,
+127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 285, 286, 287, 288, 289,
+290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305,
+306, 307, 308, 309, 310, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1, 2,
+-1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 179, -1, 16, -1, 198, 20, 22, 24, 26, 28,
+-1, 30, 32, -1, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64,
+66, 68, 70, 72, 74, 76, 78, 80, 82, 84, -1, 108, 110, 112, 114, 116, 118, 120],
+[1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70,
+72, 74, 77, 89, 91, 93, 96, 98, 100, 105, 110, 116, 133, 135, 137, 153, 155,
+161, 162, 168, 172, 174, 176, 226, 227, 264], [-1, 61, 62, -1, 63, 64, -1, 65,
+-1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 79, 213, 81, -1,
+214, 83, 84, -1, 85, 86, 87, 88, -1, 89, -1, 90, -1, 91, 92, 93, -1, 94, -1]),
+([59, 60, 331], [-1, 430, -1], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 44,
+45, 46, 59, 60, 123, 124, 125, 127, 256, 257, 258, 264, 265, 267, 285, 311,
+312, 331], [-1, 481, -1, 481, -1, 481, -1, 481, -1, 481, -1, 481, -1, 481, -1,
+481, -1, 481, -1, 481, -1, 481, -1, 481, -1, 481], [264], [-1]), ([33, 34, 38,
+39, 40, 41, 42, 44, 45, 46, 59, 60, 123, 124, 125, 127, 256, 257, 258, 264,
+265, 267, 285, 311, 312, 331], [-1, 483, -1, 483, -1, 483, -1, 483, -1, 483,
+-1, 483, -1, 483, -1, 483, -1, 483, -1, 483, -1, 483, -1, 483, -1, 483], [264],
+[-1]), ([59, 60, 331], [-1, 432, -1], [264], [-1]), ([33, 34, 38, 39, 40, 41,
+42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267,
+285, 286, 287, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305,
+306, 307, 308, 309, 310, 311, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6,
+-1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 34, 36,
+-1, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, -1,
+110, 112, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59,
+62, 64, 66, 68, 70, 72, 74, 95, 96, 116, 133, 135, 137, 143, 145, 147, 153,
+155, 161, 162, 168, 172, 197, 198, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1,
+100, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 126, -1, 217, -1, 104, 87, 88,
+-1, 105, 106, -1, 89, -1, 90, -1, 107, -1, 218, -1]), ([285, 286, 293, 294,
+295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310,
+311, 326, 327, 331], [-1, 34, -1, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70,
+72, 74, 76, 78, 80, 82, 84, -1, 112, -1], [116, 133, 135, 137, 143, 145, 147,
+153, 155, 161, 162, 168, 172, 197, 198, 264], [-1, 104, 87, 88, -1, 105, 106,
+-1, 89, -1, 90, -1, 107, -1, 219, -1]), ([285, 286, 293, 294, 295, 296, 297,
+298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 326, 327,
+331], [-1, 34, -1, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78,
+80, 82, 84, -1, 112, -1], [116, 133, 135, 137, 143, 145, 147, 153, 155, 161,
+162, 168, 172, 197, 198, 264], [-1, 104, 87, 88, -1, 105, 106, -1, 89, -1, 90,
+-1, 107, -1, 220, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127,
+258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328,
+331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [-1, 61,
+62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+-1, 221, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258,
+259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331
+], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 95, 96, 264], [-1, 61,
+62, -1, 63, 64, -1, 65, -1, 100, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+126, -1, 222, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127,
+258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328,
+331], [-1, 2, -1, 4, -1, 6, 53, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+28, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [-1,
+61, 62, -1, 63, 64, -1, 65, 223, 224, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
+76, 77, 78, -1, 225, -1]), ([258, 259, 331], [-1, 452, -1], [264], [-1]), ([33,
+34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263,
+264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6,
+-1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1,
+110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59,
+62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93, 264], [-1, 61, 62, -1, 63, 64, -1,
+65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 79, -1, 227, -1
+]), ([258, 259, 331], [-1, 456, -1], [264], [-1]), ([37, 39, 40, 48, 58, 64,
+91, 92, 93, 95, 124, 126, 264, 285, 331], [-1, 47, -1, 47, -1, 47, -1, 47, -1,
+47, -1, 47, -1, 47, -1], [264], [-1]), ([37, 39, 40, 48, 58, 64, 91, 92, 93,
+95, 124, 126, 264, 285, 331], [-1, 49, -1, 49, -1, 49, -1, 49, -1, 49, -1, 49,
+-1, 49, -1], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126,
+127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327,
+328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22,
+24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13,
+18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [
+-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
+77, 78, -1, 229, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127,
+258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328,
+331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [-1, 61,
+62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+-1, 230, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258,
+259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331
+], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [-1, 61,
+62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+-1, 231, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258,
+259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331
+], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [-1, 61,
+62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+-1, 232, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258,
+259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331
+], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [-1, 61,
+62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+-1, 233, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258,
+259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331
+], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [-1, 61,
+62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+-1, 234, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258,
+259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331
+], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [-1, 61,
+62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+-1, 235, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258,
+259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331
+], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [-1, 61,
+62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+-1, 236, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258,
+259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331
+], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [-1, 61,
+62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+-1, 237, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258,
+259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331
+], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [-1, 61,
+62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+-1, 238, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258,
+259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331
+], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [-1, 61,
+62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+-1, 239, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258,
+259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331
+], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 240, -1]), ([33,
+34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263,
+264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6,
+-1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1,
+110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 264], [-1, 61, 62,
+-1, 63, 64, -1, 65, -1, 100, 241, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44,
+45, 46, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287,
+325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1,
+198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9,
+10, 12, 13, 18, 26, 30, 42, 44, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100,
+242, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259,
+260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [
+-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28,
+-1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30,
+42, 44, 48, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 67, 243, -1]), ([
+33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262,
+263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1,
+6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36,
+-1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 264], [-1,
+61, 62, -1, 63, 64, -1, 65, -1, 100, 67, 244, -1]), ([33, 34, 38, 39, 40, 41,
+42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267,
+286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12,
+-1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1],
+[1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 264], [-1, 61, 62, -1, 63,
+64, -1, 65, -1, 100, 67, 68, 245, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44,
+45, 46, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287,
+325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1,
+198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9,
+10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 264], [-1, 61, 62, -1, 63, 64, -1, 65,
+-1, 100, 67, 68, 246, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126,
+127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327,
+328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22,
+24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13,
+18, 26, 30, 42, 44, 48, 51, 54, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100,
+67, 68, 69, 247, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127,
+258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328,
+331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 67, 68,
+69, 248, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258,
+259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331
+], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 67, 68,
+69, 249, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258,
+259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331
+], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 67, 68,
+69, 250, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258,
+259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331
+], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 67,
+68, 69, 70, 251, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127,
+258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328,
+331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 67,
+68, 69, 70, 252, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127,
+258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328,
+331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 62, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100,
+67, 68, 69, 70, 71, 253, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326,
+327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20,
+22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12,
+13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 264], [-1, 61, 62, -1, 63, 64,
+-1, 65, -1, 100, 67, 68, 69, 70, 71, 72, 254, -1]), ([33, 34, 38, 39, 40, 41,
+42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267,
+286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12,
+-1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1],
+[1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 264], [
+-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 67, 68, 69, 70, 71, 72, 73, 255, -1]),
+([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261,
+262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1,
+4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32,
+-1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48,
+51, 54, 59, 62, 64, 66, 68, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 67,
+68, 69, 70, 71, 72, 73, 74, 256, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44,
+45, 46, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287,
+325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1,
+198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9,
+10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77,
+89, 91, 93, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71,
+72, 73, 74, 75, 76, 77, 78, -1, 79, -1, 257, -1]), ([33, 34, 38, 39, 40, 41,
+42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267,
+286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12,
+-1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1],
+[1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70,
+264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 67, 68, 69, 70, 71, 72, 73, 74,
+75, 258, -1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45, 46, 59, 60, 123, 124, 125,
+127, 256, 257, 258, 264, 265, 267, 285, 311, 312, 331], [-1, 463, -1, 463, -1,
+463, -1, 463, -1, 463, -1, 463, -1, 463, -1, 463, -1, 463, -1, 463, -1, 463,
+-1, 463, -1, 463], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326,
+327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20,
+22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12,
+13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264
+], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,
+76, 77, 78, -1, 259, -1]), ([40, 41, 42, 43, 258, 259, 331], [-1, 362, -1, 364,
+-1, 366, -1], [178, 180, 185, 264], [-1, 260, 189, -1]), ([40, 41, 42, 43, 258,
+259, 293, 294, 295, 296, 326, 327, 331], [-1, 371, -1, 371, -1, 371, -1, 50,
+52, 54, -1, 522, -1], [168, 172, 185, 187, 189, 264], [-1, 262, -1, 263, 264,
+-1]), ([40, 42, 44, 45, 58, 60, 61, 62, 91, 92, 331], [-1, 361, -1, 361, -1,
+361, -1, 361, -1, 361, -1], [264], [-1]), ([40, 43, 44, 45, 59, 60, 91, 92,
+258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1,
+199, -1, 199, -1, 199, -1, 199, -1, 199, -1, 199, -1, 199, -1, 199, -1, 199,
+-1, 199, -1, 199], [264], [-1]), ([59, 60, 331], [-1, 530, -1], [264], [-1]), (
+[44, 45, 59, 60, 331], [-1, 532, -1, 213, -1], [264], [-1]), ([44, 45, 59, 60,
+331], [-1, 215, -1, 215, -1], [264], [-1]), ([44, 45, 59, 60, 61, 62, 331], [
+-1, 421, -1, 421, -1, 534, -1], [210, 212, 264], [-1, 268, -1]), ([40, 41, 42,
+44, 45, 58, 60, 61, 62, 91, 92, 331], [-1, 538, 357, -1, 357, -1, 357, -1, 357,
+-1, 540, -1], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45, 46, 59, 60,
+123, 124, 125, 127, 256, 257, 258, 264, 265, 267, 285, 311, 312, 315, 316, 331
+], [-1, 493, -1, 493, -1, 493, -1, 493, -1, 493, -1, 493, -1, 493, -1, 493, -1,
+493, -1, 493, -1, 493, -1, 493, -1, 493, -1, 493], [264], [-1]), ([37, 39, 40,
+48, 58, 64, 91, 92, 93, 95, 124, 126, 264, 285, 331], [-1, 9, -1, 9, -1, 9, -1,
+9, -1, 9, -1, 9, -1, 9, -1], [264], [-1]), ([40, 41, 42, 43, 91, 92, 285, 286,
+287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302,
+303, 304, 305, 306, 307, 308, 309, 310, 311, 324, 325, 326, 327, 328, 329, 330,
+331], [-1, 384, 542, 544, -1, 388, -1, 34, -1, 38, 40, 42, 44, 46, 48, 50, 52,
+54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, -1, 108, -1,
+112, -1, 116, -1, 120], [98, 100, 105, 110, 116, 133, 135, 137, 153, 155, 161,
+162, 168, 172, 174, 176, 189, 191, 193, 202, 210, 264], [-1, 273, 84, -1, 85,
+86, 87, 88, -1, 89, -1, 90, -1, 91, 92, 93, -1, 274, 275, -1, 276, -1]), ([40,
+43, 58, 59, 91, 92, 293, 294, 295, 296, 326, 327, 331], [-1, 371, -1, 371, -1,
+371, -1, 50, 52, 54, -1, 522, -1], [168, 172, 185, 187, 189, 264], [-1, 262,
+-1, 277, 264, -1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45, 46, 93, 94, 126, 127,
+258, 264, 265, 267, 286, 287, 289, 290, 293, 294, 295, 296, 325, 326, 327, 328,
+331], [-1, 325, -1, 325, -1, 325, -1, 325, -1, 325, -1, 325, -1, 325, -1, 325,
+-1, 325, -1, 325, -1, 556, -1, 50, 52, 54, -1, 325, 522, 325, -1], [162, 164,
+166, 168, 172, 264], [-1, 279, 280, 281, 282, -1]), ([40, 43, 58, 60, 91, 92,
+258, 259, 285, 286, 293, 311, 326, 327, 331], [-1, 289, -1, 289, -1, 289, -1,
+289, -1, 289, -1, 289, -1, 289, -1], [264], [-1]), ([41, 42, 58, 59, 331], [-1,
+395, -1, 395, -1], [264], [-1]), ([41, 42, 44, 45, 58, 59, 331], [-1, 397, -1,
+397, -1, 397, -1], [264], [-1]), ([40, 41, 42, 44, 45, 58, 59, 91, 92, 331], [
+-1, 566, 403, -1, 403, -1, 403, -1, 568, -1], [264], [-1]), ([33, 34, 38, 39,
+40, 41, 42, 43, 44, 45, 46, 123, 124, 126, 127, 258, 259, 260, 261, 262, 263,
+264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6,
+-1, 8, 10, -1, 12, -1, 570, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32,
+-1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 264],
+[-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 286, -1]), ([33, 34, 38, 39, 40, 41,
+42, 44, 45, 46, 59, 60, 123, 124, 125, 127, 256, 257, 258, 264, 265, 267, 285,
+311, 312, 331], [-1, 461, -1, 461, -1, 461, -1, 461, -1, 461, -1, 461, -1, 461,
+-1, 461, -1, 461, -1, 461, -1, 461, -1, 461, -1, 461], [264], [-1]), ([33, 34,
+38, 39, 40, 41, 42, 44, 45, 46, 59, 60, 123, 124, 125, 127, 256, 257, 258, 264,
+265, 267, 285, 311, 312, 331], [-1, 455, -1, 455, -1, 455, -1, 455, -1, 455,
+-1, 455, -1, 455, -1, 455, -1, 455, -1, 455, -1, 455, -1, 455, -1, 455], [264],
+[-1]), ([41, 42, 331], [-1, 574, -1], [264], [-1]), ([41, 42, 331], [-1, 576,
+-1], [264], [-1]), ([125, 126, 285, 286, 293, 294, 295, 296, 297, 298, 299,
+300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 326, 327, 329, 330,
+331], [-1, 275, -1, 34, -1, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74,
+76, 78, 80, 82, 84, -1, 112, -1, 118, -1], [116, 133, 135, 137, 139, 141, 143,
+145, 147, 153, 155, 161, 162, 168, 172, 226, 227, 264], [-1, 104, 87, 88, 289,
+290, 291, 292, 106, -1, 89, -1, 90, -1, 107, -1, 293, -1]), ([125, 126, 285,
+286, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307,
+308, 309, 310, 311, 326, 327, 329, 330, 331], [-1, 275, -1, 34, -1, 50, 52, 54,
+56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, -1, 112, -1, 118,
+-1], [116, 133, 135, 137, 139, 141, 143, 145, 147, 153, 155, 161, 162, 168,
+172, 226, 227, 264], [-1, 104, 87, 88, 294, 290, 291, 292, 106, -1, 89, -1, 90,
+-1, 107, -1, 293, -1]), ([125, 126, 258, 259, 331], [-1, 311, -1, 590, -1], [9,
+10, 155, 158, 160, 161, 264], [-1, 296, -1, 297, 298, 299, -1]), ([33, 34, 38,
+39, 40, 41, 42, 43, 44, 45, 46, 59, 60, 123, 124, 126, 127, 258, 259, 260, 261,
+262, 263, 264, 265, 266, 267, 286, 287, 312, 313, 314, 315, 316, 317, 318, 319,
+320, 321, 322, 323, 324, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8,
+10, -1, 12, -1, 179, -1, 14, -1, 16, -1, 18, 20, 22, 24, 26, 28, -1, 30, 32,
+-1, 36, -1, 86, 88, 90, -1, 92, 94, 96, 98, 100, 102, 104, 106, -1, 110, -1,
+114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66,
+68, 70, 72, 74, 77, 89, 91, 93, 227, 243, 264], [-1, 61, 62, -1, 63, 64, -1,
+65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 79, 80, 81, -1,
+300, -1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45, 46, 59, 60, 123, 124, 125,
+127, 256, 257, 258, 264, 265, 267, 285, 311, 312, 331], [-1, 459, -1, 459, -1,
+459, -1, 459, -1, 459, -1, 459, -1, 459, -1, 459, -1, 459, -1, 459, -1, 459,
+-1, 459, -1, 459], [264], [-1]), ([41, 42, 44, 45, 331], [-1, 602, -1, 360, -1
+], [264], [-1]), ([41, 42, 44, 45, 331], [-1, 604, -1, 360, -1], [264], [-1]),
+([41, 42, 44, 45, 331], [-1, 606, -1, 360, -1], [264], [-1]), ([40, 41, 331], [
+-1, 608, -1], [264], [-1]), ([59, 60, 331], [-1, 610, -1], [264], [-1]), ([33,
+34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 59, 60, 126, 127, 258, 259, 260, 261,
+262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1,
+4, -1, 6, -1, 8, 10, -1, 12, -1, 179, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1,
+30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42,
+44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93, 264], [-1, 61,
+62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+-1, 79, 306, 81, -1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45, 46, 59, 60, 123,
+124, 125, 127, 256, 257, 258, 264, 265, 267, 285, 311, 312, 331], [-1, 479, -1,
+479, -1, 479, -1, 479, -1, 479, -1, 479, -1, 479, -1, 479, -1, 479, -1, 479,
+-1, 479, -1, 479, -1, 479], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45,
+46, 59, 60, 123, 124, 125, 127, 256, 257, 258, 264, 265, 267, 285, 311, 312,
+331], [-1, 485, -1, 485, -1, 485, -1, 485, -1, 485, -1, 485, -1, 485, -1, 485,
+-1, 485, -1, 485, -1, 485, -1, 485, -1, 485], [264], [-1]), ([41, 42, 331], [
+-1, 614, -1], [264], [-1]), ([41, 42, 331], [-1, 616, -1], [264], [-1]), ([41,
+42, 331], [-1, 618, -1], [264], [-1]), ([41, 42, 331], [-1, 620, -1], [264], [
+-1]), ([44, 45, 331], [-1, 622, -1], [264], [-1]), ([44, 45, 331], [-1, 624, -1
+], [264], [-1]), ([41, 42, 331], [-1, 626, -1], [264], [-1]), ([41, 42, 44, 45,
+331], [-1, 55, -1, 628, -1], [264], [-1]), ([41, 42, 44, 45, 331], [-1, 57, -1,
+57, -1], [264], [-1]), ([37, 39, 40, 48, 58, 64, 91, 92, 93, 95, 124, 126, 264,
+285, 331], [-1, 43, -1, 43, -1, 43, -1, 43, -1, 43, -1, 43, -1, 43, -1], [264],
+[-1]), ([44, 45, 93, 94, 331], [-1, 360, -1, 630, -1], [264], [-1]), ([37, 39,
+40, 48, 58, 64, 91, 92, 93, 95, 124, 126, 264, 285, 331], [-1, 45, -1, 45, -1,
+45, -1, 45, -1, 45, -1, 45, -1, 45, -1], [264], [-1]), ([41, 42, 44, 45, 58,
+60, 93, 94, 125, 126, 331], [-1, 157, -1, 157, -1, 157, -1, 157, -1, 157, -1],
+[264], [-1]), ([41, 42, 44, 45, 58, 60, 93, 94, 125, 126, 331], [-1, 159, -1,
+159, -1, 159, -1, 159, -1, 159, -1], [264], [-1]), ([41, 42, 44, 45, 58, 60,
+93, 94, 125, 126, 331], [-1, 161, -1, 161, -1, 161, -1, 161, -1, 161, -1], [264
+], [-1]), ([41, 42, 44, 45, 58, 60, 93, 94, 125, 126, 331], [-1, 163, -1, 163,
+-1, 163, -1, 163, -1, 163, -1], [264], [-1]), ([41, 42, 44, 45, 58, 60, 93, 94,
+125, 126, 331], [-1, 165, -1, 165, -1, 165, -1, 165, -1, 165, -1], [264], [-1]
+), ([41, 42, 44, 45, 58, 60, 93, 94, 125, 126, 331], [-1, 167, -1, 167, -1,
+167, -1, 167, -1, 167, -1], [264], [-1]), ([41, 42, 44, 45, 58, 60, 93, 94,
+125, 126, 331], [-1, 169, -1, 169, -1, 169, -1, 169, -1, 169, -1], [264], [-1]
+), ([41, 42, 44, 45, 58, 60, 93, 94, 125, 126, 331], [-1, 171, -1, 171, -1,
+171, -1, 171, -1, 171, -1], [264], [-1]), ([41, 42, 44, 45, 58, 60, 93, 94,
+125, 126, 331], [-1, 173, -1, 173, -1, 173, -1, 173, -1, 173, -1], [264], [-1]
+), ([41, 42, 44, 45, 58, 60, 93, 94, 125, 126, 331], [-1, 175, -1, 175, -1,
+175, -1, 175, -1, 175, -1], [264], [-1]), ([41, 42, 44, 45, 58, 60, 93, 94,
+125, 126, 331], [-1, 177, -1, 177, -1, 177, -1, 177, -1, 177, -1], [264], [-1]
+), ([37, 39, 41, 46, 47, 48, 58, 61, 62, 64, 93, 95, 124, 126, 267, 275, 331],
+[-1, 95, -1, 95, -1, 95, -1, 95, -1, 95, -1, 95, -1, 95, -1, 95, -1], [264], [
+-1]), ([37, 39, 41, 46, 47, 48, 58, 61, 62, 64, 93, 95, 124, 126, 267, 275, 331
+], [-1, 91, -1, 91, -1, 91, -1, 91, -1, 91, -1, 91, -1, 91, -1, 91, -1], [264],
+[-1]), ([37, 39, 41, 46, 47, 48, 58, 61, 62, 64, 93, 95, 124, 126, 267, 275,
+331], [-1, 93, -1, 93, -1, 93, -1, 93, -1, 93, -1, 93, -1, 93, -1, 93, -1], [
+264], [-1]), ([37, 38, 39, 41, 42, 43, 46, 47, 48, 58, 61, 62, 64, 93, 95, 124,
+126, 267, 275, 331], [-1, 320, 99, -1, 99, 322, 99, -1, 324, -1, 99, -1, 99,
+-1, 99, -1, 99, -1, 99, -1], [264], [-1]), ([37, 38, 39, 41, 42, 43, 46, 47,
+48, 58, 61, 62, 64, 93, 95, 124, 126, 267, 275, 331], [-1, 320, 101, -1, 101,
+322, 101, -1, 324, -1, 101, -1, 101, -1, 101, -1, 101, -1, 101, -1], [264], [-1
+]), ([38, 39, 41, 42, 43, 44, 45, 46, 58, 61, 62, 64, 93, 95, 124, 126, 267,
+275, 331], [-1, 105, -1, 105, -1, 326, 105, 328, -1, 105, -1, 105, -1, 105, -1,
+105, -1, 105, -1], [264], [-1]), ([38, 39, 41, 42, 43, 44, 45, 46, 58, 61, 62,
+64, 93, 95, 124, 126, 267, 275, 331], [-1, 107, -1, 107, -1, 326, 107, 328, -1,
+107, -1, 107, -1, 107, -1, 107, -1, 107, -1], [264], [-1]), ([38, 39, 41, 42,
+44, 45, 58, 61, 62, 64, 93, 95, 124, 126, 267, 268, 269, 275, 331], [-1, 111,
+-1, 111, -1, 111, -1, 111, -1, 111, -1, 111, -1, 111, -1, 330, 332, 111, -1], [
+264], [-1]), ([38, 39, 41, 42, 44, 45, 58, 61, 62, 64, 93, 95, 124, 126, 267,
+268, 269, 275, 331], [-1, 113, -1, 113, -1, 113, -1, 113, -1, 113, -1, 113, -1,
+113, -1, 330, 332, 113, -1], [264], [-1]), ([38, 39, 41, 42, 44, 45, 58, 61,
+62, 64, 93, 95, 124, 126, 267, 268, 269, 275, 331], [-1, 115, -1, 115, -1, 115,
+-1, 115, -1, 115, -1, 115, -1, 115, -1, 330, 332, 115, -1], [264], [-1]), ([38,
+39, 41, 42, 44, 45, 58, 61, 62, 64, 93, 95, 124, 126, 267, 268, 269, 275, 331],
+[-1, 117, -1, 117, -1, 117, -1, 117, -1, 117, -1, 117, -1, 117, -1, 330, 332,
+117, -1], [264], [-1]), ([38, 39, 41, 42, 44, 45, 58, 60, 61, 62, 63, 64, 93,
+95, 124, 126, 269, 270, 271, 275, 331], [-1, 121, -1, 121, -1, 121, -1, 121,
+334, -1, 336, 121, -1, 121, -1, 121, -1, 338, 340, 121, -1], [264], [-1]), ([
+38, 39, 41, 42, 44, 45, 58, 60, 61, 62, 63, 64, 93, 95, 124, 126, 269, 270,
+271, 275, 331], [-1, 123, -1, 123, -1, 123, -1, 123, 334, -1, 336, 123, -1,
+123, -1, 123, -1, 338, 340, 123, -1], [264], [-1]), ([38, 39, 41, 42, 44, 45,
+58, 60, 63, 64, 93, 95, 124, 126, 271, 272, 273, 275, 331], [-1, 127, -1, 127,
+-1, 127, -1, 127, -1, 127, -1, 127, -1, 127, -1, 342, 344, 127, -1], [264], [-1
+]), ([38, 39, 41, 42, 44, 45, 58, 60, 63, 64, 93, 95, 124, 126, 273, 275, 331],
+[-1, 346, -1, 131, -1, 131, -1, 131, -1, 131, -1, 131, -1, 131, -1, 131, -1], [
+264], [-1]), ([41, 42, 44, 45, 58, 60, 63, 64, 93, 94, 95, 124, 126, 273, 275,
+331], [-1, 135, -1, 135, -1, 135, -1, 135, -1, 135, 348, -1, 135, -1, 135, -1],
+[264], [-1]), ([41, 42, 44, 45, 58, 60, 63, 64, 93, 94, 124, 125, 126, 273,
+275, 331], [-1, 139, -1, 139, -1, 139, -1, 139, -1, 139, -1, 350, 139, -1, 139,
+-1], [264], [-1]), ([44, 45, 58, 59, 331], [-1, 360, -1, 632, -1], [264], [-1]
+), ([41, 42, 44, 45, 58, 60, 63, 64, 93, 94, 125, 126, 273, 274, 275, 331], [
+-1, 143, -1, 143, -1, 143, -1, 143, -1, 143, -1, 143, -1, 352, 143, -1], [264],
+[-1]), ([41, 42, 44, 45, 58, 60, 93, 94, 331], [-1, 185, -1, 185, -1, 185, -1,
+185, -1], [264], [-1]), ([41, 42, 331], [-1, 634, -1], [264], [-1]), ([33, 34,
+38, 39, 40, 46, 58, 59, 91, 92, 93, 94, 126, 127, 258, 264, 265, 267, 286, 287,
+289, 290, 293, 296, 325, 328, 331], [-1, 343, -1, 343, -1, 343, -1, 343, -1,
+343, -1, 343, -1, 343, -1, 343, -1, 343, -1, 343, -1, 343, -1, 343, -1, 343, -1
+], [264], [-1]), ([40, 43, 44, 45, 58, 59, 91, 92, 258, 259, 293, 296, 326,
+327, 331], [-1, 375, -1, 375, -1, 375, -1, 375, -1, 375, -1, 375, -1, 375, -1],
+[264], [-1]), ([40, 41, 42, 43, 258, 259, 331], [-1, 362, -1, 364, -1, 366, -1
+], [178, 180, 185, 264], [-1, 318, 189, -1]), ([40, 43, 44, 45, 58, 59, 91, 92,
+258, 259, 293, 294, 295, 296, 326, 327, 331], [-1, 373, -1, 373, -1, 373, -1,
+373, -1, 373, -1, 50, 52, 54, -1, 522, -1], [168, 172, 264], [-1, 319, -1]), ([
+33, 34, 38, 39, 40, 41, 42, 44, 45, 46, 59, 60, 123, 124, 125, 127, 256, 257,
+258, 264, 265, 267, 285, 311, 312, 315, 316, 331], [-1, 193, -1, 193, -1, 193,
+-1, 193, -1, 193, -1, 193, -1, 193, -1, 193, -1, 193, -1, 193, -1, 193, -1,
+193, -1, 193, -1, 193], [264], [-1]), ([40, 41, 42, 43, 258, 259, 331], [-1,
+362, -1, 364, -1, 366, -1], [109, 110, 178, 180, 185, 264], [-1, 320, -1, 188,
+189, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 123, 124, 126, 127,
+258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328,
+331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 642, -1, 16, -1, 198, 20,
+22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12,
+13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89,
+212, 214, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71,
+72, 73, 74, 75, 76, 77, 78, -1, 322, -1, 323, -1]), ([44, 45, 59, 60, 331], [
+-1, 219, -1, 219, -1], [264], [-1]), ([41, 42, 258, 259, 285, 286, 287, 288,
+289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304,
+305, 306, 307, 308, 309, 310, 311, 324, 325, 326, 327, 328, 329, 330, 331], [
+-1, 387, -1, 648, -1, 34, -1, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60,
+62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, -1, 108, -1, 112, -1, 116, -1,
+120], [98, 100, 105, 110, 116, 133, 135, 137, 153, 155, 161, 162, 168, 172,
+174, 176, 189, 191, 193, 195, 197, 264], [-1, 273, 84, -1, 85, 86, 87, 88, -1,
+89, -1, 90, -1, 91, 92, 93, -1, 325, 275, 326, 327, -1]), ([33, 34, 38, 39, 40,
+41, 42, 44, 45, 46, 93, 94, 126, 127, 258, 264, 265, 267, 286, 287, 289, 290,
+293, 294, 295, 296, 325, 326, 327, 328, 331], [-1, 325, -1, 325, -1, 325, -1,
+325, -1, 325, -1, 325, -1, 325, -1, 325, -1, 325, -1, 325, -1, 556, -1, 50, 52,
+54, -1, 325, 522, 325, -1], [162, 164, 166, 168, 172, 264], [-1, 328, 280, 281,
+282, -1]), ([40, 42, 44, 45, 58, 59, 91, 92, 331], [-1, 411, -1, 411, -1, 411,
+-1, 411, -1], [264], [-1]), ([40, 43, 91, 92, 293, 294, 295, 296, 326, 327, 331
+], [-1, 371, -1, 371, -1, 50, 52, 54, -1, 522, -1], [168, 172, 185, 187, 189,
+264], [-1, 262, -1, 329, 264, -1]), ([40, 41, 42, 43, 44, 45, 91, 92, 258, 259,
+285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300,
+301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 324, 325, 326, 327, 328,
+329, 330, 331], [-1, 660, 401, 662, -1, 401, -1, 388, -1, 366, -1, 34, -1, 38,
+40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78,
+80, 82, 84, -1, 108, -1, 112, -1, 116, -1, 120], [100, 105, 110, 116, 133, 135,
+137, 153, 155, 161, 162, 168, 172, 174, 176, 178, 180, 185, 198, 200, 202, 210,
+264], [-1, 184, -1, 85, 86, 87, 88, -1, 89, -1, 90, -1, 91, 92, 93, -1, 332,
+189, -1, 333, 197, 198, -1]), ([41, 42, 44, 45, 331], [-1, 525, -1, 668, -1], [
+262, 264], [-1, 335]), ([41, 42, 44, 45, 331], [-1, 379, -1, 379, -1], [264], [
+-1]), ([40, 41, 42, 91, 92, 331], [-1, 566, 672, -1, 568, -1], [264], [-1]), ([
+40, 41, 42, 43, 58, 59, 91, 92, 331], [-1, 384, 401, 386, -1, 401, -1, 388, -1
+], [198, 200, 202, 210, 264], [-1, 337, 197, 198, -1]), ([33, 34, 38, 39, 40,
+41, 42, 44, 45, 46, 93, 94, 126, 127, 258, 264, 265, 267, 286, 287, 289, 290,
+293, 296, 325, 328, 331], [-1, 335, -1, 335, -1, 335, -1, 335, -1, 335, -1,
+335, -1, 335, -1, 335, -1, 335, -1, 335, -1, 335, -1, 335, -1, 335, -1], [264],
+[-1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 93, 94, 126, 127, 258,
+259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331
+], [-1, 2, -1, 4, -1, 6, -1, 676, 10, -1, 12, -1, 149, -1, 16, -1, 198, 20, 22,
+24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13,
+18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [
+-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
+77, 78, 339, 340, -1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45, 46, 93, 94, 126,
+127, 258, 264, 265, 267, 286, 287, 289, 290, 293, 294, 295, 296, 325, 326, 327,
+328, 331], [-1, 327, -1, 327, -1, 327, -1, 327, -1, 327, -1, 327, -1, 327, -1,
+327, -1, 327, -1, 327, -1, 556, -1, 50, 52, 54, -1, 327, 522, 327, -1], [166,
+168, 172, 264], [-1, 341, 282, -1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45, 46,
+93, 94, 126, 127, 258, 264, 265, 267, 286, 287, 289, 290, 293, 296, 325, 328,
+331], [-1, 329, -1, 329, -1, 329, -1, 329, -1, 329, -1, 329, -1, 329, -1, 329,
+-1, 329, -1, 329, -1, 329, -1, 329, -1, 329, -1], [264], [-1]), ([33, 34, 38,
+39, 40, 41, 42, 44, 45, 46, 93, 94, 126, 127, 258, 264, 265, 267, 286, 287,
+289, 290, 293, 296, 325, 328, 331], [-1, 333, -1, 333, -1, 333, -1, 333, -1,
+333, -1, 333, -1, 333, -1, 333, -1, 333, -1, 333, -1, 333, -1, 333, -1, 333, -1
+], [264], [-1]), ([41, 42, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
+295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310,
+311, 324, 325, 326, 327, 328, 329, 330, 331], [-1, 684, -1, 34, -1, 38, 40, 42,
+44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82,
+84, -1, 108, -1, 112, -1, 116, -1, 120], [98, 100, 105, 110, 116, 133, 135,
+137, 153, 155, 161, 162, 168, 172, 174, 176, 189, 191, 193, 264], [-1, 273, 84,
+-1, 85, 86, 87, 88, -1, 89, -1, 90, -1, 91, 92, 93, -1, 343, 275, -1]), ([33,
+34, 38, 39, 40, 41, 42, 44, 45, 46, 93, 94, 126, 127, 258, 264, 265, 267, 286,
+287, 289, 290, 293, 294, 295, 296, 325, 326, 327, 328, 331], [-1, 325, -1, 325,
+-1, 325, -1, 325, -1, 325, -1, 325, -1, 325, -1, 325, -1, 325, -1, 325, -1,
+556, -1, 50, 52, 54, -1, 325, 522, 325, -1], [162, 164, 166, 168, 172, 264], [
+-1, 344, 280, 281, 282, -1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45, 46, 47, 91,
+92, 123, 124, 125, 126, 127, 258, 264, 265, 267, 286, 287, 325, 326, 327, 328,
+331], [-1, 441, -1, 441, -1, 441, -1, 441, -1, 441, 690, -1, 692, -1, 441, -1,
+429, 441, -1, 441, -1, 441, -1, 441, -1, 441, -1, 441, -1], [214, 217, 219,
+220, 222, 224, 226, 264], [-1, 347, 348, 349, 350, 351, 352, -1]), ([37, 39,
+41, 46, 47, 48, 58, 64, 93, 95, 124, 126, 267, 285, 331], [-1, 87, -1, 87, -1,
+87, -1, 87, -1, 87, -1, 87, -1, 87, -1], [264], [-1]), ([37, 39, 41, 46, 47,
+48, 58, 64, 93, 95, 123, 124, 126, 267, 285, 331], [-1, 81, -1, 81, -1, 81, -1,
+81, -1, 81, -1, 570, 81, -1, 81, -1], [264], [-1]), ([123, 124, 331], [-1, 570,
+-1], [264], [-1]), ([125, 126, 331], [-1, 706, -1], [264], [-1]), ([125, 126,
+285, 286, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306,
+307, 308, 309, 310, 311, 326, 327, 329, 330, 331], [-1, 277, -1, 34, -1, 50,
+52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, -1, 112,
+-1, 118, -1], [116, 133, 135, 137, 141, 143, 145, 147, 153, 155, 161, 162, 168,
+172, 226, 227, 264], [-1, 104, 87, 88, -1, 354, 292, 106, -1, 89, -1, 90, -1,
+107, -1, 293, -1]), ([125, 126, 285, 286, 293, 311, 326, 327, 329, 330, 331], [
+-1, 279, -1, 279, -1, 279, -1, 279, -1, 279, -1], [264], [-1]), ([40, 41, 42,
+43, 58, 59, 60, 258, 259, 285, 286, 293, 294, 295, 296, 297, 298, 299, 300,
+301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 326, 327, 331], [-1,
+362, -1, 364, -1, 353, 295, -1, 366, -1, 34, -1, 50, 52, 54, 56, 58, 60, 62,
+64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, -1, 112, -1], [116, 133, 135, 137,
+145, 147, 149, 151, 153, 155, 161, 162, 168, 172, 176, 178, 180, 185, 264], [
+-1, 104, 87, 88, -1, 195, 355, 356, 357, 89, -1, 90, -1, 107, -1, 358, 359,
+189, -1]), ([125, 126, 285, 286, 293, 311, 326, 327, 329, 330, 331], [-1, 285,
+-1, 285, -1, 285, -1, 285, -1, 285, -1], [264], [-1]), ([125, 126, 331], [-1,
+720, -1], [264], [-1]), ([44, 45, 61, 62, 125, 126, 331], [-1, 19, -1, 19, -1,
+19, -1], [264], [-1]), ([44, 45, 61, 62, 125, 126, 331], [-1, 187, -1, 722, -1,
+187, -1], [93, 95, 264], [-1, 362, -1]), ([125, 126, 331], [-1, 726, -1], [264
+], [-1]), ([44, 45, 125, 126, 331], [-1, 728, -1, 313, -1], [264], [-1]), ([44,
+45, 125, 126, 331], [-1, 317, -1, 317, -1], [264], [-1]), ([33, 34, 38, 39, 40,
+41, 42, 44, 45, 46, 59, 60, 123, 124, 125, 127, 256, 257, 258, 264, 265, 267,
+285, 311, 312, 331], [-1, 457, -1, 457, -1, 457, -1, 457, -1, 457, -1, 457, -1,
+457, -1, 457, -1, 457, -1, 457, -1, 457, -1, 457, -1, 457], [264], [-1]), ([33,
+34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 59, 60, 123, 124, 126, 127, 258, 259,
+260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 312, 313, 314, 315, 316, 317,
+318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1,
+6, -1, 8, 10, -1, 12, -1, 179, -1, 14, -1, 16, -1, 18, 20, 22, 24, 26, 28, -1,
+30, 32, -1, 36, -1, 86, 88, 90, -1, 92, 94, 96, 98, 100, 102, 104, 106, -1,
+110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59,
+62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93, 227, 243, 264], [-1, 61, 62, -1,
+63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 79,
+80, 81, -1, 365, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 59, 60,
+123, 124, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287,
+312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327,
+328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 179, -1, 14, -1, 16,
+-1, 18, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 86, 88, 90, -1, 92, 94, 96,
+98, 100, 102, 104, 106, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93, 227,
+243, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73,
+74, 75, 76, 77, 78, -1, 79, 80, 81, -1, 366, -1]), ([33, 34, 38, 39, 40, 41,
+42, 43, 44, 45, 46, 59, 60, 123, 124, 126, 127, 258, 259, 260, 261, 262, 263,
+264, 265, 266, 267, 286, 287, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321,
+322, 323, 324, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1,
+12, -1, 179, -1, 14, -1, 16, -1, 18, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36,
+-1, 86, 88, 90, -1, 92, 94, 96, 98, 100, 102, 104, 106, -1, 110, -1, 114, -1],
+[1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70,
+72, 74, 77, 89, 91, 93, 227, 243, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1,
+66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 79, 80, 81, -1, 367, -1
+]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261,
+262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1,
+4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32,
+-1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48,
+51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93, 264], [-1, 61, 62, -1,
+63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 79,
+-1, 368, -1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 59, 60, 126, 127,
+258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328,
+331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 179, -1, 16, -1, 198, 20,
+22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12,
+13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 91,
+93, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73,
+74, 75, 76, 77, 78, -1, 79, 369, 81, -1]), ([59, 60, 331], [-1, 740, -1], [264
+], [-1]), ([40, 43, 44, 45, 59, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324,
+325, 326, 327, 328, 329, 330, 331], [-1, 351, -1, 351, -1, 351, -1, 351, -1,
+351, -1, 351, -1, 351, -1, 351, -1, 351, -1, 351, -1, 351], [264], [-1]), ([40,
+43, 44, 45, 59, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324, 325, 326, 327,
+328, 329, 330, 331], [-1, 349, -1, 349, -1, 349, -1, 349, -1, 349, -1, 349, -1,
+349, -1, 349, -1, 349, -1, 349, -1, 349], [264], [-1]), ([37, 39, 41, 46, 47,
+48, 58, 64, 93, 95, 124, 126, 267, 285, 331], [-1, 83, -1, 83, -1, 83, -1, 83,
+-1, 83, -1, 83, -1, 83, -1], [264], [-1]), ([40, 43, 44, 45, 58, 60, 91, 92,
+258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331], [-1,
+323, -1, 323, -1, 323, -1, 323, -1, 323, -1, 323, -1, 323, -1, 323, -1, 323,
+-1, 323, -1, 323], [264], [-1]), ([285, 286, 293, 294, 295, 296, 297, 298, 299,
+300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 313, 314, 326, 327,
+331], [-1, 34, -1, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78,
+80, 82, 84, -1, 742, -1, 112, -1], [13, 15, 16, 18, 116, 133, 135, 137, 143,
+145, 147, 153, 155, 161, 162, 168, 172, 197, 198, 264], [-1, 372, 373, 374, -1,
+104, 87, 88, -1, 105, 106, -1, 89, -1, 90, -1, 107, -1, 375, -1]), ([261, 262,
+331], [-1, 752, -1], [264], [-1]), ([37, 39, 40, 48, 58, 64, 91, 92, 93, 95,
+124, 126, 264, 285, 331], [-1, 41, -1, 41, -1, 41, -1, 41, -1, 41, -1, 41, -1,
+41, -1], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127,
+258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328,
+331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26,
+28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26,
+30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [-1, 61,
+62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,
+-1, 377, -1]), ([37, 39, 40, 48, 58, 64, 91, 92, 93, 95, 124, 126, 264, 285,
+331], [-1, 39, -1, 39, -1, 39, -1, 39, -1, 39, -1, 39, -1, 39, -1], [264], [-1]
+), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261,
+262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1,
+4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32,
+-1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48,
+51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 264], [-1, 61, 62, -1, 63, 64, -1, 65,
+-1, 100, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 378, -1]), ([40, 42, 44,
+45, 58, 60, 61, 62, 91, 92, 331], [-1, 363, -1, 363, -1, 363, -1, 363, -1, 363,
+-1], [264], [-1]), ([41, 42, 44, 45, 58, 60, 61, 62, 331], [-1, 359, -1, 359,
+-1, 359, -1, 359, -1], [264], [-1]), ([40, 43, 44, 45, 58, 59, 91, 92, 258,
+259, 293, 296, 326, 327, 331], [-1, 377, -1, 377, -1, 377, -1, 377, -1, 377,
+-1, 377, -1, 377, -1], [264], [-1]), ([44, 45, 59, 60, 331], [-1, 217, -1, 217,
+-1], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45, 46, 47, 91, 92, 123,
+124, 125, 126, 127, 258, 264, 265, 267, 286, 287, 325, 326, 327, 328, 331], [
+-1, 441, -1, 441, -1, 441, -1, 441, -1, 441, 690, -1, 692, -1, 441, -1, 429,
+441, -1, 441, -1, 441, -1, 441, -1, 441, -1, 441, -1], [214, 217, 219, 220,
+222, 224, 226, 264], [-1, 379, 348, 349, 350, 351, 352, -1]), ([44, 45, 59, 60,
+125, 126, 331], [-1, 427, -1, 427, -1, 427, -1], [264], [-1]), ([44, 45, 59,
+60, 331], [-1, 423, -1, 423, -1], [264], [-1]), ([41, 42, 44, 45, 331], [-1,
+391, -1, 391, -1], [264], [-1]), ([41, 42, 44, 45, 331], [-1, 525, -1, 668, -1
+], [262, 264], [-1, 380]), ([41, 42, 331], [-1, 762, -1], [264], [-1]), ([41,
+42, 44, 45, 331], [-1, 389, -1, 764, -1], [264], [-1]), ([33, 34, 38, 39, 40,
+41, 42, 43, 44, 45, 46, 93, 94, 126, 127, 258, 259, 260, 261, 262, 263, 264,
+265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1,
+676, 10, -1, 12, -1, 149, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1,
+36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51,
+54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [-1, 61, 62, -1, 63, 64, -1,
+65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 383, 340, -1]), ([
+40, 41, 42, 43, 91, 92, 331], [-1, 384, 401, 386, -1, 388, -1], [198, 200, 202,
+210, 264], [-1, 384, 197, 198, -1]), ([40, 41, 42, 43, 91, 92, 258, 259, 285,
+286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301,
+302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 324, 325, 326, 327, 328, 329,
+330, 331], [-1, 660, 542, 770, -1, 388, -1, 366, -1, 34, -1, 38, 40, 42, 44,
+46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84,
+-1, 108, -1, 112, -1, 116, -1, 120], [98, 100, 105, 110, 116, 133, 135, 137,
+153, 155, 161, 162, 168, 172, 174, 176, 178, 180, 185, 189, 191, 193, 202, 210,
+264], [-1, 273, 84, -1, 85, 86, 87, 88, -1, 89, -1, 90, -1, 91, 92, 93, -1,
+260, 189, -1, 274, 275, -1, 276, -1]), ([40, 43, 44, 45, 91, 92, 258, 259, 293,
+294, 295, 296, 326, 327, 331], [-1, 371, -1, 371, -1, 371, -1, 371, -1, 50, 52,
+54, -1, 522, -1], [168, 172, 185, 187, 189, 264], [-1, 262, -1, 386, 264, -1]),
+([41, 42, 44, 45, 331], [-1, 383, -1, 383, -1], [264], [-1]), ([41, 42, 44, 45,
+331], [-1, 385, -1, 385, -1], [264], [-1]), ([285, 286, 287, 288, 289, 290,
+291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306,
+307, 308, 309, 310, 311, 312, 324, 325, 326, 327, 328, 329, 330, 331], [-1, 34,
+-1, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74,
+76, 78, 80, 82, 84, 774, -1, 108, -1, 112, -1, 116, -1, 120], [98, 100, 105,
+110, 116, 133, 135, 137, 153, 155, 161, 162, 168, 172, 174, 176, 191, 193, 264
+], [-1, 273, 84, -1, 85, 86, 87, 88, -1, 89, -1, 90, -1, 91, 92, 93, -1, 388,
+-1]), ([41, 42, 331], [-1, 778, -1], [264], [-1]), ([40, 42, 44, 45, 58, 59,
+91, 92, 331], [-1, 405, -1, 405, -1, 405, -1, 405, -1], [264], [-1]), ([41, 42,
+44, 45, 58, 59, 331], [-1, 399, -1, 399, -1, 399, -1], [264], [-1]), ([33, 34,
+38, 39, 40, 41, 42, 43, 44, 45, 46, 93, 94, 126, 127, 258, 259, 260, 261, 262,
+263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1,
+6, -1, 8, 10, -1, 12, -1, 151, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32,
+-1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 264],
+[-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 109, -1]), ([93, 94, 331], [-1, 780,
+-1], [264], [-1]), ([93, 94, 331], [-1, 153, -1], [264], [-1]), ([33, 34, 38,
+39, 40, 41, 42, 44, 45, 46, 93, 94, 126, 127, 258, 264, 265, 267, 286, 287,
+289, 290, 293, 296, 325, 328, 331], [-1, 331, -1, 331, -1, 331, -1, 331, -1,
+331, -1, 331, -1, 331, -1, 331, -1, 331, -1, 331, -1, 331, -1, 331, -1, 331, -1
+], [264], [-1]), ([40, 42, 44, 45, 58, 59, 91, 92, 331], [-1, 417, -1, 417, -1,
+417, -1, 417, -1], [264], [-1]), ([41, 42, 44, 45, 331], [-1, 525, -1, 668, -1
+], [262, 264], [-1, 391]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 93,
+94, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325,
+326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 676, 10, -1, 12, -1, 149, -1,
+16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1,
+6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72,
+74, 77, 89, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71,
+72, 73, 74, 75, 76, 77, 78, 392, 340, -1]), ([258, 259, 331], [-1, 786, -1], [
+264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259,
+260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [
+-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28,
+-1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30,
+42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 95, 96, 264], [-1, 61, 62,
+-1, 63, 64, -1, 65, -1, 100, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 126,
+-1, 394, -1]), ([125, 126, 331], [-1, 790, -1], [264], [-1]), ([44, 45, 125,
+126, 331], [-1, 792, -1, 431, -1], [264], [-1]), ([44, 45, 125, 126, 331], [-1,
+435, -1, 435, -1], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46,
+123, 124, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287,
+325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 642, -1,
+16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1,
+6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72,
+74, 77, 89, 212, 214, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68,
+69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 322, -1, 397, -1]), ([46, 47, 61,
+62, 91, 92, 331], [-1, 690, -1, 796, -1, 692, -1], [224, 226, 264], [-1, 399,
+-1]), ([46, 47, 61, 62, 91, 92, 331], [-1, 445, -1, 445, -1, 445, -1], [264], [
+-1]), ([40, 43, 44, 45, 58, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324, 325,
+326, 327, 328, 329, 330, 331], [-1, 267, -1, 267, -1, 267, -1, 267, -1, 267,
+-1, 267, -1, 267, -1, 267, -1, 267, -1, 267, -1, 267], [264], [-1]), ([125,
+126, 285, 286, 293, 311, 326, 327, 329, 330, 331], [-1, 281, -1, 281, -1, 281,
+-1, 281, -1, 281, -1], [264], [-1]), ([59, 60, 331], [-1, 800, -1], [264], [-1]
+), ([44, 45, 59, 60, 331], [-1, 802, -1, 297, -1], [264], [-1]), ([44, 45, 59,
+60, 331], [-1, 299, -1, 299, -1], [264], [-1]), ([58, 59, 331], [-1, 804, -1],
+[264], [-1]), ([44, 45, 58, 59, 60, 331], [-1, 305, -1, 355, 305, -1], [264], [
+-1]), ([40, 43, 44, 45, 58, 60, 91, 92, 258, 259, 285, 286, 287, 311, 324, 325,
+326, 327, 328, 329, 330, 331], [-1, 271, -1, 271, -1, 271, -1, 271, -1, 271,
+-1, 271, -1, 271, -1, 271, -1, 271, -1, 271, -1, 271], [264], [-1]), ([33, 34,
+38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263,
+264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6,
+-1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1,
+110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59,
+62, 64, 66, 68, 70, 72, 74, 95, 96, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1,
+100, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 126, -1, 403, -1]), ([44, 45,
+125, 126, 331], [-1, 321, -1, 321, -1], [264], [-1]), ([40, 43, 44, 45, 58, 60,
+91, 92, 258, 259, 285, 286, 287, 311, 324, 325, 326, 327, 328, 329, 330, 331],
+[-1, 307, -1, 307, -1, 307, -1, 307, -1, 307, -1, 307, -1, 307, -1, 307, -1,
+307, -1, 307, -1, 307], [264], [-1]), ([125, 126, 258, 259, 331], [-1, 315, -1,
+590, -1], [9, 10, 160, 161, 264], [-1, 296, -1, 404, -1]), ([33, 34, 38, 39,
+40, 41, 42, 44, 45, 46, 59, 60, 123, 124, 125, 127, 256, 257, 258, 264, 265,
+267, 285, 311, 312, 315, 316, 331], [-1, 467, -1, 467, -1, 467, -1, 467, -1,
+467, -1, 467, -1, 467, -1, 467, -1, 467, -1, 467, -1, 467, -1, 467, -1, 467,
+810, 467], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45, 46, 59, 60, 123,
+124, 125, 127, 256, 257, 258, 264, 265, 267, 285, 311, 312, 331], [-1, 469, -1,
+469, -1, 469, -1, 469, -1, 469, -1, 469, -1, 469, -1, 469, -1, 469, -1, 469,
+-1, 469, -1, 469, -1, 469], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45,
+46, 59, 60, 123, 124, 125, 127, 256, 257, 258, 264, 265, 267, 285, 311, 312,
+331], [-1, 471, -1, 471, -1, 471, -1, 471, -1, 471, -1, 471, -1, 471, -1, 471,
+-1, 471, -1, 471, -1, 471, -1, 471, -1, 471], [264], [-1]), ([41, 42, 44, 45,
+331], [-1, 812, -1, 360, -1], [264], [-1]), ([59, 60, 331], [-1, 814, -1], [264
+], [-1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259,
+260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [
+-1, 2, -1, 4, -1, 6, 179, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28,
+-1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30,
+42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93, 264], [-1,
+61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,
+78, -1, 79, 408, 81, -1]), ([58, 59, 331], [-1, 35, -1], [264], [-1]), ([41,
+42, 44, 45, 331], [-1, 818, -1, 820, -1], [264], [-1]), ([41, 42, 44, 45, 331],
+[-1, 27, -1, 27, -1], [264], [-1]), ([58, 59, 331], [-1, 822, -1], [264], [-1]
+), ([58, 59, 331], [-1, 33, -1], [264], [-1]), ([41, 42, 331], [-1, 824, -1], [
+264], [-1]), ([41, 42, 44, 45, 331], [-1, 59, -1, 59, -1], [264], [-1]), ([41,
+42, 44, 45, 58, 60, 93, 94, 125, 126, 331], [-1, 147, -1, 147, -1, 147, -1,
+147, -1, 147, -1], [264], [-1]), ([125, 126, 331], [-1, 826, -1], [264], [-1]),
+([41, 42, 331], [-1, 828, -1], [264], [-1]), ([40, 42, 44, 45, 58, 60, 61, 62,
+91, 92, 331], [-1, 367, -1, 367, -1, 367, -1, 367, -1, 367, -1], [264], [-1]),
+([258, 259, 331], [-1, 830, -1], [264], [-1]), ([93, 94, 331], [-1, 832, -1], [
+264], [-1]), ([41, 42, 331], [-1, 834, -1], [264], [-1]), ([40, 43, 91, 92,
+258, 259, 293, 294, 295, 296, 326, 327, 331], [-1, 371, -1, 371, -1, 371, -1,
+50, 52, 54, -1, 522, -1], [168, 172, 185, 187, 189, 264], [-1, 262, -1, 418,
+264, -1]), ([40, 41, 42, 43, 44, 45, 91, 92, 258, 259, 331], [-1, 660, 401,
+662, -1, 401, -1, 388, -1, 366, -1], [178, 180, 185, 198, 200, 202, 210, 264],
+[-1, 318, 189, -1, 337, 197, 198, -1]), ([41, 42, 331], [-1, 527, -1], [264], [
+-1]), ([41, 42, 44, 45, 331], [-1, 381, -1, 381, -1], [264], [-1]), ([40, 42,
+44, 45, 58, 59, 91, 92, 331], [-1, 413, -1, 413, -1, 413, -1, 413, -1], [264],
+[-1]), ([40, 42, 44, 45, 58, 59, 91, 92, 331], [-1, 409, -1, 409, -1, 409, -1,
+409, -1], [264], [-1]), ([41, 42, 331], [-1, 838, -1], [264], [-1]), ([93, 94,
+331], [-1, 840, -1], [264], [-1]), ([46, 47, 61, 62, 91, 92, 331], [-1, 451,
+-1, 451, -1, 451, -1], [264], [-1]), ([93, 94, 331], [-1, 842, -1], [264], [-1]
+), ([37, 39, 40, 48, 58, 64, 91, 92, 93, 95, 124, 126, 264, 285, 331], [-1, 51,
+-1, 51, -1, 51, -1, 51, -1, 51, -1, 51, -1, 51, -1], [264], [-1]), ([33, 34,
+38, 39, 40, 41, 42, 44, 45, 46, 47, 91, 92, 123, 124, 125, 126, 127, 258, 264,
+265, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 441, -1, 441, -1, 441, -1,
+441, -1, 441, 690, -1, 692, -1, 441, -1, 433, 441, -1, 441, -1, 441, -1, 441,
+-1, 441, -1, 441, -1], [219, 220, 222, 224, 226, 264], [-1, 422, 350, 351, 352,
+-1]), ([44, 45, 125, 126, 331], [-1, 439, -1, 439, -1], [264], [-1]), ([33, 34,
+38, 39, 40, 41, 42, 44, 45, 46, 123, 124, 126, 127, 258, 264, 265, 267, 286,
+287, 325, 326, 327, 328, 331], [-1, 443, -1, 443, -1, 443, -1, 443, -1, 443,
+-1, 443, -1, 443, -1, 443, -1, 443, -1, 443, -1, 443, -1, 443, -1], [264], [-1]
+), ([46, 47, 61, 62, 91, 92, 331], [-1, 447, -1, 447, -1, 447, -1], [264], [-1]
+), ([125, 126, 285, 286, 293, 311, 326, 327, 329, 330, 331], [-1, 283, -1, 283,
+-1, 283, -1, 283, -1, 283, -1], [264], [-1]), ([40, 41, 42, 43, 58, 59, 258,
+259, 331], [-1, 362, -1, 364, -1, 353, -1, 366, -1], [151, 153, 176, 178, 180,
+185, 264], [-1, 423, -1, 358, 359, 189, -1]), ([33, 34, 38, 39, 40, 41, 42, 43,
+44, 45, 46, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286,
+287, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 16,
+-1, 198, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 110, -1, 114, -1], [1, 6,
+9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74,
+95, 96, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 100, 67, 68, 69, 70, 71, 72,
+73, 74, 75, 76, 77, 126, -1, 424, -1]), ([44, 45, 125, 126, 331], [-1, 189, -1,
+189, -1], [264], [-1]), ([44, 45, 125, 126, 331], [-1, 319, -1, 319, -1], [264
+], [-1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 59, 60, 123, 124, 126,
+127, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 286, 287, 312, 313, 314,
+315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 331], [
+-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 179, -1, 14, -1, 16, -1, 18, 20,
+22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 86, 88, 90, -1, 92, 94, 96, 98, 100,
+102, 104, 106, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44,
+48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93, 227, 243, 264], [
+-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,
+77, 78, -1, 79, 80, 81, -1, 425, -1]), ([59, 60, 331], [-1, 852, -1], [264], [
+-1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260,
+261, 262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2,
+-1, 4, -1, 6, 179, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30,
+32, -1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44,
+48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 91, 93, 264], [-1, 61, 62,
+-1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1,
+79, 427, 81, -1]), ([41, 42, 331], [-1, 856, -1], [264], [-1]), ([37, 39, 40,
+48, 58, 64, 91, 92, 93, 95, 124, 126, 264, 285, 331], [-1, 25, -1, 25, -1, 25,
+-1, 25, -1, 25, -1, 25, -1, 25, -1], [264], [-1]), ([285, 286, 293, 294, 295,
+296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311,
+313, 314, 326, 327, 331], [-1, 34, -1, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68,
+70, 72, 74, 76, 78, 80, 82, 84, -1, 742, -1, 112, -1], [15, 16, 18, 116, 133,
+135, 137, 143, 145, 147, 153, 155, 161, 162, 168, 172, 197, 198, 264], [-1,
+429, 374, -1, 104, 87, 88, -1, 105, 106, -1, 89, -1, 90, -1, 107, -1, 375, -1]
+), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45, 46, 126, 127, 258, 259, 260, 261,
+262, 263, 264, 265, 266, 267, 286, 287, 325, 326, 327, 328, 331], [-1, 2, -1,
+4, -1, 6, -1, 8, 10, -1, 12, -1, 16, -1, 198, 20, 22, 24, 26, 28, -1, 30, 32,
+-1, 36, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48,
+51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 264], [-1, 61, 62, -1, 63, 64,
+-1, 65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 430, -1]),
+([59, 60, 331], [-1, 862, -1], [264], [-1]), ([44, 45, 59, 60, 125, 126, 331],
+[-1, 425, -1, 425, -1, 425, -1], [264], [-1]), ([40, 42, 44, 45, 58, 60, 61,
+62, 91, 92, 331], [-1, 369, -1, 369, -1, 369, -1, 369, -1, 369, -1], [264], [-1
+]), ([41, 42, 44, 45, 331], [-1, 393, -1, 393, -1], [264], [-1]), ([40, 42, 44,
+45, 58, 60, 61, 62, 91, 92, 331], [-1, 365, -1, 365, -1, 365, -1, 365, -1, 365,
+-1], [264], [-1]), ([40, 42, 44, 45, 58, 59, 91, 92, 331], [-1, 407, -1, 407,
+-1, 407, -1, 407, -1], [264], [-1]), ([40, 41, 42, 43, 91, 92, 258, 259, 331],
+[-1, 660, 401, 662, -1, 388, -1, 366, -1], [178, 180, 185, 198, 200, 202, 210,
+264], [-1, 318, 189, -1, 384, 197, 198, -1]), ([40, 42, 44, 45, 58, 59, 91, 92,
+331], [-1, 419, -1, 419, -1, 419, -1, 419, -1], [264], [-1]), ([40, 42, 44, 45,
+58, 59, 91, 92, 331], [-1, 415, -1, 415, -1, 415, -1, 415, -1], [264], [-1]), (
+[46, 47, 61, 62, 91, 92, 331], [-1, 449, -1, 449, -1, 449, -1], [264], [-1]), (
+[44, 45, 125, 126, 331], [-1, 437, -1, 437, -1], [264], [-1]), ([44, 45, 59,
+60, 331], [-1, 301, -1, 301, -1], [264], [-1]), ([44, 45, 59, 60, 331], [-1,
+303, -1, 303, -1], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45, 46, 59,
+60, 123, 124, 125, 127, 256, 257, 258, 264, 265, 267, 285, 311, 312, 331], [-1,
+465, -1, 465, -1, 465, -1, 465, -1, 465, -1, 465, -1, 465, -1, 465, -1, 465,
+-1, 465, -1, 465, -1, 465, -1, 465], [264], [-1]), ([33, 34, 38, 39, 40, 41,
+42, 44, 45, 46, 59, 60, 123, 124, 125, 127, 256, 257, 258, 264, 265, 267, 285,
+311, 312, 331], [-1, 473, -1, 473, -1, 473, -1, 473, -1, 473, -1, 473, -1, 473,
+-1, 473, -1, 473, -1, 473, -1, 473, -1, 473, -1, 473], [264], [-1]), ([41, 42,
+331], [-1, 864, -1], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 43, 44, 45,
+46, 59, 60, 123, 124, 126, 127, 258, 259, 260, 261, 262, 263, 264, 265, 266,
+267, 286, 287, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324,
+325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8, 10, -1, 12, -1, 179, -1,
+14, -1, 16, -1, 18, 20, 22, 24, 26, 28, -1, 30, 32, -1, 36, -1, 86, 88, 90, -1,
+92, 94, 96, 98, 100, 102, 104, 106, -1, 110, -1, 114, -1], [1, 6, 9, 10, 12,
+13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66, 68, 70, 72, 74, 77, 89, 91,
+93, 227, 243, 264], [-1, 61, 62, -1, 63, 64, -1, 65, -1, 66, 67, 68, 69, 70,
+71, 72, 73, 74, 75, 76, 77, 78, -1, 79, 80, 81, -1, 433, -1]), ([41, 42, 44,
+45, 331], [-1, 29, -1, 29, -1], [264], [-1]), ([41, 42, 44, 45, 331], [-1, 31,
+-1, 31, -1], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45, 46, 59, 60,
+123, 124, 125, 127, 256, 257, 258, 264, 265, 267, 285, 311, 312, 315, 316, 331
+], [-1, 453, -1, 453, -1, 453, -1, 453, -1, 453, -1, 453, -1, 453, -1, 453, -1,
+453, -1, 453, -1, 453, -1, 453, -1, 453, -1, 453], [264], [-1]), ([33, 34, 38,
+39, 40, 41, 42, 43, 44, 45, 46, 59, 60, 123, 124, 126, 127, 258, 259, 260, 261,
+262, 263, 264, 265, 266, 267, 286, 287, 312, 313, 314, 315, 316, 317, 318, 319,
+320, 321, 322, 323, 324, 325, 326, 327, 328, 331], [-1, 2, -1, 4, -1, 6, -1, 8,
+10, -1, 12, -1, 179, -1, 14, -1, 16, -1, 18, 20, 22, 24, 26, 28, -1, 30, 32,
+-1, 36, -1, 86, 88, 90, -1, 92, 94, 96, 98, 100, 102, 104, 106, -1, 110, -1,
+114, -1], [1, 6, 9, 10, 12, 13, 18, 26, 30, 42, 44, 48, 51, 54, 59, 62, 64, 66,
+68, 70, 72, 74, 77, 89, 91, 93, 227, 243, 264], [-1, 61, 62, -1, 63, 64, -1,
+65, -1, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, -1, 79, 80, 81, -1,
+434, -1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45, 46, 59, 60, 123, 124, 125,
+127, 256, 257, 258, 264, 265, 267, 285, 311, 312, 331], [-1, 477, -1, 477, -1,
+477, -1, 477, -1, 477, -1, 477, -1, 477, -1, 477, -1, 477, -1, 477, -1, 477,
+-1, 477, -1, 477], [264], [-1]), ([33, 34, 38, 39, 40, 41, 42, 44, 45, 46, 59,
+60, 123, 124, 125, 127, 256, 257, 258, 264, 265, 267, 285, 311, 312, 331], [-1,
+475, -1, 475, -1, 475, -1, 475, -1, 475, -1, 475, -1, 475, -1, 475, -1, 475,
+-1, 475, -1, 475, -1, 475, -1, 475], [264], [-1])], [(1, []), (1, [(0, 1,
+'ExpressionIdentifier', {})]), (1, []), (1, []), (3, []), (1, []), (1, []), (1,
+[]), (1, []), (1, []), (1, []), (1, [(0, 1, 'ExpressionFunctionName', {})]), (
+6, [(0, 6, 'GenericSelection', {}), (4, 1, 'GenericAssociationList', {})]), (1,
+[]), (3, []), (3, [(0, 3, 'GenericAssociation', {})]), (1, []), (1, [(0, 1,
+'DefaultTypeName', {})]), (1, []), (4, [(0, 4, 'ExpressionIndex', {})]), (4, [(
+0, 4, 'ExpressionCall', {}), (2, 1, 'ArgumentExpressionList', {})]), (3, [(0,
+3, 'ExpressionField', {})]), (3, [(0, 3, 'ExpressionFieldDereference', {})]), (
+2, [(0, 2, 'ExpressionPostIncrement', {})]), (2, [(0, 2,
+'ExpressionPostDecrement', {})]), (6, [(0, 6, 'ExpressionArray', {}), (4, 1,
+'DesignatorInitializerList', {})]), (0, []), (1, []), (1, []), (3, []), (1, []
+), (2, [(0, 2, 'ExpressionPreIncrement', {})]), (2, [(0, 2,
+'ExpressionPreDecrement', {})]), (2, [(0, 2, 'ExpressionAddressOf', {})]), (2,
+[(0, 2, 'ExpressionDereference', {})]), (2, [(0, 2, 'ExpressionPlus', {})]), (
+2, [(0, 2, 'ExpressionMinus', {})]), (2, [(0, 2, 'ExpressionBitwiseNot', {})]),
+(2, [(0, 2, 'ExpressionLogicalNot', {})]), (2, [(0, 2,
+'ExpressionSizeOfExpression', {})]), (4, [(0, 4, 'ExpressionSizeOfType', {})]),
+(4, [(0, 4, 'ExpressionAlignOfType', {})]), (1, []), (4, [(0, 4,
+'ExpressionCast', {})]), (1, []), (3, [(0, 3, 'ExpressionMultiply', {})]), (3,
+[(0, 3, 'ExpressionDivide', {})]), (3, [(0, 3, 'ExpressionModulo', {})]), (1, [
+]), (3, [(0, 3, 'ExpressionAdd', {})]), (3, [(0, 3, 'ExpressionSubtract', {})]
+), (1, []), (3, [(0, 3, 'ExpressionShiftLeft', {})]), (3, [(0, 3,
+'ExpressionShiftRight', {})]), (1, []), (3, [(0, 3, 'ExpressionLessThan', {})]
+), (3, [(0, 3, 'ExpressionGreaterThan', {})]), (3, [(0, 3,
+'ExpressionLessThanOrEqual', {})]), (3, [(0, 3, 'ExpressionGreaterThanOrEqual',
+{})]), (1, []), (3, [(0, 3, 'ExpressionEqual', {})]), (3, [(0, 3,
+'ExpressionNotEqual', {})]), (1, []), (3, [(0, 3, 'ExpressionBitwiseAnd', {})]
+), (1, []), (3, [(0, 3, 'ExpressionExclusiveOr', {})]), (1, []), (3, [(0, 3,
+'ExpressionBitwiseOr', {})]), (1, []), (3, [(0, 3, 'ExpressionLogicalAnd', {})]
+), (1, []), (3, [(0, 3, 'ExpressionLogicalOr', {})]), (1, []), (5, [(0, 5,
+'ExpressionConditional', {})]), (0, [(0, 0, 'ExpressionEmpty', {})]), (1, [(0,
+1, 'ExpressionAsterisk', {})]), (1, []), (1, []), (3, [(0, 3,
+'ExpressionAssignment', {})]), (3, [(0, 3, 'ExpressionMultiplyAssignment', {})]
+), (3, [(0, 3, 'ExpressionDivideAssignment', {})]), (3, [(0, 3,
+'ExpressionModuloAssignment', {})]), (3, [(0, 3, 'ExpressionAddAssignment', {})
+]), (3, [(0, 3, 'ExpressionSubtractAssignment', {})]), (3, [(0, 3,
+'ExpressionLeftShiftAssignment', {})]), (3, [(0, 3,
+'ExpressionRightShiftAssignment', {})]), (3, [(0, 3,
+'ExpressionBitwiseAndAssignment', {})]), (3, [(0, 3,
+'ExpressionExclusiveOrAssignment', {})]), (3, [(0, 3,
+'ExpressionBitwiseOrAssignment', {})]), (0, [(0, 0, 'ExpressionEmpty', {})]), (
+1, []), (1, []), (3, [(0, 3, 'ExpressionComma', {})]), (0, [(0, 0,
+'ExpressionEmpty', {})]), (2, []), (1, []), (3, [(0, 3, 'Declaration', {}), (0,
+1, 'DeclarationSpecifierList', {}), (1, 1, 'InitDeclaratorList', {})]), (1, []
+), (1, []), (2, []), (1, []), (1, []), (1, []), (1, []), (1, []), (0, []), (1,
+[]), (1, []), (3, []), (2, [(0, 2, 'InitDeclarator', {})]), (1, [(0, 1,
+'StorageClassSpecifier', {'n': '0'})]), (1, [(0, 1, 'StorageClassSpecifier', {
+'n': '1'})]), (1, [(0, 1, 'StorageClassSpecifier', {'n': '2'})]), (1, [(0, 1,
+'StorageClassSpecifier', {'n': '3'})]), (1, [(0, 1, 'StorageClassSpecifier', {
+'n': '4'})]), (1, [(0, 1, 'StorageClassSpecifier', {'n': '5'})]), (1, [(0, 1,
+'TypeSpecifier', {'n': '0'})]), (1, [(0, 1, 'TypeSpecifier', {'n': '1'})]), (1,
+[(0, 1, 'TypeSpecifier', {'n': '2'})]), (1, [(0, 1, 'TypeSpecifier', {'n': '3'}
+)]), (1, [(0, 1, 'TypeSpecifier', {'n': '4'})]), (1, [(0, 1, 'TypeSpecifier', {
+'n': '5'})]), (1, [(0, 1, 'TypeSpecifier', {'n': '6'})]), (1, [(0, 1,
+'TypeSpecifier', {'n': '7'})]), (1, [(0, 1, 'TypeSpecifier', {'n': '8'})]), (1,
+[(0, 1, 'TypeSpecifier', {'n': '9'})]), (1, [(0, 1, 'TypeSpecifier', {'n': '10'
+})]), (1, [(0, 1, 'TypeSpecifier', {'n': '11'})]), (1, []), (1, []), (1, []), (
+1, []), (1, []), (5, [(0, 5, 'StructSpecifier', {}), (3, 1,
+'StructDeclarationList', {})]), (2, [(0, 2, 'StructSpecifier', {})]), (5, [(0,
+5, 'UnionSpecifier', {}), (3, 1, 'StructDeclarationList', {})]), (2, [(0, 2,
+'UnionSpecifier', {})]), (0, []), (1, []), (1, []), (2, []), (3, [(0, 3,
+'StructDeclaration', {}), (0, 1, 'SpecifierQualifierList', {}), (1, 1,
+'StructDeclaratorList', {})]), (1, []), (1, []), (2, []), (1, []), (1, []), (0,
+[]), (1, []), (1, []), (3, []), (3, [(0, 3, 'StructDeclarator', {})]), (1, []),
+(5, [(0, 5, 'EnumSpecifier', {}), (3, 1, 'EnumeratorList', {})]), (2, [(0, 2,
+'EnumSpecifier', {})]), (0, []), (1, []), (2, []), (1, []), (3, []), (2, [(0,
+2, 'Enumerator', {})]), (4, []), (0, []), (1, []), (1, []), (2, []), (1, []), (
+1, [(0, 1, 'StorageClassSpecifier', {'n': '2'})]), (1, [(0, 1, 'TypeQualifier',
+{'n': '0'})]), (1, [(0, 1, 'TypeQualifier', {'n': '1'})]), (1, [(0, 1,
+'TypeQualifier', {'n': '2'})]), (1, [(0, 1, 'TypeQualifier', {'n': '3'})]), (1,
+[(0, 1, 'FunctionSpecifier', {'n': '0'})]), (1, [(0, 1, 'FunctionSpecifier', {
+'n': '1'})]), (4, [(0, 4, 'AlignAsType', {})]), (4, [(0, 4,
+'AlignAsExpression', {})]), (0, [(0, 0, 'DeclaratorEmpty', {})]), (1, []), (1,
+[]), (3, [(0, 3, 'DeclaratorPointer', {}), (1, 1, 'TypeQualifierList', {})]), (
+1, []), (3, []), (5, [(0, 5, 'DeclaratorArray', {}), (2, 1,
+'TypeQualifierOrStaticList', {})]), (4, [(0, 4, 'DeclaratorFunctionOldStyle', {
+}), (2, 1, 'IdentifierList', {})]), (5, [(0, 5, 'DeclaratorFunction', {}), (2,
+1, 'ParameterDeclarationList', {})]), (0, []), (1, []), (1, []), (2, []), (1, [
+]), (3, []), (2, [(0, 2, 'ParameterDeclaration', {}), (0, 1,
+'DeclarationSpecifierList', {})]), (2, [(0, 2, 'ParameterDeclaration', {}), (0,
+1, 'DeclarationSpecifierList', {})]), (0, []), (1, []), (1, []), (3, []), (2, [
+(0, 2, 'TypeName', {}), (0, 1, 'SpecifierQualifierList', {})]), (1, []), (3, [(
+0, 3, 'DeclaratorPointer', {}), (1, 1, 'TypeQualifierList', {})]), (0, [(0, 0,
+'DeclaratorAbstract', {})]), (1, []), (3, []), (5, [(1, 3, 'DeclaratorPointer',
+{}), (2, 1, 'TypeQualifierList', {})]), (4, [(0, 5, 'DeclaratorArray', {}), (0,
+0, 'DeclaratorAbstract', {}), (1, 1, 'TypeQualifierOrStaticList', {})]), (2, [(
+0, 5, 'DeclaratorFunction', {}), (0, 0, 'DeclaratorAbstract', {}), (1, 0,
+'ParameterDeclarationList', {}), (1, 0, 'CommaEllipsisEmpty', {})]), (4, [(0,
+5, 'DeclaratorFunction', {}), (0, 0, 'DeclaratorAbstract', {}), (1, 1,
+'ParameterDeclarationList', {})]), (5, [(0, 5, 'DeclaratorArray', {}), (2, 1,
+'TypeQualifierOrStaticList', {})]), (3, [(0, 5, 'DeclaratorFunction', {}), (2,
+0, 'ParameterDeclarationList', {}), (2, 0, 'CommaEllipsisEmpty', {})]), (5, [(
+0, 5, 'DeclaratorFunction', {}), (2, 1, 'ParameterDeclarationList', {})]), (0,
+[(0, 0, 'EqualsInitializerEmpty', {})]), (2, []), (3, [(1, 1,
+'DesignatorInitializerList', {})]), (1, []), (0, []), (1, []), (2, []), (1, []
+), (3, []), (2, [(0, 2, 'DesignatorInitializer', {}), (0, 1, 'DesignatorList',
+{})]), (0, []), (2, []), (1, []), (2, []), (3, [(0, 3, 'DesignatorIndex', {})]
+), (2, [(0, 2, 'DesignatorField', {})]), (7, [(0, 7, 'StaticAssertDeclaration',
+{})]), (3, [(0, 3, 'StatementLabel', {})]), (4, [(0, 4, 'StatementCase', {})]),
+(3, [(0, 3, 'StatementDefault', {})]), (3, [(1, 1, 'BlockItemList', {})]), (2,
+[(0, 2, 'StatementExpression', {})]), (7, [(0, 7, 'StatementIfElse', {})]), (5,
+[(0, 5, 'StatementIf', {})]), (5, [(0, 5, 'StatementSwitch', {})]), (5, [(0, 5,
+'StatementWhile', {})]), (7, [(0, 7, 'StatementDoWhile', {})]), (9, [(0, 9,
+'StatementFor', {})]), (8, [(0, 8, 'StatementFor', {})]), (3, [(0, 3,
+'StatementGoto', {})]), (2, [(0, 2, 'StatementContinue', {})]), (2, [(0, 2,
+'StatementBreak', {})]), (3, [(0, 3, 'StatementReturn', {})]), (0, []), (1, []
+), (1, []), (2, []), (1, []), (1, []), (0, []), (1, []), (1, []), (2, []), (1,
+[]), (1, []), (6, [(0, 6, 'FunctionDefinition', {}), (0, 1,
+'DeclarationSpecifierList', {}), (2, 1, 'DeclarationList', {}), (4, 1,
+'BlockItemList', {})]), (0, []), (1, []), (1, []), (2, []), (0, [(0, 0,
+'IdentifierEmpty', {})]), (1, []), (0, [(0, 0, 'CommaEllipsisEmpty', {})]), (2,
+[(0, 2, 'CommaEllipsis', {})])], 331, 256)
+# GENERATE END
+
+def yyparse(root, pos, off, factory, yylex_iter):
+  lalr1.yyparse(root, pos, off, factory, yylex_iter)
+
+if __name__ == '__main__':
+  import ansi_c
+  import ansi_c_yylex
+  import element
+  import work
+  import sys
+  import xml.etree.ElementTree
+
+  root = element.Element('root')
+  yyparse(
+    root,
+    0,
+    0,
+    ansi_c.factory,
+    ansi_c_yylex.yylex(
+      root,
+      0,
+      0,
+      ansi_c.factory,
+      work.yychunk_line(root, sys.stdin)
+    )
+  )
+  xml.etree.ElementTree.dump(root)
diff --git a/ansi_c_yyparse.sh b/ansi_c_yyparse.sh
new file mode 100755 (executable)
index 0000000..ceec2a3
--- /dev/null
@@ -0,0 +1,7 @@
+#!/bin/sh
+if ../pyacc.git/pyacc.py ansi_c_yacc.y ansi_c_tokens.py <ansi_c_yyparse.py >ansi_c_yyparse.py.new && ! diff -q ansi_c_yyparse.py ansi_c_yyparse.py.new
+ then
+  mv ansi_c_yyparse.py.new ansi_c_yyparse.py
+else
+  rm -f ansi_c_yyparse.py.new
+fi
diff --git a/ast.py b/ast.py
new file mode 100644 (file)
index 0000000..4452031
--- /dev/null
+++ b/ast.py
@@ -0,0 +1,3681 @@
+import element
+
+class AlignAsExpression(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'AlignAsExpression',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      AlignAsExpression if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.AlignAsExpression({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class AlignAsType(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'AlignAsType',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      AlignAsType if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.AlignAsType({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ArgumentExpressionList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ArgumentExpressionList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      ArgumentExpressionList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ArgumentExpressionList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class BlockItemList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'BlockItemList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      BlockItemList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.BlockItemList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class CommaEllipsis(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'CommaEllipsis',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      CommaEllipsis if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.CommaEllipsis({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class CommaEllipsisEmpty(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'CommaEllipsisEmpty',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      CommaEllipsisEmpty if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.CommaEllipsisEmpty({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class Declaration(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'Declaration',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      Declaration if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.Declaration({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class DeclarationList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'DeclarationList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      DeclarationList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.DeclarationList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class DeclarationSpecifierList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'DeclarationSpecifierList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      DeclarationSpecifierList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.DeclarationSpecifierList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class Declarator(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'Declarator',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      Declarator if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.Declarator({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class DeclaratorAbstract(Declarator):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'DeclaratorAbstract',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Declarator.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Declarator.copy(
+      self,
+      DeclaratorAbstract if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.DeclaratorAbstract({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class DeclaratorArray(Declarator):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'DeclaratorArray',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Declarator.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Declarator.copy(
+      self,
+      DeclaratorArray if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.DeclaratorArray({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class DeclaratorEmpty(Declarator):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'DeclaratorEmpty',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Declarator.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Declarator.copy(
+      self,
+      DeclaratorEmpty if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.DeclaratorEmpty({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class DeclaratorFunction(Declarator):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'DeclaratorFunction',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Declarator.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Declarator.copy(
+      self,
+      DeclaratorFunction if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.DeclaratorFunction({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class DeclaratorFunctionOldStyle(Declarator):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'DeclaratorFunctionOldStyle',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Declarator.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Declarator.copy(
+      self,
+      DeclaratorFunctionOldStyle if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.DeclaratorFunctionOldStyle({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class DeclaratorPointer(Declarator):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'DeclaratorPointer',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Declarator.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Declarator.copy(
+      self,
+      DeclaratorPointer if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.DeclaratorPointer({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class DefaultTypeName(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'DefaultTypeName',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      DefaultTypeName if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.DefaultTypeName({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class DesignatorField(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'DesignatorField',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      DesignatorField if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.DesignatorField({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class DesignatorIndex(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'DesignatorIndex',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      DesignatorIndex if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.DesignatorIndex({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class DesignatorInitializer(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'DesignatorInitializer',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      DesignatorInitializer if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.DesignatorInitializer({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class DesignatorInitializerList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'DesignatorInitializerList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      DesignatorInitializerList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.DesignatorInitializerList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class DesignatorList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'DesignatorList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      DesignatorList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.DesignatorList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class EnumSpecifier(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'EnumSpecifier',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      EnumSpecifier if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.EnumSpecifier({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class Enumerator(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'Enumerator',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      Enumerator if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.Enumerator({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class EnumeratorList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'EnumeratorList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      EnumeratorList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.EnumeratorList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class EqualsInitializerEmpty(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'EqualsInitializerEmpty',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      EqualsInitializerEmpty if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.EqualsInitializerEmpty({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class Expression(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'Expression',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      Expression if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.Expression({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionAdd(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionAdd',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionAdd if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionAdd({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionAddAssignment(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionAddAssignment',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionAddAssignment if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionAddAssignment({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionAddressOf(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionAddressOf',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionAddressOf if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionAddressOf({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionAlignOfType(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionAlignOfType',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionAlignOfType if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionAlignOfType({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionArray(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionArray',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionArray if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionArray({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionAssignment(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionAssignment',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionAssignment if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionAssignment({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionAsterisk(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionAsterisk',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionAsterisk if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionAsterisk({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionBitwiseAnd(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionBitwiseAnd',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionBitwiseAnd if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionBitwiseAnd({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionBitwiseAndAssignment(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionBitwiseAndAssignment',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionBitwiseAndAssignment if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionBitwiseAndAssignment({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionBitwiseNot(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionBitwiseNot',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionBitwiseNot if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionBitwiseNot({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionBitwiseOr(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionBitwiseOr',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionBitwiseOr if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionBitwiseOr({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionBitwiseOrAssignment(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionBitwiseOrAssignment',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionBitwiseOrAssignment if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionBitwiseOrAssignment({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionCall(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionCall',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionCall if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionCall({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionCast(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionCast',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionCast if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionCast({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionComma(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionComma',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionComma if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionComma({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionConditional(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionConditional',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionConditional if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionConditional({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionDereference(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionDereference',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionDereference if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionDereference({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionDivide(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionDivide',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionDivide if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionDivide({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionDivideAssignment(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionDivideAssignment',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionDivideAssignment if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionDivideAssignment({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionEmpty(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionEmpty',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionEmpty if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionEmpty({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionEqual(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionEqual',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionEqual if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionEqual({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionExclusiveOr(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionExclusiveOr',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionExclusiveOr if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionExclusiveOr({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionExclusiveOrAssignment(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionExclusiveOrAssignment',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionExclusiveOrAssignment if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionExclusiveOrAssignment({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionField(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionField',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionField if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionField({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionFieldDereference(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionFieldDereference',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionFieldDereference if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionFieldDereference({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionFloatLiteral(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionFloatLiteral',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionFloatLiteral if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionFloatLiteral({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionFunctionName(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionFunctionName',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionFunctionName if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionFunctionName({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionGreaterThan(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionGreaterThan',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionGreaterThan if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionGreaterThan({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionGreaterThanOrEqual(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionGreaterThanOrEqual',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionGreaterThanOrEqual if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionGreaterThanOrEqual({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionIdentifier(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionIdentifier',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionIdentifier if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionIdentifier({0:s})'.format(', '.join(params))
+  # GENERATE END
+class ExpressionIndex(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionIndex',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionIndex if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionIndex({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionIntLiteral(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionIntLiteral',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionIntLiteral if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionIntLiteral({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class Identifier(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'Identifier',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      Identifier if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.Identifier({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+
+class ExpressionLeftShiftAssignment(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionLeftShiftAssignment',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionLeftShiftAssignment if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionLeftShiftAssignment({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionLessThan(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionLessThan',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionLessThan if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionLessThan({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionLessThanOrEqual(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionLessThanOrEqual',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionLessThanOrEqual if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionLessThanOrEqual({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionLogicalAnd(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionLogicalAnd',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionLogicalAnd if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionLogicalAnd({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionLogicalNot(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionLogicalNot',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionLogicalNot if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionLogicalNot({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionLogicalOr(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionLogicalOr',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionLogicalOr if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionLogicalOr({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionMinus(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionMinus',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionMinus if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionMinus({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionModulo(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionModulo',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionModulo if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionModulo({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionModuloAssignment(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionModuloAssignment',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionModuloAssignment if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionModuloAssignment({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionMultiply(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionMultiply',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionMultiply if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionMultiply({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionMultiplyAssignment(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionMultiplyAssignment',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionMultiplyAssignment if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionMultiplyAssignment({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionNotEqual(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionNotEqual',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionNotEqual if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionNotEqual({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionPlus(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionPlus',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionPlus if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionPlus({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionPostDecrement(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionPostDecrement',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionPostDecrement if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionPostDecrement({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionPostIncrement(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionPostIncrement',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionPostIncrement if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionPostIncrement({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionPreDecrement(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionPreDecrement',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionPreDecrement if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionPreDecrement({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionPreIncrement(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionPreIncrement',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionPreIncrement if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionPreIncrement({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionRightShiftAssignment(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionRightShiftAssignment',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionRightShiftAssignment if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionRightShiftAssignment({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionShiftLeft(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionShiftLeft',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionShiftLeft if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionShiftLeft({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionShiftRight(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionShiftRight',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionShiftRight if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionShiftRight({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionSizeOfExpression(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionSizeOfExpression',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionSizeOfExpression if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionSizeOfExpression({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionSizeOfType(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionSizeOfType',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionSizeOfType if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionSizeOfType({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionSubtract(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionSubtract',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionSubtract if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionSubtract({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ExpressionSubtractAssignment(Expression):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ExpressionSubtractAssignment',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Expression.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Expression.copy(
+      self,
+      ExpressionSubtractAssignment if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ExpressionSubtractAssignment({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class FunctionDefinition(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'FunctionDefinition',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      FunctionDefinition if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.FunctionDefinition({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class FunctionSpecifier(element.Element):
+  # GENERATE ELEMENT(int n) BEGIN
+  def __init__(
+    self,
+    tag = 'FunctionSpecifier',
+    attrib = {},
+    text = '',
+    children = [],
+    n = -1
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+    self.n = (
+      element.deserialize_int(n)
+    if isinstance(n, str) else
+      n
+    )
+  def serialize(self, ref_list):
+    element.Element.serialize(self, ref_list)
+    self.set('n', element.serialize_int(self.n))
+  def deserialize(self, ref_list):
+    element.Element.deserialize(self, ref_list)
+    self.n = element.deserialize_int(self.get('n', '-1'))
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      FunctionSpecifier if factory is None else factory
+    )
+    result.n = self.n
+    return result
+  def repr_serialize(self, params):
+    element.Element.repr_serialize(self, params)
+    if self.n != -1:
+      params.append(
+        'n = {0:s}'.format(repr(self.n))
+      )
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.FunctionSpecifier({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class GenericAssociation(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'GenericAssociation',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      GenericAssociation if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.GenericAssociation({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class GenericAssociationList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'GenericAssociationList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      GenericAssociationList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.GenericAssociationList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class GenericSelection(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'GenericSelection',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      GenericSelection if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.GenericSelection({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class IdentifierEmpty(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'IdentifierEmpty',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      IdentifierEmpty if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.IdentifierEmpty({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class IdentifierList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'IdentifierList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      IdentifierList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.IdentifierList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class InitDeclarator(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'InitDeclarator',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      InitDeclarator if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.InitDeclarator({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class InitDeclaratorList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'InitDeclaratorList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      InitDeclaratorList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.InitDeclaratorList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ParameterDeclaration(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ParameterDeclaration',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      ParameterDeclaration if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ParameterDeclaration({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class ParameterDeclarationList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'ParameterDeclarationList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      ParameterDeclarationList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.ParameterDeclarationList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class SpecifierQualifierList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'SpecifierQualifierList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      SpecifierQualifierList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.SpecifierQualifierList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class Statement(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'Statement',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      Statement if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.Statement({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StatementBreak(Statement):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StatementBreak',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Statement.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Statement.copy(
+      self,
+      StatementBreak if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StatementBreak({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StatementCase(Statement):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StatementCase',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Statement.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Statement.copy(
+      self,
+      StatementCase if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StatementCase({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StatementContinue(Statement):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StatementContinue',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Statement.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Statement.copy(
+      self,
+      StatementContinue if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StatementContinue({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StatementDefault(Statement):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StatementDefault',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Statement.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Statement.copy(
+      self,
+      StatementDefault if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StatementDefault({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StatementDoWhile(Statement):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StatementDoWhile',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Statement.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Statement.copy(
+      self,
+      StatementDoWhile if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StatementDoWhile({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StatementExpression(Statement):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StatementExpression',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Statement.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Statement.copy(
+      self,
+      StatementExpression if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StatementExpression({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StatementFor(Statement):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StatementFor',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Statement.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Statement.copy(
+      self,
+      StatementFor if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StatementFor({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StatementGoto(Statement):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StatementGoto',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Statement.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Statement.copy(
+      self,
+      StatementGoto if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StatementGoto({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StatementIf(Statement):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StatementIf',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Statement.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Statement.copy(
+      self,
+      StatementIf if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StatementIf({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StatementIfElse(Statement):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StatementIfElse',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Statement.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Statement.copy(
+      self,
+      StatementIfElse if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StatementIfElse({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StatementLabel(Statement):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StatementLabel',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Statement.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Statement.copy(
+      self,
+      StatementLabel if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StatementLabel({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StatementReturn(Statement):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StatementReturn',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Statement.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Statement.copy(
+      self,
+      StatementReturn if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StatementReturn({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StatementSwitch(Statement):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StatementSwitch',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Statement.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Statement.copy(
+      self,
+      StatementSwitch if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StatementSwitch({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StatementWhile(Statement):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StatementWhile',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Statement.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Statement.copy(
+      self,
+      StatementWhile if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StatementWhile({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StaticAssertDeclaration(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StaticAssertDeclaration',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      StaticAssertDeclaration if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StaticAssertDeclaration({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StorageClassSpecifier(element.Element):
+  # GENERATE ELEMENT(int n) BEGIN
+  def __init__(
+    self,
+    tag = 'StorageClassSpecifier',
+    attrib = {},
+    text = '',
+    children = [],
+    n = -1
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+    self.n = (
+      element.deserialize_int(n)
+    if isinstance(n, str) else
+      n
+    )
+  def serialize(self, ref_list):
+    element.Element.serialize(self, ref_list)
+    self.set('n', element.serialize_int(self.n))
+  def deserialize(self, ref_list):
+    element.Element.deserialize(self, ref_list)
+    self.n = element.deserialize_int(self.get('n', '-1'))
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      StorageClassSpecifier if factory is None else factory
+    )
+    result.n = self.n
+    return result
+  def repr_serialize(self, params):
+    element.Element.repr_serialize(self, params)
+    if self.n != -1:
+      params.append(
+        'n = {0:s}'.format(repr(self.n))
+      )
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StorageClassSpecifier({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StructDeclaration(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StructDeclaration',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      StructDeclaration if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StructDeclaration({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StructDeclarationList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StructDeclarationList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      StructDeclarationList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StructDeclarationList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StructDeclarator(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StructDeclarator',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      StructDeclarator if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StructDeclarator({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StructDeclaratorList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StructDeclaratorList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      StructDeclaratorList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StructDeclaratorList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class StructSpecifier(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'StructSpecifier',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      StructSpecifier if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.StructSpecifier({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class TypeName(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'TypeName',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      TypeName if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.TypeName({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class TypeQualifier(element.Element):
+  # GENERATE ELEMENT(int n) BEGIN
+  def __init__(
+    self,
+    tag = 'TypeQualifier',
+    attrib = {},
+    text = '',
+    children = [],
+    n = -1
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+    self.n = (
+      element.deserialize_int(n)
+    if isinstance(n, str) else
+      n
+    )
+  def serialize(self, ref_list):
+    element.Element.serialize(self, ref_list)
+    self.set('n', element.serialize_int(self.n))
+  def deserialize(self, ref_list):
+    element.Element.deserialize(self, ref_list)
+    self.n = element.deserialize_int(self.get('n', '-1'))
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      TypeQualifier if factory is None else factory
+    )
+    result.n = self.n
+    return result
+  def repr_serialize(self, params):
+    element.Element.repr_serialize(self, params)
+    if self.n != -1:
+      params.append(
+        'n = {0:s}'.format(repr(self.n))
+      )
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.TypeQualifier({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class TypeQualifierList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'TypeQualifierList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      TypeQualifierList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.TypeQualifierList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class TypeQualifierOrStaticList(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'TypeQualifierOrStaticList',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      TypeQualifierOrStaticList if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.TypeQualifierOrStaticList({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class TypeSpecifier(element.Element):
+  # GENERATE ELEMENT(int n) BEGIN
+  def __init__(
+    self,
+    tag = 'TypeSpecifier',
+    attrib = {},
+    text = '',
+    children = [],
+    n = -1
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+    self.n = (
+      element.deserialize_int(n)
+    if isinstance(n, str) else
+      n
+    )
+  def serialize(self, ref_list):
+    element.Element.serialize(self, ref_list)
+    self.set('n', element.serialize_int(self.n))
+  def deserialize(self, ref_list):
+    element.Element.deserialize(self, ref_list)
+    self.n = element.deserialize_int(self.get('n', '-1'))
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      TypeSpecifier if factory is None else factory
+    )
+    result.n = self.n
+    return result
+  def repr_serialize(self, params):
+    element.Element.repr_serialize(self, params)
+    if self.n != -1:
+      params.append(
+        'n = {0:s}'.format(repr(self.n))
+      )
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.TypeSpecifier({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+class UnionSpecifier(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'UnionSpecifier',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      UnionSpecifier if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'ast.UnionSpecifier({0:s})'.format(', '.join(params))
+  # GENERATE END
+
+# GENERATE FACTORY(element.Element) BEGIN
+tag_to_class = {
+  'AlignAsExpression': AlignAsExpression,
+  'AlignAsType': AlignAsType,
+  'ArgumentExpressionList': ArgumentExpressionList,
+  'BlockItemList': BlockItemList,
+  'CommaEllipsis': CommaEllipsis,
+  'CommaEllipsisEmpty': CommaEllipsisEmpty,
+  'Declaration': Declaration,
+  'DeclarationList': DeclarationList,
+  'DeclarationSpecifierList': DeclarationSpecifierList,
+  'Declarator': Declarator,
+  'DeclaratorAbstract': DeclaratorAbstract,
+  'DeclaratorArray': DeclaratorArray,
+  'DeclaratorEmpty': DeclaratorEmpty,
+  'DeclaratorFunction': DeclaratorFunction,
+  'DeclaratorFunctionOldStyle': DeclaratorFunctionOldStyle,
+  'DeclaratorPointer': DeclaratorPointer,
+  'DefaultTypeName': DefaultTypeName,
+  'DesignatorField': DesignatorField,
+  'DesignatorIndex': DesignatorIndex,
+  'DesignatorInitializer': DesignatorInitializer,
+  'DesignatorInitializerList': DesignatorInitializerList,
+  'DesignatorList': DesignatorList,
+  'EnumSpecifier': EnumSpecifier,
+  'Enumerator': Enumerator,
+  'EnumeratorList': EnumeratorList,
+  'EqualsInitializerEmpty': EqualsInitializerEmpty,
+  'Expression': Expression,
+  'ExpressionAdd': ExpressionAdd,
+  'ExpressionAddAssignment': ExpressionAddAssignment,
+  'ExpressionAddressOf': ExpressionAddressOf,
+  'ExpressionAlignOfType': ExpressionAlignOfType,
+  'ExpressionArray': ExpressionArray,
+  'ExpressionAssignment': ExpressionAssignment,
+  'ExpressionAsterisk': ExpressionAsterisk,
+  'ExpressionBitwiseAnd': ExpressionBitwiseAnd,
+  'ExpressionBitwiseAndAssignment': ExpressionBitwiseAndAssignment,
+  'ExpressionBitwiseNot': ExpressionBitwiseNot,
+  'ExpressionBitwiseOr': ExpressionBitwiseOr,
+  'ExpressionBitwiseOrAssignment': ExpressionBitwiseOrAssignment,
+  'ExpressionCall': ExpressionCall,
+  'ExpressionCast': ExpressionCast,
+  'ExpressionComma': ExpressionComma,
+  'ExpressionConditional': ExpressionConditional,
+  'ExpressionDereference': ExpressionDereference,
+  'ExpressionDivide': ExpressionDivide,
+  'ExpressionDivideAssignment': ExpressionDivideAssignment,
+  'ExpressionEmpty': ExpressionEmpty,
+  'ExpressionEqual': ExpressionEqual,
+  'ExpressionExclusiveOr': ExpressionExclusiveOr,
+  'ExpressionExclusiveOrAssignment': ExpressionExclusiveOrAssignment,
+  'ExpressionField': ExpressionField,
+  'ExpressionFieldDereference': ExpressionFieldDereference,
+  'ExpressionFloatLiteral': ExpressionFloatLiteral,
+  'ExpressionFunctionName': ExpressionFunctionName,
+  'ExpressionGreaterThan': ExpressionGreaterThan,
+  'ExpressionGreaterThanOrEqual': ExpressionGreaterThanOrEqual,
+  'ExpressionIdentifier': ExpressionIdentifier,
+  'ExpressionIndex': ExpressionIndex,
+  'ExpressionIntLiteral': ExpressionIntLiteral,
+  'Identifier': Identifier,
+  'ExpressionLeftShiftAssignment': ExpressionLeftShiftAssignment,
+  'ExpressionLessThan': ExpressionLessThan,
+  'ExpressionLessThanOrEqual': ExpressionLessThanOrEqual,
+  'ExpressionLogicalAnd': ExpressionLogicalAnd,
+  'ExpressionLogicalNot': ExpressionLogicalNot,
+  'ExpressionLogicalOr': ExpressionLogicalOr,
+  'ExpressionMinus': ExpressionMinus,
+  'ExpressionModulo': ExpressionModulo,
+  'ExpressionModuloAssignment': ExpressionModuloAssignment,
+  'ExpressionMultiply': ExpressionMultiply,
+  'ExpressionMultiplyAssignment': ExpressionMultiplyAssignment,
+  'ExpressionNotEqual': ExpressionNotEqual,
+  'ExpressionPlus': ExpressionPlus,
+  'ExpressionPostDecrement': ExpressionPostDecrement,
+  'ExpressionPostIncrement': ExpressionPostIncrement,
+  'ExpressionPreDecrement': ExpressionPreDecrement,
+  'ExpressionPreIncrement': ExpressionPreIncrement,
+  'ExpressionRightShiftAssignment': ExpressionRightShiftAssignment,
+  'ExpressionShiftLeft': ExpressionShiftLeft,
+  'ExpressionShiftRight': ExpressionShiftRight,
+  'ExpressionSizeOfExpression': ExpressionSizeOfExpression,
+  'ExpressionSizeOfType': ExpressionSizeOfType,
+  'ExpressionSubtract': ExpressionSubtract,
+  'ExpressionSubtractAssignment': ExpressionSubtractAssignment,
+  'FunctionDefinition': FunctionDefinition,
+  'FunctionSpecifier': FunctionSpecifier,
+  'GenericAssociation': GenericAssociation,
+  'GenericAssociationList': GenericAssociationList,
+  'GenericSelection': GenericSelection,
+  'IdentifierEmpty': IdentifierEmpty,
+  'IdentifierList': IdentifierList,
+  'InitDeclarator': InitDeclarator,
+  'InitDeclaratorList': InitDeclaratorList,
+  'ParameterDeclaration': ParameterDeclaration,
+  'ParameterDeclarationList': ParameterDeclarationList,
+  'SpecifierQualifierList': SpecifierQualifierList,
+  'Statement': Statement,
+  'StatementBreak': StatementBreak,
+  'StatementCase': StatementCase,
+  'StatementContinue': StatementContinue,
+  'StatementDefault': StatementDefault,
+  'StatementDoWhile': StatementDoWhile,
+  'StatementExpression': StatementExpression,
+  'StatementFor': StatementFor,
+  'StatementGoto': StatementGoto,
+  'StatementIf': StatementIf,
+  'StatementIfElse': StatementIfElse,
+  'StatementLabel': StatementLabel,
+  'StatementReturn': StatementReturn,
+  'StatementSwitch': StatementSwitch,
+  'StatementWhile': StatementWhile,
+  'StaticAssertDeclaration': StaticAssertDeclaration,
+  'StorageClassSpecifier': StorageClassSpecifier,
+  'StructDeclaration': StructDeclaration,
+  'StructDeclarationList': StructDeclarationList,
+  'StructDeclarator': StructDeclarator,
+  'StructDeclaratorList': StructDeclaratorList,
+  'StructSpecifier': StructSpecifier,
+  'TypeName': TypeName,
+  'TypeQualifier': TypeQualifier,
+  'TypeQualifierList': TypeQualifierList,
+  'TypeQualifierOrStaticList': TypeQualifierOrStaticList,
+  'TypeSpecifier': TypeSpecifier,
+  'UnionSpecifier': UnionSpecifier
+}
+def factory(tag, attrib = {}, *args, **kwargs):
+  return tag_to_class.get(tag, element.Element)(tag, attrib, *args, **kwargs)
+# GENERATE END
diff --git a/ast.sh b/ast.sh
new file mode 100755 (executable)
index 0000000..dd16e2d
--- /dev/null
+++ b/ast.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+if ./generate.py ast <ast.py >ast.py.new && ! diff -q ast.py ast.py.new
+then
+  mv ast.py.new ast.py
+else
+  rm -f ast.py.new
+fi
diff --git a/bisect_set.py b/bisect_set.py
new file mode 100644 (file)
index 0000000..6ce1be9
--- /dev/null
@@ -0,0 +1,71 @@
+# defines the alphabet size, set this to 0x11000 for unicode
+n_characters = 0x100
+
+def bisect_set_or(character_set0, character_set1):
+  # calculate union of the child sets
+  # we do this by calculating a series of breakpoints, at each breakpoint
+  # evaluating the "or" (max) of the even/odd truth values of each child,
+  # then making the output truth value even/odd by outputting if necessary
+  result = []
+  i = 0
+  j = 0
+  while True:
+    if i < len(character_set0):
+      k = character_set0[i]
+      if j < len(character_set1):
+        k = min(k, character_set1[j])
+    elif j < len(character_set1):
+      k = character_set1[j]
+    else:
+      break
+    if i < len(character_set0) and character_set0[i] == k:
+      i += 1
+    if j < len(character_set1) and character_set1[j] == k:
+      j += 1
+    if (len(result) & 1) != max(i & 1, j & 1):
+      result.append(k)
+  assert (i & 1) == 0 and (j & 1) == 0
+  return result
+
+def bisect_set_and(character_set0, character_set1):
+  # calculate intersection of the child sets
+  # we do this by calculating a series of breakpoints, at each breakpoint
+  # evaluating the "and" (min) of the even/odd truth values of each child,
+  # then making the output truth value even/odd by outputting if necessary
+  result = []
+  i = 0
+  j = 0
+  while True:
+    if i < len(character_set0):
+      k = character_set0[i]
+      if j < len(character_set1):
+        k = min(k, character_set1[j])
+    elif j < len(character_set1):
+      k = character_set1[j]
+    else:
+      break
+    if i < len(character_set0) and character_set0[i] == k:
+      i += 1
+    if j < len(character_set1) and character_set1[j] == k:
+      j += 1
+    if (len(result) & 1) != min(i & 1, j & 1):
+      result.append(k)
+  assert (i & 1) == 0 and (j & 1) == 0
+  return result
+
+def bisect_set_not(character_set):
+  # calculate complement of the child set
+  # if child set begins with [0], remove it, otherwise add [0] prefix
+  # if child set ends with [n_characters], remove it, otherwise add [n_characters] suffix
+  # the suffix part is not totally necessary, but makes sure length is even
+  # (the evenness is so that single character sets can always be [c, c + 1])
+  result = list(character_set)
+  if result[:1] == [0]:
+    del result[:1]
+  else:
+    result[:0] = [0]
+  if result[-1:] == [n_characters]:
+    del result[-1:]
+  else:
+    result.append(n_characters)
+  return result
diff --git a/c_to_python.py b/c_to_python.py
new file mode 100644 (file)
index 0000000..f83c0bc
--- /dev/null
@@ -0,0 +1,31 @@
+import ansi_c_yylex
+import ansi_c_yyparse
+import ast
+import element
+
+def extract(i):
+  return ''.join(
+    [
+      k
+      for j in range(len(i))
+      for k in [element.get_text(i, j), extract(i[j])]
+    ] +
+    [element.get_text(i, len(i))]
+  )
+
+def c_to_python(text):
+  root = element.Element('root', text = text)
+  ansi_c_yyparse.yyparse(
+    root,
+    0,
+    0,
+    ast.factory,
+    ansi_c_yylex.yylex(
+      root,
+      0,
+      0,
+      ast.factory,
+      iter([])
+    )
+  )
+  return extract(root)
diff --git a/degenerate.py b/degenerate.py
new file mode 100755 (executable)
index 0000000..96d362a
--- /dev/null
@@ -0,0 +1,27 @@
+#!/usr/bin/env python3
+
+import re
+import sys
+
+re_begin = re.compile(
+  '([\t ]*# GENERATE .*) BEGIN'
+)
+re_end = re.compile(
+  '([\t ]*# GENERATE END)'
+)
+
+line = sys.stdin.readline()
+while len(line):
+  match = re_begin.match(line)
+  if match is not None:
+    sys.stdout.write(match.group(1))
+    line = sys.stdin.readline()
+    while len(line):
+      match = re_end.match(line)
+      if match is not None:
+        sys.stdout.write(line[len(match.group(1)):])
+        break
+      line = sys.stdin.readline()
+  else:
+    sys.stdout.write(line)
+  line = sys.stdin.readline()
diff --git a/dfa.py b/dfa.py
new file mode 100644 (file)
index 0000000..46f4cbe
--- /dev/null
+++ b/dfa.py
@@ -0,0 +1,221 @@
+import bisect
+import element
+import work
+import sys
+
+# defines the alphabet size, set this to 0x11000 for unicode
+n_characters = 0x100
+
+class DFA:
+  # transition classes:
+  # instructions to transform thread list from a multistate to next multistate
+  # (TRANSITION_POP, n)                        j += n
+  # (TRANSITION_DUP, n)                        threads0[j - n:j] = threads0[j:j + n]
+  #                                    j -= n
+  # (TRANSITION_MARK, n, mark_value)   threads0[j:j + n] = [
+  #                                      (i, mark, thread)
+  #                                      for thread in threads0[j:j + n]
+  #                                    ]
+  # (TRANSITION_MOVE, n)               threads1.extend(threads0[j:j + n])
+  #                                    j += n
+  # (TRANSITION_DEL, n)                        del threads1[-n:]
+
+  TRANSITION_POP = 0
+  TRANSITION_DUP = 1
+  TRANSITION_MARK = 2
+  TRANSITION_MOVE = 3
+  #TRANSITION_DEL = 4
+  def __init__(
+    self,
+    groups = [],
+    states = [([n_characters], [0], 0)],
+    actions = [(0, [])],
+    start_action = [] # can have multiple DFAs in same container
+  ):
+    # groups: list of group_desc
+    # group_desc: (tag, kwargs)
+    #   tag, kwargs will be passed to apply_markup() hence factory()
+    # states: list of state_desc
+    # state_desc: (list of breaks, list of action to do, accept_thread)
+    # actions: list of action_desc
+    # action_desc: (state to go to next, compiled transition to do first)
+    # accept_thread: which thread of thread list to use, -1 don't accept
+    self.groups = groups
+    self.states = states
+    self.actions = actions
+    self.start_action = start_action
+
+  def match_text(self, text, i, start_index = 0):
+    def transit(transition):
+      nonlocal threads0, threads1, prefix_slop # note: also uses i
+      j = prefix_slop
+      for trans in transition:
+        if trans[0] == DFA.TRANSITION_POP:
+          j += trans[1]
+        elif trans[0] == DFA.TRANSITION_DUP:
+          while j < trans[1]:
+            threads0[:0] = [None] * prefix_slop
+            threads1[:0] = [None] * prefix_slop
+            j += prefix_slop
+            prefix_slop *= 2
+          threads0[j - trans[1]:j] = threads0[j:j + trans[1]]
+          j -= trans[1]
+        elif trans[0] == DFA.TRANSITION_MARK:
+          threads0[j:j + trans[1]] = [
+            (i, trans[2], thread)
+            for thread in threads0[j:j + trans[1]]
+          ]
+        elif trans[0] == DFA.TRANSITION_MOVE:
+          threads1.extend(threads0[j:j + trans[1]])
+          j += trans[1]
+        #elif trans[0] == DFA.TRANSITION_DEL:
+        #  del threads1[-trans[1]:]
+        else:
+          assert False
+      assert j == len(threads0)
+      threads0, threads1 = threads1, threads0
+      del threads1[prefix_slop:]
+
+    threads0 = [None, None]
+    threads1 = [None]
+    prefix_slop = 1
+
+    action = self.start_action[start_index]
+    while action != -1:
+      state, transition = self.actions[action]
+      #print('i', i, 'action', action, 'state', state, 'transition', transition)
+      transit(transition)
+      if state == 0:
+        # there is only one match, which is complete
+        assert len(threads0) == prefix_slop + 1
+        return threads0[prefix_slop]
+      if i >= len(text):
+        # return best match we have, but not incomplete match
+        i = self.states[state][2]
+        return (None if i == -1 else threads0[prefix_slop + i])
+      action = self.states[state][1][
+        bisect.bisect_right(self.states[state][0], ord(text[i]))
+      ]
+      i += 1
+    return None
+
+  def match_yychunk(self, root, pos, off, yychunk_iter, start_index = 0):
+    if pos < 0:
+      pos, off = element.to_start_relative(root, pos, off)
+
+    def transit(transition):
+      nonlocal threads0, threads1, prefix_slop # note: also uses pos, off
+      j = prefix_slop
+      for trans in transition:
+        if trans[0] == DFA.TRANSITION_POP:
+          j += trans[1]
+        elif trans[0] == DFA.TRANSITION_DUP:
+          while j < trans[1]:
+            threads0[:0] = [None] * prefix_slop
+            threads1[:0] = [None] * prefix_slop
+            j += prefix_slop
+            prefix_slop *= 2
+          threads0[j - trans[1]:j] = threads0[j:j + trans[1]]
+          j -= trans[1]
+        elif trans[0] == DFA.TRANSITION_MARK:
+          threads0[j:j + trans[1]] = [
+            (pos, off, trans[2], thread)
+            for thread in threads0[j:j + trans[1]]
+          ]
+        elif trans[0] == DFA.TRANSITION_MOVE:
+          threads1.extend(threads0[j:j + trans[1]])
+          j += trans[1]
+        #elif trans[0] == DFA.TRANSITION_DEL:
+        #  del threads1[-trans[1]:]
+        else:
+          assert False
+      assert j == len(threads0)
+      threads0, threads1 = threads1, threads0
+      del threads1[prefix_slop:]
+
+    threads0 = [None, None]
+    threads1 = [None]
+    prefix_slop = 1
+
+    action = self.start_action[start_index]
+    text = element.get_text(root, pos)
+    while action != -1:
+      state, transition = self.actions[action]
+      transit(transition)
+      if state == 0:
+        # there is only one match, which is complete
+        assert len(threads0) == prefix_slop + 1
+        return threads0[prefix_slop]
+      while off >= len(text):
+        if pos < len(root):
+          pos += 1
+          off = 0
+        else:
+          try:
+            next(yychunk_iter)
+          except StopIteration:
+            # return best match we have, but not incomplete match
+            i = self.states[state][2]
+            return (None if i == -1 else threads0[prefix_slop + i])
+          text = element.get_text(root, pos)
+      #print(
+      #  'state {0:d} pos {1:d} off {2:d} text "{3:s}"'.format(
+      #    state,
+      #    pos,
+      #    off,
+      #    text.replace('\n', '$')
+      #  )
+      #)
+      action = self.states[state][1][
+        bisect.bisect_right(self.states[state][0], ord(text[off]))
+      ]
+      off += 1
+    return None
+
+  def yylex(self, root, pos, off, factory, yychunk_iter):
+    if pos < 0:
+      pos, off = element.to_start_relative(root, pos, off)
+
+    while True:
+      # note: pointers must be kept start relative during the below call,
+      # because it extends the following text by calling the yychunk_iter
+      thread = self.match_yychunk(root, pos, off, yychunk_iter)
+      if thread is None:
+        break
+      stack = []
+      while True:
+        pos, off, mark_value, thread = thread
+        group_index = mark_value >> 1
+        if (mark_value & 1) != 0:
+          end_pos, end_off = element.to_end_relative(root, pos, off)
+          stack.append((end_pos, end_off, group_index))
+        else:
+          end_pos, end_off, temp = stack.pop()
+          assert temp == group_index
+          if len(stack) == 0:
+            break
+          tag, kwargs = self.groups[group_index]
+          if tag != '':
+            work.apply_markup(
+              root,
+              pos,
+              off,
+              end_pos,
+              end_off,
+              factory,
+              tag,
+              **kwargs
+            )
+      # note: pointers must be kept end relative during the below call,
+      # because it modifies the preceding text by calling apply_markup()
+      yield end_pos, end_off, group_index
+      pos, off = element.to_start_relative(root, end_pos, end_off)
+
+  def __repr__(self):
+    return 'dfa.DFA({0:s}, {1:s}, {2:s}, {3:s})'.format(
+      repr(self.groups),
+      repr(self.states),
+      repr(self.actions),
+      repr(self.start_action)
+    )
diff --git a/element.py b/element.py
new file mode 100644 (file)
index 0000000..1f8e84f
--- /dev/null
@@ -0,0 +1,157 @@
+import xml.etree.ElementTree
+
+class Element(xml.etree.ElementTree._Element_Py):
+  def __init__(self, tag = 'Element', attrib = {}, text = '', children = []):
+    xml.etree.ElementTree._Element_Py.__init__(self, tag, attrib)
+    self.ref = -1
+    self.seen = False
+    set_text(self, 0, text)
+    self[:] = children
+  def serialize(self, ref_list):
+    for i in self:
+      # parented, enforce that child can only be parented at most once
+      # (although there can be unlimited numbers of numeric refs to it)
+      assert not i.seen
+      i.seen = True
+      if i.ref == -1:
+        i.serialize(ref_list)
+  def deserialize(self, ref_list):
+    for i in self:
+      i.deserialize(ref_list)
+  def copy(self, factory = None):
+    result = (Element if factory is None else factory)(self.tag, self.attrib)
+    result.text = self.text
+    result.tail = self.tail
+    result[:] = [i.copy() for i in self]
+    return result
+  def repr_serialize(self, params):
+    if len(self):
+      params.append(
+        'children = [{0:s}]'.format(
+          ', '.join([repr(i) for i in self])
+        )
+      )
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'element.Element({0:s})'.format(', '.join(params))
+
+bool_to_str = ['false', 'true']
+def serialize_bool(value):
+  return bool_to_str[int(value)]
+
+str_to_bool = {'false': False, 'true': True}
+def deserialize_bool(text):
+  return str_to_bool[text]
+
+def serialize_int(value):
+  return str(value)
+
+def deserialize_int(text):
+  return int(text)
+
+def serialize_ref(value, ref_list):
+  if value is None:
+    ref = -1
+  else:
+    ref = value.ref
+    if ref == -1:
+      ref = len(ref_list)
+      ref_list.append(value)
+      value.ref = ref
+      value.set('ref', str(ref))
+      # this doesn't set the seen flag, so it will be parented by the
+      # root, unless it is already parented or gets parented later on
+      if not value.seen:
+        value.serialize(ref_list)
+  return str(ref)
+
+def deserialize_ref(text, ref_list):
+  ref = int(text)
+  return None if ref < 0 else ref_list[ref]
+
+def serialize_str(value):
+  return value
+
+def deserialize_str(text):
+  return text
+
+def serialize(value, fout, encoding = 'unicode'):
+  ref_list = []
+  serialize_ref(value, ref_list)
+  parents = [i for i in ref_list if not i.seen]
+  root = Element('root', children = parents)
+  for i in range(len(root)):
+    set_text(root, i, '\n  ')
+  set_text(root, len(root), '\n')
+  root.tail = '\n'
+  xml.etree.ElementTree.ElementTree(root).write(fout, encoding)
+  for i in root:
+    i.tail = None
+  for i in ref_list:
+    i.ref = -1
+    del i.attrib['ref']
+  i = 0
+  while i < len(parents):
+    for j in parents[i]:
+      j.seen = False
+      parents.append(j)
+    i += 1
+
+def deserialize(fin, factory = Element, encoding = 'unicode'):
+  root = xml.etree.ElementTree.parse(
+    fin,
+    xml.etree.ElementTree.XMLParser(
+      target = xml.etree.ElementTree.TreeBuilder(factory),
+      encoding = encoding
+    )
+  ).getroot()
+  assert root.tag == 'root'
+  for i in root:
+    i.tail = None
+  i = 0
+  parents = root[:]
+  ref_list = []
+  while i < len(parents):
+    j = parents[i]
+    if 'ref' in j.attrib:
+      ref = int(j.attrib['ref'])
+      del j.attrib['ref']
+      if len(ref_list) < ref + 1:
+        ref_list.extend([None] * (ref + 1 - len(ref_list)))
+      ref_list[ref] = j
+    parents.extend(j[:])
+    i += 1
+  for i in root:
+    i.deserialize(ref_list)
+  return ref_list[0]
+
+# compatibility scheme to access arbitrary xml.etree.ElementTree.Element-like
+# objects (not just Element defined above) using a more consistent interface:
+def get_text(root, i):
+  if i < 0:
+    i += len(root) + 1
+  text = root.text if i == 0 else root[i - 1].tail
+  return '' if text is None else text
+
+def set_text(root, i, text):
+  if i < 0:
+    i += len(root) + 1
+  if len(text) == 0:
+    text = None
+  if i == 0:
+    root.text = text
+  else:
+    root[i - 1].tail = text
+
+def to_end_relative(root, pos, off):
+  assert pos >= 0 and off >= 0
+  off -= len(get_text(root, pos))
+  pos -= len(root) + 1
+  return pos, off
+
+def to_start_relative(root, pos, off):
+  assert pos < 0 and off <= 0
+  pos += len(root) + 1
+  off += len(get_text(root, pos))
+  return pos, off
diff --git a/generate.py b/generate.py
new file mode 100755 (executable)
index 0000000..f9a633b
--- /dev/null
@@ -0,0 +1,500 @@
+#!/usr/bin/env python3
+
+import re
+import sys
+
+if len(sys.argv) >= 2:
+  package_name = '{0:s}.'.format(sys.argv[1])
+else:
+  package_name = ''
+
+default_value = {
+  'bool': 'False',
+  'int': '-1',
+  'ref': 'None',
+  'str': '\'\'',
+  'list(bool)': '[]',
+  'list(int)': '[]',
+  'list(ref)': '[]',
+  'list(str)': '[]',
+  'set(bool)': 'set()',
+  'set(int)': 'set()',
+  'set(ref)': 'set()',
+  'set(str)': 'set()'
+}
+default_value_str = {
+  'bool': 'false',
+  'int': '-1',
+  'ref': '-1',
+  'str': ''
+}
+
+re_class = re.compile(
+  '([\t ]*)class ([A-Za-z_][A-Za-z0-9_]*)\(([A-Za-z_][A-Za-z0-9_.]*)'
+)
+re_element = re.compile(
+  '([\t ]*)# GENERATE ELEMENT\((([^()]|\([^()]*\))*)\)( BEGIN)?'
+)
+re_factory = re.compile(
+  '([\t ]*)# GENERATE FACTORY\(([^()]*)\)( BEGIN)?'
+)
+stack = []
+classes = []
+base_classes = [{'element.Element': []}] # params
+
+line = sys.stdin.readline()
+while len(line):
+  match = re_class.match(line)
+  if match is not None:
+    sys.stdout.write(line)
+    indent = match.group(1)
+    class_name = match.group(2)
+    base_class = match.group(3)
+    while len(stack) and stack[-1][0][:len(indent)] == indent:
+      _, temp_class_name, _, _ = stack.pop()
+      for temp_base_class, temp_fields in base_classes.pop().items():
+        base_classes[-1][
+          '{0:s}.{1:s}'.format(temp_class_name, temp_base_class)
+        ] = temp_fields
+    for i in range(len(base_classes) - 1, -1, -1):
+      if base_class in base_classes[i]:
+        classes.append(
+          '.'.join([j for _, j, _, _ in stack] + [class_name])
+        )
+        full_base_class = '.'.join(
+          [j for _, j, _, _ in stack[:i]] + [base_class]
+        )
+        base_classes[-1][class_name] = list(base_classes[i][base_class])
+        break
+    else:
+      full_base_class = base_class
+    stack.append((indent, class_name, base_class, full_base_class))
+    base_classes.append({})
+  else:
+    match = re_element.match(line)
+    if match is not None:
+      indent = match.group(1)
+      params = match.group(2)
+      begin = match.group(4)
+
+      while len(stack) and stack[-1][0][:len(indent)] == indent:
+        _, temp_class_name, _, _ = stack.pop()
+        for temp_base_class, temp_fields in base_classes.pop().items():
+          base_classes[-1][
+            '{0:s}.{1:s}'.format(temp_class_name, temp_base_class)
+          ] = temp_fields
+      _, class_name, base_class, full_base_class = stack[-1]
+      fields = params.split(',')
+      if fields[-1] == '':
+        del fields[-1:]
+      fields = [i.split() for i in fields]
+      fields = [(type, name) for [type, name] in fields]
+      i = len(base_classes[-2][class_name])
+      base_classes[-2][class_name].extend(fields)
+
+      sys.stdout.write(
+        '''{0:s}# GENERATE ELEMENT({1:s}) BEGIN
+{2:s}def __init__(
+{3:s}  self,
+{4:s}  tag = '{5:s}',
+{6:s}  attrib = {{}},
+{7:s}  text = '',
+{8:s}  children = []{9:s}
+{10:s}):
+{11:s}  {12:s}.__init__(
+{13:s}    self,
+{14:s}    tag,
+{15:s}    attrib,
+{16:s}    text,
+{17:s}    children{18:s}
+{19:s}  )
+'''.format(
+          indent,
+          params,
+          indent,
+          indent,
+          indent,
+          '_'.join([i for _, i, _, _ in stack]),
+          indent,
+          indent,
+          indent,
+          ''.join(
+            [
+              ',\n{0:s}  {1:s} = {2:s}'.format(
+                indent,
+                name,
+                default_value[type]
+              )
+              for type, name in base_classes[-2][class_name]
+            ]
+          ),
+          indent,
+          indent,
+          full_base_class,
+          indent,
+          indent,
+          indent,
+          indent,
+          indent,
+          ''.join(
+            [
+              ',\n{0:s}    {1:s}'.format(
+                indent,
+                name
+              )
+              for type, name in base_classes[-2][class_name][:i]
+            ]
+          ),
+          indent
+        )
+      )
+      for type, name in fields:
+        if type == 'ref' or type == 'list(ref)' or type == 'set(ref)' or type == 'str':
+          sys.stdout.write(
+            '''{0:s}  self.{1:s} = {2:s}
+'''.format(indent, name, name)
+          )
+        elif type[:5] == 'list(' and type[-1:] == ')':
+          subtype = type[5:-1]
+          sys.stdout.write(
+            '''{0:s}  self.{1:s} = (
+{2:s}    [element.deserialize_{3:s}(i) for i in {4:s}.split()]
+{5:s}  if isinstance({6:s}, str) else
+{7:s}    {8:s}
+{9:s}  )
+'''.format(
+              indent,
+              name,
+              indent,
+              subtype,
+              name,
+              indent,
+              name,
+              indent,
+              name,
+              indent
+            )
+          )
+        elif type[:4] == 'set(' and type[-1:] == ')':
+          subtype = type[4:-1]
+          sys.stdout.write(
+            '''{0:s}  self.{1:s} = (
+{2:s}    set([element.deserialize_{3:s}(i) for i in {4:s}.split()])
+{5:s}  if isinstance({6:s}, str) else
+{7:s}    {8:s}
+{9:s}  )
+'''.format(
+              indent,
+              name,
+              indent,
+              subtype,
+              name,
+              indent,
+              name,
+              indent,
+              name,
+              indent
+            )
+          )
+        else:
+          sys.stdout.write(
+            '''{0:s}  self.{1:s} = (
+{2:s}    element.deserialize_{3:s}({4:s})
+{5:s}  if isinstance({6:s}, str) else
+{7:s}    {8:s}
+{9:s}  )
+'''.format(
+              indent,
+              name,
+              indent,
+              type,
+              name,
+              indent,
+              name,
+              indent,
+              name,
+              indent
+            )
+          )
+      if len(fields):
+        sys.stdout.write(
+          '''{0:s}def serialize(self, ref_list):
+{1:s}  {2:s}.serialize(self, ref_list)
+'''.format(indent, indent, full_base_class)
+        )
+        for type, name in fields:
+          if type[:5] == 'list(' and type[-1:] == ')':
+            subtype = type[5:-1]
+            sys.stdout.write(
+              '''{0:s}  self.set(
+{1:s}    '{2:s}',
+{3:s}    ' '.join([element.serialize_{4:s}(i{5:s}) for i in self.{6:s}])
+{7:s}  )
+'''.format(
+                indent,
+                indent,
+                name,
+                indent,
+                subtype,
+                ', ref_list' if subtype == 'ref' else '',
+                name,
+                indent
+              )
+            )
+          elif type[:4] == 'set(' and type[-1:] == ')':
+            subtype = type[4:-1]
+            sys.stdout.write(
+              '''{0:s}  self.set(
+{1:s}    '{2:s}',
+{3:s}    ' '.join([element.serialize_{4:s}(i{5:s}) for i in sorted(self.{6:s})])
+{7:s}  )
+'''.format(
+                indent,
+                indent,
+                name,
+                indent,
+                subtype,
+                ', ref_list' if subtype == 'ref' else '',
+                name,
+                indent
+              )
+            )
+          else:
+            sys.stdout.write(
+              '''{0:s}  self.set('{1:s}', element.serialize_{2:s}(self.{3:s}{4:s}))
+'''.format(
+                indent,
+                name,
+                type,
+                name,
+                ', ref_list' if type == 'ref' else ''
+              )
+            )
+        sys.stdout.write(
+          '''{0:s}def deserialize(self, ref_list):
+{1:s}  {2:s}.deserialize(self, ref_list)
+'''.format(indent, indent, full_base_class)
+        )
+        for type, name in fields:
+          if type[:5] == 'list(' and type[-1:] == ')':
+            subtype = type[5:-1]
+            sys.stdout.write(
+              '''{0:s}  self.{1:s} = [
+{2:s}    element.deserialize_{3:s}(i{4:s})
+{5:s}    for i in self.get('{6:s}', '').split()
+{7:s}  ]
+'''.format(
+                indent,
+                name,
+                indent,
+                subtype,
+                ', ref_list' if subtype == 'ref' else '',
+                indent,
+                name,
+                indent
+              )
+            )
+          elif type[:4] == 'set(' and type[-1:] == ')':
+            subtype = type[4:-1]
+            sys.stdout.write(
+              '''{0:s}  self.{1:s} = set(
+{2:s}    [
+{3:s}      element.deserialize_{4:s}(i{5:s})
+{6:s}      for i in self.get('{7:s}', '').split()
+{8:s}    ]
+{9:s}  )
+'''.format(
+                indent,
+                name,
+                indent,
+                indent,
+                subtype,
+                ', ref_list' if subtype == 'ref' else '',
+                indent,
+                name,
+                indent,
+                indent
+              )
+            )
+          else: 
+            sys.stdout.write(
+              '''{0:s}  self.{1:s} = element.deserialize_{2:s}(self.get('{3:s}', '{4:s}'){5:s})
+'''.format(
+                indent,
+                name,
+                type,
+                name,
+                default_value_str[type],
+                ', ref_list' if type == 'ref' else ''
+              )
+            )
+      sys.stdout.write(
+        '''{0:s}def copy(self, factory = None):
+{1:s}  result = {2:s}.copy(
+{3:s}    self,
+{4:s}    {5:s} if factory is None else factory
+{6:s}  ){7:s}
+{8:s}  return result
+'''.format(
+          indent,
+          indent,
+          full_base_class,
+          indent,
+          indent,
+          class_name,
+          indent,
+          ''.join(
+            [
+              '\n{0:s}  result.{1:s} = self.{2:s}'.format(
+                indent,
+                name,
+                name
+              )
+              for _, name in fields
+            ]
+          ),
+          indent
+        )
+      )
+      if len(fields):
+        sys.stdout.write(
+          '''{0:s}def repr_serialize(self, params):
+{1:s}  {2:s}.repr_serialize(self, params)
+'''.format(
+            indent,
+            indent,
+            full_base_class
+          )
+        )
+        for type, name in fields:
+          if type[:5] == 'list(' and type[-1:] == ')':
+            subtype = type[5:-1]
+            sys.stdout.write(
+              '''{0:s}  if len(self.{1:s}):
+{2:s}    params.append(
+{3:s}      '{4:s} = [{{0:s}}]'.format(
+{5:s}        ', '.join([repr(i) for i in self.{6:s}])
+{7:s}      )
+{8:s}    )
+'''.format(
+                indent,
+                name,
+                indent,
+                indent,
+                name,
+                indent,
+                name,
+                indent,
+                indent
+              )
+            )
+          elif type[:4] == 'set(' and type[-1:] == ')':
+            subtype = type[4:-1]
+            sys.stdout.write(
+              '''{0:s}  if len(self.{1:s}):
+{2:s}    params.append(
+{3:s}      '{4:s} = set([{{0:s}}])'.format(
+{5:s}        ', '.join([repr(i) for i in sorted(self.{6:s})])
+{7:s}      )
+{8:s}    )
+'''.format(
+                indent,
+                name,
+                indent,
+                indent,
+                name,
+                indent,
+                name,
+                indent,
+                indent
+              )
+            )
+          else:
+            sys.stdout.write(
+              '''{0:s}  if self.{1:s} != {2:s}:
+{3:s}    params.append(
+{4:s}      '{5:s} = {{0:s}}'.format(repr(self.{6:s}))
+{7:s}    )
+'''.format(
+                indent,
+                name,
+                default_value[type],
+                indent,
+                indent,
+                name,
+                name,
+                indent
+              )
+            )
+      sys.stdout.write(
+        '''{0:s}def __repr__(self):
+{1:s}  params = []
+{2:s}  self.repr_serialize(params)
+{3:s}  return '{4:s}{5:s}({{0:s}})'.format(', '.join(params))
+{6:s}# GENERATE END
+'''.format(
+          indent,
+          indent,
+          indent,
+          indent,
+          package_name,
+          '.'.join([i for _, i, _, _ in stack]),
+          indent
+        )
+      )
+      if begin is not None:
+        line = sys.stdin.readline()
+        while len(line):
+          if line.strip() == '# GENERATE END':
+            break
+          line = sys.stdin.readline()
+        else:
+          assert False
+    else:
+      match = re_factory.match(line)
+      if match is not None:
+        indent = match.group(1)
+        param = match.group(2)
+        begin = match.group(3)
+
+        sys.stdout.write(
+          '''{0:s}# GENERATE FACTORY({1:s}) BEGIN
+{2:s}tag_to_class = {{{3:s}
+{4:s}}}
+{5:s}def factory(tag, attrib = {{}}, *args, **kwargs):
+{6:s}  return tag_to_class.get(tag, {7:s})(tag, attrib, *args, **kwargs)
+{8:s}# GENERATE END
+'''.format(
+            indent,
+            param,
+            indent,
+            ','.join(
+              [
+                '\n{0:s}  \'{1:s}\': {2:s}'.format(
+                  indent,
+                  i.replace('.', '_'),
+                  i
+                )
+                for i in classes
+              ]
+            ),
+            indent,
+            indent,
+            indent,
+            param,
+            indent
+          )
+        )
+
+        if begin is not None:
+          line = sys.stdin.readline()
+          while len(line):
+            if line.strip() == '# GENERATE END':
+              break
+            line = sys.stdin.readline()
+          else:
+            assert False
+      else:
+        sys.stdout.write(line)
+  line = sys.stdin.readline()
diff --git a/grammar.py b/grammar.py
new file mode 100644 (file)
index 0000000..81d30ef
--- /dev/null
@@ -0,0 +1,555 @@
+import bisect
+import bisect_set
+import element
+import lr1
+import sys
+
+# defines the alphabet size, set this to 0x11000 for unicode
+n_characters = 0x100
+
+class Grammar(element.Element):
+  class Production(element.Element):
+    class Item(element.Element):
+      # GENERATE ELEMENT() BEGIN
+      def __init__(
+        self,
+        tag = 'Grammar_Production_Item',
+        attrib = {},
+        text = '',
+        children = []
+      ):
+        element.Element.__init__(
+          self,
+          tag,
+          attrib,
+          text,
+          children
+        )
+      def copy(self, factory = None):
+        result = element.Element.copy(
+          self,
+          Item if factory is None else factory
+        )
+        return result
+      def __repr__(self):
+        params = []
+        self.repr_serialize(params)
+        return 'grammar.Grammar.Production.Item({0:s})'.format(', '.join(params))
+      # GENERATE END
+      def post_process(self, name_to_character_sets, group_index):
+        raise NotImplementedException
+      def add_to_groups(self, groups):
+        raise NotImplementedException
+      def add_to_lr1_symbols(self, symbols, group_bounds):
+        raise NotImplementedException
+
+    class Group(Item):
+      class Attribute(element.Element):
+        # GENERATE ELEMENT(str name, str value) BEGIN
+        def __init__(
+          self,
+          tag = 'Grammar_Production_Group_Attribute',
+          attrib = {},
+          text = '',
+          children = [],
+          name = '',
+          value = ''
+        ):
+          element.Element.__init__(
+            self,
+            tag,
+            attrib,
+            text,
+            children
+          )
+          self.name = name
+          self.value = value
+        def serialize(self, ref_list):
+          element.Element.serialize(self, ref_list)
+          self.set('name', element.serialize_str(self.name))
+          self.set('value', element.serialize_str(self.value))
+        def deserialize(self, ref_list):
+          element.Element.deserialize(self, ref_list)
+          self.name = element.deserialize_str(self.get('name', ''))
+          self.value = element.deserialize_str(self.get('value', ''))
+        def copy(self, factory = None):
+          result = element.Element.copy(
+            self,
+            Attribute if factory is None else factory
+          )
+          result.name = self.name
+          result.value = self.value
+          return result
+        def repr_serialize(self, params):
+          element.Element.repr_serialize(self, params)
+          if self.name != '':
+            params.append(
+              'name = {0:s}'.format(repr(self.name))
+            )
+          if self.value != '':
+            params.append(
+              'value = {0:s}'.format(repr(self.value))
+            )
+        def __repr__(self):
+          params = []
+          self.repr_serialize(params)
+          return 'grammar.Grammar.Production.Group.Attribute({0:s})'.format(', '.join(params))
+        # GENERATE END
+
+      # GENERATE ELEMENT(int index, str name, list(ref) attributes) BEGIN
+      def __init__(
+        self,
+        tag = 'Grammar_Production_Group',
+        attrib = {},
+        text = '',
+        children = [],
+        index = -1,
+        name = '',
+        attributes = []
+      ):
+        Grammar.Production.Item.__init__(
+          self,
+          tag,
+          attrib,
+          text,
+          children
+        )
+        self.index = (
+          element.deserialize_int(index)
+        if isinstance(index, str) else
+          index
+        )
+        self.name = name
+        self.attributes = attributes
+      def serialize(self, ref_list):
+        Grammar.Production.Item.serialize(self, ref_list)
+        self.set('index', element.serialize_int(self.index))
+        self.set('name', element.serialize_str(self.name))
+        self.set(
+          'attributes',
+          ' '.join([element.serialize_ref(i, ref_list) for i in self.attributes])
+        )
+      def deserialize(self, ref_list):
+        Grammar.Production.Item.deserialize(self, ref_list)
+        self.index = element.deserialize_int(self.get('index', '-1'))
+        self.name = element.deserialize_str(self.get('name', ''))
+        self.attributes = [
+          element.deserialize_ref(i, ref_list)
+          for i in self.get('attributes', '').split()
+        ]
+      def copy(self, factory = None):
+        result = Grammar.Production.Item.copy(
+          self,
+          Group if factory is None else factory
+        )
+        result.index = self.index
+        result.name = self.name
+        result.attributes = self.attributes
+        return result
+      def repr_serialize(self, params):
+        Grammar.Production.Item.repr_serialize(self, params)
+        if self.index != -1:
+          params.append(
+            'index = {0:s}'.format(repr(self.index))
+          )
+        if self.name != '':
+          params.append(
+            'name = {0:s}'.format(repr(self.name))
+          )
+        if len(self.attributes):
+          params.append(
+            'attributes = [{0:s}]'.format(
+              ', '.join([repr(i) for i in self.attributes])
+            )
+          )
+      def __repr__(self):
+        params = []
+        self.repr_serialize(params)
+        return 'grammar.Grammar.Production.Group({0:s})'.format(', '.join(params))
+      # GENERATE END
+      def post_process(self, name_to_character_sets, group_index):
+        self.index = group_index
+        group_index += 1
+        for i in self:
+          group_index = i.post_process(name_to_character_sets, group_index)
+        return group_index
+      def add_to_groups(self, groups):
+        assert len(groups) == self.index
+        groups.append(
+          (self.name, {i.name: i.value for i in self.attributes})
+        )
+        for i in self:
+          i.add_to_groups(groups)
+      def add_to_lr1_symbols(self, symbols, group_bounds):
+        group_start = len(symbols)
+        assert len(group_bounds) == self.index
+        group_bounds.append(None)
+        group_count = 0
+        for i in self:
+          group_count += (
+            i.add_to_lr1_symbols(symbols, group_bounds)
+          )
+        group_bounds[self.index] = (
+          group_start,
+          group_count,
+          self.name,
+          {i.name: i.value for i in self.attributes}
+        )
+        return 1 # count of groups or ungrouped characters
+
+    class Symbol(element.Element):
+      # GENERATE ELEMENT(list(int) terminal_set, list(int) nonterminal_set) BEGIN
+      def __init__(
+        self,
+        tag = 'Grammar_Production_Symbol',
+        attrib = {},
+        text = '',
+        children = [],
+        terminal_set = [],
+        nonterminal_set = []
+      ):
+        element.Element.__init__(
+          self,
+          tag,
+          attrib,
+          text,
+          children
+        )
+        self.terminal_set = (
+          [element.deserialize_int(i) for i in terminal_set.split()]
+        if isinstance(terminal_set, str) else
+          terminal_set
+        )
+        self.nonterminal_set = (
+          [element.deserialize_int(i) for i in nonterminal_set.split()]
+        if isinstance(nonterminal_set, str) else
+          nonterminal_set
+        )
+      def serialize(self, ref_list):
+        element.Element.serialize(self, ref_list)
+        self.set(
+          'terminal_set',
+          ' '.join([element.serialize_int(i) for i in self.terminal_set])
+        )
+        self.set(
+          'nonterminal_set',
+          ' '.join([element.serialize_int(i) for i in self.nonterminal_set])
+        )
+      def deserialize(self, ref_list):
+        element.Element.deserialize(self, ref_list)
+        self.terminal_set = [
+          element.deserialize_int(i)
+          for i in self.get('terminal_set', '').split()
+        ]
+        self.nonterminal_set = [
+          element.deserialize_int(i)
+          for i in self.get('nonterminal_set', '').split()
+        ]
+      def copy(self, factory = None):
+        result = element.Element.copy(
+          self,
+          Symbol if factory is None else factory
+        )
+        result.terminal_set = self.terminal_set
+        result.nonterminal_set = self.nonterminal_set
+        return result
+      def repr_serialize(self, params):
+        element.Element.repr_serialize(self, params)
+        if len(self.terminal_set):
+          params.append(
+            'terminal_set = [{0:s}]'.format(
+              ', '.join([repr(i) for i in self.terminal_set])
+            )
+          )
+        if len(self.nonterminal_set):
+          params.append(
+            'nonterminal_set = [{0:s}]'.format(
+              ', '.join([repr(i) for i in self.nonterminal_set])
+            )
+          )
+      def __repr__(self):
+        params = []
+        self.repr_serialize(params)
+        return 'grammar.Grammar.Production.Symbol({0:s})'.format(', '.join(params))
+      # GENERATE END
+      def post_process(self, name_to_character_sets, group_index):
+        return group_index
+      def add_to_groups(self, groups):
+        pass
+      def add_to_lr1_symbols(self, symbols, group_bounds):
+        symbols.append((self.terminal_set, self.nonterminal_set))
+        return 1 # count of groups or ungrouped characters
+
+    class NamedSymbol(Symbol):
+      # GENERATE ELEMENT(str name) BEGIN
+      def __init__(
+        self,
+        tag = 'Grammar_Production_NamedSymbol',
+        attrib = {},
+        text = '',
+        children = [],
+        terminal_set = [],
+        nonterminal_set = [],
+        name = ''
+      ):
+        Grammar.Production.Symbol.__init__(
+          self,
+          tag,
+          attrib,
+          text,
+          children,
+          terminal_set,
+          nonterminal_set
+        )
+        self.name = name
+      def serialize(self, ref_list):
+        Grammar.Production.Symbol.serialize(self, ref_list)
+        self.set('name', element.serialize_str(self.name))
+      def deserialize(self, ref_list):
+        Grammar.Production.Symbol.deserialize(self, ref_list)
+        self.name = element.deserialize_str(self.get('name', ''))
+      def copy(self, factory = None):
+        result = Grammar.Production.Symbol.copy(
+          self,
+          NamedSymbol if factory is None else factory
+        )
+        result.name = self.name
+        return result
+      def repr_serialize(self, params):
+        Grammar.Production.Symbol.repr_serialize(self, params)
+        if self.name != '':
+          params.append(
+            'name = {0:s}'.format(repr(self.name))
+          )
+      def __repr__(self):
+        params = []
+        self.repr_serialize(params)
+        return 'grammar.Grammar.Production.NamedSymbol({0:s})'.format(', '.join(params))
+      # GENERATE END
+      def post_process(self, name_to_character_sets, group_index):
+        self.terminal_set, self.nonterminal_set = (
+          name_to_character_sets[self.name]
+        )
+        return group_index
+
+    # GENERATE ELEMENT(int lhs_nonterminal, int precedence) BEGIN
+    def __init__(
+      self,
+      tag = 'Grammar_Production',
+      attrib = {},
+      text = '',
+      children = [],
+      lhs_nonterminal = -1,
+      precedence = -1
+    ):
+      element.Element.__init__(
+        self,
+        tag,
+        attrib,
+        text,
+        children
+      )
+      self.lhs_nonterminal = (
+        element.deserialize_int(lhs_nonterminal)
+      if isinstance(lhs_nonterminal, str) else
+        lhs_nonterminal
+      )
+      self.precedence = (
+        element.deserialize_int(precedence)
+      if isinstance(precedence, str) else
+        precedence
+      )
+    def serialize(self, ref_list):
+      element.Element.serialize(self, ref_list)
+      self.set('lhs_nonterminal', element.serialize_int(self.lhs_nonterminal))
+      self.set('precedence', element.serialize_int(self.precedence))
+    def deserialize(self, ref_list):
+      element.Element.deserialize(self, ref_list)
+      self.lhs_nonterminal = element.deserialize_int(self.get('lhs_nonterminal', '-1'))
+      self.precedence = element.deserialize_int(self.get('precedence', '-1'))
+    def copy(self, factory = None):
+      result = element.Element.copy(
+        self,
+        Production if factory is None else factory
+      )
+      result.lhs_nonterminal = self.lhs_nonterminal
+      result.precedence = self.precedence
+      return result
+    def repr_serialize(self, params):
+      element.Element.repr_serialize(self, params)
+      if self.lhs_nonterminal != -1:
+        params.append(
+          'lhs_nonterminal = {0:s}'.format(repr(self.lhs_nonterminal))
+        )
+      if self.precedence != -1:
+        params.append(
+          'precedence = {0:s}'.format(repr(self.precedence))
+        )
+    def __repr__(self):
+      params = []
+      self.repr_serialize(params)
+      return 'grammar.Grammar.Production({0:s})'.format(', '.join(params))
+    # GENERATE END
+    def post_process(self, lhs_nonterminal, name_to_character_sets):
+      self.lhs_nonterminal = lhs_nonterminal
+      group_index = 0
+      for i in self:
+        group_index = i.post_process(name_to_character_sets, group_index)
+    def add_to_lr1(self, _lr1):
+      symbols = []
+      group_bounds = []
+      for i in self:
+        i.add_to_lr1_symbols(symbols, group_bounds)
+      _lr1.productions.append(
+        (
+          # symbols
+          symbols,
+          # lookaheads (list of initial_set, can_be_empty)
+          [([], False) for i in range(len(symbols))] + [([], True)],
+          # group_bounds
+          group_bounds
+        )
+      )
+
+  # GENERATE ELEMENT(list(int) associativities, int n_terminals, int eof_terminal) BEGIN
+  def __init__(
+    self,
+    tag = 'Grammar',
+    attrib = {},
+    text = '',
+    children = [],
+    associativities = [],
+    n_terminals = -1,
+    eof_terminal = -1
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+    self.associativities = (
+      [element.deserialize_int(i) for i in associativities.split()]
+    if isinstance(associativities, str) else
+      associativities
+    )
+    self.n_terminals = (
+      element.deserialize_int(n_terminals)
+    if isinstance(n_terminals, str) else
+      n_terminals
+    )
+    self.eof_terminal = (
+      element.deserialize_int(eof_terminal)
+    if isinstance(eof_terminal, str) else
+      eof_terminal
+    )
+  def serialize(self, ref_list):
+    element.Element.serialize(self, ref_list)
+    self.set(
+      'associativities',
+      ' '.join([element.serialize_int(i) for i in self.associativities])
+    )
+    self.set('n_terminals', element.serialize_int(self.n_terminals))
+    self.set('eof_terminal', element.serialize_int(self.eof_terminal))
+  def deserialize(self, ref_list):
+    element.Element.deserialize(self, ref_list)
+    self.associativities = [
+      element.deserialize_int(i)
+      for i in self.get('associativities', '').split()
+    ]
+    self.n_terminals = element.deserialize_int(self.get('n_terminals', '-1'))
+    self.eof_terminal = element.deserialize_int(self.get('eof_terminal', '-1'))
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      Grammar if factory is None else factory
+    )
+    result.associativities = self.associativities
+    result.n_terminals = self.n_terminals
+    result.eof_terminal = self.eof_terminal
+    return result
+  def repr_serialize(self, params):
+    element.Element.repr_serialize(self, params)
+    if len(self.associativities):
+      params.append(
+        'associativities = [{0:s}]'.format(
+          ', '.join([repr(i) for i in self.associativities])
+        )
+      )
+    if self.n_terminals != -1:
+      params.append(
+        'n_terminals = {0:s}'.format(repr(self.n_terminals))
+      )
+    if self.eof_terminal != -1:
+      params.append(
+        'eof_terminal = {0:s}'.format(repr(self.eof_terminal))
+      )
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'grammar.Grammar({0:s})'.format(', '.join(params))
+  # GENERATE END
+  def post_process(self, name_to_character_sets):
+    for i in range(len(self)):
+      self[i].post_process(i, name_to_character_sets)
+  def to_lr1(self):
+    _lr1 = lr1.LR1(
+      # productions
+      [],
+      # precedences
+      ([self.n_terminals], [-1], [1 + len(self)], [-1]),
+      # associativities
+      self.associativities,
+      # n_terminals
+      self.n_terminals,
+      # eof_terminal
+      self.eof_terminal)
+
+    # compute productions and (eventually) nonterminals precedence table
+    for i in self:
+      i.add_to_lr1(_lr1)
+
+    # propagate lookaheads
+    modified = True
+    while modified:
+      modified = False
+      for symbols, lookaheads, _ in _lr1.productions:
+        for i in range(len(symbols) - 1, -1, -1):
+          initial_set, nonterminal_set = symbols[i]
+          can_be_empty = False
+          for j in range(0, len(nonterminal_set), 2):
+            for k in range(nonterminal_set[j], nonterminal_set[j + 1]):
+              child_initial_set, child_can_be_empty = _lr1.productions[k][1][0]
+              initial_set = bisect_set.bisect_set_or(
+                initial_set,
+                child_initial_set
+              )
+              can_be_empty = can_be_empty or child_can_be_empty
+          # at this point can_be_empty refers to current symbol only
+          if can_be_empty:
+            next_initial_set, can_be_empty = lookaheads[i + 1]
+            initial_set = bisect_set.bisect_set_or(
+              initial_set,
+              next_initial_set
+            )
+          # at this point can_be_empty refers to all remaining symbols
+          if (initial_set, can_be_empty) != lookaheads[i]:
+            lookaheads[i] = (initial_set, can_be_empty)
+            modified = True
+
+    return _lr1
+
+# GENERATE FACTORY(element.Element) BEGIN
+tag_to_class = {
+  'Grammar': Grammar,
+  'Grammar_Production': Grammar.Production,
+  'Grammar_Production_Item': Grammar.Production.Item,
+  'Grammar_Production_Group': Grammar.Production.Group,
+  'Grammar_Production_Group_Attribute': Grammar.Production.Group.Attribute,
+  'Grammar_Production_Symbol': Grammar.Production.Symbol,
+  'Grammar_Production_NamedSymbol': Grammar.Production.NamedSymbol
+}
+def factory(tag, attrib = {}, *args, **kwargs):
+  return tag_to_class.get(tag, element.Element)(tag, attrib, *args, **kwargs)
+# GENERATE END
diff --git a/grammar.sh b/grammar.sh
new file mode 100755 (executable)
index 0000000..67d4650
--- /dev/null
@@ -0,0 +1,7 @@
+#!/bin/sh
+if ./generate.py grammar <grammar.py >grammar.py.new && ! diff -q grammar.py grammar.py.new
+then
+  mv grammar.py.new grammar.py
+else
+  rm -f grammar.py.new
+fi
diff --git a/l_to_python.py b/l_to_python.py
new file mode 100755 (executable)
index 0000000..aed1b29
--- /dev/null
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+
+import c_to_python
+import element
+import os
+import sys
+import xml.etree.ElementTree
+
+root = xml.etree.ElementTree.parse(
+  sys.stdin,
+  xml.etree.ElementTree.XMLParser(
+    target = xml.etree.ElementTree.TreeBuilder(element.Element),
+    encoding = 'unicode'
+  )
+).getroot()
+def transform(i):
+  if (
+    i.tag == 'PLex_CodeBlock' or
+    (i.tag == 'PLex_Section2_Rule_Action' and len(i) != 0)
+  ):
+    assert i[0].tag == 'PLex_Text'
+    text = c_to_python.extract(i[0])
+
+    with open('a.c', 'w') as fout:
+      fout.write(text)
+    os.system('gcc -E a.c >a.i')
+  
+    lines = []
+    with open('a.i') as fin:
+      line = fin.readline()
+      while len(line):
+        if (
+          line[0] != '#' and
+          not (line == '\n' and (len(lines) == 0 or lines[-1] == '\n'))
+        ):
+          lines.append(line)
+        line = fin.readline()
+    if len(lines) and lines[-1] == '\n':
+      lines.pop()
+    text = ''.join(lines)
+
+    text = c_to_python.c_to_python(text)
+    if text[-1:] != '\n':
+      text = text + '\n' # force at least one line
+      
+    i[0] = element.Element(
+      'PLex_Text',
+      text = text
+    )
+  else:
+    for j in i:
+      transform(j)
+transform(root)
+xml.etree.ElementTree.ElementTree(root).write(
+  sys.stdout,
+  encoding = 'unicode' # strangely does not seem to default to this
+)
diff --git a/lex.yy.c b/lex.yy.c
new file mode 100644 (file)
index 0000000..47055b4
--- /dev/null
+++ b/lex.yy.c
@@ -0,0 +1,5509 @@
+
+#line 2 "lex.yy.c"
+
+#define  YY_INT_ALIGNED short int
+
+/* A lexical scanner generated by flex */
+
+#define FLEX_SCANNER
+#define YY_FLEX_MAJOR_VERSION 2
+#define YY_FLEX_MINOR_VERSION 6
+#define YY_FLEX_SUBMINOR_VERSION 4
+#if YY_FLEX_SUBMINOR_VERSION > 0
+#define FLEX_BETA
+#endif
+
+/* First, we deal with  platform-specific or compiler-specific issues. */
+
+/* begin standard C headers. */
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+#include <stdlib.h>
+
+/* end standard C headers. */
+
+/* flex integer type definitions */
+
+#ifndef FLEXINT_H
+#define FLEXINT_H
+
+/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */
+
+#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
+
+/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,
+ * if you want the limit (max/min) macros for int types. 
+ */
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS 1
+#endif
+
+#include <inttypes.h>
+typedef int8_t flex_int8_t;
+typedef uint8_t flex_uint8_t;
+typedef int16_t flex_int16_t;
+typedef uint16_t flex_uint16_t;
+typedef int32_t flex_int32_t;
+typedef uint32_t flex_uint32_t;
+#else
+typedef signed char flex_int8_t;
+typedef short int flex_int16_t;
+typedef int flex_int32_t;
+typedef unsigned char flex_uint8_t; 
+typedef unsigned short int flex_uint16_t;
+typedef unsigned int flex_uint32_t;
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN               (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN              (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN              (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX               (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX              (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX              (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX              (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX             (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX             (4294967295U)
+#endif
+
+#ifndef SIZE_MAX
+#define SIZE_MAX               (~(size_t)0)
+#endif
+
+#endif /* ! C99 */
+
+#endif /* ! FLEXINT_H */
+
+/* begin standard C++ headers. */
+
+/* TODO: this is always defined, so inline it */
+#define yyconst const
+
+#if defined(__GNUC__) && __GNUC__ >= 3
+#define yynoreturn __attribute__((__noreturn__))
+#else
+#define yynoreturn
+#endif
+
+/* Returned upon end-of-file. */
+#define YY_NULL 0
+
+/* Promotes a possibly negative, possibly signed char to an
+ *   integer in range [0..255] for use as an array index.
+ */
+#define YY_SC_TO_UI(c) ((YY_CHAR) (c))
+
+/* Enter a start condition.  This macro really ought to take a parameter,
+ * but we do it the disgusting crufty way forced on us by the ()-less
+ * definition of BEGIN.
+ */
+#define BEGIN (yy_start) = 1 + 2 *
+/* Translate the current start state into a value that can be later handed
+ * to BEGIN to return to the state.  The YYSTATE alias is for lex
+ * compatibility.
+ */
+#define YY_START (((yy_start) - 1) / 2)
+#define YYSTATE YY_START
+/* Action number for EOF rule of a given start state. */
+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)
+/* Special action meaning "start processing a new file". */
+#define YY_NEW_FILE yyrestart( yyin  )
+#define YY_END_OF_BUFFER_CHAR 0
+
+/* Size of default input buffer. */
+#ifndef YY_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k.
+ * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+ * Ditto for the __ia64__ case accordingly.
+ */
+#define YY_BUF_SIZE 32768
+#else
+#define YY_BUF_SIZE 16384
+#endif /* __ia64__ */
+#endif
+
+/* The state buf must be large enough to hold one state per character in the main buffer.
+ */
+#define YY_STATE_BUF_SIZE   ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))
+
+#ifndef YY_TYPEDEF_YY_BUFFER_STATE
+#define YY_TYPEDEF_YY_BUFFER_STATE
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+#endif
+
+#ifndef YY_TYPEDEF_YY_SIZE_T
+#define YY_TYPEDEF_YY_SIZE_T
+typedef size_t yy_size_t;
+#endif
+
+extern int yyleng;
+
+extern FILE *yyin, *yyout;
+
+#define EOB_ACT_CONTINUE_SCAN 0
+#define EOB_ACT_END_OF_FILE 1
+#define EOB_ACT_LAST_MATCH 2
+    
+    #define YY_LESS_LINENO(n)
+    #define YY_LINENO_REWIND_TO(ptr)
+    
+/* Return all but the first "n" matched characters back to the input stream. */
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+               *yy_cp = (yy_hold_char); \
+               YY_RESTORE_YY_MORE_OFFSET \
+               (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
+               YY_DO_BEFORE_ACTION; /* set up yytext again */ \
+               } \
+       while ( 0 )
+#define unput(c) yyunput( c, (yytext_ptr)  )
+
+#ifndef YY_STRUCT_YY_BUFFER_STATE
+#define YY_STRUCT_YY_BUFFER_STATE
+struct yy_buffer_state
+       {
+       FILE *yy_input_file;
+
+       char *yy_ch_buf;                /* input buffer */
+       char *yy_buf_pos;               /* current position in input buffer */
+
+       /* Size of input buffer in bytes, not including room for EOB
+        * characters.
+        */
+       int yy_buf_size;
+
+       /* Number of characters read into yy_ch_buf, not including EOB
+        * characters.
+        */
+       int yy_n_chars;
+
+       /* Whether we "own" the buffer - i.e., we know we created it,
+        * and can realloc() it to grow it, and should free() it to
+        * delete it.
+        */
+       int yy_is_our_buffer;
+
+       /* Whether this is an "interactive" input source; if so, and
+        * if we're using stdio for input, then we want to use getc()
+        * instead of fread(), to make sure we stop fetching input after
+        * each newline.
+        */
+       int yy_is_interactive;
+
+       /* Whether we're considered to be at the beginning of a line.
+        * If so, '^' rules will be active on the next match, otherwise
+        * not.
+        */
+       int yy_at_bol;
+
+    int yy_bs_lineno; /**< The line count. */
+    int yy_bs_column; /**< The column count. */
+
+       /* Whether to try to fill the input buffer when we reach the
+        * end of it.
+        */
+       int yy_fill_buffer;
+
+       int yy_buffer_status;
+
+#define YY_BUFFER_NEW 0
+#define YY_BUFFER_NORMAL 1
+       /* When an EOF's been seen but there's still some text to process
+        * then we mark the buffer as YY_EOF_PENDING, to indicate that we
+        * shouldn't try reading from the input source any more.  We might
+        * still have a bunch of tokens to match, though, because of
+        * possible backing-up.
+        *
+        * When we actually see the EOF, we change the status to "new"
+        * (via yyrestart()), so that the user can continue scanning by
+        * just pointing yyin at a new input file.
+        */
+#define YY_BUFFER_EOF_PENDING 2
+
+       };
+#endif /* !YY_STRUCT_YY_BUFFER_STATE */
+
+/* Stack of input buffers. */
+static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */
+static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */
+static YY_BUFFER_STATE * yy_buffer_stack = NULL; /**< Stack as an array. */
+
+/* We provide macros for accessing buffer states in case in the
+ * future we want to put the buffer states in a more general
+ * "scanner state".
+ *
+ * Returns the top of the stack, or NULL.
+ */
+#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \
+                          ? (yy_buffer_stack)[(yy_buffer_stack_top)] \
+                          : NULL)
+/* Same as previous macro, but useful when we know that the buffer stack is not
+ * NULL or when we need an lvalue. For internal use only.
+ */
+#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)]
+
+/* yy_hold_char holds the character lost when yytext is formed. */
+static char yy_hold_char;
+static int yy_n_chars;         /* number of characters read into yy_ch_buf */
+int yyleng;
+
+/* Points to current character in buffer. */
+static char *yy_c_buf_p = NULL;
+static int yy_init = 0;                /* whether we need to initialize */
+static int yy_start = 0;       /* start state number */
+
+/* Flag which is used to allow yywrap()'s to do buffer switches
+ * instead of setting up a fresh yyin.  A bit of a hack ...
+ */
+static int yy_did_buffer_switch_on_eof;
+
+void yyrestart ( FILE *input_file  );
+void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer  );
+YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size  );
+void yy_delete_buffer ( YY_BUFFER_STATE b  );
+void yy_flush_buffer ( YY_BUFFER_STATE b  );
+void yypush_buffer_state ( YY_BUFFER_STATE new_buffer  );
+void yypop_buffer_state ( void );
+
+static void yyensure_buffer_stack ( void );
+static void yy_load_buffer_state ( void );
+static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file  );
+#define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER )
+
+YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size  );
+YY_BUFFER_STATE yy_scan_string ( const char *yy_str  );
+YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len  );
+
+void *yyalloc ( yy_size_t  );
+void *yyrealloc ( void *, yy_size_t  );
+void yyfree ( void *  );
+
+#define yy_new_buffer yy_create_buffer
+#define yy_set_interactive(is_interactive) \
+       { \
+       if ( ! YY_CURRENT_BUFFER ){ \
+        yyensure_buffer_stack (); \
+               YY_CURRENT_BUFFER_LVALUE =    \
+            yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       } \
+       YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
+       }
+#define yy_set_bol(at_bol) \
+       { \
+       if ( ! YY_CURRENT_BUFFER ){\
+        yyensure_buffer_stack (); \
+               YY_CURRENT_BUFFER_LVALUE =    \
+            yy_create_buffer( yyin, YY_BUF_SIZE ); \
+       } \
+       YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
+       }
+#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)
+
+/* Begin user sect3 */
+typedef flex_uint8_t YY_CHAR;
+
+FILE *yyin = NULL, *yyout = NULL;
+
+typedef int yy_state_type;
+
+extern int yylineno;
+int yylineno = 1;
+
+extern char *yytext;
+#ifdef yytext_ptr
+#undef yytext_ptr
+#endif
+#define yytext_ptr yytext
+
+static yy_state_type yy_get_previous_state ( void );
+static yy_state_type yy_try_NUL_trans ( yy_state_type current_state  );
+static int yy_get_next_buffer ( void );
+static void yynoreturn yy_fatal_error ( const char* msg  );
+
+/* Done after the current pattern has been matched and before the
+ * corresponding action - sets up yytext.
+ */
+#define YY_DO_BEFORE_ACTION \
+       (yytext_ptr) = yy_bp; \
+       yyleng = (int) (yy_cp - yy_bp); \
+       (yy_hold_char) = *yy_cp; \
+       *yy_cp = '\0'; \
+       (yy_c_buf_p) = yy_cp;
+#define YY_NUM_RULES 253
+#define YY_END_OF_BUFFER 254
+/* This struct is not used in this scanner,
+   but its presence is necessary. */
+struct yy_trans_info
+       {
+       flex_int32_t yy_verify;
+       flex_int32_t yy_nxt;
+       };
+static const flex_int16_t yy_accept[1114] =
+    {   0,
+        0,    0,    0,    0,    0,    0,  246,  246,   40,   40,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,   21,   21,
+      239,  239,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,   21,   21,
+      250,  250,  239,  239,  254,  252,    9,   20,  252,   18,
+        1,   19,  252,  252,  252,  252,   17,  163,  148,  149,
+      163,  141,  163,  160,  161,  162,  162,  163,  163,  163,
+      162,  147,  137,  163,  163,  139,  140,  135,  136,  135,
+      134,  133,  134,  246,  247,  247,   40,   42,   40,   41,
+
+       40,   40,   41,   41,   41,   50,   49,   51,  252,  169,
+      169,  164,  169,  165,  166,  168,  170,  218,  219,  218,
+      216,  215,  217,  171,  173,  171,  172,  171,  185,  185,
+      185,  185,  187,  189,  187,  187,  187,  187,  188,  228,
+      233,  228,  232,  231,  234,  229,  229,  229,  234,  234,
+      226,  227,  252,  130,  252,   21,   23,   21,   22,   22,
+       22,  235,  241,  235,  236,  242,  242,  242,  224,  224,
+      225,  224,  224,  224,  224,  224,  224,  224,  129,   53,
+       52,  129,  129,  129,  129,   54,  129,  129,  129,  129,
+      129,  129,  129,  129,  129,  129,  129,  129,  129,  129,
+
+      129,  129,  129,  129,  129,  129,  129,   36,   33,   36,
+       34,   48,   45,  252,   48,   48,   44,   43,  175,  174,
+      176,  177,  178,  179,  180,  181,  182,   31,   32,   31,
+       30,   28,   29,   28,   27,   22,  250,  251,  251,  237,
+      237,  238,    9,   20,    0,   18,    1,   19,    0,    0,
+        0,   16,   10,    0,    0,    0,    0,    4,   16,    5,
+        0,    2,   17,  148,  149,    0,    0,    0,  143,    0,
+      159,  157,    0,  153,  153,    0,  243,  243,  243,    0,
+        0,  142,    0,  147,  137,    0,    0,    0,  139,  140,
+      152,  138,    0,  136,  134,  133,  131,  132,  246,  244,
+
+      245,   40,   42,   40,   40,   37,   38,    0,   50,   49,
+       51,    0,  164,    0,  164,  167,  168,  219,  215,  173,
+        0,  183,  184,  189,  186,  228,  233,    0,    0,  221,
+      229,  229,  229,    0,  130,    0,   21,   23,   24,  235,
+      241,  240,  239,  240,    0,    0,  225,  220,    0,    0,
+       53,   52,    0,  128,    0,    0,  129,  129,  129,  129,
+      129,  129,  129,  129,  129,  129,  129,  129,  129,  129,
+      129,  129,  129,  129,  129,  129,   55,  129,  129,  129,
+      129,  129,  129,  129,  129,  129,  129,  129,    0,   35,
+       34,   48,   45,   46,   47,   31,   32,   29,   26,   25,
+
+      250,  248,  249,  237,    0,   16,   10,    0,   14,    0,
+        0,    0,    0,    0,    4,   16,    5,    0,    6,    0,
+      144,    0,  145,    0,  158,    0,  153,  153,    0,  153,
+      153,  153,  243,  243,  155,  154,    0,  156,  138,  146,
+        0,  152,    0,  131,  132,   40,   40,    0,   39,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,  230,  229,  229,    0,    0,  220,    0,    0,
+        0,    0,  129,  129,  129,  129,  129,  129,   65,  129,
+      129,  129,   70,  129,  129,  129,  129,  129,  129,  129,
+      129,  129,  129,  129,  129,  129,  129,  129,  129,  129,
+
+      129,  129,  129,  129,  129,  129,  129,  129,  129,  129,
+      129,  129,  129,  129,  129,  129,  129,  129,    0,    0,
+        0,    0,   14,    0,    0,    0,    0,    0,    0,    4,
+        8,    5,    0,  153,  153,  153,  153,  153,  153,  153,
+      243,  156,    0,    0,   40,   40,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  229,  229,
+        0,    0,   56,   57,  129,  129,  129,  129,  129,  129,
+      129,  129,  129,  129,   71,   72,  129,  129,  129,  129,
+       77,   78,  129,  129,  129,  129,  129,  129,  129,   83,
+
+      129,  129,  129,  129,  129,  129,  129,  129,  129,   92,
+      129,  129,  129,  129,  129,  129,  129,  129,  129,    0,
+        0,    0,    0,   15,    0,    0,    0,    0,    0,    8,
+        8,    8,    0,  153,  153,  153,  153,  153,  153,  153,
+        0,    0,   40,   40,  214,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  229,  229,
+        0,    0,   58,  129,   60,  129,   62,  129,  129,  129,
+      129,   68,  129,  129,  129,   73,  129,  129,  129,  129,
+      129,  129,  129,  129,  129,  129,  129,   86,  129,  129,
+
+      129,  129,   90,  129,  129,  129,  129,  129,  129,  129,
+      129,  129,  129,    0,    0,    0,    0,    3,    0,    0,
+        0,    8,    7,    8,    0,  153,  153,  153,    0,    0,
+       40,   40,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,  222,  223,  222,  223,
+      129,   61,  129,  129,  129,  129,  129,  129,  129,  125,
+      129,  129,  129,  129,  129,  129,  129,  129,  123,  129,
+       85,  129,   88,  129,   89,  129,  129,  129,  104,    0,
+      129,   94,  129,    0,   95,    0,    0,    0,    0,    0,
+
+       12,    0,   13,    0,  151,    0,  150,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,  129,  129,  129,  129,  129,   66,  129,   69,  129,
+      129,  129,  129,  129,  129,  122,  129,   82,  129,  129,
+       87,  129,   91,  102,  124,    0,    0,    0,    0,    0,
+        0,  129,  129,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,  150,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,  129,  129,
+
+      129,  129,  129,   67,  129,  129,  129,  129,   79,  129,
+      129,  129,  129,  129,  129,    0,    0,  113,    0,    0,
+        0,    0,    0,    0,   93,  129,    0,    0,  114,    0,
+        0,    0,    0,    0,    0,    0,    0,    0,   11,    0,
+      190,  191,  192,  193,  194,  195,  196,  197,  198,  199,
+      200,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+        0,    0,    0,    0,  129,  129,  129,  129,  129,  129,
+      129,  129,  129,  129,  129,  129,   84,  129,  129,    0,
+        0,    0,    0,    0,    0,  115,    0,  103,    0,    0,
+        0,    0,    0,  116,    0,    0,    0,    0,    0,  201,
+
+      202,  203,  204,  205,  206,  207,  208,  209,  210,  211,
+      212,    0,  129,  129,  129,  129,  129,  121,  129,  129,
+       75,  129,  129,  129,  129,  129,    0,    0,  109,    0,
+      119,  117,  110,    0,    0,    0,  120,  118,    0,    0,
+        0,    0,    0,    0,  213,  129,  129,  129,  129,  129,
+      125,   74,  129,   81,  129,  126,  129,  105,  107,    0,
+      106,  108,    0,    0,    0,    0,    0,    0,    0,  129,
+       63,  129,  129,  129,  129,   76,  129,  111,  112,   97,
+        0,    0,    0,    0,   98,  129,  129,  129,  129,  129,
+      127,   96,    0,  100,    0,  129,  129,  129,   66,  129,
+
+       99,  101,  129,   64,  129,  129,  129,   67,  129,  129,
+       80,   59,    0
+    } ;
+
+static const YY_CHAR yy_ec[256] =
+    {   0,
+        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
+        4,    4,    5,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    2,    1,    6,    7,    8,    9,    1,   10,   11,
+       12,   13,   14,   15,   16,   17,   18,   19,   19,   19,
+       19,   19,   19,   19,   20,   21,   22,   23,    1,   24,
+       25,   26,   27,    1,   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,   44,
+       53,   54,   55,   56,   57,    1,   58,   59,   60,   61,
+
+       62,   63,   64,   65,   66,   67,   68,   69,   70,   71,
+       72,   73,   44,   74,   75,   76,   77,   78,   79,   80,
+       81,   44,   82,   83,   84,    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,    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,    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,    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,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1
+    } ;
+
+static const YY_CHAR yy_meta[85] =
+    {   0,
+        1,    1,    2,    1,    3,    4,    1,    1,    5,    6,
+        1,    7,    8,    9,    1,   10,    1,   11,   12,   12,
+       12,   12,   13,    1,    1,    1,    1,   14,   14,   14,
+       14,   14,   14,   15,   15,   15,   15,   15,   15,   15,
+       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
+       15,   15,   16,   17,   18,    1,   19,   14,   14,   14,
+       14,   14,   14,   15,   15,   15,   15,   15,   15,   15,
+       15,   15,   15,   15,   15,   15,   15,   15,   15,   15,
+       15,   20,    1,   21
+    } ;
+
+static const flex_int16_t yy_base[1221] =
+    {   0,
+        0,   84,  167,  250,  171,  184,  135,  142,  220,  231,
+      196,  200,  334,    0, 3627, 3625,  211,  416,  203,  212,
+      189,  225,  266,  417,  500,    0,  207,  208,  234,  421,
+      424,  436,  583,  588,  669,    0,  294,  304,  584,  751,
+      579,  580,  417,  576,  287,  306,  241,  441,  595,  608,
+      169,  238,  440,  754, 3680, 4511,  325, 4511, 3676,    0,
+      446, 4511, 3673,  430,  827, 3661,    0, 4511,  758, 4511,
+     3650, 4511,  453, 3621, 4511, 4511, 3619, 3584,  129,  746,
+      445,  766, 4511, 3604,  198, 3582, 4511, 4511, 4511, 3600,
+        0, 3599,  214,    0, 3506, 3483,    0, 4511, 3532, 4511,
+
+      420,  119, 3481, 3478, 3446,    0, 3526, 4511, 3520, 4511,
+      482, 3520, 3518, 4511, 3455,    0, 4511, 4511, 4511, 3504,
+     4511,  598, 4511, 4511, 4511, 3499, 4511,  754, 4511, 3477,
+      759,  180, 4511, 4511, 3467,    0, 3442,  762, 4511,    0,
+     4511, 3459, 4511, 3406, 3434,    0,  562,  167, 3393, 3370,
+     4511, 4511,  326, 4511,  420,    0, 4511, 3418, 3402, 3366,
+     3342,    0, 4511, 3368, 4511, 3317,  444, 3314, 4511,  471,
+     4511, 3354, 3271, 3337,  572,  189, 3295, 3285, 4511, 3332,
+     4511, 3307, 3303,  585,  594, 4511,  746,  734,  744,  754,
+      763,  770,    0,  755,  748,  763,  818,  789,  240,  822,
+
+      762,  381,  802,  791,  813,  824,  577, 4511, 4511, 3302,
+      871,    0, 4511, 3302, 3250, 3231, 4511, 4511, 4511, 4511,
+     4511, 4511, 4511, 4511, 4511, 4511, 4511,    0, 4511, 3279,
+     4511, 4511, 4511, 3276, 3260, 3259,    0, 3221, 3214,    0,
+     3264, 4511,  835, 4511, 3262,    0,  903, 4511, 3257,  842,
+      817,    0,    0,  910,  914,  918,  922,    0,  814,    0,
+      457, 4511,    0,  943, 4511, 3241, 3141,  483, 4511, 3217,
+     3212, 4511,  826,  556,  903,  930, 4511,  757,    0, 3134,
+     3131, 4511, 3129,  964, 4511, 3190, 3110, 3174, 3161, 4511,
+        0, 4511,  896, 4511,    0, 3172,    0,    0,    0, 4511,
+
+     4511,    0, 4511,  910,  913, 4511, 4511,  602,    0, 3169,
+     4511,  957, 3164, 3161, 3127, 4511,    0, 4511,  976, 4511,
+     1020, 4511, 4511, 4511, 4511,    0, 4511, 3116,    0, 4511,
+        0,  926,  930,  644, 4511,  662,    0, 4511, 4511,    0,
+     4511, 4511, 3071, 3121,  794, 3037, 4511,    0,  934,  932,
+     3117, 4511, 3091, 4511,  938,  939,    0,  940,  738,  956,
+      802, 3059,  876,  978,  933,  933,  939,  948,  964, 1030,
+      938,  958,  976,  968,    0,  996, 4511,  999, 1057, 1068,
+      981, 1079, 1077, 1080, 1074, 1068, 1070, 1120, 3062, 4511,
+     1014,    0, 4511, 4511, 4511,    0, 4511, 4511, 4511, 4511,
+
+        0, 4511, 4511,    0, 1078,    0,    0, 1153, 4511, 3063,
+     1166, 1077, 1076, 1091,    0, 1089,    0, 1018, 4511, 1022,
+     4511, 1025, 4511, 1035, 4511, 1091, 1067, 1138, 1162, 1242,
+     1177, 1308, 1105,    0, 4511, 4511, 2954, 1198, 4511, 4511,
+     1144,    0, 1137,    0,    0, 1161, 1156, 1123, 4511, 1202,
+     1308, 1309, 1310, 1319, 3013, 1312, 1311, 1327, 1320, 1321,
+     1323, 1382, 4511, 1172, 1166, 2589, 2537,    0, 1178, 1169,
+     1169, 1298, 1315, 1324, 1330, 1321, 1330, 1323,    0, 1341,
+     1332, 1348,    0, 1346, 1350, 1348, 1361, 1350, 1367, 2573,
+     1370, 1366, 1380, 1382, 1382, 1385, 1378, 1387, 1391, 1400,
+
+     1393, 1403, 1406, 1414, 1400, 1401, 1404, 1429, 1419, 1424,
+     1428, 1425, 1436, 1435, 1430, 1441, 1442, 1432, 1432, 1450,
+     1209, 1508, 4511, 1215, 1512, 1219, 1461, 1455, 1451,    0,
+     1143,    0, 1461, 1534, 1600, 1636,  204, 2525, 1606, 1681,
+     4511, 4511, 1453, 1463, 1591, 1442, 2524, 1599, 1604, 1600,
+     1607, 1605, 1611, 1608, 1650, 1620, 1606, 1614, 1613, 1654,
+     1663, 1652, 1661, 1666, 1682, 1664, 1693, 1694, 1655, 1674,
+     1662, 1675, 4511, 4511, 1683, 1676, 1677, 1683, 1697, 1692,
+     1731, 1711, 1702, 1718,    0,    0, 1719, 1706, 1716, 1735,
+        0,    0, 2553, 1722, 1732, 2540, 1725, 1722, 1733,    0,
+
+     1727, 1747, 1740, 1739, 1735, 1752, 1739, 1740, 1746,    0,
+     1750, 1763, 1760, 1750, 1752, 1759, 1777, 1762, 1778, 1769,
+     1783, 1778, 2514, 4511, 1224, 1230, 1772, 1783, 1780,    0,
+     1507, 1234, 2364,  732, 2273, 1809, 1845, 1430, 1076, 1585,
+     1797, 2286, 1785, 1807, 4511, 1811, 1814, 1829, 1835, 1821,
+     1808, 1822, 1845, 1859, 1860, 1862, 1868, 1869, 1870, 1825,
+     1888, 1890, 1876, 1891, 1874, 1902, 1894, 1898, 1795, 1891,
+     1882, 1899,    0, 1887,    0, 1892,    0, 2260, 1900, 1891,
+     1909,    0, 1904, 2253, 1902,    0, 1916, 1907, 1918, 2227,
+     1912, 1909, 1924, 2201, 1908, 1918, 1922,    0, 1934, 1925,
+
+     1931, 1947,    0, 1936, 1942, 1941, 1953, 2103, 1957, 1958,
+     1952, 2085, 1950, 1951, 1950, 1969, 1956, 2133, 1515, 1961,
+     1971, 2002, 4511, 2117, 2038, 1981, 1592, 1842, 2025, 1983,
+        0,    0, 1972, 1990, 1999, 1987, 1994, 2008, 2005, 2007,
+     2015, 2023, 2016, 2021, 2017, 2024, 2022, 2026, 2030, 2029,
+     2037, 2035, 2045, 2051, 2054, 2061,    0,    0, 4511, 4511,
+     1922,    0, 2049, 2039, 2050, 2053, 2051, 2051, 2054, 1831,
+     2073, 2064, 2077, 2073, 2081, 2082, 2072, 2085,    0, 2091,
+        0, 2074,    0, 1824,    0, 2091, 2094, 2082,    0, 2116,
+     2088,    0, 2092, 2133,    0, 1728, 2097, 2095, 1714, 1678,
+
+     4511, 2135, 4511, 2096, 4511, 1726, 4511, 1703, 1612, 1601,
+     1514, 1500, 1477, 1377, 1373, 1333, 1274, 1203, 2133, 2128,
+     2148, 2151, 2144, 2150, 2156, 2158, 2161, 2163, 2184, 2167,
+     2164, 2157, 2151, 2159, 2158, 2173,    0, 2165,    0, 2166,
+     2182, 2173, 2179, 2178, 2186,    0, 2185,    0, 2187, 2193,
+        0, 2202,    0,    0,    0, 2204, 2187, 2201, 2224, 2200,
+     2222, 2213, 2219, 2230, 2199, 2227, 2239, 2222, 2225, 1162,
+     1158, 2228, 2278, 4511, 1112, 1109, 1081, 1063, 1057,  984,
+      976,  969,  923,  913,  910,  931,  895,  891,  887,  881,
+      874,  856,  848,  843,  840,  804,  788, 2259, 2248, 2258,
+
+     2265, 2264, 2241,    0, 2254, 2265, 2268, 2279,    0, 2262,
+     2268, 2271, 2266, 2278, 2283, 2289, 2273, 4511, 2280, 2281,
+     2281, 2300, 2283, 2281,    0, 2303, 2307, 2292, 4511, 2302,
+     2304, 2319, 2303, 2307, 2309, 2328, 2309, 2357, 4511, 2362,
+     4511, 4511, 4511, 4511, 4511, 4511, 4511, 4511, 4511, 4511,
+     4511,  746,  725,  597,  577,  441,  426,  420,  267,  253,
+      247,  230,  183,  181, 2317, 2338, 2342, 2330, 2336, 2343,
+     2339, 2331, 2334, 2350, 2341, 2345,    0, 2350, 2346, 2344,
+     2349, 2361, 2364, 2367, 2359, 4511, 2357,    0, 2358, 2362,
+     2379, 2383, 2375, 4511, 2388, 2375, 2382, 2377, 2389, 4511,
+
+     4511, 4511, 4511, 4511, 4511, 4511, 4511, 4511, 4511, 4511,
+     4511,  122, 2399, 2398, 2382, 2391, 2391,    0, 2407, 2408,
+        0, 2397, 2398, 2420, 2417, 2414, 2418, 2426, 4511, 2414,
+     4511, 4511, 4511, 2422, 2429, 2419, 4511, 4511, 2417, 2437,
+     2435, 2425, 2428, 2428, 4511, 2431, 2445, 2445, 2447, 2452,
+        0,    0, 2461,    0, 2444,    0, 2459, 4511, 4511, 2452,
+     4511, 4511, 2454, 2465, 2452, 2467, 2471, 2470, 2476, 2481,
+        0, 2468, 2465, 2465, 2485,    0, 2465, 4511, 4511, 4511,
+     2489, 2491, 2479, 2488, 4511, 2501, 2491, 2498, 2503, 2490,
+        0, 4511, 2497, 4511, 2510, 2500, 2502, 2500,    0, 2514,
+
+     4511, 4511, 2516,    0, 2523, 2508, 2509,    0, 2528, 2531,
+        0,    0, 4511, 2593, 2614, 2635, 2656, 2677, 2698, 2719,
+     2740, 2761, 2782, 2803, 2824, 2845, 2866, 2887, 2908, 2929,
+     2950, 2971, 2992, 3013, 3025, 3044, 3055, 3074, 3095, 3108,
+     3127, 3148, 3169, 3190, 3202, 3221, 3242, 3263, 3280, 3292,
+     3311, 3332, 3353, 3374, 3395, 3408, 2553, 3423, 3444, 3463,
+     3484, 3505, 3517, 3536, 3557, 2569, 3057, 3578, 3590, 3609,
+     3630, 3651, 2558, 3663, 3684, 3705, 3726, 3747, 3768, 3789,
+     3810, 3831, 3843, 3862, 3879, 3891, 3910, 3931, 3952, 3973,
+     3994, 4007, 4022, 4043, 4062, 4083, 4104, 4125, 4146, 4167,
+
+     4179, 4189, 4208, 4229, 4250, 2561, 4262, 4283, 4304, 4325,
+     4346, 4367, 3028, 4379, 4398, 4419, 4432, 4447, 4468, 4489
+    } ;
+
+static const flex_int16_t yy_def[1221] =
+    {   0,
+     1113, 1113, 1114, 1114, 1115, 1116, 1117, 1117, 1118, 1118,
+     1119, 1119, 1113,   13, 1120, 1120, 1121, 1121, 1122, 1122,
+     1123, 1123, 1124, 1124, 1113,   25, 1125, 1125, 1126, 1126,
+     1127, 1127, 1128, 1128, 1113,   35, 1129, 1129, 1130, 1130,
+     1120, 1120, 1120, 1120, 1131, 1131, 1132, 1132, 1126, 1126,
+     1133, 1133, 1134, 1134, 1113, 1113, 1113, 1113, 1113, 1135,
+     1113, 1113, 1113, 1113, 1136, 1113, 1137, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1138, 1139,
+     1140, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1141, 1113, 1141, 1142, 1113, 1113, 1143, 1113, 1143, 1113,
+
+     1143, 1143, 1113, 1113, 1113, 1144, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1145, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1139, 1113, 1113,
+     1139, 1146, 1113, 1113, 1113, 1147, 1113, 1139, 1113, 1148,
+     1113, 1148, 1113, 1149, 1113, 1150, 1150, 1150, 1113, 1113,
+     1113, 1113, 1151, 1113, 1151, 1152, 1113, 1152, 1113, 1113,
+     1113, 1153, 1113, 1153, 1113, 1113, 1154, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1155, 1113, 1113, 1113, 1156, 1156, 1156, 1156,
+     1156, 1156, 1156, 1156, 1156, 1156, 1156, 1157, 1156, 1156,
+
+     1156, 1156, 1156, 1156, 1156, 1156, 1156, 1113, 1113, 1158,
+     1113, 1159, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1160, 1113, 1160,
+     1113, 1113, 1113, 1113, 1113, 1113, 1161, 1113, 1113, 1162,
+     1162, 1113, 1113, 1113, 1113, 1163, 1113, 1113, 1113, 1113,
+     1113, 1164, 1165, 1113, 1113, 1113, 1113, 1166, 1164, 1167,
+     1168, 1113, 1169, 1113, 1113, 1113, 1113, 1170, 1113, 1113,
+     1113, 1113, 1113, 1171, 1171, 1172, 1113, 1113, 1173, 1113,
+     1113, 1113, 1174, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1175, 1113, 1113, 1113, 1176, 1113, 1177, 1178, 1179, 1113,
+
+     1113, 1180, 1113, 1180, 1180, 1113, 1113, 1181, 1182, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1183, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1184, 1113, 1113, 1185, 1113,
+     1186, 1186, 1186, 1187, 1113, 1187, 1188, 1113, 1113, 1189,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1190, 1113, 1113,
+     1113, 1113, 1191, 1113, 1113, 1113, 1192, 1192, 1192, 1192,
+     1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192,
+     1192, 1192, 1192, 1192, 1192, 1192, 1113, 1192, 1192, 1192,
+     1192, 1192, 1192, 1192, 1192, 1192, 1192, 1192, 1193, 1113,
+     1113, 1194, 1113, 1113, 1113, 1195, 1113, 1113, 1113, 1113,
+
+     1196, 1113, 1113, 1197, 1113, 1198, 1199, 1200, 1113, 1113,
+     1113, 1113, 1113, 1113, 1201, 1198, 1202, 1203, 1113, 1203,
+     1113, 1204, 1113, 1204, 1113, 1113, 1205, 1205, 1205, 1113,
+     1205, 1205, 1113, 1206, 1113, 1113, 1207, 1113, 1113, 1113,
+     1113, 1208, 1113, 1209, 1210, 1211, 1211, 1212, 1113, 1212,
+     1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+     1213, 1213, 1113, 1214, 1214, 1113, 1215, 1216, 1113, 1113,
+     1113, 1113, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1113, 1113,
+     1200, 1200, 1113, 1200, 1200, 1113, 1113, 1113, 1113, 1201,
+     1218, 1202, 1113, 1113, 1205,  432,  430,  430, 1205,  432,
+     1113, 1113, 1113, 1113, 1211, 1211, 1113, 1213, 1213, 1213,
+     1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+     1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1214, 1214,
+     1113, 1113, 1113, 1113, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1113,
+     1113, 1113, 1113, 1113, 1200, 1200, 1113, 1113, 1113, 1218,
+     1218, 1218, 1113,  534,  534, 1205,  432, 1205, 1205, 1205,
+     1113, 1113, 1211, 1211, 1113, 1213, 1213, 1213, 1213, 1213,
+     1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+     1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1214, 1214,
+     1113, 1113, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1113, 1113, 1113, 1113, 1113, 1219, 1113,
+     1113, 1218, 1113, 1218, 1113, 1205, 1205, 1205, 1113, 1113,
+     1211, 1211, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+     1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+     1213, 1213, 1213, 1213, 1213, 1213, 1214, 1214, 1113, 1113,
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1113,
+     1217, 1217, 1217, 1113, 1217, 1113, 1113, 1113, 1113, 1219,
+
+     1113, 1219, 1113, 1113, 1113, 1113, 1113, 1213, 1213, 1213,
+     1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+     1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213,
+     1213, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1113, 1113, 1113, 1113, 1113,
+     1113, 1217, 1217, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1220, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1213, 1213, 1213, 1213, 1213,
+     1213, 1213, 1213, 1213, 1213, 1213, 1213, 1213, 1217, 1217,
+
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1217, 1217, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1220, 1113, 1220,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1213, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1217, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1217, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1217,
+     1217, 1217, 1217, 1217, 1217, 1217, 1217, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1217, 1217, 1217, 1217, 1217,
+     1217, 1113, 1113, 1113, 1113, 1217, 1217, 1217, 1217, 1217,
+
+     1113, 1113, 1217, 1217, 1217, 1217, 1217, 1217, 1217, 1217,
+     1217, 1217,    0, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113
+    } ;
+
+static const flex_int16_t yy_nxt[4596] =
+    {   0,
+       56,   57,   58,   56,   59,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   60,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,   56,   56,   56,   56,   60,   60,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,   60,   60,   60,   60,   60,   60,   60,   60,   60,
+       60,   56,   56,   56,   56,   61,   62,   56,   63,   56,
+       64,   56,   65,   56,   56,   56,   56,   56,   56,   56,
+
+       56,   66,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   67,   67,   67,   67,   67,   67,   67,   67,   67,
+       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
+       67,   67,   67,   67,   67,   67,   56,   56,   56,   56,
+       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
+       67,   67,   67,   67,   67,   67,   67,   67,   67,   67,
+       67,   67,   67,   67,   67,   56,   56,   56,   69,   70,
+      305,   71,   72,   89,   73,   90, 1045,   74,   75,   76,
+       76,  275,  276,   76,   77,   92,   89,   95,   90,   96,
+       78,   56,   93,   76,   95,  323,   96,  107,  108,  305,
+
+      109,  107,  108, 1012,  109,  125,  291,  126,  127,  154,
+      154,  155,  155,  119,  125,  120,  126,  127,  333,   79,
+       80,  238,   98,  239,   99,  121,  638,   56,  100,  122,
+      122,  122,  122,   98,  323,   99,  157, 1011,  158,  105,
+      350,  130,  131,  233,  132,  234,  159,  333,   81,   76,
+       76,   82,   83,  235,   84,   72,  128,   73,   85,  427,
+       74,   75,   76,   76,  101,  128,   76,   77,  134,  350,
+      135,  102,  103,   86,  104,  101,   76,  130,  131,  292,
+      132,  136,  102,  103, 1010,  104,  160,  378,  161,  229,
+      238,  230,  239,  101,  123,  297,  209,  298,  231,  210,
+
+      102, 1009,   79,   80,  101,   87,  209, 1008,  229,  210,
+      230,  102,  211,  211,  211,  211,  378,  231,  137,  138,
+      139, 1007,  211,  211,  211,  211,  243,  244,  335,  245,
+      336,   81,   76,   76,  110,  111,  112,  110,  113,  110,
+      110,  110,  110,  110,  110,  110,  114,  110,  114,  110,
+      110,  110,  110,  110,  110,  110,  110,  110,  110,  115,
+      110,  116,  116,  116,  116,  116,  116,  116,  116,  116,
+      116,  116,  116,  116,  116,  116,  116,  116,  116,  116,
+      116,  116,  116,  116,  116,  116,  110,  110,  110,  110,
+      116,  116,  116,  116,  116,  116,  116,  116,  116,  116,
+
+      116,  116,  116,  116,  116,  116,  116,  116,  116,  116,
+      116,  116,  116,  116,  116,  110,  110,  110,  119,  134,
+      120,  135,  335,  157,  336,  158,  163,  383,  164,  165,
+      121,  250,  136,  159,  122,  122,  122,  122,  163,  224,
+      164,  165,  163,  233,  241,  234,  343,  247,  248,  242,
+      249,  304,  225,  235,  269,  269,  383,  270,  280,  419,
+      281,  420,  226,  282,  282,  282,  282,  227,  251,  137,
+      138,  139,  345,  160, 1006,  161,  166,  167,  168,  346,
+     1005,  304,  225,  312,  313,  423,  314,  424,  166,  167,
+      168,  226,  166,  167,  168, 1004,  227,  344,  251,  123,
+
+      140,  140,  141,  140,  142,  143,  140,  140,  140,  144,
+      140,  140,  140,  140,  140,  140,  140,  145,  140,  140,
+      140,  140,  140,  140,  140,  140,  140,  146,  146,  146,
+      146,  146,  146,  146,  146,  146,  146,  146,  146,  146,
+      146,  146,  146,  146,  147,  146,  146,  146,  146,  146,
+      146,  148,  149,  140,  150,  140,  146,  146,  146,  146,
+      146,  146,  146,  146,  146,  146,  146,  146,  146,  146,
+      146,  146,  146,  147,  146,  146,  146,  146,  146,  146,
+      148,  151,  140,  152,  170,  171,  213,  172,  214,  170,
+      171,  173,  172,  332,  219,  219,  173,  157,  224,  158,
+
+      174,  220,  220,  349,  449,  174,  450,  236,  428,  429,
+      157,  225,  158,  355,  221,  221,  319,  319,  319,  319,
+      236,  226,  356,  332,  222,  222,  227,  175,  388,  223,
+      223, 1003,  175,  349,  176,  177,  215,  178,  216,  176,
+      177,  225,  178,  355,  221,  221,  335,  160,  336,  161,
+      226, 1002,  356,  222,  222,  227,  175,  388,  223,  223,
+      160,  175,  161,  176,  335,  217,  336,  218,  176,  179,
+      180,  181,  179,  182,  183,  179,  179,  179,  179,  179,
+      179,  179,  179,  179,  179,  179,  179,  179,  184,  185,
+      179,  179,  179,  186,  179,  179,  187,  188,  189,  190,
+
+      191,  192,  193,  194,  195,  193,  193,  196,  197,  198,
+      199,  200,  193,  201,  202,  203,  204,  205,  206,  193,
+      207,  179,  179,  179,  179,  179,  187,  188,  189,  190,
+      191,  192,  193,  194,  195,  193,  193,  196,  197,  198,
+      199,  200,  201,  202,  203,  204,  205,  206,  193,  207,
+      179,  179,  179,  213,  726,  214,  163,  362,  241,  264,
+      265,  360,  266,  242,  278,  278,  267,  284,  285,  361,
+      286,  363,  278,  278,  287,  433,  433,  278,  278, 1001,
+      278,  278,  475,  288,  358,  364,  369,  427,  370,  289,
+      359,  360,  365,  382,  371,  345,  279,  367,  372,  361,
+
+     1000,  363,  346,  215,  279,  216,  166,  167,  168,  279,
+      963,  475,  279,  366,  358,  364,  369,  368,  370,  359,
+      376,  290,  365,  382,  371,  279,  962,  367,  372,  384,
+      377,  385,  217,  279,  218,  253,  243,  244,  279,  245,
+      268,  279,  366,  250,  386,  373,  368,  478,  268,  374,
+      376,  387,  405,  379,  254,  416,  255,  426,  255,  384,
+      377,  385,  961,  380,  255,  960,  381,  255,  256,  257,
+      959,  255,  258,  259,  386,  373,  478,  260,  958,  374,
+      251,  387,  405,  379,  254,  416,  255,  426,  255,  391,
+      391,  391,  391,  380,  255,  381,  957,  255,  256,  257,
+
+      255,  258,  259,  956,  247,  248,  260,  249,  261,  955,
+      251,  408,  409,  954,  410,  408,  409,  953,  410,  408,
+      409,  480,  410,  408,  409,  430,  410,  443,  411,  411,
+      411,  411,  411,  411,  411,  411,  411,  411,  411,  411,
+      411,  411,  411,  411,  264,  265,  446,  266,  431,  431,
+      480,  267,  447,  952,  412,  428,  429,  443,  312,  313,
+      413,  314,  464,  414,  951,  284,  285,  950,  286,  465,
+      469,  470,  287,  471,  472,  473,  446,  949,  483,  484,
+      432,  288,  447,  412,  485,  476,  486,  289,  490,  474,
+      413,  487,  464,  414,  319,  319,  319,  319,  491,  465,
+
+      469,  470,  477,  471,  472,  473,  481,  483,  484,  432,
+      482,  492,  499,  485,  493,  476,  486,  490,  474,  290,
+      419,  487,  420,  948,  419,  268,  420,  423,  491,  424,
+      947,  477,  391,  391,  391,  391,  481,  423,  946,  424,
+      482,  492,  499,  493,  494,  495,  268,  451,  452,  453,
+      454,  455,  455,  456,  455,  455,  455,  455,  457,  455,
+      455,  455,  458,  455,  455,  459,  455,  460,  455,  455,
+      461,  455,  488,  494,  495,  462,  489,  451,  452,  453,
+      454,  455,  455,  456,  455,  455,  455,  455,  457,  455,
+      455,  455,  458,  455,  459,  455,  460,  455,  455,  461,
+
+      455,  496,  488,  497,  503,  489,  500,  504,  505,  506,
+      501,  945,  508,  498,  509,  502,  507,  944,  520,  428,
+      429,  527,  528,  277,  277,  449,  529,  450,  428,  429,
+      496,  531,  533,  497,  503,  943,  500,  504,  505,  506,
+      501,  508,  498,  509,  631,  502,  507,  510,  520,  511,
+      527,  528,  512,  513,  522,  523,  529,  524,  514,  515,
+      534,  531,  533,  942,  516,  517,  941,  526,  409,  518,
+      410,  525,  525,  525,  525,  543,  519,  510,  544,  511,
+      535,  535,  512,  513,  411,  411,  411,  411,  514,  515,
+      428,  429,  545,  516,  517,  539,  539,  546,  518,  542,
+
+      542,  542,  542,  569,  449,  543,  450,  570,  544,  571,
+      572,  624,  536,  625,  936,  573,  427,  523,  935,  625,
+      526,  409,  545,  410,  632,  885,  624,  546,  625,  428,
+      429,  626,  523,  569,  524,  722,  723,  570,  724,  571,
+      572,  536,  427,  427,  573,  427,  427,  427,  427,  427,
+      427,  427,  427,  427,  427,  427,  427,  427,  427,  427,
+      427,  427,  427,  427,  427,  427,  427,  427,  427,  537,
+      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
+      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
+      537,  537,  537,  537,  428,  429,  884,  538,  427,  537,
+
+      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
+      537,  537,  537,  537,  537,  537,  537,  537,  537,  537,
+      537,  537,  537,  427,  427,  427,  540,  540,  540,  540,
+      547,  547,  547,  547,  547,  540,  540,  540,  540,  540,
+      540,  547,  547,  547,  574,  547,  548,  549,  575,  547,
+      550,  576,  553,  558,  551,  883,  552,  577,  578,  579,
+      428,  429,  556,  557,  580,  540,  540,  540,  540,  540,
+      540,  554,  581,  574,  555,  583,  548,  549,  575,  582,
+      550,  576,  553,  558,  551,  552,  586,  577,  578,  579,
+      584,  587,  556,  557,  580,  882,  585,  588,  589,  881,
+
+      554,  591,  581,  555, 1113,  583,  592,  593,  582,  559,
+      560,  561,  562,  594,  595,  563,  586,  596,  597,  584,
+      564,  587,  598,  599,  565,  585,  588,  566,  589,  567,
+      600,  591,  568,  601,  602,  603,  592,  593,  606,  559,
+      560,  561,  562,  594,  595,  563,  607,  596,  597,  604,
+      564,  608,  598,  599,  565,  605,  566,  609,  567,  610,
+      600,  568,  611,  601,  602,  603,  612,  614,  606,  613,
+      615,  616,  617,  618,  620,  607,  619,  621,  622,  604,
+      608,  623,  428,  429,  274,  605,  644,  609,  627,  610,
+      628,  629,  611,  633,  641,  642,  612,  614,  613,  880,
+
+      615,  616,  617,  618,  620,  619,  621,  622,  631,  522,
+      523,  623,  524,  626,  523,  644,  524,  801,  627,  802,
+      628,  629,  879,  633,  641,  642,  525,  525,  525,  525,
+      525,  525,  525,  525,  427,  427,  878,  427,  427,  427,
+      427,  427,  427,  427,  427,  427,  427,  427,  427,  427,
+      427,  427,  427,  427,  427,  427,  427,  427,  427,  427,
+      427,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  634,  428,  429,  632,  635,
+      427,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+
+      634,  634,  634,  634,  634,  634,  634,  634,  634,  634,
+      634,  634,  634,  634,  634,  427,  427,  427,  636,  636,
+      643,  547,  547,  877,  639,  639,  547,  547,  547,  547,
+      547,  648,  651,  547,  876,  547,  547,  428,  429,  646,
+      650,  647,  547,  653,  428,  429,  649,  655,  656,  657,
+      643,  658,  428,  429,  637,  637,  637,  637,  428,  429,
+      652,  648,  651,  637,  637,  637,  637,  637,  637,  646,
+      650,  647,  547,  653,  547,  649,  547,  655,  656,  657,
+      801,  658,  802,  547,  669,  547,  547,  661,  547,  652,
+      654,  671,  659,  637,  637,  637,  637,  637,  637,  640,
+
+      640,  640,  640,  660,  547,  662,  666,  663,  640,  640,
+      640,  640,  640,  640,  669,  547,  547,  661,  670,  672,
+      654,  671,  659,  673,  668,  875,  664,  674,  675,  665,
+      676,  677,  678,  660,  662,  667,  666,  663,  640,  640,
+      640,  640,  640,  640,  682,  684,  679,  670,  672,  683,
+      685,  874,  686,  673,  668,  664,  674,  675,  665,  676,
+      687,  677,  678,  680,  688,  667,  690,  691,  695,  681,
+      872,  693,  694,  696,  682,  684,  697,  698,  683,  699,
+      685,  686,  700,  701,  869,  702,  703,  704,  705,  687,
+      706,  707,  709,  680,  688,  690,  708,  691,  695,  681,
+
+      693,  694,  696,  710,  711,  713,  697,  698,  712,  699,
+      714,  700,  716,  701,  702,  703,  715,  704,  705,  717,
+      706,  707,  709,  719,  720,  708,  721,  727,  727,  729,
+      547,  731,  710,  547,  711,  713,  547,  712,  732,  852,
+      714,  757,  716,  547,  547,  715,  841,  547,  734,  717,
+      738,  547,  719,  739,  720,  721,  737,  547,  733,  729,
+      731,  428,  429,  728,  728,  728,  728,  547,  732,  735,
+      757,  748,  728,  728,  728,  728,  728,  728,  734,  736,
+      738,  547,  547,  739,  547,  740,  737,  733,  741,  742,
+      547,  547,  547,  743,  428,  429,  547,  747,  547,  735,
+
+      748,  744,  728,  728,  728,  728,  728,  728,  736,  745,
+      547,  746,  547,  547,  753,  740,  547,  750,  741,  742,
+      547,  749,  758,  743,  547,  751,  752,  747,  759,  754,
+      760,  744,  761,  756,  762,  764,  755,  832,  766,  745,
+      767,  746,  768,  771,  753,  765,  770,  750,  772,  773,
+      775,  749,  758,  776,  751,  777,  752,  759,  779,  754,
+      760,  761,  780,  756,  762,  764,  755,  766,  781,  782,
+      767,  783,  768,  771,  765,  770,  784,  785,  772,  773,
+      775,  786,  776,  787,  789,  777,  788,  779,  791,  792,
+      793,  780,  795,  796,  547,  797,  798,  781,  799,  782,
+
+      783,  803,  804,  722,  723,  784,  724,  785,  807,  547,
+      786,  808,  547,  787,  789,  788,  547,  809,  791,  792,
+      793,  547,  795,  796,  797,  811,  798,  547,  799,  547,
+      547,  803,  804,  428,  429,  427,  810,  547,  547,  547,
+      812,  808,  813,  547,  547,  547,  547,  809,  547,  814,
+      806,  547,  547,  815,  817,  811,  819,  547,  821,  547,
+      818,  816,  822,  805,  820,  824,  810,  547,  826,  812,
+      823,  825,  813,  547,  828,  827,  547,  833,  814,  835,
+      829,  836,  815,  547,  817,  830,  819,  834,  821,  818,
+      816,  837,  822,  820,  831,  824,  838,  839,  826,  823,
+
+      840,  825,  842,  843,  828,  827,  844,  833,  845,  835,
+      829,  836,  846,  847,  849,  830,  848,  834,  850,  723,
+      851,  837,  853,  854,  831,  838,  839,  855,  862,  840,
+      863,  870,  842,  843,  718,  871,  844,  801,  845,  802,
+      873,  794,  846,  847,  849,  848,  856,  857,  850,  851,
+      547,  858,  853,  854,  859,  547,  855,  860,  862,  790,
+      863,  870,  861,  864,  865,  871,  547,  887,  866,  873,
+      547,  867,  547,  547,  868,  888,  856,  857,  547,  886,
+      547,  858,  890,  547,  859,  547,  547,  860,  889,  547,
+      892,  861,  899,  864,  865,  900,  891,  887,  866,  898,
+
+      901,  867,  893,  902,  868,  888,  547,  894,  886,  895,
+      904,  897,  890,  903,  906,  896,  778,  905,  889,  907,
+      892,  908,  899,  909,  900,  891,  910,  911,  912,  898,
+      901,  893,  902,  913,  914,  916,  894,  917,  895,  904,
+      897,  918,  774,  903,  906,  896,  905,  923,  907,  928,
+      915,  908,  909,  924,  925,  919,  910,  911,  912,  920,
+      926,  927,  921,  913,  914,  916,  917,  929,  769,  933,
+      934,  918,  922,  937,  930,  763,  923,  931,  928,  915,
+      939,  547,  940,  924,  925,  919,  969,  932,  965,  920,
+      926,  927,  921,  966,  967,  968,  970,  929,  933,  934,
+
+      971,  922,  937,  972,  930,  964,  973,  931,  974,  975,
+      976,  730,  977,  978,  979,  969,  932,  980,  965,  981,
+      982,  983,  984,  966,  967,  968,  970,  985,  427,  986,
+      971,  987,  988,  972,  964,  989,  973,  974,  990,  975,
+      976,  977,  991,  978,  979,  992,  993,  980,  981,  994,
+      982,  983,  984,  995,  996,  999,  997,  985,  986,  939,
+      987,  940,  988, 1013,  939,  989,  940,  990, 1014, 1015,
+     1016, 1017,  991,  998, 1018,  992,  993, 1019,  994, 1020,
+     1021, 1022,  995,  996,  999, 1023,  997, 1024, 1025,  725,
+     1026, 1027, 1013, 1028, 1029, 1030, 1031, 1032, 1014, 1015,
+
+     1016, 1017,  998, 1033, 1018, 1034, 1035, 1019, 1020, 1021,
+     1036, 1022, 1037, 1038, 1023, 1039, 1044, 1024, 1025, 1026,
+     1027, 1040, 1028, 1043, 1029, 1030, 1031, 1032, 1048, 1041,
+     1046, 1047, 1033, 1042, 1034, 1035, 1049, 1050, 1051, 1052,
+     1036, 1053, 1037, 1038, 1054, 1039, 1044, 1055, 1056, 1057,
+     1040, 1058, 1043, 1059, 1060, 1061, 1062, 1048, 1041, 1063,
+     1046, 1047, 1042, 1064, 1065, 1049, 1050, 1066, 1051, 1052,
+     1053, 1067, 1068, 1054, 1069, 1070, 1071, 1055, 1056, 1057,
+     1072, 1058, 1073, 1059, 1060, 1061, 1062, 1074, 1075, 1063,
+     1076, 1077, 1064, 1078, 1065, 1079, 1080, 1066, 1081, 1082,
+
+     1067, 1068, 1083, 1069, 1070, 1084, 1071, 1085, 1086, 1087,
+     1072, 1088, 1073, 1089, 1090,  718, 1091, 1074, 1075, 1076,
+     1092, 1077, 1093, 1078, 1094, 1079, 1080, 1081, 1095, 1082,
+     1096, 1097, 1083, 1098, 1099, 1084, 1100, 1085, 1086, 1087,
+     1088, 1101, 1089, 1102, 1090, 1091, 1103, 1104, 1105, 1106,
+     1092, 1107, 1093, 1094, 1108,  692, 1109, 1110, 1095, 1111,
+     1096, 1097, 1112, 1098, 1099, 1100,  375,  375,  689,  434,
+     1101,  434,  541, 1102,  541, 1103, 1104, 1105,  645, 1106,
+      427, 1107,  415,  415, 1108, 1109, 1110,  415,  590, 1111,
+      344,  343, 1112,   68,   68,   68,   68,   68,   68,   68,
+
+       68,   68,   68,   68,   68,   68,   68,   68,   68,   68,
+       68,   68,   68,   68,   88,   88,   88,   88,   88,   88,
+       88,   88,   88,   88,   88,   88,   88,   88,   88,   88,
+       88,   88,   88,   88,   88,   91,   91,   91,   91,   91,
+       91,   91,   91,   91,   91,   91,   91,   91,   91,   91,
+       91,   91,   91,   91,   91,   91,   94,   94,   94,   94,
+       94,   94,   94,   94,   94,   94,   94,   94,   94,   94,
+       94,   94,   94,   94,   94,   94,   94,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,   97,   97,
+       97,   97,   97,   97,   97,   97,   97,   97,  106,  106,
+
+      106,  106,  106,  106,  106,  106,  106,  106,  106,  106,
+      106,  106,  106,  106,  106,  106,  106,  106,  106,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+       56,   56,   56,   56,   56,   56,   56,   56,   56,   56,
+      118,  118,  118,  118,  118,  118,  118,  118,  118,  118,
+      118,  118,  118,  118,  118,  118,  118,  118,  118,  118,
+      118,  124,  124,  124,  124,  124,  124,  124,  124,  124,
+      124,  124,  124,  124,  124,  124,  124,  124,  124,  124,
+      124,  124,  129,  129,  129,  129,  129,  129,  129,  129,
+      129,  129,  129,  129,  129,  129,  129,  129,  129,  129,
+
+      129,  129,  129,  133,  133,  133,  133,  133,  133,  133,
+      133,  133,  133,  133,  133,  133,  133,  133,  133,  133,
+      133,  133,  133,  133,  153,  153,  153,  153,  153,  153,
+      153,  153,  153,  153,  153,  153,  153,  153,  153,  153,
+      153,  153,  153,  153,  153,  156,  156,  156,  156,  156,
+      156,  156,  156,  156,  156,  156,  156,  156,  156,  156,
+      156,  156,  156,  156,  156,  156,  162,  162,  162,  162,
+      162,  162,  162,  162,  162,  162,  162,  162,  162,  162,
+      162,  162,  162,  162,  162,  162,  162,  169,  169,  169,
+      169,  169,  169,  169,  169,  169,  169,  169,  169,  169,
+
+      169,  169,  169,  169,  169,  169,  169,  169,  208,  208,
+      208,  208,  208,  208,  208,  208,  208,  208,  208,  208,
+      208,  208,  208,  208,  208,  208,  208,  208,  208,  212,
+      212,  212,  212,  212,  212,  212,  212,  212,  212,  212,
+      212,  212,  212,  212,  212,  212,  212,  212,  212,  212,
+      228,  228,  228,  228,  228,  228,  228,  228,  228,  228,
+      228,  228,  228,  228,  228,  228,  228,  228,  228,  228,
+      228,  232,  232,  232,  232,  232,  232,  232,  232,  232,
+      232,  232,  232,  232,  232,  232,  232,  232,  232,  232,
+      232,  232,  237,  237,  237,  237,  237,  237,  237,  237,
+
+      237,  237,  237,  237,  237,  237,  237,  237,  237,  237,
+      237,  237,  237,  240,  240,  240,  240,  240,  240,  240,
+      240,  240,  240,  240,  240,  240,  240,  240,  240,  240,
+      240,  240,  240,  240,  246,  547,  246,  438,  246,  246,
+      455,  455,  455,  246,  252,  252,  252,  252,  252,  252,
+      252,  252,  252,  252,  252,  252,  252,  252,  252,  252,
+      252,  252,  252,  252,  263,  409,  263,  390,  263,  263,
+      417,  417,  479,  263,  274,  417,  274,  274,  274,  274,
+      274,  274,  274,  274,  274,  274,  274,  274,  274,  274,
+      274,  274,  274,  274,  274,  277,  354,  277,  277,  277,
+
+      277,  277,  277,  277,  277,  277,  277,  277,  277,  277,
+      277,  277,  277,  277,  277,  277,  283,  283,  351,  283,
+      348,  283,  283,  467,  466,  463,  283,  295,  315,  295,
+      295,  295,  295,  295,  295,  295,  295,  295,  295,  295,
+      295,  295,  295,  295,  295,  295,  295,  295,  299,  299,
+      299,  299,  299,  299,  299,  299,  299,  299,  299,  299,
+      299,  299,  299,  313,  299,  315,  299,  299,  299,  302,
+      310,  302,  302,  296,  302,  302,  302,  302,  302,  302,
+      302,  302,  302,  302,  441,  302,  440,  302,  302,  302,
+      309,  439,  285,  309,  309,  309,  309,  309,  309,  309,
+
+      309,  309,  309,  309,  309,  309,  309,  309,  309,  309,
+      309,  317,  438,  317,  436,  317,  317,  435,  425,  269,
+      317,  322,  421,  322,  322,  322,  322,  322,  322,  322,
+      322,  322,  322,  322,  322,  322,  322,  322,  322,  322,
+      322,  322,  325,  265,  325,  325,  325,  325,  325,  325,
+      325,  325,  325,  325,  325,  325,  325,  325,  325,  248,
+      325,  325,  325,  326,  244,  326,  341,  326,  403,  326,
+      326,  326,  326,  402,  326,  326,  400,  399,  398,  326,
+      328,  397,  328,  328,  328,  395,  328,  328,  328,  328,
+      328,  328,  328,  328,  328,  328,  328,  328,  328,  328,
+
+      328,  331,  394,  331,  393,  331,  331,  390,  354,  352,
+      331,  334,  334,  334,  334,  334,  334,  334,  334,  334,
+      334,  334,  334,  334,  334,  334,  334,  334,  334,  334,
+      334,  334,  337,  351,  337,  337,  337,  337,  337,  307,
+      337,  337,  337,  337,  337,  337,  337,  306,  337,  330,
+      337,  337,  337,  340,  348,  340,  347,  340,  340,  340,
+      340,  340,  340,  340,  340,  340,  340,  340,  307,  306,
+      341,  340,  340,  340,  342,  342,  342,  342,  342,  342,
+      342,  342,  342,  342,  342,  342,  342,  342,  342,  342,
+      342,  342,  342,  342,  342,  353,  307,  353,  353,  353,
+
+      353,  353,  353,  353,  353,  353,  353,  353,  353,  353,
+      353,  353,  353,  353,  353,  353,  357,  357,  306,  339,
+      338,  357,  357,  389,  307,  389,  389,  389,  389,  389,
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  389,
+      389,  389,  389,  389,  392,  306,  330,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392,  392,  329,
+      392,  327,  392,  396,  321,  396,  396,  396,  396,  324,
+      396,  396,  396,  396,  396,  396,  396,  396,  396,  396,
+      396,  396,  396,  396,  401,  401,  401,  401,  401,  401,
+      401,  401,  401,  401,  401,  401,  401,  401,  401,  321,
+
+      401,  320,  401,  401,  401,  404,  318,  404,  404,  404,
+      316,  404,  404,  404,  404,  404,  404,  404,  404,  404,
+      313,  315,  311,  404,  404,  404,  246,  310,  246,  308,
+      246,  246,  307,  306,  303,  246,  406,  301,  406,  406,
+      406,  406,  406,  406,  406,  406,  406,  406,  406,  406,
+      406,  406,  406,  406,  406,  406,  406,  407,  300,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  418,  418,
+      418,  418,  418,  418,  418,  418,  418,  418,  418,  418,
+      418,  418,  418,  418,  418,  418,  418,  418,  418,  263,
+
+      296,  263,  294,  263,  263,  293,  285,  273,  263,  422,
+      422,  422,  422,  422,  422,  422,  422,  422,  422,  422,
+      422,  422,  422,  422,  422,  422,  422,  422,  422,  422,
+      427,  272,  427,  427,  427,  427,  427,  427,  427,  427,
+      427,  427,  427,  427,  427,  427,  427,  271,  427,  427,
+      427,  274,  265,  274,  274,  274,  274,  274,  274,  274,
+      274,  274,  274,  274,  274,  274,  274,  274,  274,  274,
+      274,  274,  437,  262,  437,  248,  437,  437,  244, 1113,
+      117,  437,  117,  437,  442, 1113,  442,  442,  442,  442,
+      442,  442,  442,  442,  442,  442,  442,  442,  442,  442,
+
+      442,  442,  442,  442,  442,  295, 1113,  295,  295,  295,
+      295,  295,  295,  295,  295,  295,  295,  295,  295,  295,
+      295,  295,  295,  295,  295,  295,  444, 1113,  444,  444,
+      444,  444,  444,  444,  444,  444,  444,  444,  444,  444,
+      444,  444,  444,  444,  444,  444,  444,  445, 1113,  445,
+      445,  445,  445,  445,  445,  445,  445,  445,  445,  445,
+      445,  445,  445,  445,  445,  445,  445,  445,  299,  299,
+      299,  299,  299,  299,  299,  299,  299,  299,  299,  299,
+      299,  299,  299, 1113,  299, 1113,  299,  299,  299,  302,
+     1113,  302,  302, 1113,  302,  302,  302,  302,  302,  302,
+
+      302,  302,  302,  302, 1113,  302, 1113,  302,  302,  302,
+      448,  448,  448,  448,  448,  448,  448,  448,  448,  448,
+      448,  448,  448,  448,  448,  448,  448,  448,  448,  448,
+      448,  309, 1113, 1113,  309,  309,  309,  309,  309,  309,
+      309,  309,  309,  309,  309,  309,  309,  309,  309,  309,
+      309,  309,  317, 1113,  317, 1113,  317,  317, 1113, 1113,
+     1113,  317,  326, 1113,  326, 1113,  326, 1113,  326,  326,
+      326,  326, 1113,  326,  326, 1113, 1113, 1113,  326,  328,
+     1113,  328,  328,  328,  328,  328,  328,  328,  328,  328,
+      328,  328,  328,  328,  328,  328,  328,  328,  328,  328,
+
+      331, 1113,  331, 1113,  331,  331, 1113, 1113, 1113,  331,
+      334,  334,  334,  334,  334,  334,  334,  334,  334,  334,
+      334,  334,  334,  334,  334,  334,  334,  334,  334,  334,
+      334,  337, 1113,  337,  337,  337,  337,  337, 1113,  337,
+      337,  337,  337,  337,  337,  337, 1113,  337, 1113,  337,
+      337,  337,  340, 1113,  340, 1113,  340,  340,  340,  340,
+      340,  340,  340,  340,  340,  340,  340, 1113, 1113, 1113,
+      340,  340,  340,  468, 1113,  468,  468,  468,  468,  468,
+      468,  468,  468,  468,  468,  468,  468,  468,  468,  468,
+      468,  468,  468,  468,  353, 1113,  353,  353,  353,  353,
+
+      353,  353,  353,  353,  353,  353,  353,  353,  353,  353,
+      353,  353,  353,  353,  353,  357,  357, 1113, 1113, 1113,
+      357,  357,  389, 1113,  389,  389,  389,  389,  389,  389,
+      389,  389,  389,  389,  389,  389,  389,  389,  389,  389,
+      389,  389,  389,  392, 1113, 1113,  392,  392,  392,  392,
+      392,  392,  392,  392,  392,  392,  392,  392, 1113,  392,
+     1113,  392,  396, 1113,  396,  396,  396,  396, 1113,  396,
+      396,  396,  396,  396,  396,  396,  396,  396,  396,  396,
+      396,  396,  396,  401,  401,  401,  401,  401,  401,  401,
+      401,  401,  401,  401,  401,  401,  401,  401, 1113,  401,
+
+     1113,  401,  401,  401,  404, 1113,  404,  404,  404, 1113,
+      404,  404,  404,  404,  404,  404,  404,  404,  404, 1113,
+     1113, 1113,  404,  404,  404,  406, 1113,  406,  406,  406,
+      406,  406,  406,  406,  406,  406,  406,  406,  406,  406,
+      406,  406,  406,  406,  406,  406,  407, 1113,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  407,  407,  407,
+      407,  407,  407,  407,  407,  407,  407,  521,  521,  521,
+      521,  521,  521,  521,  521,  521,  521,  521,  521,  521,
+      521,  521,  521,  521,  521,  521,  521,  521,  530, 1113,
+      530, 1113,  530,  530, 1113, 1113, 1113,  530,  532, 1113,
+
+      532, 1113,  532,  532, 1113, 1113, 1113,  532,  418,  418,
+      418,  418,  418,  418,  418,  418,  418,  418,  418,  418,
+      418,  418,  418,  418,  418,  418,  418,  418,  418,  422,
+      422,  422,  422,  422,  422,  422,  422,  422,  422,  422,
+      422,  422,  422,  422,  422,  422,  422,  422,  422,  422,
+      427, 1113,  427,  427,  427,  427,  427,  427,  427,  427,
+      427,  427,  427,  427,  427,  427,  427, 1113,  427,  427,
+      427,  437, 1113,  437, 1113,  437,  437, 1113, 1113, 1113,
+      437, 1113,  437,  442, 1113,  442,  442,  442,  442,  442,
+      442,  442,  442,  442,  442,  442,  442,  442,  442,  442,
+
+      442,  442,  442,  442,  444, 1113,  444,  444,  444,  444,
+      444,  444,  444,  444,  444,  444,  444,  444,  444,  444,
+      444,  444,  444,  444,  444,  445, 1113,  445,  445,  445,
+      445,  445,  445,  445,  445,  445,  445,  445,  445,  445,
+      445,  445,  445,  445,  445,  445,  302, 1113,  302,  302,
+     1113,  302,  302,  302,  302,  302,  302,  302,  302,  302,
+      302, 1113,  302, 1113,  302,  302,  302,  448,  448,  448,
+      448,  448,  448,  448,  448,  448,  448,  448,  448,  448,
+      448,  448,  448,  448,  448,  448,  448,  448,  331, 1113,
+      331, 1113,  331,  331, 1113, 1113, 1113,  331,  342, 1113,
+
+      342,  342,  342,  342,  342,  342,  342,  342,  342,  342,
+      342,  342,  342,  342,  342,  342,  342,  342,  342,  468,
+     1113,  468,  468,  468,  468,  468,  468,  468,  468,  468,
+      468,  468,  468,  468,  468,  468,  468,  468,  468,  468,
+      357,  357, 1113, 1113, 1113,  357,  357,  630, 1113,  630,
+      630,  630,  630,  630,  630,  630,  630,  630,  630,  630,
+      630,  630,  630,  630,  630,  630,  630,  630,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  800,
+      800,  800,  800,  800,  800,  800,  800,  800,  800,  938,
+      938,  938,  938,  938,  938,  938,  938,  938,  938,  938,
+
+      938,  938,  938,  938,  938,  938,  938,  938,  938,  938,
+       55, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113
+
+    } ;
+
+static const flex_int16_t yy_chk[4596] =
+    {   0,
+        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,
+        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,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
+        1,    1,    1,    1,    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,    3,    3,
+      102,    3,    3,    5,    3,    5, 1012,    3,    3,    3,
+        3,   79,   79,    3,    3,    6,    6,    7,    6,    7,
+        3,   21,    6,    3,    8,  132,    8,   11,   11,  102,
+
+       11,   12,   12,  964,   12,   19,   85,   19,   19,   27,
+       28,   27,   28,   17,   20,   17,   20,   20,  148,    3,
+        3,   51,    9,   51,    9,   17,  537,   22,    9,   17,
+       17,   17,   17,   10,  132,   10,   29,  963,   29,   10,
+      176,   21,   21,   47,   21,   47,   29,  148,    3,    3,
+        3,    4,    4,   47,    4,    4,   19,    4,    4,  537,
+        4,    4,    4,    4,    9,   20,    4,    4,   23,  176,
+       23,    9,    9,    4,    9,   10,    4,   22,   22,   85,
+       22,   23,   10,   10,  962,   10,   29,  199,   29,   45,
+       52,   45,   52,    9,   17,   93,   37,   93,   45,   37,
+
+        9,  961,    4,    4,   10,    4,   38,  960,   46,   38,
+       46,   10,   37,   37,   37,   37,  199,   46,   23,   23,
+       23,  959,   38,   38,   38,   38,   57,   57,  153,   57,
+      153,    4,    4,    4,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+
+       13,   13,   13,   13,   13,   13,   13,   13,   13,   13,
+       13,   13,   13,   13,   13,   13,   13,   13,   18,   24,
+       18,   24,  155,   30,  155,   30,   31,  202,   31,   31,
+       18,   64,   24,   30,   18,   18,   18,   18,   32,   43,
+       32,   32,   53,   48,   53,   48,  167,   61,   61,   53,
+       61,  101,   43,   48,   73,   73,  202,   73,   81,  261,
+       81,  261,   43,   81,   81,   81,   81,   43,   64,   24,
+       24,   24,  170,   30,  958,   30,   31,   31,   31,  170,
+      957,  101,   43,  111,  111,  268,  111,  268,   32,   32,
+       32,   43,   53,   53,   53,  956,   43,  167,   64,   18,
+
+       25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+       25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+       25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+       25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+       25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+       25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+       25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+       25,   25,   25,   25,   25,   25,   25,   25,   25,   25,
+       25,   25,   25,   25,   33,   33,   39,   33,   39,   34,
+       34,   33,   34,  147,   41,   42,   34,   49,   44,   49,
+
+       33,   41,   42,  175,  308,   34,  308,   49,  274,  274,
+       50,   44,   50,  184,   41,   42,  122,  122,  122,  122,
+       50,   44,  185,  147,   41,   42,   44,   33,  207,   41,
+       42,  955,   34,  175,   33,   33,   39,   33,   39,   34,
+       34,   44,   34,  184,   41,   42,  334,   49,  334,   49,
+       44,  954,  185,   41,   42,   44,   33,  207,   41,   42,
+       50,   34,   50,   33,  336,   39,  336,   39,   34,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
+
+       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
+       35,   35,   35,   35,   35,   35,   35,   35,   35,   35,
+       35,   35,   35,   40,  634,   40,   54,  189,   54,   69,
+       69,  188,   69,   54,   80,   80,   69,   82,   82,  188,
+       82,  189,  128,  128,   82,  278,  278,  131,  131,  953,
+      138,  138,  359,   82,  187,  190,  194,  634,  195,   82,
+      187,  188,  191,  201,  196,  345,   80,  192,  196,  188,
+
+      952,  189,  345,   40,  128,   40,   54,   54,   54,  131,
+      897,  359,  138,  191,  187,  190,  194,  192,  195,  187,
+      198,   82,  191,  201,  196,   80,  896,  192,  196,  203,
+      198,  204,   40,  128,   40,   65,  243,  243,  131,  243,
+       69,  138,  191,  250,  205,  197,  192,  361,   82,  197,
+      198,  206,  251,  200,   65,  259,   65,  273,   65,  203,
+      198,  204,  895,  200,   65,  894,  200,   65,   65,   65,
+      893,   65,   65,   65,  205,  197,  361,   65,  892,  197,
+      250,  206,  251,  200,   65,  259,   65,  273,   65,  211,
+      211,  211,  211,  200,   65,  200,  891,   65,   65,   65,
+
+       65,   65,   65,  890,  247,  247,   65,  247,   65,  889,
+      250,  254,  254,  888,  254,  255,  255,  887,  255,  256,
+      256,  363,  256,  257,  257,  275,  257,  293,  254,  254,
+      254,  254,  255,  255,  255,  255,  256,  256,  256,  256,
+      257,  257,  257,  257,  264,  264,  304,  264,  276,  276,
+      363,  264,  305,  886,  254,  275,  275,  293,  312,  312,
+      256,  312,  332,  257,  885,  284,  284,  884,  284,  333,
+      349,  350,  284,  355,  356,  358,  304,  883,  365,  366,
+      276,  284,  305,  254,  367,  360,  368,  284,  371,  358,
+      256,  369,  332,  257,  319,  319,  319,  319,  372,  333,
+
+      349,  350,  360,  355,  356,  358,  364,  365,  366,  276,
+      364,  373,  381,  367,  374,  360,  368,  371,  358,  284,
+      418,  369,  418,  882,  420,  264,  420,  422,  372,  422,
+      881,  360,  391,  391,  391,  391,  364,  424,  880,  424,
+      364,  373,  381,  374,  376,  378,  284,  321,  321,  321,
+      321,  321,  321,  321,  321,  321,  321,  321,  321,  321,
+      321,  321,  321,  321,  321,  321,  321,  321,  321,  321,
+      321,  321,  370,  376,  378,  321,  370,  321,  321,  321,
+      321,  321,  321,  321,  321,  321,  321,  321,  321,  321,
+      321,  321,  321,  321,  321,  321,  321,  321,  321,  321,
+
+      321,  379,  370,  380,  383,  370,  382,  383,  384,  385,
+      382,  879,  386,  380,  387,  382,  385,  878,  405,  427,
+      427,  412,  413,  433,  433,  448,  414,  448,  639,  639,
+      379,  416,  426,  380,  383,  877,  382,  383,  384,  385,
+      382,  386,  380,  387,  531,  382,  385,  388,  405,  388,
+      412,  413,  388,  388,  408,  408,  414,  408,  388,  388,
+      428,  416,  426,  876,  388,  388,  875,  411,  411,  388,
+      411,  408,  408,  408,  408,  441,  388,  388,  443,  388,
+      429,  429,  388,  388,  411,  411,  411,  411,  388,  388,
+      428,  428,  446,  388,  388,  431,  431,  447,  388,  438,
+
+      438,  438,  438,  464,  450,  441,  450,  465,  443,  469,
+      470,  521,  429,  521,  871,  471,  429,  524,  870,  524,
+      526,  526,  446,  526,  531,  818,  625,  447,  625,  431,
+      431,  626,  626,  464,  626,  632,  632,  465,  632,  469,
+      470,  429,  430,  430,  471,  430,  430,  430,  430,  430,
+      430,  430,  430,  430,  430,  430,  430,  430,  430,  430,
+      430,  430,  430,  430,  430,  430,  430,  430,  430,  430,
+      430,  430,  430,  430,  430,  430,  430,  430,  430,  430,
+      430,  430,  430,  430,  430,  430,  430,  430,  430,  430,
+      430,  430,  430,  430,  430,  430,  817,  430,  430,  430,
+
+      430,  430,  430,  430,  430,  430,  430,  430,  430,  430,
+      430,  430,  430,  430,  430,  430,  430,  430,  430,  430,
+      430,  430,  430,  430,  430,  430,  432,  432,  432,  432,
+      451,  452,  453,  457,  456,  432,  432,  432,  432,  432,
+      432,  454,  459,  460,  472,  461,  451,  452,  473,  458,
+      453,  474,  457,  461,  454,  816,  456,  475,  476,  477,
+      432,  432,  459,  460,  478,  432,  432,  432,  432,  432,
+      432,  458,  480,  472,  458,  482,  451,  452,  473,  481,
+      453,  474,  457,  461,  454,  456,  486,  475,  476,  477,
+      484,  487,  459,  460,  478,  815,  485,  488,  489,  814,
+
+      458,  491,  480,  458,  462,  482,  492,  493,  481,  462,
+      462,  462,  462,  494,  495,  462,  486,  496,  497,  484,
+      462,  487,  498,  499,  462,  485,  488,  462,  489,  462,
+      500,  491,  462,  501,  502,  503,  492,  493,  505,  462,
+      462,  462,  462,  494,  495,  462,  506,  496,  497,  504,
+      462,  507,  498,  499,  462,  504,  462,  508,  462,  509,
+      500,  462,  510,  501,  502,  503,  511,  513,  505,  512,
+      514,  515,  516,  517,  519,  506,  518,  519,  519,  504,
+      507,  520,  638,  638,  638,  504,  546,  508,  527,  509,
+      528,  529,  510,  533,  543,  544,  511,  513,  512,  813,
+
+      514,  515,  516,  517,  519,  518,  519,  519,  631,  522,
+      522,  520,  522,  525,  525,  546,  525,  719,  527,  719,
+      528,  529,  812,  533,  543,  544,  522,  522,  522,  522,
+      525,  525,  525,  525,  534,  534,  811,  534,  534,  534,
+      534,  534,  534,  534,  534,  534,  534,  534,  534,  534,
+      534,  534,  534,  534,  534,  534,  534,  534,  534,  534,
+      534,  534,  534,  534,  534,  534,  534,  534,  534,  534,
+      534,  534,  534,  534,  534,  534,  534,  534,  534,  534,
+      534,  534,  534,  534,  534,  534,  534,  534,  631,  534,
+      534,  534,  534,  534,  534,  534,  534,  534,  534,  534,
+
+      534,  534,  534,  534,  534,  534,  534,  534,  534,  534,
+      534,  534,  534,  534,  534,  534,  534,  534,  535,  535,
+      545,  548,  550,  810,  539,  539,  549,  552,  557,  551,
+      554,  549,  552,  553,  809,  559,  558,  640,  640,  548,
+      551,  548,  556,  554,  727,  727,  550,  556,  557,  558,
+      545,  559,  535,  535,  536,  536,  536,  536,  539,  539,
+      553,  549,  552,  536,  536,  536,  536,  536,  536,  548,
+      551,  548,  555,  554,  562,  550,  560,  556,  557,  558,
+      800,  559,  800,  563,  569,  561,  566,  562,  564,  553,
+      555,  571,  560,  536,  536,  536,  536,  536,  536,  540,
+
+      540,  540,  540,  561,  565,  563,  566,  564,  540,  540,
+      540,  540,  540,  540,  569,  567,  568,  562,  570,  572,
+      555,  571,  560,  575,  568,  808,  565,  576,  577,  565,
+      578,  579,  580,  561,  563,  567,  566,  564,  540,  540,
+      540,  540,  540,  540,  582,  584,  581,  570,  572,  583,
+      587,  806,  588,  575,  568,  565,  576,  577,  565,  578,
+      589,  579,  580,  581,  590,  567,  594,  595,  599,  581,
+      799,  597,  598,  601,  582,  584,  602,  603,  583,  604,
+      587,  588,  605,  606,  796,  607,  608,  609,  611,  589,
+      612,  613,  615,  581,  590,  594,  614,  595,  599,  581,
+
+      597,  598,  601,  616,  617,  619,  602,  603,  618,  604,
+      620,  605,  621,  606,  607,  608,  620,  609,  611,  622,
+      612,  613,  615,  627,  628,  614,  629,  636,  636,  641,
+      651,  643,  616,  646,  617,  619,  647,  618,  644,  784,
+      620,  669,  621,  650,  652,  620,  770,  660,  647,  622,
+      651,  648,  627,  652,  628,  629,  650,  649,  646,  641,
+      643,  636,  636,  637,  637,  637,  637,  653,  644,  648,
+      669,  660,  637,  637,  637,  637,  637,  637,  647,  649,
+      651,  654,  655,  652,  656,  653,  650,  646,  654,  655,
+      657,  658,  659,  656,  728,  728,  665,  659,  663,  648,
+
+      660,  657,  637,  637,  637,  637,  637,  637,  649,  658,
+      661,  658,  662,  664,  665,  653,  667,  662,  654,  655,
+      668,  661,  670,  656,  666,  663,  664,  659,  671,  666,
+      672,  657,  674,  668,  676,  679,  667,  761,  680,  658,
+      681,  658,  683,  687,  665,  679,  685,  662,  688,  689,
+      691,  661,  670,  692,  663,  693,  664,  671,  695,  666,
+      672,  674,  696,  668,  676,  679,  667,  680,  697,  699,
+      681,  700,  683,  687,  679,  685,  701,  702,  688,  689,
+      691,  704,  692,  705,  707,  693,  706,  695,  709,  710,
+      711,  696,  713,  714,  733,  715,  716,  697,  717,  699,
+
+      700,  720,  721,  722,  722,  701,  722,  702,  730,  736,
+      704,  733,  734,  705,  707,  706,  737,  734,  709,  710,
+      711,  735,  713,  714,  715,  736,  716,  739,  717,  740,
+      738,  720,  721,  726,  726,  726,  735,  741,  743,  745,
+      737,  733,  738,  744,  747,  742,  746,  734,  748,  739,
+      729,  750,  749,  740,  742,  736,  744,  752,  746,  751,
+      743,  741,  747,  725,  745,  749,  735,  753,  751,  737,
+      748,  750,  738,  754,  753,  752,  755,  763,  739,  764,
+      754,  765,  740,  756,  742,  755,  744,  763,  746,  743,
+      741,  766,  747,  745,  756,  749,  767,  768,  751,  748,
+
+      769,  750,  771,  772,  753,  752,  773,  763,  774,  764,
+      754,  765,  775,  776,  778,  755,  777,  763,  780,  724,
+      782,  766,  786,  787,  756,  767,  768,  788,  791,  769,
+      793,  797,  771,  772,  718,  798,  773,  802,  774,  802,
+      804,  712,  775,  776,  778,  777,  790,  790,  780,  782,
+      820,  790,  786,  787,  790,  819,  788,  790,  791,  708,
+      793,  797,  790,  794,  794,  798,  823,  820,  794,  804,
+      821,  794,  824,  822,  794,  821,  790,  790,  825,  819,
+      826,  790,  823,  827,  790,  828,  831,  790,  822,  830,
+      825,  790,  832,  794,  794,  833,  824,  820,  794,  831,
+
+      834,  794,  826,  835,  794,  821,  829,  827,  819,  828,
+      838,  830,  823,  836,  841,  829,  694,  840,  822,  842,
+      825,  843,  832,  844,  833,  824,  845,  847,  849,  831,
+      834,  826,  835,  850,  852,  856,  827,  857,  828,  838,
+      830,  858,  690,  836,  841,  829,  840,  860,  842,  865,
+      852,  843,  844,  861,  862,  859,  845,  847,  849,  859,
+      863,  864,  859,  850,  852,  856,  857,  866,  684,  868,
+      869,  858,  859,  872,  867,  678,  860,  867,  865,  852,
+      873,  898,  873,  861,  862,  859,  903,  867,  899,  859,
+      863,  864,  859,  900,  901,  902,  905,  866,  868,  869,
+
+      906,  859,  872,  907,  867,  898,  908,  867,  910,  911,
+      912,  642,  913,  914,  915,  903,  867,  916,  899,  917,
+      919,  920,  921,  900,  901,  902,  905,  922,  635,  923,
+      906,  924,  926,  907,  898,  927,  908,  910,  928,  911,
+      912,  913,  930,  914,  915,  931,  932,  916,  917,  933,
+      919,  920,  921,  934,  935,  937,  936,  922,  923,  938,
+      924,  938,  926,  965,  940,  927,  940,  928,  966,  967,
+      968,  969,  930,  936,  970,  931,  932,  971,  933,  972,
+      973,  974,  934,  935,  937,  975,  936,  976,  978,  633,
+      979,  980,  965,  981,  982,  983,  984,  985,  966,  967,
+
+      968,  969,  936,  987,  970,  989,  990,  971,  972,  973,
+      991,  974,  992,  993,  975,  995,  999,  976,  978,  979,
+      980,  996,  981,  998,  982,  983,  984,  985, 1015,  997,
+     1013, 1014,  987,  997,  989,  990, 1016, 1017, 1019, 1020,
+      991, 1022,  992,  993, 1023,  995,  999, 1024, 1025, 1026,
+      996, 1027,  998, 1028, 1030, 1034, 1035, 1015,  997, 1036,
+     1013, 1014,  997, 1039, 1040, 1016, 1017, 1041, 1019, 1020,
+     1022, 1042, 1043, 1023, 1044, 1046, 1047, 1024, 1025, 1026,
+     1048, 1027, 1049, 1028, 1030, 1034, 1035, 1050, 1053, 1036,
+     1055, 1057, 1039, 1060, 1040, 1063, 1064, 1041, 1065, 1066,
+
+     1042, 1043, 1067, 1044, 1046, 1068, 1047, 1069, 1070, 1072,
+     1048, 1073, 1049, 1074, 1075,  623, 1077, 1050, 1053, 1055,
+     1081, 1057, 1082, 1060, 1083, 1063, 1064, 1065, 1084, 1066,
+     1086, 1087, 1067, 1088, 1089, 1068, 1090, 1069, 1070, 1072,
+     1073, 1093, 1074, 1095, 1075, 1077, 1096, 1097, 1098, 1100,
+     1081, 1103, 1082, 1083, 1105,  596, 1106, 1107, 1084, 1109,
+     1086, 1087, 1110, 1088, 1089, 1090, 1157, 1157,  593, 1173,
+     1093, 1173, 1206, 1095, 1206, 1096, 1097, 1098,  547, 1100,
+      538, 1103, 1166, 1166, 1105, 1106, 1107, 1166,  490, 1109,
+      467,  466, 1110, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
+
+     1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114, 1114,
+     1114, 1114, 1114, 1114, 1115, 1115, 1115, 1115, 1115, 1115,
+     1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115, 1115,
+     1115, 1115, 1115, 1115, 1115, 1116, 1116, 1116, 1116, 1116,
+     1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116, 1116,
+     1116, 1116, 1116, 1116, 1116, 1116, 1117, 1117, 1117, 1117,
+     1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117, 1117,
+     1117, 1117, 1117, 1117, 1117, 1117, 1117, 1118, 1118, 1118,
+     1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118,
+     1118, 1118, 1118, 1118, 1118, 1118, 1118, 1118, 1119, 1119,
+
+     1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119,
+     1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1119, 1120,
+     1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+     1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120, 1120,
+     1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121,
+     1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121, 1121,
+     1121, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122,
+     1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122, 1122,
+     1122, 1122, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123,
+     1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123, 1123,
+
+     1123, 1123, 1123, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+     1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124, 1124,
+     1124, 1124, 1124, 1124, 1125, 1125, 1125, 1125, 1125, 1125,
+     1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125, 1125,
+     1125, 1125, 1125, 1125, 1125, 1126, 1126, 1126, 1126, 1126,
+     1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126, 1126,
+     1126, 1126, 1126, 1126, 1126, 1126, 1127, 1127, 1127, 1127,
+     1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127, 1127,
+     1127, 1127, 1127, 1127, 1127, 1127, 1127, 1128, 1128, 1128,
+     1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128,
+
+     1128, 1128, 1128, 1128, 1128, 1128, 1128, 1128, 1129, 1129,
+     1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129,
+     1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1129, 1130,
+     1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130,
+     1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130, 1130,
+     1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131,
+     1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131, 1131,
+     1131, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
+     1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132, 1132,
+     1132, 1132, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133,
+
+     1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133, 1133,
+     1133, 1133, 1133, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+     1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134, 1134,
+     1134, 1134, 1134, 1134, 1135,  455, 1135,  437, 1135, 1135,
+     1213, 1213, 1213, 1135, 1136, 1136, 1136, 1136, 1136, 1136,
+     1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136, 1136,
+     1136, 1136, 1136, 1136, 1137,  410, 1137,  389, 1137, 1137,
+     1167, 1167,  362, 1137, 1138, 1167, 1138, 1138, 1138, 1138,
+     1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138, 1138,
+     1138, 1138, 1138, 1138, 1138, 1139,  353, 1139, 1139, 1139,
+
+     1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139, 1139,
+     1139, 1139, 1139, 1139, 1139, 1139, 1140, 1140,  351, 1140,
+      346, 1140, 1140,  344,  343,  328, 1140, 1141,  315, 1141,
+     1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141,
+     1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1142, 1142,
+     1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142, 1142,
+     1142, 1142, 1142,  314, 1142,  313, 1142, 1142, 1142, 1143,
+      310, 1143, 1143,  296, 1143, 1143, 1143, 1143, 1143, 1143,
+     1143, 1143, 1143, 1143,  289, 1143,  288, 1143, 1143, 1143,
+     1144,  287,  286, 1144, 1144, 1144, 1144, 1144, 1144, 1144,
+
+     1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144, 1144,
+     1144, 1145,  283, 1145,  281, 1145, 1145,  280,  271,  270,
+     1145, 1146,  267, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+     1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146, 1146,
+     1146, 1146, 1147,  266, 1147, 1147, 1147, 1147, 1147, 1147,
+     1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147,  249,
+     1147, 1147, 1147, 1148,  245, 1148,  241, 1148,  239, 1148,
+     1148, 1148, 1148,  238, 1148, 1148,  236,  235,  234, 1148,
+     1149,  230, 1149, 1149, 1149,  216, 1149, 1149, 1149, 1149,
+     1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149,
+
+     1149, 1150,  215, 1150,  214, 1150, 1150,  210,  183,  182,
+     1150, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
+     1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151, 1151,
+     1151, 1151, 1152,  180, 1152, 1152, 1152, 1152, 1152,  178,
+     1152, 1152, 1152, 1152, 1152, 1152, 1152,  177, 1152,  174,
+     1152, 1152, 1152, 1153,  173, 1153,  172, 1153, 1153, 1153,
+     1153, 1153, 1153, 1153, 1153, 1153, 1153, 1153,  168,  166,
+      164, 1153, 1153, 1153, 1154, 1154, 1154, 1154, 1154, 1154,
+     1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154, 1154,
+     1154, 1154, 1154, 1154, 1154, 1155,  161, 1155, 1155, 1155,
+
+     1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155, 1155,
+     1155, 1155, 1155, 1155, 1155, 1155, 1156, 1156,  160,  159,
+      158, 1156, 1156, 1158,  150, 1158, 1158, 1158, 1158, 1158,
+     1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158, 1158,
+     1158, 1158, 1158, 1158, 1159,  149,  145, 1159, 1159, 1159,
+     1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159, 1159,  144,
+     1159,  142, 1159, 1160,  137, 1160, 1160, 1160, 1160,  135,
+     1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160, 1160,
+     1160, 1160, 1160, 1160, 1161, 1161, 1161, 1161, 1161, 1161,
+     1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161, 1161,  130,
+
+     1161,  126, 1161, 1161, 1161, 1162,  120, 1162, 1162, 1162,
+      115, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162, 1162,
+      113,  112,  109, 1162, 1162, 1162, 1163,  107, 1163,  105,
+     1163, 1163,  104,  103,   99, 1163, 1164,   96, 1164, 1164,
+     1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164, 1164,
+     1164, 1164, 1164, 1164, 1164, 1164, 1164, 1165,   95, 1165,
+     1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165,
+     1165, 1165, 1165, 1165, 1165, 1165, 1165, 1165, 1168, 1168,
+     1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168,
+     1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1168, 1169,
+
+       92, 1169,   90, 1169, 1169,   86,   84,   78, 1169, 1170,
+     1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170,
+     1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170, 1170,
+     1171,   77, 1171, 1171, 1171, 1171, 1171, 1171, 1171, 1171,
+     1171, 1171, 1171, 1171, 1171, 1171, 1171,   74, 1171, 1171,
+     1171, 1172,   71, 1172, 1172, 1172, 1172, 1172, 1172, 1172,
+     1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172, 1172,
+     1172, 1172, 1174,   66, 1174,   63, 1174, 1174,   59,   55,
+       16, 1174,   15, 1174, 1175,    0, 1175, 1175, 1175, 1175,
+     1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175, 1175,
+
+     1175, 1175, 1175, 1175, 1175, 1176,    0, 1176, 1176, 1176,
+     1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1176,
+     1176, 1176, 1176, 1176, 1176, 1176, 1177,    0, 1177, 1177,
+     1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177, 1177,
+     1177, 1177, 1177, 1177, 1177, 1177, 1177, 1178,    0, 1178,
+     1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178,
+     1178, 1178, 1178, 1178, 1178, 1178, 1178, 1178, 1179, 1179,
+     1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179, 1179,
+     1179, 1179, 1179,    0, 1179,    0, 1179, 1179, 1179, 1180,
+        0, 1180, 1180,    0, 1180, 1180, 1180, 1180, 1180, 1180,
+
+     1180, 1180, 1180, 1180,    0, 1180,    0, 1180, 1180, 1180,
+     1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181,
+     1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181, 1181,
+     1181, 1182,    0,    0, 1182, 1182, 1182, 1182, 1182, 1182,
+     1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182, 1182,
+     1182, 1182, 1183,    0, 1183,    0, 1183, 1183,    0,    0,
+        0, 1183, 1184,    0, 1184,    0, 1184,    0, 1184, 1184,
+     1184, 1184,    0, 1184, 1184,    0,    0,    0, 1184, 1185,
+        0, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185,
+     1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185, 1185,
+
+     1186,    0, 1186,    0, 1186, 1186,    0,    0,    0, 1186,
+     1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187,
+     1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187, 1187,
+     1187, 1188,    0, 1188, 1188, 1188, 1188, 1188,    0, 1188,
+     1188, 1188, 1188, 1188, 1188, 1188,    0, 1188,    0, 1188,
+     1188, 1188, 1189,    0, 1189,    0, 1189, 1189, 1189, 1189,
+     1189, 1189, 1189, 1189, 1189, 1189, 1189,    0,    0,    0,
+     1189, 1189, 1189, 1190,    0, 1190, 1190, 1190, 1190, 1190,
+     1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190, 1190,
+     1190, 1190, 1190, 1190, 1191,    0, 1191, 1191, 1191, 1191,
+
+     1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191, 1191,
+     1191, 1191, 1191, 1191, 1191, 1192, 1192,    0,    0,    0,
+     1192, 1192, 1193,    0, 1193, 1193, 1193, 1193, 1193, 1193,
+     1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193, 1193,
+     1193, 1193, 1193, 1194,    0,    0, 1194, 1194, 1194, 1194,
+     1194, 1194, 1194, 1194, 1194, 1194, 1194, 1194,    0, 1194,
+        0, 1194, 1195,    0, 1195, 1195, 1195, 1195,    0, 1195,
+     1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195, 1195,
+     1195, 1195, 1195, 1196, 1196, 1196, 1196, 1196, 1196, 1196,
+     1196, 1196, 1196, 1196, 1196, 1196, 1196, 1196,    0, 1196,
+
+        0, 1196, 1196, 1196, 1197,    0, 1197, 1197, 1197,    0,
+     1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197, 1197,    0,
+        0,    0, 1197, 1197, 1197, 1198,    0, 1198, 1198, 1198,
+     1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198, 1198,
+     1198, 1198, 1198, 1198, 1198, 1198, 1199,    0, 1199, 1199,
+     1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199, 1199,
+     1199, 1199, 1199, 1199, 1199, 1199, 1199, 1200, 1200, 1200,
+     1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200,
+     1200, 1200, 1200, 1200, 1200, 1200, 1200, 1200, 1201,    0,
+     1201,    0, 1201, 1201,    0,    0,    0, 1201, 1202,    0,
+
+     1202,    0, 1202, 1202,    0,    0,    0, 1202, 1203, 1203,
+     1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203,
+     1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1203, 1204,
+     1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204,
+     1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204, 1204,
+     1205,    0, 1205, 1205, 1205, 1205, 1205, 1205, 1205, 1205,
+     1205, 1205, 1205, 1205, 1205, 1205, 1205,    0, 1205, 1205,
+     1205, 1207,    0, 1207,    0, 1207, 1207,    0,    0,    0,
+     1207,    0, 1207, 1208,    0, 1208, 1208, 1208, 1208, 1208,
+     1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208, 1208,
+
+     1208, 1208, 1208, 1208, 1209,    0, 1209, 1209, 1209, 1209,
+     1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209, 1209,
+     1209, 1209, 1209, 1209, 1209, 1210,    0, 1210, 1210, 1210,
+     1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210, 1210,
+     1210, 1210, 1210, 1210, 1210, 1210, 1211,    0, 1211, 1211,
+        0, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211, 1211,
+     1211,    0, 1211,    0, 1211, 1211, 1211, 1212, 1212, 1212,
+     1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212,
+     1212, 1212, 1212, 1212, 1212, 1212, 1212, 1212, 1214,    0,
+     1214,    0, 1214, 1214,    0,    0,    0, 1214, 1215,    0,
+
+     1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215,
+     1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1215, 1216,
+        0, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216,
+     1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216, 1216,
+     1217, 1217,    0,    0,    0, 1217, 1217, 1218,    0, 1218,
+     1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218,
+     1218, 1218, 1218, 1218, 1218, 1218, 1218, 1218, 1219, 1219,
+     1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219,
+     1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1219, 1220,
+     1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220,
+
+     1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220, 1220,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113, 1113,
+     1113, 1113, 1113, 1113, 1113
+
+    } ;
+
+static yy_state_type yy_last_accepting_state;
+static char *yy_last_accepting_cpos;
+
+extern int yy_flex_debug;
+int yy_flex_debug = 0;
+
+/* The intent behind this definition is that it'll catch
+ * any uses of REJECT which flex missed.
+ */
+#define REJECT reject_used_but_not_detected
+#define yymore() yymore_used_but_not_detected
+#define YY_MORE_ADJ 0
+#define YY_RESTORE_YY_MORE_OFFSET
+char *yytext;
+#line 1 "tests/scan.l"
+/* scan.l - scanner for flex input -*-C-*- */
+#line 4 "tests/scan.l"
+/*  Copyright (c) 1990 The Regents of the University of California. */
+/*  All rights reserved. */
+
+/*  This code is derived from software contributed to Berkeley by */
+/*  Vern Paxson. */
+
+/*  The United States Government has rights in this work pursuant */
+/*  to contract no. DE-AC03-76SF00098 between the United States */
+/*  Department of Energy and the University of California. */
+
+/*  This file is part of flex. */
+
+/*  Redistribution and use in source and binary forms, with or without */
+/*  modification, are permitted provided that the following conditions */
+/*  are met: */
+
+/*  1. Redistributions of source code must retain the above copyright */
+/*     notice, this list of conditions and the following disclaimer. */
+/*  2. Redistributions in binary form must reproduce the above copyright */
+/*     notice, this list of conditions and the following disclaimer in the */
+/*     documentation and/or other materials provided with the distribution. */
+
+/*  Neither the name of the University nor the names of its contributors */
+/*  may be used to endorse or promote products derived from this software */
+/*  without specific prior written permission. */
+
+/*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
+/*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
+/*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
+/*  PURPOSE. */
+
+#include "flexdef.h"
+#include "parse.h"
+extern bool tablesverify, tablesext;
+extern int trlcontxt; /* Set in  parse.y for each rule. */
+extern const char *escaped_qstart, *escaped_qend;
+
+#define M4QSTART "[""["
+#define M4QEND "]""]"
+
+#define ESCAPED_QSTART "[" M4QEND M4QSTART "[" M4QEND M4QSTART
+#define ESCAPED_QEND M4QEND "]" M4QSTART M4QEND "]" M4QSTART
+
+#define ACTION_ECHO add_action( yytext )
+#define ACTION_IFDEF(def, should_define) \
+       { \
+       if ( should_define ) \
+               action_define( def, 1 ); \
+       }
+
+#define ACTION_ECHO_QSTART add_action (ESCAPED_QSTART)
+#define ACTION_ECHO_QEND   add_action (ESCAPED_QEND)
+
+#define ACTION_M4_IFDEF(def, should_define) \
+    do{ \
+        if ( should_define ) \
+            buf_m4_define( &m4defs_buf, def, NULL);\
+        else \
+            buf_m4_undefine( &m4defs_buf, def);\
+    } while(0)
+
+#define MARK_END_OF_PROLOG mark_prolog();
+
+#if 1
+#define YY_DECL \
+       static int real_flexscan(void)
+#else
+#define YY_DECL \
+       int flexscan(void)
+#endif
+
+#define RETURNCHAR \
+       yylval = (unsigned char) yytext[0]; \
+       return CHAR;
+
+#define RETURNNAME \
+       if(yyleng < MAXLINE) \
+         { \
+       strncpy( nmstr, yytext, sizeof(nmstr) ); \
+ piece_pack(); \
+ piece_append("<PLex_Name>"); \
+ piece_escape(yytext, strlen(yytext)); \
+ piece_append("</PLex_Name>"); \
+ piece_pack(); \
+ return ~NAME; \
+ /*    return NAME;*/ \
+        } \
+       else \
+        do { \
+          synerr(_("Input line too long\n")); \
+          FLEX_EXIT(EXIT_FAILURE);  \
+        } while (0)
+
+#define PUT_BACK_STRING(str, start) \
+       { size_t i = strlen( str );     \
+         while ( i > start )           \
+           unput((str)[--i]);          \
+       }
+
+#define CHECK_REJECT(str) \
+       if ( all_upper( str ) ) \
+               reject = true;
+
+#define CHECK_YYMORE(str) \
+       if ( all_lower( str ) ) \
+               yymore_used = true;
+
+#define YY_USER_INIT \
+       if ( getenv("POSIXLY_CORRECT") ) \
+               posix_compat = true;
+
+#define START_CODEBLOCK(x) do { \
+    /* Emit the needed line directive... */\
+    if (indented_code == false) { \
+        linenum++; \
+        line_directive_out(NULL, 1); \
+    } \
+    add_action(M4QSTART); \
+    yy_push_state(CODEBLOCK); \
+    if ((indented_code = x)) ACTION_ECHO; \
+ piece_append("<PLex_Section1Or2_CodeBlock>"); \
+} while(0)
+
+#define END_CODEBLOCK do { \
+    yy_pop_state();\
+    add_action(M4QEND); \
+    if (!indented_code) line_directive_out(NULL, 0);\
+ piece_append("</PLex_Section1Or2_CodeBlock>"); \
+} while (0)
+
+/* Nick */
+char piece_temp[100], *piece[10000];
+int piece0, piece1;
+
+void piece_append(const char *str);
+void piece_insert(int n, const char *str);
+void piece_escape(const char *p, size_t n);
+void piece_flush(size_t n);
+void piece_pack();
+
+static void markup_action(const char *text);
+static void markup_option(const char *name, int sense);
+
+#line 1991 "lex.yy.c"
+
+#line 1993 "lex.yy.c"
+
+#define INITIAL 0
+#define SECT2 1
+#define SECT2PROLOG 2
+#define SECT3 3
+#define CODEBLOCK 4
+#define PICKUPDEF 5
+#define SC 6
+#define CARETISBOL 7
+#define NUM 8
+#define QUOTE 9
+#define FIRSTCCL 10
+#define CCL 11
+#define ACTION 12
+#define RECOVER 13
+#define COMMENT 14
+#define ACTION_STRING 15
+#define PERCENT_BRACE_ACTION 16
+#define OPTION 17
+#define LINEDIR 18
+#define CODEBLOCK_MATCH_BRACE 19
+#define GROUP_WITH_PARAMS 20
+#define GROUP_MINUS_PARAMS 21
+#define EXTENDED_COMMENT 22
+#define COMMENT_DISCARD 23
+#define CODE_COMMENT 24
+#define SECT3_NOESCAPE 25
+#define CHARACTER_CONSTANT 26
+
+#ifndef YY_NO_UNISTD_H
+/* Special case for "unistd.h", since it is non-ANSI. We include it way
+ * down here because we want the user's section 1 to have been scanned first.
+ * The user has a chance to override it with an option.
+ */
+#include <unistd.h>
+#endif
+
+#ifndef YY_EXTRA_TYPE
+#define YY_EXTRA_TYPE void *
+#endif
+
+static int yy_init_globals ( void );
+
+/* Accessor methods to globals.
+   These are made visible to non-reentrant scanners for convenience. */
+
+int yylex_destroy ( void );
+
+int yyget_debug ( void );
+
+void yyset_debug ( int debug_flag  );
+
+YY_EXTRA_TYPE yyget_extra ( void );
+
+void yyset_extra ( YY_EXTRA_TYPE user_defined  );
+
+FILE *yyget_in ( void );
+
+void yyset_in  ( FILE * _in_str  );
+
+FILE *yyget_out ( void );
+
+void yyset_out  ( FILE * _out_str  );
+
+                       int yyget_leng ( void );
+
+char *yyget_text ( void );
+
+int yyget_lineno ( void );
+
+void yyset_lineno ( int _line_number  );
+
+/* Macros after this point can all be overridden by user definitions in
+ * section 1.
+ */
+
+#ifndef YY_SKIP_YYWRAP
+#ifdef __cplusplus
+extern "C" int yywrap ( void );
+#else
+extern int yywrap ( void );
+#endif
+#endif
+
+#ifndef YY_NO_UNPUT
+    
+    static void yyunput ( int c, char *buf_ptr  );
+    
+#endif
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy ( char *, const char *, int );
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen ( const char * );
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+static int yyinput ( void );
+#else
+static int input ( void );
+#endif
+
+#endif
+
+        static int yy_start_stack_ptr = 0;
+        static int yy_start_stack_depth = 0;
+        static int *yy_start_stack = NULL;
+    
+    static void yy_push_state ( int _new_state );
+    
+    static void yy_pop_state ( void );
+    
+/* Amount of stuff to slurp up with each read. */
+#ifndef YY_READ_BUF_SIZE
+#ifdef __ia64__
+/* On IA-64, the buffer size is 16k, not 8k */
+#define YY_READ_BUF_SIZE 16384
+#else
+#define YY_READ_BUF_SIZE 8192
+#endif /* __ia64__ */
+#endif
+
+/* Copy whatever the last rule matched to the standard output. */
+#ifndef ECHO
+/* This used to be an fputs(), but since the string might contain NUL's,
+ * we now use fwrite().
+ */
+#define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0)
+#endif
+
+/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
+ * is returned in "result".
+ */
+#ifndef YY_INPUT
+#define YY_INPUT(buf,result,max_size) \
+       if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
+               { \
+               int c = '*'; \
+               int n; \
+               for ( n = 0; n < max_size && \
+                            (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
+                       buf[n] = (char) c; \
+               if ( c == '\n' ) \
+                       buf[n++] = (char) c; \
+               if ( c == EOF && ferror( yyin ) ) \
+                       YY_FATAL_ERROR( "input in flex scanner failed" ); \
+               result = n; \
+               } \
+       else \
+               { \
+               errno=0; \
+               while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \
+                       { \
+                       if( errno != EINTR) \
+                               { \
+                               YY_FATAL_ERROR( "input in flex scanner failed" ); \
+                               break; \
+                               } \
+                       errno=0; \
+                       clearerr(yyin); \
+                       } \
+               }\
+\
+
+#endif
+
+/* No semi-colon after return; correct usage is to write "yyterminate();" -
+ * we don't want an extra ';' after the "return" because that will cause
+ * some compilers to complain about unreachable statements.
+ */
+#ifndef yyterminate
+#define yyterminate() return YY_NULL
+#endif
+
+/* Number of entries by which start-condition stack grows. */
+#ifndef YY_START_STACK_INCR
+#define YY_START_STACK_INCR 25
+#endif
+
+/* Report a fatal error. */
+#ifndef YY_FATAL_ERROR
+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg )
+#endif
+
+/* end tables serialization structures and prototypes */
+
+/* Default declaration of generated scanner - a define so the user can
+ * easily add parameters.
+ */
+#ifndef YY_DECL
+#define YY_DECL_IS_OURS 1
+
+extern int yylex (void);
+
+#define YY_DECL int yylex (void)
+#endif /* !YY_DECL */
+
+/* Code executed at the beginning of each rule, after yytext and yyleng
+ * have been set up.
+ */
+#ifndef YY_USER_ACTION
+#define YY_USER_ACTION
+#endif
+
+/* Code executed at the end of each rule. */
+#ifndef YY_BREAK
+#define YY_BREAK /*LINTED*/break;
+#endif
+
+#define YY_RULE_SETUP \
+       if ( yyleng > 0 ) \
+               YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \
+                               (yytext[yyleng - 1] == '\n'); \
+       YY_USER_ACTION
+
+/** The main scanner function which does all the work.
+ */
+YY_DECL
+{
+       yy_state_type yy_current_state;
+       char *yy_cp, *yy_bp;
+       int yy_act;
+    
+       if ( !(yy_init) )
+               {
+               (yy_init) = 1;
+
+#ifdef YY_USER_INIT
+               YY_USER_INIT;
+#endif
+
+               if ( ! (yy_start) )
+                       (yy_start) = 1; /* first start state */
+
+               if ( ! yyin )
+                       yyin = stdin;
+
+               if ( ! yyout )
+                       yyout = stdout;
+
+               if ( ! YY_CURRENT_BUFFER ) {
+                       yyensure_buffer_stack ();
+                       YY_CURRENT_BUFFER_LVALUE =
+                               yy_create_buffer( yyin, YY_BUF_SIZE );
+               }
+
+               yy_load_buffer_state(  );
+               }
+
+       {
+#line 184 "tests/scan.l"
+
+#line 186 "tests/scan.l"
+       static int bracelevel, didadef, indented_code;
+       static int doing_rule_action = false;
+       static int option_sense;
+
+       int doing_codeblock = false;
+       int brace_depth=0, brace_start_line=0;
+       char nmdef[MAXLINE];
+
+
+#line 2259 "lex.yy.c"
+
+       while ( /*CONSTCOND*/1 )                /* loops until end-of-file is reached */
+               {
+               yy_cp = (yy_c_buf_p);
+
+               /* Support of yytext. */
+               *yy_cp = (yy_hold_char);
+
+               /* yy_bp points to the position in yy_ch_buf of the start of
+                * the current run.
+                */
+               yy_bp = yy_cp;
+
+               yy_current_state = (yy_start);
+               yy_current_state += YY_AT_BOL();
+yy_match:
+               do
+                       {
+                       int yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
+                       if ( yy_accept[yy_current_state] )
+                               {
+                               (yy_last_accepting_state) = yy_current_state;
+                               (yy_last_accepting_cpos) = yy_cp;
+                               }
+                       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                               {
+                               yy_current_state = (int) yy_def[yy_current_state];
+                               if ( yy_current_state >= 1114 )
+                                       yy_c = yy_meta[yy_c];
+                               }
+                       yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+                       ++yy_cp;
+                       }
+               while ( yy_base[yy_current_state] != 4511 );
+
+yy_find_action:
+               yy_act = yy_accept[yy_current_state];
+               if ( yy_act == 0 )
+                       { /* have to back up */
+                       yy_cp = (yy_last_accepting_cpos);
+                       yy_current_state = (yy_last_accepting_state);
+                       yy_act = yy_accept[yy_current_state];
+                       }
+
+               YY_DO_BEFORE_ACTION;
+
+do_action:     /* This label is used only to access EOF actions. */
+
+               switch ( yy_act )
+       { /* beginning of action switch */
+                       case 0: /* must back up */
+                       /* undo the effects of YY_DO_BEFORE_ACTION */
+                       *yy_cp = (yy_hold_char);
+                       yy_cp = (yy_last_accepting_cpos);
+                       yy_current_state = (yy_last_accepting_state);
+                       goto yy_find_action;
+
+case 1:
+YY_RULE_SETUP
+#line 196 "tests/scan.l"
+START_CODEBLOCK(true); piece_append("<PLex_Text>");
+       YY_BREAK
+case 2:
+YY_RULE_SETUP
+#line 197 "tests/scan.l"
+add_action("/*[""["); yy_push_state( COMMENT );
+       YY_BREAK
+case 3:
+YY_RULE_SETUP
+#line 198 "tests/scan.l"
+yy_push_state( LINEDIR );
+       YY_BREAK
+case 4:
+YY_RULE_SETUP
+#line 199 "tests/scan.l"
+return SCDECL;
+       YY_BREAK
+case 5:
+YY_RULE_SETUP
+#line 200 "tests/scan.l"
+return XSCDECL;
+       YY_BREAK
+case 6:
+/* rule 6 can match eol */
+YY_RULE_SETUP
+#line 201 "tests/scan.l"
+START_CODEBLOCK(false); piece_flush(strlen(yytext)); piece_append("<PLex_Text>");
+       YY_BREAK
+case 7:
+/* rule 7 can match eol */
+YY_RULE_SETUP
+#line 202 "tests/scan.l"
+{
+                brace_start_line = linenum;
+                ++linenum;
+                buf_linedir( &top_buf, infilename?infilename:"<stdin>", linenum);
+                brace_depth = 1;
+                yy_push_state(CODEBLOCK_MATCH_BRACE);
+            }
+       YY_BREAK
+case 8:
+YY_RULE_SETUP
+#line 210 "tests/scan.l"
+synerr( _("malformed '%top' directive") );
+       YY_BREAK
+case 9:
+YY_RULE_SETUP
+#line 212 "tests/scan.l"
+/* discard */
+       YY_BREAK
+case 10:
+YY_RULE_SETUP
+#line 214 "tests/scan.l"
+{
+                       sectnum = 2;
+                       bracelevel = 0;
+                       mark_defs1();
+                       line_directive_out(NULL, 1);
+                       BEGIN(SECT2PROLOG);
+#if 1
+ piece_append("</PLex_Section1>");
+ piece_pack();
+ piece_escape(yytext, strlen(yytext));
+ piece_append("<PLex_Section2>");
+ piece_pack();
+ return ~SECTEND;
+#else
+                       return SECTEND;
+#endif
+                       }
+       YY_BREAK
+case 11:
+/* rule 11 can match eol */
+YY_RULE_SETUP
+#line 232 "tests/scan.l"
+yytext_is_array = false; ++linenum; piece_append("<PLex_Section1_Options><PLex_Section1_Options_Array>"); piece_flush(strlen(yytext) - 1); piece_append("</PLex_Section1_Options_Array></PLex_Section1_Options>"); 
+       YY_BREAK
+case 12:
+/* rule 12 can match eol */
+YY_RULE_SETUP
+#line 233 "tests/scan.l"
+yytext_is_array = true; ++linenum; piece_append("<PLex_Section1_Options><PLex_Section1_Options_Array value=\"true\">"); piece_flush(strlen(yytext) - 1); piece_append("</PLex_Section1_Options_Array></PLex_Section1_Options>");
+       YY_BREAK
+case 13:
+YY_RULE_SETUP
+#line 235 "tests/scan.l"
+BEGIN(OPTION); return TOK_OPTION;
+       YY_BREAK
+case 14:
+/* rule 14 can match eol */
+YY_RULE_SETUP
+#line 237 "tests/scan.l"
+++linenum; /* ignore */
+       YY_BREAK
+case 15:
+/* rule 15 can match eol */
+YY_RULE_SETUP
+#line 238 "tests/scan.l"
+++linenum;     /* ignore */
+       YY_BREAK
+/* xgettext: no-c-format */
+case 16:
+/* rule 16 can match eol */
+YY_RULE_SETUP
+#line 241 "tests/scan.l"
+synerr( _( "unrecognized '%' directive" ) );
+       YY_BREAK
+case 17:
+YY_RULE_SETUP
+#line 243 "tests/scan.l"
+{
+                       if(yyleng < MAXLINE)
+                        {
+                       strncpy( nmstr, yytext, sizeof(nmstr) );
+                        }
+                       else
+                        {
+                          synerr( _("Definition name too long\n"));
+                          FLEX_EXIT(EXIT_FAILURE);
+                        }
+
+                       didadef = false;
+                       BEGIN(PICKUPDEF);
+                       }
+       YY_BREAK
+case 18:
+YY_RULE_SETUP
+#line 258 "tests/scan.l"
+RETURNNAME;
+       YY_BREAK
+case 19:
+/* rule 19 can match eol */
+YY_RULE_SETUP
+#line 259 "tests/scan.l"
+++linenum; /* allows blank lines in section 1 */
+       YY_BREAK
+case 20:
+/* rule 20 can match eol */
+YY_RULE_SETUP
+#line 260 "tests/scan.l"
+ACTION_ECHO; ++linenum; /* maybe end of comment line */
+       YY_BREAK
+
+/* */
+case 21:
+YY_RULE_SETUP
+#line 265 "tests/scan.l"
+ACTION_ECHO;
+       YY_BREAK
+case 22:
+YY_RULE_SETUP
+#line 266 "tests/scan.l"
+ACTION_ECHO;
+       YY_BREAK
+case 23:
+/* rule 23 can match eol */
+YY_RULE_SETUP
+#line 268 "tests/scan.l"
+++linenum; ACTION_ECHO;
+       YY_BREAK
+
+
+case 24:
+YY_RULE_SETUP
+#line 271 "tests/scan.l"
+add_action("*/]""]"); yy_pop_state();
+       YY_BREAK
+
+
+case 25:
+YY_RULE_SETUP
+#line 274 "tests/scan.l"
+ACTION_ECHO; yy_pop_state();
+       YY_BREAK
+
+
+/* This is the same as COMMENT, but is discarded rather than output. */
+case 26:
+YY_RULE_SETUP
+#line 279 "tests/scan.l"
+yy_pop_state();
+       YY_BREAK
+case 27:
+YY_RULE_SETUP
+#line 280 "tests/scan.l"
+;
+       YY_BREAK
+case 28:
+YY_RULE_SETUP
+#line 281 "tests/scan.l"
+;
+       YY_BREAK
+case 29:
+/* rule 29 can match eol */
+YY_RULE_SETUP
+#line 282 "tests/scan.l"
+++linenum;
+       YY_BREAK
+
+
+case 30:
+YY_RULE_SETUP
+#line 286 "tests/scan.l"
+yy_pop_state();
+       YY_BREAK
+case 31:
+YY_RULE_SETUP
+#line 287 "tests/scan.l"
+;
+       YY_BREAK
+case 32:
+/* rule 32 can match eol */
+YY_RULE_SETUP
+#line 288 "tests/scan.l"
+++linenum;
+       YY_BREAK
+
+
+case 33:
+/* rule 33 can match eol */
+YY_RULE_SETUP
+#line 292 "tests/scan.l"
+yy_pop_state();
+       YY_BREAK
+case 34:
+YY_RULE_SETUP
+#line 293 "tests/scan.l"
+linenum = myctoi( yytext );
+       YY_BREAK
+case 35:
+YY_RULE_SETUP
+#line 295 "tests/scan.l"
+{
+                       free(infilename);
+                       infilename = xstrdup(yytext + 1);
+                       infilename[strlen( infilename ) - 1] = '\0';
+                       }
+       YY_BREAK
+case 36:
+YY_RULE_SETUP
+#line 300 "tests/scan.l"
+/* ignore spurious characters */
+       YY_BREAK
+
+
+case 37:
+YY_RULE_SETUP
+#line 303 "tests/scan.l"
+ACTION_ECHO_QSTART;
+       YY_BREAK
+case 38:
+YY_RULE_SETUP
+#line 304 "tests/scan.l"
+ACTION_ECHO_QEND;
+       YY_BREAK
+
+
+case 39:
+/* rule 39 can match eol */
+YY_RULE_SETUP
+#line 308 "tests/scan.l"
+++linenum; piece_append("</PLex_Text>"); piece_flush(strlen(yytext)); END_CODEBLOCK;
+       YY_BREAK
+case 40:
+YY_RULE_SETUP
+#line 309 "tests/scan.l"
+ACTION_ECHO;
+       YY_BREAK
+case 41:
+YY_RULE_SETUP
+#line 310 "tests/scan.l"
+ACTION_ECHO;
+       YY_BREAK
+case 42:
+/* rule 42 can match eol */
+YY_RULE_SETUP
+#line 311 "tests/scan.l"
+{
+                       ++linenum;
+                       ACTION_ECHO;
+                       if ( indented_code ) { piece_flush(strlen(yytext)); piece_append("</PLex_Text>"); END_CODEBLOCK; }
+                       }
+       YY_BREAK
+
+
+case 43:
+YY_RULE_SETUP
+#line 319 "tests/scan.l"
+{
+                if( --brace_depth == 0){
+                    /* TODO: Matched. */
+                    yy_pop_state();
+                }else
+                    buf_strnappend(&top_buf, yytext, yyleng);
+            }
+       YY_BREAK
+case 44:
+YY_RULE_SETUP
+#line 327 "tests/scan.l"
+{
+                brace_depth++;
+                buf_strnappend(&top_buf, yytext, yyleng);
+            }
+       YY_BREAK
+case 45:
+/* rule 45 can match eol */
+YY_RULE_SETUP
+#line 332 "tests/scan.l"
+{
+                ++linenum;
+                buf_strnappend(&top_buf, yytext, yyleng);
+            }
+       YY_BREAK
+case 46:
+YY_RULE_SETUP
+#line 337 "tests/scan.l"
+buf_strnappend(&top_buf, escaped_qstart, (int) strlen(escaped_qstart));
+       YY_BREAK
+case 47:
+YY_RULE_SETUP
+#line 338 "tests/scan.l"
+buf_strnappend(&top_buf, escaped_qend, (int) strlen(escaped_qend));
+       YY_BREAK
+case 48:
+YY_RULE_SETUP
+#line 339 "tests/scan.l"
+{
+       buf_strnappend(&top_buf, yytext, yyleng);
+    }
+       YY_BREAK
+case YY_STATE_EOF(CODEBLOCK_MATCH_BRACE):
+#line 343 "tests/scan.l"
+{
+                linenum = brace_start_line;
+                synerr(_("Unmatched '{'"));
+                yyterminate();
+                }
+       YY_BREAK
+
+
+case 49:
+YY_RULE_SETUP
+#line 352 "tests/scan.l"
+/* separates name and definition */
+       YY_BREAK
+case 50:
+YY_RULE_SETUP
+#line 354 "tests/scan.l"
+{
+                       if(yyleng < MAXLINE)
+                        {
+                       strncpy( nmdef, yytext, sizeof(nmdef) );
+                        }
+                       else
+                        {
+                          format_synerr( _("Definition value for {%s} too long\n"), nmstr);
+                          FLEX_EXIT(EXIT_FAILURE);
+                        }
+                       /* Skip trailing whitespace. */
+                       {
+                           size_t i = strlen( nmdef );
+                           while (i > 0 && (nmdef[i-1] == ' ' || nmdef[i-1] == '\t'))
+                              --i;
+                           nmdef[i] = '\0';
+                       }
+
+                       ndinstal( nmstr, nmdef );
+                       didadef = true;
+                       }
+       YY_BREAK
+case 51:
+/* rule 51 can match eol */
+YY_RULE_SETUP
+#line 376 "tests/scan.l"
+{
+                       if ( ! didadef )
+                               synerr( _( "incomplete name definition" ) );
+                       BEGIN(INITIAL);
+                       ++linenum;
+                       }
+       YY_BREAK
+
+
+case 52:
+/* rule 52 can match eol */
+YY_RULE_SETUP
+#line 386 "tests/scan.l"
+++linenum; BEGIN(INITIAL);
+       YY_BREAK
+case 53:
+YY_RULE_SETUP
+#line 387 "tests/scan.l"
+option_sense = true;
+       YY_BREAK
+case 54:
+YY_RULE_SETUP
+#line 389 "tests/scan.l"
+return '=';
+       YY_BREAK
+case 55:
+YY_RULE_SETUP
+#line 391 "tests/scan.l"
+option_sense = ! option_sense;
+       YY_BREAK
+case 56:
+YY_RULE_SETUP
+#line 393 "tests/scan.l"
+csize = option_sense ? 128 : 256; markup_option("SevenBit", option_sense);
+       YY_BREAK
+case 57:
+YY_RULE_SETUP
+#line 394 "tests/scan.l"
+csize = option_sense ? 256 : 128; markup_option("SevenBit", !option_sense);
+       YY_BREAK
+case 58:
+YY_RULE_SETUP
+#line 396 "tests/scan.l"
+long_align = option_sense; markup_option("Align", option_sense);
+       YY_BREAK
+case 59:
+YY_RULE_SETUP
+#line 397 "tests/scan.l"
+{
+                       ACTION_M4_IFDEF( "M4""_YY_ALWAYS_INTERACTIVE", option_sense );
+            interactive = option_sense;
+ markup_option("AlwaysInteractive", option_sense);
+                       }
+       YY_BREAK
+case 60:
+YY_RULE_SETUP
+#line 402 "tests/scan.l"
+yytext_is_array = option_sense; markup_option("Array", option_sense);
+       YY_BREAK
+case 61:
+YY_RULE_SETUP
+#line 403 "tests/scan.l"
+backing_up_report = option_sense; markup_option("Backup", option_sense);
+       YY_BREAK
+case 62:
+YY_RULE_SETUP
+#line 404 "tests/scan.l"
+interactive = ! option_sense; markup_option("Interactive", !option_sense);
+       YY_BREAK
+case 63:
+YY_RULE_SETUP
+#line 405 "tests/scan.l"
+bison_bridge_lval = option_sense; markup_option("BisonBridge", option_sense);
+       YY_BREAK
+case 64:
+YY_RULE_SETUP
+#line 406 "tests/scan.l"
+{ if((bison_bridge_lloc = option_sense))
+                            bison_bridge_lval = true;
+ markup_option("BisonLocations", option_sense);
+                     }
+       YY_BREAK
+case 65:
+YY_RULE_SETUP
+#line 410 "tests/scan.l"
+C_plus_plus = option_sense; markup_option("CPlusPlus", option_sense);
+       YY_BREAK
+case 66:
+YY_RULE_SETUP
+#line 411 "tests/scan.l"
+sf_set_case_ins(!option_sense); markup_option("Caseless", !option_sense);
+       YY_BREAK
+case 67:
+YY_RULE_SETUP
+#line 412 "tests/scan.l"
+sf_set_case_ins(option_sense); markup_option("Caseless", option_sense);
+       YY_BREAK
+case 68:
+YY_RULE_SETUP
+#line 413 "tests/scan.l"
+ddebug = option_sense; markup_option("Debug", option_sense);
+       YY_BREAK
+case 69:
+YY_RULE_SETUP
+#line 414 "tests/scan.l"
+spprdflt = ! option_sense; markup_option("Default", option_sense);
+       YY_BREAK
+case 70:
+YY_RULE_SETUP
+#line 415 "tests/scan.l"
+useecs = option_sense; markup_option("ECS", option_sense);
+       YY_BREAK
+case 71:
+YY_RULE_SETUP
+#line 416 "tests/scan.l"
+{
+                       useecs = usemecs = false;
+                       use_read = fullspd = true;
+ markup_option("Fast", option_sense);
+                       }
+       YY_BREAK
+case 72:
+YY_RULE_SETUP
+#line 421 "tests/scan.l"
+{
+                       useecs = usemecs = false;
+                       use_read = fulltbl = true;
+ markup_option("Full", option_sense);
+                       }
+       YY_BREAK
+case 73:
+YY_RULE_SETUP
+#line 426 "tests/scan.l"
+ACTION_IFDEF("YY_NO_INPUT", ! option_sense); markup_option("Input", option_sense);
+       YY_BREAK
+case 74:
+YY_RULE_SETUP
+#line 427 "tests/scan.l"
+interactive = option_sense; markup_option("Interactive", option_sense);
+       YY_BREAK
+case 75:
+YY_RULE_SETUP
+#line 428 "tests/scan.l"
+lex_compat = option_sense; markup_option("LexCompat", option_sense);
+       YY_BREAK
+case 76:
+YY_RULE_SETUP
+#line 429 "tests/scan.l"
+posix_compat = option_sense; markup_option("PosixCompat", option_sense);
+       YY_BREAK
+case 77:
+YY_RULE_SETUP
+#line 430 "tests/scan.l"
+gen_line_dirs = option_sense; markup_option("Line", option_sense);
+       YY_BREAK
+case 78:
+YY_RULE_SETUP
+#line 431 "tests/scan.l"
+{
+                       ACTION_M4_IFDEF( "M4""_YY_MAIN", option_sense);
+            /* Override yywrap */
+            if( option_sense == true )
+                do_yywrap = false;
+ markup_option("Main", option_sense);
+                       }
+       YY_BREAK
+case 79:
+YY_RULE_SETUP
+#line 438 "tests/scan.l"
+usemecs = option_sense; markup_option("MetaECS", option_sense);
+       YY_BREAK
+case 80:
+YY_RULE_SETUP
+#line 439 "tests/scan.l"
+{
+                       ACTION_M4_IFDEF( "M4""_YY_NEVER_INTERACTIVE", option_sense );
+            interactive = !option_sense;
+ markup_option("NeverInteractive", option_sense);
+                       }
+       YY_BREAK
+case 81:
+YY_RULE_SETUP
+#line 444 "tests/scan.l"
+performance_report += option_sense ? 1 : -1; markup_option("PerfReport", option_sense);
+       YY_BREAK
+case 82:
+YY_RULE_SETUP
+#line 445 "tests/scan.l"
+yytext_is_array = ! option_sense; markup_option("Array", !option_sense);
+       YY_BREAK
+case 83:
+YY_RULE_SETUP
+#line 446 "tests/scan.l"
+use_read = option_sense; markup_option("Read", option_sense);
+       YY_BREAK
+case 84:
+YY_RULE_SETUP
+#line 447 "tests/scan.l"
+reentrant = option_sense; markup_option("Reentrant", option_sense);
+       YY_BREAK
+case 85:
+YY_RULE_SETUP
+#line 448 "tests/scan.l"
+reject_really_used = option_sense; markup_option("Reject", option_sense);
+       YY_BREAK
+case 86:
+YY_RULE_SETUP
+#line 449 "tests/scan.l"
+ACTION_M4_IFDEF( "M4""_YY_STACK_USED", option_sense ); markup_option("Stack", option_sense);
+       YY_BREAK
+case 87:
+YY_RULE_SETUP
+#line 450 "tests/scan.l"
+do_stdinit = option_sense; markup_option("StdInit", option_sense);
+       YY_BREAK
+case 88:
+YY_RULE_SETUP
+#line 451 "tests/scan.l"
+use_stdout = option_sense; markup_option("StdOut", option_sense);
+       YY_BREAK
+case 89:
+YY_RULE_SETUP
+#line 452 "tests/scan.l"
+ACTION_IFDEF("YY_NO_UNISTD_H", ! option_sense); markup_option("UniStd", option_sense);
+       YY_BREAK
+case 90:
+YY_RULE_SETUP
+#line 453 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_UNPUT", ! option_sense); markup_option("Unput", option_sense);
+       YY_BREAK
+case 91:
+YY_RULE_SETUP
+#line 454 "tests/scan.l"
+printstats = option_sense; markup_option("Verbose", option_sense);
+       YY_BREAK
+case 92:
+YY_RULE_SETUP
+#line 455 "tests/scan.l"
+nowarn = ! option_sense; markup_option("Warn", option_sense);
+       YY_BREAK
+case 93:
+YY_RULE_SETUP
+#line 456 "tests/scan.l"
+do_yylineno = option_sense; ACTION_M4_IFDEF("M4""_YY_USE_LINENO", option_sense); markup_option("YYLineNo", option_sense);
+       YY_BREAK
+case 94:
+YY_RULE_SETUP
+#line 457 "tests/scan.l"
+yymore_really_used = option_sense; markup_option("YYMore", option_sense);
+       YY_BREAK
+case 95:
+YY_RULE_SETUP
+#line 458 "tests/scan.l"
+do_yywrap = option_sense; markup_option("YYWrap", option_sense);
+       YY_BREAK
+case 96:
+YY_RULE_SETUP
+#line 460 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_PUSH_STATE", ! option_sense); markup_option("YYPushState", option_sense);
+       YY_BREAK
+case 97:
+YY_RULE_SETUP
+#line 461 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_POP_STATE", ! option_sense); markup_option("YYPopState", option_sense);
+       YY_BREAK
+case 98:
+YY_RULE_SETUP
+#line 462 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_TOP_STATE", ! option_sense); markup_option("YYTopState", option_sense);
+       YY_BREAK
+case 99:
+YY_RULE_SETUP
+#line 464 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BUFFER", ! option_sense); markup_option("YYScanBuffer", option_sense);
+       YY_BREAK
+case 100:
+YY_RULE_SETUP
+#line 465 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BYTES", ! option_sense); markup_option("YYScanBytes", option_sense);
+       YY_BREAK
+case 101:
+YY_RULE_SETUP
+#line 466 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_SCAN_STRING", ! option_sense); markup_option("YYScanString", option_sense);
+       YY_BREAK
+case 102:
+YY_RULE_SETUP
+#line 468 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_FLEX_ALLOC", ! option_sense); markup_option("YYAlloc", option_sense);
+       YY_BREAK
+case 103:
+YY_RULE_SETUP
+#line 469 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_FLEX_REALLOC", ! option_sense); markup_option("YYRealloc", option_sense);
+       YY_BREAK
+case 104:
+YY_RULE_SETUP
+#line 470 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_FLEX_FREE", ! option_sense); markup_option("YYFree", option_sense);
+       YY_BREAK
+case 105:
+YY_RULE_SETUP
+#line 472 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_GET_DEBUG", ! option_sense); markup_option("YYGetDebug", option_sense);
+       YY_BREAK
+case 106:
+YY_RULE_SETUP
+#line 473 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_SET_DEBUG", ! option_sense); markup_option("YYSetDebug", option_sense);
+       YY_BREAK
+case 107:
+YY_RULE_SETUP
+#line 474 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_GET_EXTRA", ! option_sense); markup_option("YYGetExtra", option_sense);
+       YY_BREAK
+case 108:
+YY_RULE_SETUP
+#line 475 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_SET_EXTRA", ! option_sense); markup_option("YYSetExtra", option_sense);
+       YY_BREAK
+case 109:
+YY_RULE_SETUP
+#line 476 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_GET_LENG", ! option_sense); markup_option("YYGetLeng", option_sense);
+       YY_BREAK
+case 110:
+YY_RULE_SETUP
+#line 477 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_GET_TEXT", ! option_sense); markup_option("YYGetText", option_sense);
+       YY_BREAK
+case 111:
+YY_RULE_SETUP
+#line 478 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_GET_LINENO", ! option_sense); markup_option("YYGetLineNo", option_sense);
+       YY_BREAK
+case 112:
+YY_RULE_SETUP
+#line 479 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_SET_LINENO", ! option_sense); markup_option("YYSetLineNo", option_sense);
+       YY_BREAK
+case 113:
+YY_RULE_SETUP
+#line 480 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_GET_IN", ! option_sense); markup_option("YYGetIn", option_sense);
+       YY_BREAK
+case 114:
+YY_RULE_SETUP
+#line 481 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_SET_IN", ! option_sense); markup_option("YYSetIn", option_sense);
+       YY_BREAK
+case 115:
+YY_RULE_SETUP
+#line 482 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_GET_OUT", ! option_sense); markup_option("YYGetOut", option_sense);
+       YY_BREAK
+case 116:
+YY_RULE_SETUP
+#line 483 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_SET_OUT", ! option_sense); markup_option("YYSetOut", option_sense);
+       YY_BREAK
+case 117:
+YY_RULE_SETUP
+#line 484 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_GET_LVAL", ! option_sense); markup_option("YYGetLVal", option_sense);
+       YY_BREAK
+case 118:
+YY_RULE_SETUP
+#line 485 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_SET_LVAL", ! option_sense); markup_option("YYSetLVal", option_sense);
+       YY_BREAK
+case 119:
+YY_RULE_SETUP
+#line 486 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_GET_LLOC", ! option_sense); markup_option("YYGetLLoc", option_sense);
+       YY_BREAK
+case 120:
+YY_RULE_SETUP
+#line 487 "tests/scan.l"
+ACTION_M4_IFDEF("M4""_YY_NO_SET_LLOC", ! option_sense); markup_option("YYSetLLoc", option_sense);
+       YY_BREAK
+case 121:
+YY_RULE_SETUP
+#line 489 "tests/scan.l"
+return TOK_EXTRA_TYPE;
+       YY_BREAK
+case 122:
+YY_RULE_SETUP
+#line 490 "tests/scan.l"
+return TOK_OUTFILE;
+       YY_BREAK
+case 123:
+YY_RULE_SETUP
+#line 491 "tests/scan.l"
+return TOK_PREFIX;
+       YY_BREAK
+case 124:
+YY_RULE_SETUP
+#line 492 "tests/scan.l"
+return TOK_YYCLASS;
+       YY_BREAK
+case 125:
+YY_RULE_SETUP
+#line 493 "tests/scan.l"
+return TOK_HEADER_FILE;
+       YY_BREAK
+case 126:
+YY_RULE_SETUP
+#line 494 "tests/scan.l"
+return TOK_TABLES_FILE;
+       YY_BREAK
+case 127:
+YY_RULE_SETUP
+#line 495 "tests/scan.l"
+{
+                    tablesverify = option_sense;
+                    if(!tablesext && option_sense)
+                        tablesext = true;
+ markup_option("TablesVerify", option_sense);
+                    }
+       YY_BREAK
+case 128:
+YY_RULE_SETUP
+#line 503 "tests/scan.l"
+{
+                       if(yyleng-1 < MAXLINE)
+                        {
+                       strncpy( nmstr, yytext + 1, sizeof(nmstr) );
+                        }
+                       else
+                        {
+                          synerr( _("Option line too long\n"));
+                          FLEX_EXIT(EXIT_FAILURE);
+                        }
+                       nmstr[strlen( nmstr ) - 1] = '\0';
+#if 1
+ piece_pack();
+ piece_append("<PLex_String>\"<PLex_Text>");
+ piece_escape(yytext + 1, strlen(yytext + 1) - 1);
+ piece_append("</PLex_Text>\"</PLex_String>");
+ piece_pack();
+ return ~NAME; /* actually a misnomer */
+#else
+                       return NAME;
+#endif
+                       }
+       YY_BREAK
+case 129:
+YY_RULE_SETUP
+#line 526 "tests/scan.l"
+{
+                       format_synerr( _( "unrecognized %%option: %s" ),
+                               yytext );
+                       BEGIN(RECOVER);
+                       }
+       YY_BREAK
+
+case 130:
+/* rule 130 can match eol */
+YY_RULE_SETUP
+#line 533 "tests/scan.l"
+++linenum; BEGIN(INITIAL);
+       YY_BREAK
+
+case 131:
+YY_RULE_SETUP
+#line 537 "tests/scan.l"
+++bracelevel; yyless( 2 );     /* eat only %{ */
+       YY_BREAK
+case 132:
+YY_RULE_SETUP
+#line 538 "tests/scan.l"
+--bracelevel; yyless( 2 );     /* eat only %} */
+       YY_BREAK
+case 133:
+YY_RULE_SETUP
+#line 540 "tests/scan.l"
+START_CODEBLOCK(true); piece_append("<PLex_Text>"); /* indented code in prolog */
+       YY_BREAK
+case 134:
+YY_RULE_SETUP
+#line 542 "tests/scan.l"
+{
+        /* non-indented code */
+               if ( bracelevel <= 0 ) {
+            /* not in %{ ... %} */
+            yyless( 0 );       /* put it all back */
+            yy_set_bol( 1 );
+            mark_prolog();
+            BEGIN(SECT2);
+        } else {
+            START_CODEBLOCK(true);
+ piece_append("<PLex_Text>");
+        }
+    }
+       YY_BREAK
+case 135:
+YY_RULE_SETUP
+#line 556 "tests/scan.l"
+ACTION_ECHO;
+       YY_BREAK
+case 136:
+/* rule 136 can match eol */
+YY_RULE_SETUP
+#line 557 "tests/scan.l"
+++linenum; ACTION_ECHO;
+       YY_BREAK
+case YY_STATE_EOF(SECT2PROLOG):
+#line 559 "tests/scan.l"
+{
+                       mark_prolog();
+                       sectnum = 0;
+#if 1
+ piece_pack();
+ piece_append("</PLex_Section2>");
+ piece_pack();
+ return ~YY_NULL;
+#else
+                       yyterminate(); /* to stop the parser */
+#endif
+                       }
+       YY_BREAK
+
+
+case 137:
+/* rule 137 can match eol */
+YY_RULE_SETUP
+#line 574 "tests/scan.l"
+++linenum; /* allow blank lines in section 2 */
+       YY_BREAK
+case 138:
+YY_RULE_SETUP
+#line 576 "tests/scan.l"
+{
+                       indented_code = false;
+                       doing_codeblock = true;
+                       bracelevel = 1;
+                       BEGIN(PERCENT_BRACE_ACTION);
+ piece_flush(strlen(yytext) - 2);
+ piece_append("<PLex_Section1Or2_CodeBlock>");
+ piece_flush(2);
+ piece_append("<PLex_Text>");
+                       }
+       YY_BREAK
+case 139:
+YY_RULE_SETUP
+#line 587 "tests/scan.l"
+{
+                        /* Allow "<" to appear in (?x) patterns. */
+                        if (!sf_skip_ws())
+                            BEGIN(SC);
+                        return '<';
+                    }
+       YY_BREAK
+case 140:
+YY_RULE_SETUP
+#line 593 "tests/scan.l"
+return '^';
+       YY_BREAK
+case 141:
+YY_RULE_SETUP
+#line 594 "tests/scan.l"
+BEGIN(QUOTE); return '"';
+       YY_BREAK
+case 142:
+*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 595 "tests/scan.l"
+{
+                       BEGIN(NUM);
+                       if ( lex_compat || posix_compat )
+                               return BEGIN_REPEAT_POSIX;
+                       else
+                               return BEGIN_REPEAT_FLEX;
+                       }
+       YY_BREAK
+case 143:
+/* rule 143 can match eol */
+*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+YY_LINENO_REWIND_TO(yy_bp + 1);
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 602 "tests/scan.l"
+return '$';
+       YY_BREAK
+case 144:
+YY_RULE_SETUP
+#line 604 "tests/scan.l"
+{
+                       bracelevel = 1;
+                       BEGIN(PERCENT_BRACE_ACTION);
+ piece_flush(strlen(yytext) - 2);
+ piece_append("<PLex_Section2_Rule_Action>");
+
+                       if ( in_rule )
+                               {
+                               doing_rule_action = true;
+                               in_rule = false;
+#if 1
+ piece_pack();
+ piece_escape(yytext, 2);
+ piece_pack();
+ piece_append("<PLex_Text>");
+ return ~'\n';
+#else
+                               return '\n';
+#endif
+                               }
+#if 1 /* don't think this can really happen */
+ abort();
+#else
+ piece_flush(strlen(yytext));
+ piece_append("<PLex_Text>");
+#endif
+                       }
+       YY_BREAK
+case 145:
+/* rule 145 can match eol */
+YY_RULE_SETUP
+#line 631 "tests/scan.l"
+{
+                        if (sf_skip_ws()){
+                            /* We're in the middle of a (?x: ) pattern. */
+                            /* Push back everything starting at the "|" */
+                            int amt = (int) (strchr (yytext, '|') - yytext);
+                            yyless(amt);
+                        }
+                        else {
+                            add_action("]""]");
+                            continued_action = true;
+                            ++linenum;
+#if 1
+ int i;
+ for (i = 0; yytext[i] == '\t' || yytext[i] == ' '; ++i)
+  ;
+ piece_flush(i);
+ piece_pack();
+ piece_append("<PLex_Section2_Rule_Action continued=\"true\">");
+ piece_escape(yytext, strlen(yytext));
+ piece_append("</PLex_Section2_Rule_Action>");
+ piece_pack();
+ return ~'\n';
+#else
+                            return '\n';
+#endif
+                        }
+                    }
+       YY_BREAK
+case 146:
+YY_RULE_SETUP
+#line 659 "tests/scan.l"
+{
+
+                if (sf_skip_ws()){
+                    /* We're in the middle of a (?x: ) pattern. */
+                    yy_push_state(COMMENT_DISCARD);
+                }
+                else{
+                    yyless( yyleng - 2 );      /* put back '/', '*' */
+                    bracelevel = 0;
+                    continued_action = false;
+                    BEGIN(ACTION);
+                }
+                       }
+       YY_BREAK
+case 147:
+YY_RULE_SETUP
+#line 673 "tests/scan.l"
+/* allow indented rules */ ;
+       YY_BREAK
+case 148:
+YY_RULE_SETUP
+#line 675 "tests/scan.l"
+{
+            if (sf_skip_ws()){
+                /* We're in the middle of a (?x: ) pattern. */
+            }
+            else{
+                /* This rule is separate from the one below because
+                 * otherwise we get variable trailing context, so
+                 * we can't build the scanner using -{f,F}.
+                 */
+                bracelevel = 0;
+                continued_action = false;
+                BEGIN(ACTION);
+
+                if ( in_rule )
+                    {
+                    doing_rule_action = true;
+                    in_rule = false;
+#if 1
+ piece_pack();
+ piece_escape(yytext, strlen(yytext));
+ piece_pack();
+ piece_append("<PLex_Section2_Rule_Action><PLex_Text>");
+ return ~'\n';
+#else
+                    return '\n';
+#endif
+                    }
+            }
+                       }
+       YY_BREAK
+case 149:
+/* rule 149 can match eol */
+YY_RULE_SETUP
+#line 705 "tests/scan.l"
+{
+            if (sf_skip_ws()){
+                /* We're in the middle of a (?x: ) pattern. */
+                ++linenum;
+            }
+            else{
+                bracelevel = 0;
+                continued_action = false;
+                BEGIN(ACTION);
+#if 1
+ yyless(yyleng - 1);
+#else
+                unput( '\n' ); /* so <ACTION> sees it */
+#endif
+
+                if ( in_rule )
+                    {
+                    doing_rule_action = true;
+                    in_rule = false;
+#if 1
+ piece_pack();
+ piece_escape(yytext, strlen(yytext));
+ piece_pack();
+ piece_append("<PLex_Section2_Rule_Action><PLex_Text>");
+ return ~'\n';
+#else
+                    return '\n';
+#endif
+                    }
+            }
+                       }
+       YY_BREAK
+case 150:
+#line 738 "tests/scan.l"
+case 151:
+YY_RULE_SETUP
+#line 738 "tests/scan.l"
+return EOF_OP;
+       YY_BREAK
+case 152:
+YY_RULE_SETUP
+#line 740 "tests/scan.l"
+{
+                       sectnum = 3;
+                       BEGIN(no_section3_escape ? SECT3_NOESCAPE : SECT3);
+                       outn("/* Begin user sect3 */");
+#if 1
+ piece_pack();
+ piece_append("</PLex_Section2>");
+ piece_escape(yytext, strlen(yytext));
+ piece_pack();
+ piece_append("<PLex_Section3>");
+ return ~YY_NULL;
+#else
+                       yyterminate(); /* to stop the parser */
+#endif
+
+                       }
+       YY_BREAK
+case 153:
+YY_RULE_SETUP
+#line 757 "tests/scan.l"
+{
+                       int cclval;
+
+                       if(yyleng < MAXLINE)
+                        {
+                       strncpy( nmstr, yytext, sizeof(nmstr) );
+                        }
+                       else
+                        {
+                          synerr( _("Input line too long\n"));
+                          FLEX_EXIT(EXIT_FAILURE);
+                        }
+
+                       /* Check to see if we've already encountered this
+                        * ccl.
+                        */
+                       if (0 /* <--- This "0" effectively disables the reuse of a
+                   * character class (purely based on its source text).
+                   * The reason it was disabled is so yacc/bison can parse
+                   * ccl operations, such as ccl difference and union.
+                   */
+                &&  (cclval = ccllookup( nmstr )) != 0 )
+                               {
+                               if ( input() != ']' )
+                                       synerr( _( "bad character class" ) );
+
+                               yylval = cclval;
+                               ++cclreuse;
+                               return PREVCCL;
+                               }
+                       else
+                               {
+                               /* We fudge a bit.  We know that this ccl will
+                                * soon be numbered as lastccl + 1 by cclinit.
+                                */
+                               cclinstal( nmstr, lastccl + 1 );
+
+                               /* Push back everything but the leading bracket
+                                * so the ccl can be rescanned.
+                                */
+                               yyless( 1 );
+
+                               BEGIN(FIRSTCCL);
+                               return '[';
+                               }
+                       }
+       YY_BREAK
+case 154:
+YY_RULE_SETUP
+#line 803 "tests/scan.l"
+return CCL_OP_DIFF;
+       YY_BREAK
+case 155:
+YY_RULE_SETUP
+#line 804 "tests/scan.l"
+return CCL_OP_UNION;
+       YY_BREAK
+/* Check for :space: at the end of the rule so we don't
+     * wrap the expanded regex in '(' ')' -- breaking trailing
+     * context.
+     */
+case 156:
+/* rule 156 can match eol */
+YY_RULE_SETUP
+#line 811 "tests/scan.l"
+{
+                       char *nmdefptr;
+            int end_is_ws, end_ch;
+
+            end_ch = yytext[yyleng-1];
+            end_is_ws = end_ch != '}' ? 1 : 0;
+
+                       if(yyleng-1 < MAXLINE)
+                        {
+                       strncpy( nmstr, yytext + 1, sizeof(nmstr) );
+                        }
+                       else
+                        {
+                          synerr( _("Input line too long\n"));
+                          FLEX_EXIT(EXIT_FAILURE);
+                        }
+nmstr[yyleng - 2 - end_is_ws] = '\0';  /* chop trailing brace */
+
+                       if ( (nmdefptr = ndlookup( nmstr )) == 0 )
+                               format_synerr(
+                                       _( "undefined definition {%s}" ),
+                                               nmstr );
+
+                       else
+                               { /* push back name surrounded by ()'s */
+                               size_t len = strlen( nmdefptr );
+                if (end_is_ws)
+#if 1
+ yyless(yyleng - 1);
+#else
+                    unput(end_ch);
+#endif
+
+                               if ( lex_compat || nmdefptr[0] == '^' ||
+                                    (len > 0 && nmdefptr[len - 1] == '$')
+                     || (end_is_ws && trlcontxt && !sf_skip_ws()))
+                                       { /* don't use ()'s after all */
+                                       PUT_BACK_STRING(nmdefptr, 0);
+
+                                       if ( nmdefptr[0] == '^' )
+                                               BEGIN(CARETISBOL);
+                                       }
+
+                               else
+                                       {
+                                       unput(')');
+                                       PUT_BACK_STRING(nmdefptr, 0);
+                                       unput('(');
+                                       }
+                               }
+                       }
+       YY_BREAK
+case 157:
+YY_RULE_SETUP
+#line 863 "tests/scan.l"
+{
+                    if (sf_skip_ws())
+                        yy_push_state(COMMENT_DISCARD);
+                    else{
+                        /* Push back the "*" and return "/" as usual. */
+                        yyless(1);
+                        return '/';
+                    }
+                }
+       YY_BREAK
+case 158:
+YY_RULE_SETUP
+#line 873 "tests/scan.l"
+{
+                    if (lex_compat || posix_compat){
+                        /* Push back the "?#" and treat it like a normal parens. */
+                        yyless(1);
+                        sf_push(); 
+                        return '(';
+                    }
+                    else
+                        yy_push_state(EXTENDED_COMMENT);
+                }
+       YY_BREAK
+case 159:
+YY_RULE_SETUP
+#line 883 "tests/scan.l"
+{
+                    sf_push();
+                    if (lex_compat || posix_compat)
+                        /* Push back the "?" and treat it like a normal parens. */
+                        yyless(1);
+                    else
+                        BEGIN(GROUP_WITH_PARAMS);
+                    return '(';
+                }
+       YY_BREAK
+case 160:
+YY_RULE_SETUP
+#line 892 "tests/scan.l"
+sf_push(); return '(';
+       YY_BREAK
+case 161:
+YY_RULE_SETUP
+#line 893 "tests/scan.l"
+{
+                    if (_sf_top_ix > 0) {
+                        sf_pop();
+                        return ')';
+                    } else
+                        synerr(_("unbalanced parenthesis"));
+                }
+       YY_BREAK
+case 162:
+YY_RULE_SETUP
+#line 901 "tests/scan.l"
+return (unsigned char) yytext[0];
+       YY_BREAK
+case 163:
+YY_RULE_SETUP
+#line 902 "tests/scan.l"
+RETURNCHAR;
+       YY_BREAK
+/* Nick added this rule for consistency with rest of scanner */
+case YY_STATE_EOF(SECT2):
+#line 905 "tests/scan.l"
+{
+                       sectnum = 0;
+#if 1
+ piece_pack();
+ piece_append("</PLex_Section2>");
+ piece_pack();
+ return ~YY_NULL;
+#else
+                       yyterminate(); /* to stop the parser */
+#endif
+                       }
+       YY_BREAK
+
+
+case 164:
+/* rule 164 can match eol */
+YY_RULE_SETUP
+#line 920 "tests/scan.l"
+++linenum;     /* Allow blank lines & continuations */
+       YY_BREAK
+case 165:
+YY_RULE_SETUP
+#line 921 "tests/scan.l"
+return (unsigned char) yytext[0];
+       YY_BREAK
+case 166:
+YY_RULE_SETUP
+#line 922 "tests/scan.l"
+BEGIN(SECT2); return '>';
+       YY_BREAK
+case 167:
+*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 923 "tests/scan.l"
+BEGIN(CARETISBOL); return '>';
+       YY_BREAK
+case 168:
+YY_RULE_SETUP
+#line 924 "tests/scan.l"
+RETURNNAME;
+       YY_BREAK
+case 169:
+YY_RULE_SETUP
+#line 925 "tests/scan.l"
+{
+                       format_synerr( _( "bad <start condition>: %s" ),
+                               yytext );
+                       }
+       YY_BREAK
+
+case 170:
+YY_RULE_SETUP
+#line 931 "tests/scan.l"
+BEGIN(SECT2); return '^';
+       YY_BREAK
+
+case 171:
+YY_RULE_SETUP
+#line 935 "tests/scan.l"
+RETURNCHAR;
+       YY_BREAK
+case 172:
+YY_RULE_SETUP
+#line 936 "tests/scan.l"
+BEGIN(SECT2); return '"';
+       YY_BREAK
+case 173:
+/* rule 173 can match eol */
+YY_RULE_SETUP
+#line 938 "tests/scan.l"
+{
+                       synerr( _( "missing quote" ) );
+                       BEGIN(SECT2);
+                       ++linenum;
+                       return '"';
+                       }
+       YY_BREAK
+
+
+case 174:
+YY_RULE_SETUP
+#line 947 "tests/scan.l"
+BEGIN(SECT2);
+       YY_BREAK
+case 175:
+YY_RULE_SETUP
+#line 948 "tests/scan.l"
+BEGIN(GROUP_MINUS_PARAMS);
+       YY_BREAK
+case 176:
+YY_RULE_SETUP
+#line 949 "tests/scan.l"
+sf_set_case_ins(1);
+       YY_BREAK
+case 177:
+YY_RULE_SETUP
+#line 950 "tests/scan.l"
+sf_set_dot_all(1);
+       YY_BREAK
+case 178:
+YY_RULE_SETUP
+#line 951 "tests/scan.l"
+sf_set_skip_ws(1);
+       YY_BREAK
+
+
+case 179:
+YY_RULE_SETUP
+#line 954 "tests/scan.l"
+BEGIN(SECT2);
+       YY_BREAK
+case 180:
+YY_RULE_SETUP
+#line 955 "tests/scan.l"
+sf_set_case_ins(0);
+       YY_BREAK
+case 181:
+YY_RULE_SETUP
+#line 956 "tests/scan.l"
+sf_set_dot_all(0);
+       YY_BREAK
+case 182:
+YY_RULE_SETUP
+#line 957 "tests/scan.l"
+sf_set_skip_ws(0);
+       YY_BREAK
+
+
+case 183:
+*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 961 "tests/scan.l"
+BEGIN(CCL); return '^';
+       YY_BREAK
+case 184:
+*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 962 "tests/scan.l"
+return '^';
+       YY_BREAK
+case 185:
+YY_RULE_SETUP
+#line 963 "tests/scan.l"
+BEGIN(CCL); RETURNCHAR;
+       YY_BREAK
+
+
+case 186:
+*yy_cp = (yy_hold_char); /* undo effects of setting up yytext */
+(yy_c_buf_p) = yy_cp = yy_bp + 1;
+YY_DO_BEFORE_ACTION; /* set up yytext again */
+YY_RULE_SETUP
+#line 967 "tests/scan.l"
+return '-';
+       YY_BREAK
+case 187:
+YY_RULE_SETUP
+#line 968 "tests/scan.l"
+RETURNCHAR;
+       YY_BREAK
+case 188:
+YY_RULE_SETUP
+#line 969 "tests/scan.l"
+BEGIN(SECT2); return ']';
+       YY_BREAK
+case 189:
+/* rule 189 can match eol */
+YY_RULE_SETUP
+#line 970 "tests/scan.l"
+{
+                       synerr( _( "bad character class" ) );
+                       BEGIN(SECT2);
+                       return ']';
+                       }
+       YY_BREAK
+
+
+case 190:
+YY_RULE_SETUP
+#line 978 "tests/scan.l"
+BEGIN(CCL); return CCE_ALNUM;
+       YY_BREAK
+case 191:
+YY_RULE_SETUP
+#line 979 "tests/scan.l"
+BEGIN(CCL); return CCE_ALPHA;
+       YY_BREAK
+case 192:
+YY_RULE_SETUP
+#line 980 "tests/scan.l"
+BEGIN(CCL); return CCE_BLANK;
+       YY_BREAK
+case 193:
+YY_RULE_SETUP
+#line 981 "tests/scan.l"
+BEGIN(CCL); return CCE_CNTRL;
+       YY_BREAK
+case 194:
+YY_RULE_SETUP
+#line 982 "tests/scan.l"
+BEGIN(CCL); return CCE_DIGIT;
+       YY_BREAK
+case 195:
+YY_RULE_SETUP
+#line 983 "tests/scan.l"
+BEGIN(CCL); return CCE_GRAPH;
+       YY_BREAK
+case 196:
+YY_RULE_SETUP
+#line 984 "tests/scan.l"
+BEGIN(CCL); return CCE_LOWER;
+       YY_BREAK
+case 197:
+YY_RULE_SETUP
+#line 985 "tests/scan.l"
+BEGIN(CCL); return CCE_PRINT;
+       YY_BREAK
+case 198:
+YY_RULE_SETUP
+#line 986 "tests/scan.l"
+BEGIN(CCL); return CCE_PUNCT;
+       YY_BREAK
+case 199:
+YY_RULE_SETUP
+#line 987 "tests/scan.l"
+BEGIN(CCL); return CCE_SPACE;
+       YY_BREAK
+case 200:
+YY_RULE_SETUP
+#line 988 "tests/scan.l"
+BEGIN(CCL); return CCE_UPPER;
+       YY_BREAK
+case 201:
+YY_RULE_SETUP
+#line 989 "tests/scan.l"
+BEGIN(CCL); return CCE_XDIGIT;
+       YY_BREAK
+case 202:
+YY_RULE_SETUP
+#line 991 "tests/scan.l"
+BEGIN(CCL); return CCE_NEG_ALNUM;
+       YY_BREAK
+case 203:
+YY_RULE_SETUP
+#line 992 "tests/scan.l"
+BEGIN(CCL); return CCE_NEG_ALPHA;
+       YY_BREAK
+case 204:
+YY_RULE_SETUP
+#line 993 "tests/scan.l"
+BEGIN(CCL); return CCE_NEG_BLANK;
+       YY_BREAK
+case 205:
+YY_RULE_SETUP
+#line 994 "tests/scan.l"
+BEGIN(CCL); return CCE_NEG_CNTRL;
+       YY_BREAK
+case 206:
+YY_RULE_SETUP
+#line 995 "tests/scan.l"
+BEGIN(CCL); return CCE_NEG_DIGIT;
+       YY_BREAK
+case 207:
+YY_RULE_SETUP
+#line 996 "tests/scan.l"
+BEGIN(CCL); return CCE_NEG_GRAPH;
+       YY_BREAK
+case 208:
+YY_RULE_SETUP
+#line 997 "tests/scan.l"
+BEGIN(CCL); return CCE_NEG_LOWER;
+       YY_BREAK
+case 209:
+YY_RULE_SETUP
+#line 998 "tests/scan.l"
+BEGIN(CCL); return CCE_NEG_PRINT;
+       YY_BREAK
+case 210:
+YY_RULE_SETUP
+#line 999 "tests/scan.l"
+BEGIN(CCL); return CCE_NEG_PUNCT;
+       YY_BREAK
+case 211:
+YY_RULE_SETUP
+#line 1000 "tests/scan.l"
+BEGIN(CCL); return CCE_NEG_SPACE;
+       YY_BREAK
+case 212:
+YY_RULE_SETUP
+#line 1001 "tests/scan.l"
+BEGIN(CCL); return CCE_NEG_UPPER;
+       YY_BREAK
+case 213:
+YY_RULE_SETUP
+#line 1002 "tests/scan.l"
+BEGIN(CCL); return CCE_NEG_XDIGIT;
+       YY_BREAK
+case 214:
+YY_RULE_SETUP
+#line 1003 "tests/scan.l"
+{
+                       format_synerr(
+                               _( "bad character class expression: %s" ),
+                                       yytext );
+                       BEGIN(CCL); return CCE_ALNUM;
+                       }
+       YY_BREAK
+
+
+case 215:
+YY_RULE_SETUP
+#line 1012 "tests/scan.l"
+{
+                       yylval = myctoi( yytext );
+                       return NUMBER;
+                       }
+       YY_BREAK
+case 216:
+YY_RULE_SETUP
+#line 1017 "tests/scan.l"
+return ',';
+       YY_BREAK
+case 217:
+YY_RULE_SETUP
+#line 1018 "tests/scan.l"
+{
+                       BEGIN(SECT2);
+                       if ( lex_compat || posix_compat )
+                               return END_REPEAT_POSIX;
+                       else
+                               return END_REPEAT_FLEX;
+                       }
+       YY_BREAK
+case 218:
+YY_RULE_SETUP
+#line 1026 "tests/scan.l"
+{
+                       synerr( _( "bad character inside {}'s" ) );
+                       BEGIN(SECT2);
+                       return '}';
+                       }
+       YY_BREAK
+case 219:
+/* rule 219 can match eol */
+YY_RULE_SETUP
+#line 1032 "tests/scan.l"
+{
+                       synerr( _( "missing }" ) );
+                       BEGIN(SECT2);
+                       ++linenum;
+                       return '}';
+                       }
+       YY_BREAK
+
+
+case 220:
+YY_RULE_SETUP
+#line 1042 "tests/scan.l"
+bracelevel = 0; piece_append("</PLex_Text>");
+       YY_BREAK
+case 221:
+YY_RULE_SETUP
+#line 1044 "tests/scan.l"
+ACTION_ECHO; yy_push_state( CODE_COMMENT );
+       YY_BREAK
+
+case 222:
+YY_RULE_SETUP
+#line 1047 "tests/scan.l"
+{
+            ACTION_ECHO;
+            CHECK_REJECT(yytext);
+        }
+       YY_BREAK
+case 223:
+YY_RULE_SETUP
+#line 1051 "tests/scan.l"
+{
+            ACTION_ECHO;
+            CHECK_YYMORE(yytext);
+        }
+       YY_BREAK
+
+case 224:
+YY_RULE_SETUP
+#line 1057 "tests/scan.l"
+ACTION_ECHO;
+       YY_BREAK
+case 225:
+/* rule 225 can match eol */
+YY_RULE_SETUP
+#line 1058 "tests/scan.l"
+{
+               ++linenum;
+               ACTION_ECHO;
+               if (bracelevel <= 0 || (doing_codeblock && indented_code)) {
+            if ( doing_rule_action )
+                add_action( "\tYY_BREAK]""]\n" );
+
+ piece_flush(strlen(yytext));
+ if (doing_codeblock)
+  piece_append("</PLex_Section1Or2_CodeBlock>");
+ else
+  markup_action("</PLex_Section2_Rule_Action>");
+            doing_rule_action = doing_codeblock = false;
+            BEGIN(SECT2);
+        }
+    }
+       YY_BREAK
+
+/* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */
+
+case 226:
+YY_RULE_SETUP
+#line 1079 "tests/scan.l"
+ACTION_ECHO; ++bracelevel;
+       YY_BREAK
+case 227:
+YY_RULE_SETUP
+#line 1080 "tests/scan.l"
+ACTION_ECHO; --bracelevel;
+       YY_BREAK
+case 228:
+YY_RULE_SETUP
+#line 1081 "tests/scan.l"
+ACTION_ECHO;
+       YY_BREAK
+case 229:
+YY_RULE_SETUP
+#line 1082 "tests/scan.l"
+ACTION_ECHO;
+       YY_BREAK
+case 230:
+YY_RULE_SETUP
+#line 1083 "tests/scan.l"
+ACTION_ECHO; /* character constant */
+       YY_BREAK
+case 231:
+YY_RULE_SETUP
+#line 1084 "tests/scan.l"
+ACTION_ECHO; BEGIN(CHARACTER_CONSTANT);
+       YY_BREAK
+case 232:
+YY_RULE_SETUP
+#line 1085 "tests/scan.l"
+ACTION_ECHO; BEGIN(ACTION_STRING);
+       YY_BREAK
+case 233:
+/* rule 233 can match eol */
+YY_RULE_SETUP
+#line 1086 "tests/scan.l"
+{
+                ++linenum;
+                ACTION_ECHO;
+                if (bracelevel <= 0) {
+                   if ( doing_rule_action )
+ {
+                      add_action( "\tYY_BREAK]""]\n" );
+  piece_flush(strlen(yytext));
+  markup_action("</PLex_Text></PLex_Section2_Rule_Action>");
+ }
+
+                   doing_rule_action = false;
+                   BEGIN(SECT2);
+                }
+             }
+       YY_BREAK
+case 234:
+YY_RULE_SETUP
+#line 1101 "tests/scan.l"
+ACTION_ECHO;
+       YY_BREAK
+
+
+case 235:
+YY_RULE_SETUP
+#line 1105 "tests/scan.l"
+ACTION_ECHO;
+       YY_BREAK
+case 236:
+YY_RULE_SETUP
+#line 1106 "tests/scan.l"
+ACTION_ECHO; BEGIN(ACTION);
+       YY_BREAK
+
+
+case 237:
+YY_RULE_SETUP
+#line 1109 "tests/scan.l"
+ACTION_ECHO;
+       YY_BREAK
+case 238:
+YY_RULE_SETUP
+#line 1110 "tests/scan.l"
+ACTION_ECHO; BEGIN(ACTION);
+       YY_BREAK
+
+
+case 239:
+/* rule 239 can match eol */
+YY_RULE_SETUP
+#line 1113 "tests/scan.l"
+ACTION_ECHO;
+       YY_BREAK
+case 240:
+/* rule 240 can match eol */
+YY_RULE_SETUP
+#line 1114 "tests/scan.l"
+ACTION_ECHO;
+       YY_BREAK
+case 241:
+/* rule 241 can match eol */
+YY_RULE_SETUP
+#line 1115 "tests/scan.l"
+++linenum; ACTION_ECHO; if (bracelevel <= 0) { BEGIN(SECT2); piece_flush(strlen(yytext)); if (doing_rule_action) markup_action("</PLex_Text></PLex_Section2_Rule_Action>"); } else { BEGIN(ACTION); }
+       YY_BREAK
+case 242:
+YY_RULE_SETUP
+#line 1116 "tests/scan.l"
+ACTION_ECHO;
+       YY_BREAK
+
+case YY_STATE_EOF(COMMENT):
+case YY_STATE_EOF(CODE_COMMENT):
+case YY_STATE_EOF(COMMENT_DISCARD):
+case YY_STATE_EOF(ACTION):
+case YY_STATE_EOF(ACTION_STRING):
+case YY_STATE_EOF(CHARACTER_CONSTANT):
+#line 1119 "tests/scan.l"
+{
+                       synerr( _( "EOF encountered inside an action" ) );
+                       yyterminate();
+                       }
+       YY_BREAK
+case YY_STATE_EOF(EXTENDED_COMMENT):
+case YY_STATE_EOF(GROUP_WITH_PARAMS):
+case YY_STATE_EOF(GROUP_MINUS_PARAMS):
+#line 1124 "tests/scan.l"
+{
+                       synerr( _( "EOF encountered inside pattern" ) );
+                       yyterminate();
+                       }
+       YY_BREAK
+case 243:
+YY_RULE_SETUP
+#line 1129 "tests/scan.l"
+{
+                       yylval = myesc( (unsigned char *) yytext );
+
+                       if ( YY_START == FIRSTCCL )
+                               BEGIN(CCL);
+
+                       return CHAR;
+                       }
+       YY_BREAK
+
+case 244:
+YY_RULE_SETUP
+#line 1139 "tests/scan.l"
+fputs(escaped_qstart, yyout);
+       YY_BREAK
+case 245:
+YY_RULE_SETUP
+#line 1140 "tests/scan.l"
+fputs(escaped_qend, yyout);
+       YY_BREAK
+case 246:
+/* rule 246 can match eol */
+YY_RULE_SETUP
+#line 1141 "tests/scan.l"
+ECHO;
+       YY_BREAK
+case 247:
+YY_RULE_SETUP
+#line 1142 "tests/scan.l"
+ECHO;
+       YY_BREAK
+case YY_STATE_EOF(SECT3):
+#line 1143 "tests/scan.l"
+{
+        sectnum = 0;
+#if 1
+ piece_pack();
+ piece_append("</PLex_Section3>");
+ piece_pack();
+ return ~YY_NULL;
+#else
+        yyterminate();
+#endif
+    }
+       YY_BREAK
+
+
+case 248:
+YY_RULE_SETUP
+#line 1156 "tests/scan.l"
+fprintf(yyout, "[""[%s]""]", escaped_qstart);
+       YY_BREAK
+case 249:
+YY_RULE_SETUP
+#line 1157 "tests/scan.l"
+fprintf(yyout, "[""[%s]""]", escaped_qend);
+       YY_BREAK
+case 250:
+/* rule 250 can match eol */
+YY_RULE_SETUP
+#line 1158 "tests/scan.l"
+ECHO;
+       YY_BREAK
+case 251:
+YY_RULE_SETUP
+#line 1159 "tests/scan.l"
+ECHO;
+       YY_BREAK
+case YY_STATE_EOF(SECT3_NOESCAPE):
+#line 1160 "tests/scan.l"
+{
+       sectnum = 0;
+#if 1
+ piece_pack();
+ piece_append("</PLex_Section3>");
+ piece_pack();
+ return ~YY_NULL;
+#else
+       yyterminate();
+#endif
+    }
+       YY_BREAK
+
+case 252:
+/* rule 252 can match eol */
+YY_RULE_SETUP
+#line 1172 "tests/scan.l"
+format_synerr( _( "bad character: %s" ), yytext );
+       YY_BREAK
+case 253:
+YY_RULE_SETUP
+#line 1174 "tests/scan.l"
+YY_FATAL_ERROR( "flex scanner jammed" );
+       YY_BREAK
+#line 4297 "lex.yy.c"
+case YY_STATE_EOF(INITIAL):
+case YY_STATE_EOF(CODEBLOCK):
+case YY_STATE_EOF(PICKUPDEF):
+case YY_STATE_EOF(SC):
+case YY_STATE_EOF(CARETISBOL):
+case YY_STATE_EOF(NUM):
+case YY_STATE_EOF(QUOTE):
+case YY_STATE_EOF(FIRSTCCL):
+case YY_STATE_EOF(CCL):
+case YY_STATE_EOF(RECOVER):
+case YY_STATE_EOF(PERCENT_BRACE_ACTION):
+case YY_STATE_EOF(OPTION):
+case YY_STATE_EOF(LINEDIR):
+       yyterminate();
+
+       case YY_END_OF_BUFFER:
+               {
+               /* Amount of text matched not including the EOB char. */
+               int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1;
+
+               /* Undo the effects of YY_DO_BEFORE_ACTION. */
+               *yy_cp = (yy_hold_char);
+               YY_RESTORE_YY_MORE_OFFSET
+
+               if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
+                       {
+                       /* We're scanning a new file or input source.  It's
+                        * possible that this happened because the user
+                        * just pointed yyin at a new source and called
+                        * yylex().  If so, then we have to assure
+                        * consistency between YY_CURRENT_BUFFER and our
+                        * globals.  Here is the right place to do so, because
+                        * this is the first action (other than possibly a
+                        * back-up) that will match for the new input source.
+                        */
+                       (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+                       YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
+                       YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
+                       }
+
+               /* Note that here we test for yy_c_buf_p "<=" to the position
+                * of the first EOB in the buffer, since yy_c_buf_p will
+                * already have been incremented past the NUL character
+                * (since all states make transitions on EOB to the
+                * end-of-buffer state).  Contrast this with the test
+                * in input().
+                */
+               if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+                       { /* This was really a NUL. */
+                       yy_state_type yy_next_state;
+
+                       (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text;
+
+                       yy_current_state = yy_get_previous_state(  );
+
+                       /* Okay, we're now positioned to make the NUL
+                        * transition.  We couldn't have
+                        * yy_get_previous_state() go ahead and do it
+                        * for us because it doesn't know how to deal
+                        * with the possibility of jamming (and we don't
+                        * want to build jamming into it because then it
+                        * will run more slowly).
+                        */
+
+                       yy_next_state = yy_try_NUL_trans( yy_current_state );
+
+                       yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+
+                       if ( yy_next_state )
+                               {
+                               /* Consume the NUL. */
+                               yy_cp = ++(yy_c_buf_p);
+                               yy_current_state = yy_next_state;
+                               goto yy_match;
+                               }
+
+                       else
+                               {
+                               yy_cp = (yy_c_buf_p);
+                               goto yy_find_action;
+                               }
+                       }
+
+               else switch ( yy_get_next_buffer(  ) )
+                       {
+                       case EOB_ACT_END_OF_FILE:
+                               {
+                               (yy_did_buffer_switch_on_eof) = 0;
+
+                               if ( yywrap(  ) )
+                                       {
+                                       /* Note: because we've taken care in
+                                        * yy_get_next_buffer() to have set up
+                                        * yytext, we can now set up
+                                        * yy_c_buf_p so that if some total
+                                        * hoser (like flex itself) wants to
+                                        * call the scanner after we return the
+                                        * YY_NULL, it'll still work - another
+                                        * YY_NULL will get returned.
+                                        */
+                                       (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ;
+
+                                       yy_act = YY_STATE_EOF(YY_START);
+                                       goto do_action;
+                                       }
+
+                               else
+                                       {
+                                       if ( ! (yy_did_buffer_switch_on_eof) )
+                                               YY_NEW_FILE;
+                                       }
+                               break;
+                               }
+
+                       case EOB_ACT_CONTINUE_SCAN:
+                               (yy_c_buf_p) =
+                                       (yytext_ptr) + yy_amount_of_matched_text;
+
+                               yy_current_state = yy_get_previous_state(  );
+
+                               yy_cp = (yy_c_buf_p);
+                               yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+                               goto yy_match;
+
+                       case EOB_ACT_LAST_MATCH:
+                               (yy_c_buf_p) =
+                               &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)];
+
+                               yy_current_state = yy_get_previous_state(  );
+
+                               yy_cp = (yy_c_buf_p);
+                               yy_bp = (yytext_ptr) + YY_MORE_ADJ;
+                               goto yy_find_action;
+                       }
+               break;
+               }
+
+       default:
+               YY_FATAL_ERROR(
+                       "fatal flex scanner internal error--no action found" );
+       } /* end of action switch */
+               } /* end of scanning one token */
+       } /* end of user's declarations */
+} /* end of yylex */
+
+/* yy_get_next_buffer - try to read in a new buffer
+ *
+ * Returns a code representing an action:
+ *     EOB_ACT_LAST_MATCH -
+ *     EOB_ACT_CONTINUE_SCAN - continue scanning from current position
+ *     EOB_ACT_END_OF_FILE - end of file
+ */
+static int yy_get_next_buffer (void)
+{
+       char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+       char *source = (yytext_ptr);
+       int number_to_move, i;
+       int ret_val;
+
+       if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] )
+               YY_FATAL_ERROR(
+               "fatal flex scanner internal error--end of buffer missed" );
+
+       if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
+               { /* Don't try to fill the buffer, so this is an EOF. */
+               if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 )
+                       {
+                       /* We matched a single character, the EOB, so
+                        * treat this as a final EOF.
+                        */
+                       return EOB_ACT_END_OF_FILE;
+                       }
+
+               else
+                       {
+                       /* We matched some text prior to the EOB, first
+                        * process it.
+                        */
+                       return EOB_ACT_LAST_MATCH;
+                       }
+               }
+
+       /* Try to read more data. */
+
+       /* First move last chars to start of buffer. */
+       number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr) - 1);
+
+       for ( i = 0; i < number_to_move; ++i )
+               *(dest++) = *(source++);
+
+       if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
+               /* don't do the read, it's not guaranteed to return an EOF,
+                * just force an EOF
+                */
+               YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0;
+
+       else
+               {
+                       int num_to_read =
+                       YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;
+
+               while ( num_to_read <= 0 )
+                       { /* Not enough room in the buffer - grow it. */
+
+                       /* just a shorter name for the current buffer */
+                       YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE;
+
+                       int yy_c_buf_p_offset =
+                               (int) ((yy_c_buf_p) - b->yy_ch_buf);
+
+                       if ( b->yy_is_our_buffer )
+                               {
+                               int new_size = b->yy_buf_size * 2;
+
+                               if ( new_size <= 0 )
+                                       b->yy_buf_size += b->yy_buf_size / 8;
+                               else
+                                       b->yy_buf_size *= 2;
+
+                               b->yy_ch_buf = (char *)
+                                       /* Include room in for 2 EOB chars. */
+                                       yyrealloc( (void *) b->yy_ch_buf,
+                                                        (yy_size_t) (b->yy_buf_size + 2)  );
+                               }
+                       else
+                               /* Can't grow it, we don't own it. */
+                               b->yy_ch_buf = NULL;
+
+                       if ( ! b->yy_ch_buf )
+                               YY_FATAL_ERROR(
+                               "fatal error - scanner input buffer overflow" );
+
+                       (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset];
+
+                       num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
+                                               number_to_move - 1;
+
+                       }
+
+               if ( num_to_read > YY_READ_BUF_SIZE )
+                       num_to_read = YY_READ_BUF_SIZE;
+
+               /* Read in more data. */
+               YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
+                       (yy_n_chars), num_to_read );
+
+               YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+               }
+
+       if ( (yy_n_chars) == 0 )
+               {
+               if ( number_to_move == YY_MORE_ADJ )
+                       {
+                       ret_val = EOB_ACT_END_OF_FILE;
+                       yyrestart( yyin  );
+                       }
+
+               else
+                       {
+                       ret_val = EOB_ACT_LAST_MATCH;
+                       YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
+                               YY_BUFFER_EOF_PENDING;
+                       }
+               }
+
+       else
+               ret_val = EOB_ACT_CONTINUE_SCAN;
+
+       if (((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {
+               /* Extend the array by 50%, plus the number we really need. */
+               int new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1);
+               YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc(
+                       (void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf, (yy_size_t) new_size  );
+               if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+                       YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );
+               /* "- 2" to take care of EOB's */
+               YY_CURRENT_BUFFER_LVALUE->yy_buf_size = (int) (new_size - 2);
+       }
+
+       (yy_n_chars) += number_to_move;
+       YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR;
+       YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR;
+
+       (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];
+
+       return ret_val;
+}
+
+/* yy_get_previous_state - get the state just before the EOB char was reached */
+
+    static yy_state_type yy_get_previous_state (void)
+{
+       yy_state_type yy_current_state;
+       char *yy_cp;
+    
+       yy_current_state = (yy_start);
+       yy_current_state += YY_AT_BOL();
+
+       for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp )
+               {
+               int yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+               if ( yy_accept[yy_current_state] )
+                       {
+                       (yy_last_accepting_state) = yy_current_state;
+                       (yy_last_accepting_cpos) = yy_cp;
+                       }
+               while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+                       {
+                       yy_current_state = (int) yy_def[yy_current_state];
+                       if ( yy_current_state >= 1114 )
+                               yy_c = yy_meta[yy_c];
+                       }
+               yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+               }
+
+       return yy_current_state;
+}
+
+/* yy_try_NUL_trans - try to make a transition on the NUL character
+ *
+ * synopsis
+ *     next_state = yy_try_NUL_trans( current_state );
+ */
+    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state )
+{
+       int yy_is_jam;
+       char *yy_cp = (yy_c_buf_p);
+
+       int yy_c = 1;
+       if ( yy_accept[yy_current_state] )
+               {
+               (yy_last_accepting_state) = yy_current_state;
+               (yy_last_accepting_cpos) = yy_cp;
+               }
+       while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
+               {
+               yy_current_state = (int) yy_def[yy_current_state];
+               if ( yy_current_state >= 1114 )
+                       yy_c = yy_meta[yy_c];
+               }
+       yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
+       yy_is_jam = (yy_current_state == 1113);
+
+               return yy_is_jam ? 0 : yy_current_state;
+}
+
+#ifndef YY_NO_UNPUT
+
+    static void yyunput (int c, char * yy_bp )
+{
+       char *yy_cp;
+    
+    yy_cp = (yy_c_buf_p);
+
+       /* undo effects of setting up yytext */
+       *yy_cp = (yy_hold_char);
+
+       if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+               { /* need to shift things up to make room */
+               /* +2 for EOB chars. */
+               int number_to_move = (yy_n_chars) + 2;
+               char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+                                       YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
+               char *source =
+                               &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
+
+               while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
+                       *--dest = *--source;
+
+               yy_cp += (int) (dest - source);
+               yy_bp += (int) (dest - source);
+               YY_CURRENT_BUFFER_LVALUE->yy_n_chars =
+                       (yy_n_chars) = (int) YY_CURRENT_BUFFER_LVALUE->yy_buf_size;
+
+               if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
+                       YY_FATAL_ERROR( "flex scanner push-back overflow" );
+               }
+
+       *--yy_cp = (char) c;
+
+       (yytext_ptr) = yy_bp;
+       (yy_hold_char) = *yy_cp;
+       (yy_c_buf_p) = yy_cp;
+}
+
+#endif
+
+#ifndef YY_NO_INPUT
+#ifdef __cplusplus
+    static int yyinput (void)
+#else
+    static int input  (void)
+#endif
+
+{
+       int c;
+    
+       *(yy_c_buf_p) = (yy_hold_char);
+
+       if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR )
+               {
+               /* yy_c_buf_p now points to the character we want to return.
+                * If this occurs *before* the EOB characters, then it's a
+                * valid NUL; if not, then we've hit the end of the buffer.
+                */
+               if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] )
+                       /* This was really a NUL. */
+                       *(yy_c_buf_p) = '\0';
+
+               else
+                       { /* need more input */
+                       int offset = (int) ((yy_c_buf_p) - (yytext_ptr));
+                       ++(yy_c_buf_p);
+
+                       switch ( yy_get_next_buffer(  ) )
+                               {
+                               case EOB_ACT_LAST_MATCH:
+                                       /* This happens because yy_g_n_b()
+                                        * sees that we've accumulated a
+                                        * token and flags that we need to
+                                        * try matching the token before
+                                        * proceeding.  But for input(),
+                                        * there's no matching to consider.
+                                        * So convert the EOB_ACT_LAST_MATCH
+                                        * to EOB_ACT_END_OF_FILE.
+                                        */
+
+                                       /* Reset buffer status. */
+                                       yyrestart( yyin );
+
+                                       /*FALLTHROUGH*/
+
+                               case EOB_ACT_END_OF_FILE:
+                                       {
+                                       if ( yywrap(  ) )
+                                               return 0;
+
+                                       if ( ! (yy_did_buffer_switch_on_eof) )
+                                               YY_NEW_FILE;
+#ifdef __cplusplus
+                                       return yyinput();
+#else
+                                       return input();
+#endif
+                                       }
+
+                               case EOB_ACT_CONTINUE_SCAN:
+                                       (yy_c_buf_p) = (yytext_ptr) + offset;
+                                       break;
+                               }
+                       }
+               }
+
+       c = *(unsigned char *) (yy_c_buf_p);    /* cast for 8-bit char's */
+       *(yy_c_buf_p) = '\0';   /* preserve yytext */
+       (yy_hold_char) = *++(yy_c_buf_p);
+
+       YY_CURRENT_BUFFER_LVALUE->yy_at_bol = (c == '\n');
+
+       return c;
+}
+#endif /* ifndef YY_NO_INPUT */
+
+/** Immediately switch to a different input stream.
+ * @param input_file A readable stream.
+ * 
+ * @note This function does not reset the start condition to @c INITIAL .
+ */
+    void yyrestart  (FILE * input_file )
+{
+    
+       if ( ! YY_CURRENT_BUFFER ){
+        yyensure_buffer_stack ();
+               YY_CURRENT_BUFFER_LVALUE =
+            yy_create_buffer( yyin, YY_BUF_SIZE );
+       }
+
+       yy_init_buffer( YY_CURRENT_BUFFER, input_file );
+       yy_load_buffer_state(  );
+}
+
+/** Switch to a different input buffer.
+ * @param new_buffer The new input buffer.
+ * 
+ */
+    void yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer )
+{
+    
+       /* TODO. We should be able to replace this entire function body
+        * with
+        *              yypop_buffer_state();
+        *              yypush_buffer_state(new_buffer);
+     */
+       yyensure_buffer_stack ();
+       if ( YY_CURRENT_BUFFER == new_buffer )
+               return;
+
+       if ( YY_CURRENT_BUFFER )
+               {
+               /* Flush out information for old buffer. */
+               *(yy_c_buf_p) = (yy_hold_char);
+               YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+               YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+               }
+
+       YY_CURRENT_BUFFER_LVALUE = new_buffer;
+       yy_load_buffer_state(  );
+
+       /* We don't actually know whether we did this switch during
+        * EOF (yywrap()) processing, but the only time this flag
+        * is looked at is after yywrap() is called, so it's safe
+        * to go ahead and always set it.
+        */
+       (yy_did_buffer_switch_on_eof) = 1;
+}
+
+static void yy_load_buffer_state  (void)
+{
+       (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
+       (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
+       yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
+       (yy_hold_char) = *(yy_c_buf_p);
+}
+
+/** Allocate and initialize an input buffer state.
+ * @param file A readable stream.
+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
+ * 
+ * @return the allocated buffer state.
+ */
+    YY_BUFFER_STATE yy_create_buffer  (FILE * file, int  size )
+{
+       YY_BUFFER_STATE b;
+    
+       b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state )  );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_buf_size = size;
+
+       /* yy_ch_buf has to be 2 characters longer than the size given because
+        * we need to put in 2 end-of-buffer characters.
+        */
+       b->yy_ch_buf = (char *) yyalloc( (yy_size_t) (b->yy_buf_size + 2)  );
+       if ( ! b->yy_ch_buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
+
+       b->yy_is_our_buffer = 1;
+
+       yy_init_buffer( b, file );
+
+       return b;
+}
+
+/** Destroy the buffer.
+ * @param b a buffer created with yy_create_buffer()
+ * 
+ */
+    void yy_delete_buffer (YY_BUFFER_STATE  b )
+{
+    
+       if ( ! b )
+               return;
+
+       if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
+               YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;
+
+       if ( b->yy_is_our_buffer )
+               yyfree( (void *) b->yy_ch_buf  );
+
+       yyfree( (void *) b  );
+}
+
+/* Initializes or reinitializes a buffer.
+ * This function is sometimes called more than once on the same buffer,
+ * such as during a yyrestart() or at EOF.
+ */
+    static void yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file )
+
+{
+       int oerrno = errno;
+    
+       yy_flush_buffer( b );
+
+       b->yy_input_file = file;
+       b->yy_fill_buffer = 1;
+
+    /* If b is the current buffer, then yy_init_buffer was _probably_
+     * called from yyrestart() or through yy_get_next_buffer.
+     * In that case, we don't want to reset the lineno or column.
+     */
+    if (b != YY_CURRENT_BUFFER){
+        b->yy_bs_lineno = 1;
+        b->yy_bs_column = 0;
+    }
+
+        b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
+    
+       errno = oerrno;
+}
+
+/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
+ * 
+ */
+    void yy_flush_buffer (YY_BUFFER_STATE  b )
+{
+       if ( ! b )
+               return;
+
+       b->yy_n_chars = 0;
+
+       /* We always need two end-of-buffer characters.  The first causes
+        * a transition to the end-of-buffer state.  The second causes
+        * a jam in that state.
+        */
+       b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
+       b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;
+
+       b->yy_buf_pos = &b->yy_ch_buf[0];
+
+       b->yy_at_bol = 1;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       if ( b == YY_CURRENT_BUFFER )
+               yy_load_buffer_state(  );
+}
+
+/** Pushes the new state onto the stack. The new state becomes
+ *  the current state. This function will allocate the stack
+ *  if necessary.
+ *  @param new_buffer The new state.
+ *  
+ */
+void yypush_buffer_state (YY_BUFFER_STATE new_buffer )
+{
+       if (new_buffer == NULL)
+               return;
+
+       yyensure_buffer_stack();
+
+       /* This block is copied from yy_switch_to_buffer. */
+       if ( YY_CURRENT_BUFFER )
+               {
+               /* Flush out information for old buffer. */
+               *(yy_c_buf_p) = (yy_hold_char);
+               YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p);
+               YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
+               }
+
+       /* Only push if top exists. Otherwise, replace top. */
+       if (YY_CURRENT_BUFFER)
+               (yy_buffer_stack_top)++;
+       YY_CURRENT_BUFFER_LVALUE = new_buffer;
+
+       /* copied from yy_switch_to_buffer. */
+       yy_load_buffer_state(  );
+       (yy_did_buffer_switch_on_eof) = 1;
+}
+
+/** Removes and deletes the top of the stack, if present.
+ *  The next element becomes the new top.
+ *  
+ */
+void yypop_buffer_state (void)
+{
+       if (!YY_CURRENT_BUFFER)
+               return;
+
+       yy_delete_buffer(YY_CURRENT_BUFFER );
+       YY_CURRENT_BUFFER_LVALUE = NULL;
+       if ((yy_buffer_stack_top) > 0)
+               --(yy_buffer_stack_top);
+
+       if (YY_CURRENT_BUFFER) {
+               yy_load_buffer_state(  );
+               (yy_did_buffer_switch_on_eof) = 1;
+       }
+}
+
+/* Allocates the stack if it does not exist.
+ *  Guarantees space for at least one push.
+ */
+static void yyensure_buffer_stack (void)
+{
+       yy_size_t num_to_alloc;
+    
+       if (!(yy_buffer_stack)) {
+
+               /* First allocation is just for 2 elements, since we don't know if this
+                * scanner will even need a stack. We use 2 instead of 1 to avoid an
+                * immediate realloc on the next call.
+         */
+      num_to_alloc = 1; /* After all that talk, this was set to 1 anyways... */
+               (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc
+                                                               (num_to_alloc * sizeof(struct yy_buffer_state*)
+                                                               );
+               if ( ! (yy_buffer_stack) )
+                       YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+               memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*));
+
+               (yy_buffer_stack_max) = num_to_alloc;
+               (yy_buffer_stack_top) = 0;
+               return;
+       }
+
+       if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){
+
+               /* Increase the buffer to prepare for a possible push. */
+               yy_size_t grow_size = 8 /* arbitrary grow size */;
+
+               num_to_alloc = (yy_buffer_stack_max) + grow_size;
+               (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc
+                                                               ((yy_buffer_stack),
+                                                               num_to_alloc * sizeof(struct yy_buffer_state*)
+                                                               );
+               if ( ! (yy_buffer_stack) )
+                       YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" );
+
+               /* zero only the new slots.*/
+               memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*));
+               (yy_buffer_stack_max) = num_to_alloc;
+       }
+}
+
+/** Setup the input buffer state to scan directly from a user-specified character buffer.
+ * @param base the character buffer
+ * @param size the size in bytes of the character buffer
+ * 
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_buffer  (char * base, yy_size_t  size )
+{
+       YY_BUFFER_STATE b;
+    
+       if ( size < 2 ||
+            base[size-2] != YY_END_OF_BUFFER_CHAR ||
+            base[size-1] != YY_END_OF_BUFFER_CHAR )
+               /* They forgot to leave room for the EOB's. */
+               return NULL;
+
+       b = (YY_BUFFER_STATE) yyalloc( sizeof( struct yy_buffer_state )  );
+       if ( ! b )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" );
+
+       b->yy_buf_size = (int) (size - 2);      /* "- 2" to take care of EOB's */
+       b->yy_buf_pos = b->yy_ch_buf = base;
+       b->yy_is_our_buffer = 0;
+       b->yy_input_file = NULL;
+       b->yy_n_chars = b->yy_buf_size;
+       b->yy_is_interactive = 0;
+       b->yy_at_bol = 1;
+       b->yy_fill_buffer = 0;
+       b->yy_buffer_status = YY_BUFFER_NEW;
+
+       yy_switch_to_buffer( b  );
+
+       return b;
+}
+
+/** Setup the input buffer state to scan a string. The next call to yylex() will
+ * scan from a @e copy of @a str.
+ * @param yystr a NUL-terminated string to scan
+ * 
+ * @return the newly allocated buffer state object.
+ * @note If you want to scan bytes that may contain NUL values, then use
+ *       yy_scan_bytes() instead.
+ */
+YY_BUFFER_STATE yy_scan_string (const char * yystr )
+{
+    
+       return yy_scan_bytes( yystr, (int) strlen(yystr) );
+}
+
+/** Setup the input buffer state to scan the given bytes. The next call to yylex() will
+ * scan from a @e copy of @a bytes.
+ * @param yybytes the byte buffer to scan
+ * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes.
+ * 
+ * @return the newly allocated buffer state object.
+ */
+YY_BUFFER_STATE yy_scan_bytes  (const char * yybytes, int  _yybytes_len )
+{
+       YY_BUFFER_STATE b;
+       char *buf;
+       yy_size_t n;
+       int i;
+    
+       /* Get memory for full buffer, including space for trailing EOB's. */
+       n = (yy_size_t) (_yybytes_len + 2);
+       buf = (char *) yyalloc( n  );
+       if ( ! buf )
+               YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" );
+
+       for ( i = 0; i < _yybytes_len; ++i )
+               buf[i] = yybytes[i];
+
+       buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR;
+
+       b = yy_scan_buffer( buf, n );
+       if ( ! b )
+               YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" );
+
+       /* It's okay to grow etc. this buffer, and we should throw it
+        * away when we're done.
+        */
+       b->yy_is_our_buffer = 1;
+
+       return b;
+}
+
+    static void yy_push_state (int  _new_state )
+{
+       if ( (yy_start_stack_ptr) >= (yy_start_stack_depth) )
+               {
+               yy_size_t new_size;
+
+               (yy_start_stack_depth) += YY_START_STACK_INCR;
+               new_size = (yy_size_t) (yy_start_stack_depth) * sizeof( int );
+
+               if ( ! (yy_start_stack) )
+                       (yy_start_stack) = (int *) yyalloc( new_size  );
+
+               else
+                       (yy_start_stack) = (int *) yyrealloc(
+                                       (void *) (yy_start_stack), new_size  );
+
+               if ( ! (yy_start_stack) )
+                       YY_FATAL_ERROR( "out of memory expanding start-condition stack" );
+               }
+
+       (yy_start_stack)[(yy_start_stack_ptr)++] = YY_START;
+
+       BEGIN(_new_state);
+}
+
+    static void yy_pop_state  (void)
+{
+       if ( --(yy_start_stack_ptr) < 0 )
+               YY_FATAL_ERROR( "start-condition stack underflow" );
+
+       BEGIN((yy_start_stack)[(yy_start_stack_ptr)]);
+}
+
+#ifndef YY_EXIT_FAILURE
+#define YY_EXIT_FAILURE 2
+#endif
+
+static void yynoreturn yy_fatal_error (const char* msg )
+{
+                       fprintf( stderr, "%s\n", msg );
+       exit( YY_EXIT_FAILURE );
+}
+
+/* Redefine yyless() so it works in section 3 code. */
+
+#undef yyless
+#define yyless(n) \
+       do \
+               { \
+               /* Undo effects of setting up yytext. */ \
+        int yyless_macro_arg = (n); \
+        YY_LESS_LINENO(yyless_macro_arg);\
+               yytext[yyleng] = (yy_hold_char); \
+               (yy_c_buf_p) = yytext + yyless_macro_arg; \
+               (yy_hold_char) = *(yy_c_buf_p); \
+               *(yy_c_buf_p) = '\0'; \
+               yyleng = yyless_macro_arg; \
+               } \
+       while ( 0 )
+
+/* Accessor  methods (get/set functions) to struct members. */
+
+/** Get the current line number.
+ * 
+ */
+int yyget_lineno  (void)
+{
+    
+    return yylineno;
+}
+
+/** Get the input stream.
+ * 
+ */
+FILE *yyget_in  (void)
+{
+        return yyin;
+}
+
+/** Get the output stream.
+ * 
+ */
+FILE *yyget_out  (void)
+{
+        return yyout;
+}
+
+/** Get the length of the current token.
+ * 
+ */
+int yyget_leng  (void)
+{
+        return yyleng;
+}
+
+/** Get the current token.
+ * 
+ */
+
+char *yyget_text  (void)
+{
+        return yytext;
+}
+
+/** Set the current line number.
+ * @param _line_number line number
+ * 
+ */
+void yyset_lineno (int  _line_number )
+{
+    
+    yylineno = _line_number;
+}
+
+/** Set the input stream. This does not discard the current
+ * input buffer.
+ * @param _in_str A readable stream.
+ * 
+ * @see yy_switch_to_buffer
+ */
+void yyset_in (FILE *  _in_str )
+{
+        yyin = _in_str ;
+}
+
+void yyset_out (FILE *  _out_str )
+{
+        yyout = _out_str ;
+}
+
+int yyget_debug  (void)
+{
+        return yy_flex_debug;
+}
+
+void yyset_debug (int  _bdebug )
+{
+        yy_flex_debug = _bdebug ;
+}
+
+static int yy_init_globals (void)
+{
+        /* Initialization is the same as for the non-reentrant scanner.
+     * This function is called from yylex_destroy(), so don't allocate here.
+     */
+
+    (yy_buffer_stack) = NULL;
+    (yy_buffer_stack_top) = 0;
+    (yy_buffer_stack_max) = 0;
+    (yy_c_buf_p) = NULL;
+    (yy_init) = 0;
+    (yy_start) = 0;
+
+    (yy_start_stack_ptr) = 0;
+    (yy_start_stack_depth) = 0;
+    (yy_start_stack) =  NULL;
+
+/* Defined in main.c */
+#ifdef YY_STDINIT
+    yyin = stdin;
+    yyout = stdout;
+#else
+    yyin = NULL;
+    yyout = NULL;
+#endif
+
+    /* For future reference: Set errno on error, since we are called by
+     * yylex_init()
+     */
+    return 0;
+}
+
+/* yylex_destroy is for both reentrant and non-reentrant scanners. */
+int yylex_destroy  (void)
+{
+    
+    /* Pop the buffer stack, destroying each element. */
+       while(YY_CURRENT_BUFFER){
+               yy_delete_buffer( YY_CURRENT_BUFFER  );
+               YY_CURRENT_BUFFER_LVALUE = NULL;
+               yypop_buffer_state();
+       }
+
+       /* Destroy the stack itself. */
+       yyfree((yy_buffer_stack) );
+       (yy_buffer_stack) = NULL;
+
+    /* Destroy the start condition stack. */
+        yyfree( (yy_start_stack)  );
+        (yy_start_stack) = NULL;
+
+    /* Reset the globals. This is important in a non-reentrant scanner so the next time
+     * yylex() is called, initialization will occur. */
+    yy_init_globals( );
+
+    return 0;
+}
+
+/*
+ * Internal utility routines.
+ */
+
+#ifndef yytext_ptr
+static void yy_flex_strncpy (char* s1, const char * s2, int n )
+{
+               
+       int i;
+       for ( i = 0; i < n; ++i )
+               s1[i] = s2[i];
+}
+#endif
+
+#ifdef YY_NEED_STRLEN
+static int yy_flex_strlen (const char * s )
+{
+       int n;
+       for ( n = 0; s[n]; ++n )
+               ;
+
+       return n;
+}
+#endif
+
+void *yyalloc (yy_size_t  size )
+{
+                       return malloc(size);
+}
+
+void *yyrealloc  (void * ptr, yy_size_t  size )
+{
+               
+       /* The cast to (char *) in the following accommodates both
+        * implementations that use char* generic pointers, and those
+        * that use void* generic pointers.  It works with the latter
+        * because both ANSI C and C++ allow castless assignment from
+        * any pointer type to void*, and deal with argument conversions
+        * as though doing an assignment.
+        */
+       return realloc(ptr, size);
+}
+
+void yyfree (void * ptr )
+{
+                       free( (char *) ptr );   /* see yyrealloc() for (char *) cast */
+}
+
+#define YYTABLES_NAME "yytables"
+
+#line 1174 "tests/scan.l"
+
+
+
+int yywrap(void)
+       {
+       if ( --num_input_files > 0 )
+               {
+               set_input_file( *++input_files );
+               return 0;
+               }
+
+       else
+               return 1;
+       }
+
+
+/* set_input_file - open the given file (if NULL, stdin) for scanning */
+
+void set_input_file( char *file )
+       {
+       if ( file && strcmp( file, "-" ) )
+               {
+               infilename = xstrdup(file);
+               yyin = fopen( infilename, "r" );
+
+               if ( yyin == NULL )
+                       lerr( _( "can't open %s" ), file );
+               }
+
+       else
+               {
+               yyin = stdin;
+               infilename = xstrdup("<stdin>");
+               }
+
+       linenum = 1;
+       }
+
+/* Nick */
+void piece_append(const char *str) {
+ piece[piece1++] = strdup(str);
+}
+
+void piece_insert(int n, const char *str) {
+ memmove(piece + n + 1, piece + n, (piece1 - n) * sizeof(char *));
+ piece[n] = strdup(str);
+ ++piece1;
+}
+
+void piece_escape(const char *p, size_t n) {
+ size_t i, j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+  case '>':
+   j += 4;
+   break;
+  case '&':
+   j += 5;
+   break;
+  default:
+   ++j;
+   break;
+  }
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+   memcpy(q + j, "&lt;", 4);
+   j += 4;
+   break;
+  case '>':
+   memcpy(q + j, "&gt;", 4);
+   j += 4;
+   break;
+  case '&':
+   memcpy(q + j, "&amp;", 5);
+   j += 5;
+   break;
+  default:
+   q[j++] = p[i];
+   break;
+  }
+ q[j] = 0;
+ piece[piece1++] = q;
+}
+
+void piece_flush(size_t n) {
+ piece_escape(yytext, n);
+ yytext += n;
+}
+
+void piece_pack() {
+ int i;
+ size_t j = 0;
+ for (i = piece0; i < piece1; ++i)
+  j += strlen(piece[i]);
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = piece0; i < piece1; ++i) {
+  int k = strlen(piece[i]);
+  memcpy(q + j, piece[i], k);
+  free(piece[i]);
+  j += k;
+ }
+ q[j] = 0;
+ piece[piece0++] = q;
+ piece1 = piece0;
+}
+
+int flexscan(void) {
+ int result = real_flexscan();
+ if (result < 0)
+  return ~result;
+ piece_pack();
+ piece_escape(yytext, strlen(yytext));
+ piece_pack();
+ return result;
+}
+
+static void markup_action(const char *text) {
+ /* append to last token text so it appears inside <PLex_Section2_Rule>..</PLex_Section2_Rule> */
+ /* a problem here is that Rule has already been reduced (marked up), */
+ /* because we returned a '\n' token when we detected start of action, */
+ /* hence we need to move the closing </PLex_Section2_Rule> tag over to our right */
+ int i = strlen(piece[--piece0]);
+ if (i < 21 || strcmp(piece[piece0] + i - 21, "</PLex_Section2_Rule>") != 0)
+  abort();
+ piece[piece0][i - 21] = 0;
+ piece_append(text);
+ piece_append("</PLex_Section2_Rule>");
+ piece_pack();
+}
+
+static void markup_option(const char *name, int sense) {
+ /* a problem here is that we couldn't apply markup when scanning the "no" */
+ /* prefix because we didn't know what option it was, back up to include it */
+ int i = piece1;
+ while (--i >= piece0 && strcmp(piece[i], "no") == 0)
+  ;
+ sprintf(piece_temp, "<PLex_Section1_Options_%s%s>", name, sense ? " value=\"true\"" : "");
+ piece_insert(i + 1, piece_temp);
+ piece_flush(strlen(yytext));
+ sprintf(piece_temp, "</PLex_Section1_Options_%s>", name);
+ piece_append(piece_temp);
+ /* append to last token text so it appears inside <PLex_Section1_Options>..</PLex_Section1_Options> */
+ --piece0;
+ piece_pack();
+}
+
diff --git a/lr1.py b/lr1.py
new file mode 100644 (file)
index 0000000..7a784f1
--- /dev/null
+++ b/lr1.py
@@ -0,0 +1,573 @@
+import bisect
+import bisect_set
+import element
+import lr1dfa
+#import work
+import sys
+
+# defines the alphabet size, set this to 0x11000 for unicode
+n_characters = 0x100
+
+class LR1:
+  ASSOCIATIVITY_RIGHT = 0
+  ASSOCIATIVITY_LEFT = 1
+  ASSOCIATIVITY_NON = 2
+
+  def __init__(
+    self,
+    productions = [],
+    precedences = ([], [], [], []),
+    associativities = [],
+    n_terminals = n_characters + 1,
+    eof_terminal = n_characters
+  ):
+    # productions: list of production
+    # production: (
+    #   symbols,
+    #   lookaheads,
+    #   ref_data
+    # )
+    # symbols: list of symbol_desc
+    # symbol_desc: (terminal_set, nonterminal_set)
+    # terminal_set: similar to character_set, even length list of pairs of breaks
+    # nonterminal_set: as above but has n_terminals subtracted from breaks
+    # lookaheads: list of lookahead_desc, len(lookaheads) = len(symbols) + 1
+    # lookahead_desc: (initial_set, can_be_empty)
+    # initial_set: what terminals can occur at this position in symbols array,
+    # computed such that lookaheads[i][0] is symbols[i][0], plus initial set of
+    # each nonterminal from symbols[i][1], plus lookaheads[i + 1][0] if any
+    # nonterminal of symbols[i][1] can be empty (may pull in i + 2, i + 3 etc)
+    # can_be_empty: whether all symbols from this position to end can be empty
+    # note: last lookahead_desc is a sentinel consisting of ([], True), so that
+    # initial_set is empty (will be augmented by context) and can_be_empty is
+    # True (because all symbols from the end to the end can obviously be empty)
+    # ref_data: can be anything for caller's use, usually list of group_bound
+    # group_bound: (start_index, end_index, tag, kwargs)
+    #   where start_index, end_index are indices into list of character_set,
+    #   and tag, kwargs will be passed to apply_markup() hence factory(),
+    #   noting that markup has to be applied in reverse order of the list
+    # precedences: (terminal_breaks, terminal_precs, nonterminal_breaks,
+    #   nonterminal_precs) encoded similarly to the action and goto tables
+    # associativities: indexed by value from (non)terminal_precs, contains
+    #   -1 for not specified (equal precedence is a compile time error) or an
+    #   ASSOCIATIVITY_* value (NON means equal precedence is run time error)
+    # n_terminals: offset to apply to productions[] index to get symbol
+    #   (character set code), also symbol for productions[0] = start production
+    # eof_terminal: usually == n_terminals - 1 (must be valid terminal value)
+    self.productions = productions
+    self.precedences = precedences
+    self.associativities = associativities
+    self.n_terminals = n_terminals
+    self.eof_terminal = eof_terminal
+
+  def lookahead_item_set_closure(self, items, item_to_index):
+    in_queue = [True for i in range(len(items))]
+    queue = list(range(len(items)))
+
+    qhead = 0
+    while qhead < len(queue):
+      i = queue[qhead]
+      in_queue[i] = False
+      j, k, lookahead_set = items[i]
+      symbols, lookaheads, _ = self.productions[j]
+      if k < len(symbols):
+        _, nonterminal_set = symbols[k]
+        if len(nonterminal_set):
+          next_lookahead_set, next_can_be_empty = lookaheads[k + 1]
+          if next_can_be_empty:
+            next_lookahead_set = bisect_set.bisect_set_or(
+              next_lookahead_set,
+              lookahead_set
+            )
+          for l in range(0, len(nonterminal_set), 2):
+            for m in range(nonterminal_set[l], nonterminal_set[l + 1]):
+              key = (m, 0)
+              if key in item_to_index:
+                n = item_to_index[key]
+                child_lookahead_set = bisect_set.bisect_set_or(
+                  items[n][2],
+                  next_lookahead_set
+                )
+                if child_lookahead_set != items[n][2]:
+                  items[n] = (m, 0, child_lookahead_set)
+                  if not in_queue[n]:
+                    # optimization: do not re-queue unless it is transparent
+                    # to changes in the lookahead set wrt. further propagation
+                    child_symbols, child_lookaheads, _ = self.productions[m]
+                    if len(child_symbols) and child_lookaheads[1][1]:
+                      in_queue[n] = True
+                      queue.append(n)
+              else:
+                n = len(items)
+                items.append((m, 0, next_lookahead_set))
+                item_to_index[key] = n
+                in_queue.append(True)
+                queue.append(n)
+      qhead += 1 
+
+  def lookahead_item_set_action(self, items, terminal):
+    next_items = []
+    next_item_to_index = {}
+    reductions = set()
+    terminal0 = 0
+    terminal1 = self.n_terminals
+    for i, j, lookahead_set in items:
+      symbols, _, _ = self.productions[i]
+      if j < len(symbols):
+        terminal_set, _ = symbols[j]
+        k = bisect.bisect_right(terminal_set, terminal)
+        if k > 0 and terminal0 < terminal_set[k - 1]:
+          terminal0 = terminal_set[k - 1]
+        if k < len(terminal_set) and terminal1 > terminal_set[k]:
+          terminal1 = terminal_set[k]
+        if (k & 1) == 1:
+          next_item_to_index[(i, j + 1)] = len(next_items)
+          next_items.append((i, j + 1, lookahead_set))
+      else:
+        k = bisect.bisect_right(lookahead_set, terminal)
+        if k > 0 and terminal0 < lookahead_set[k - 1]:
+          terminal0 = lookahead_set[k - 1]
+        if k < len(lookahead_set) and terminal1 > lookahead_set[k]:
+          terminal1 = lookahead_set[k]
+        if (k & 1) == 1:
+          reductions.add(i)
+    return next_items, next_item_to_index, reductions, terminal0, terminal1
+
+  def lookahead_item_set_goto(self, items, nonterminal):
+    next_items = []
+    next_item_to_index = {}
+    reductions = set()
+    nonterminal0 = 0
+    nonterminal1 = len(self.productions)
+    for i, j, lookahead_set in items:
+      symbols, _, _ = self.productions[i]
+      if j < len(symbols):
+        _, nonterminal_set = symbols[j]
+        k = bisect.bisect_right(nonterminal_set, nonterminal)
+        if k > 0 and nonterminal0 < nonterminal_set[k - 1]:
+          nonterminal0 = nonterminal_set[k - 1]
+        if k < len(nonterminal_set) and nonterminal1 > nonterminal_set[k]:
+          nonterminal1 = nonterminal_set[k]
+        if (k & 1) == 1:
+          next_item_to_index[(i, j + 1)] = len(next_items)
+          next_items.append((i, j + 1, lookahead_set))
+    return next_items, next_item_to_index, nonterminal0, nonterminal1
+
+  #def parse_text(self, text, i):
+  #  items = [(0, 0, [self.eof_terminal, self.eof_terminal + 1])]
+  #  item_to_index = {(0, 0): 0}
+  #  value_stack = []
+  #  state_stack = []
+  #  lookahead_character = ord(text[i]) if i < len(text) else self.eof_terminal
+  #  while True:
+  #    self.lookahead_item_set_closure(items, item_to_index)
+  #    value_stack.append(i)
+  #    state_stack.append(items)
+  #    items, item_to_index, reductions, _, _ = (
+  #      self.lookahead_item_set_action(items, lookahead_character)
+  #    )
+  #    if len(items) != 0:
+  #      if len(reductions) != 0:
+  #        sys.stderr.write(
+  #          'shift/reduce conflict: {0:s} vs {1:s}\n'.format(
+  #            ','.join([str(i) for i, _, _ in next_items]),
+  #            ','.join([str(i) for i in reductions])
+  #          )
+  #        )
+  #      i += 1
+  #      lookahead_character = ord(text[i]) if i < len(text) else self.eof_terminal
+  #    elif len(reductions) != 0:
+  #      if len(reductions) != 1:
+  #        sys.stderr.write(
+  #          'reduce/reduce conflict: {0:s}\n'.format(
+  #            ','.join([str(i) for i in reductions])
+  #          )
+  #        )
+  #      reduce = min(reductions)
+  #      symbols, _, ref_data = self.productions[reduce]
+  #      base = len(value_stack) - len(symbols) - 1
+  #      for j in range(len(ref_data) - 1, -1, -1):
+  #        k, l, tag, _ = ref_data[j]
+  #        k += base
+  #        if l != 1:
+  #          value_stack[k + 1:k + l + 1] = [value_stack[k + l]]
+  #        sys.stderr.write(
+  #          'text \'{0:s}\' tag \'{1:s}\'\n'.format(
+  #            text[value_stack[k]:value_stack[k + 1]],
+  #            tag
+  #          )
+  #        )
+  #      del value_stack[base + 1:]
+  #      del state_stack[base + 1:]
+  #      if reduce == 0:
+  #        assert base == 0
+  #        return
+  #      items, item_to_index, _, _ = (
+  #        self.lookahead_item_set_goto(state_stack[-1], reduce)
+  #      )
+  #      assert len(items) != 0
+  #    else:
+  #      raise Exception(
+  #        'syntax error at {0:d}: {1:s}'.format(i, text[i:])
+  #      )
+
+  #def parse_yychunk(self, root, pos, off, factory, yychunk_iter):
+  #  if pos < 0:
+  #    pos, off = element.to_start_relative(root, pos, off)
+
+  #  items = [(0, 0, [self.eof_terminal, self.eof_terminal + 1])]
+  #  item_to_index = {(0, 0): 0}
+  #  value_stack = []
+  #  state_stack = []
+  #  text = element.get_text(root, pos)
+  #  while off >= len(text):
+  #    if pos < len(root):
+  #      pos += 1
+  #      off = 0
+  #    else:
+  #      try:
+  #        next(yychunk_iter)
+  #      except StopIteration:
+  #        lookahead_character = self.eof_terminal
+  #        break
+  #      text = element.get_text(root, pos)
+  #  else: 
+  #    lookahead_character = ord(text[off])
+  #  while True:
+  #    self.lookahead_item_set_closure(items, item_to_index)
+  #    value_stack.append((pos, off))
+  #    state_stack.append(items)
+  #    items, item_to_index, reductions, _, _ = (
+  #      self.lookahead_item_set_action(items, lookahead_character)
+  #    )
+  #    if len(items) != 0:
+  #      if len(reductions) != 0:
+  #        sys.stderr.write(
+  #          'shift/reduce conflict: {0:s} vs {1:s}\n'.format(
+  #            ','.join([str(i) for i, _ in next_lookahead_item_set.keys()]),
+  #            ','.join([str(i) for i in reductions])
+  #          )
+  #        )
+  #      off += 1
+  #      while off >= len(text):
+  #        if pos < len(root):
+  #          pos += 1
+  #          off = 0
+  #        else:
+  #          try:
+  #            next(yychunk_iter)
+  #          except StopIteration:
+  #            lookahead_character = self.eof_terminal
+  #            break
+  #          text = element.get_text(root, pos)
+  #      else: 
+  #        lookahead_character = ord(text[off])
+  #    elif len(reductions) != 0:
+  #      if len(reductions) != 1:
+  #        sys.stderr.write(
+  #          'reduce/reduce conflict: {0:s}\n'.format(
+  #            ','.join([str(i) for i in reductions])
+  #          )
+  #        )
+  #      reduce = min(reductions)
+  #      symbols, _, ref_data = self.productions[reduce]
+  #      base = len(value_stack) - len(symbols) - 1
+  #      end_relative = len(value_stack)
+  #      for j in range(len(ref_data) - 1, -1, -1):
+  #        k, l, tag, kwargs = ref_data[j]
+  #        k += base
+  #        assert k < end_relative
+  #        if l != 1:
+  #          value_stack[k + 1:k + l + 1] = [value_stack[k + l]]
+  #          end_relative = max(k + 1, end_relative + 1 - l)
+  #        while end_relative > k + 1:
+  #          end_relative -= 1
+  #          pos1, off1 = value_stack[end_relative]
+  #          value_stack[end_relative] = (
+  #            element.to_end_relative(root, pos1, off1)
+  #          )
+  #        pos0, off0 = value_stack[k]
+  #        pos1, off1 = value_stack[k + 1]
+  #        work.apply_markup(
+  #          root,
+  #          pos0,
+  #          off0,
+  #          pos1,
+  #          off1,
+  #          factory,
+  #          tag,
+  #          **kwargs
+  #        )
+  #      if end_relative < len(value_stack):
+  #        pos, off = value_stack[-1]
+  #        pos, off = element.to_start_relative(root, pos, off)
+  #        text = element.get_text(root, pos)
+  #      del value_stack[base + 1:]
+  #      del state_stack[base + 1:]
+  #      if reduce == 0:
+  #        assert base == 0
+  #        return
+  #      items, item_to_index, _, _ = (
+  #        self.lookahead_item_set_goto(state_stack[-1], reduce)
+  #      )
+  #      assert len(items) != 0
+  #    else:
+  #      raise Exception(
+  #        'syntax error at {0:d},{1:d}: {2:s}'.format(pos, off, text[off:])
+  #      )
+
+  def to_clr1(self):
+    _lr1dfa = lr1dfa.LR1DFA(
+      [],
+      [
+        (len(symbols), ref_data)
+        for symbols, _, ref_data in self.productions
+      ],
+      self.n_terminals,
+      self.eof_terminal
+    )
+
+    items = [(0, 0, [self.eof_terminal, self.eof_terminal + 1])]
+    item_to_index = {(0, 0): 0}
+    self.lookahead_item_set_closure(items, item_to_index)
+
+    items = sorted(items)
+    key = tuple((i, j, tuple(k)) for i, j, k in items)
+    state_to_items = [items]
+    items_to_state = {key: 0}
+
+    while len(_lr1dfa.states) < len(state_to_items):
+      items = state_to_items[len(_lr1dfa.states)]
+      state_desc = ([], [], [], [])
+
+      def add_state(next_items, next_item_to_index):
+        self.lookahead_item_set_closure(next_items, next_item_to_index)
+        new_items = sorted(next_items)
+        key = tuple((i, j, tuple(k)) for i, j, k in new_items)
+        if key in items_to_state:
+          state = items_to_state[key]
+        else:
+          state = len(state_to_items)
+          state_to_items.append(new_items)
+          items_to_state[key] = state
+        return state
+
+      terminal = 0
+      while terminal < self.n_terminals:
+        next_items, next_item_to_index, reductions, terminal0, terminal1 = (
+          self.lookahead_item_set_action(items, terminal)
+        )
+        assert terminal0 == terminal and terminal1 > terminal
+        if len(reductions) != 0:
+          if len(reductions) != 1:
+            sys.stderr.write(
+              'state {0:d} reduce/reduce conflict: {1:s}\n'.format(
+                len(_lr1dfa.states),
+                ', '.join([str(i) for i in sorted(reductions)])
+              )
+            )
+          reduction = min(reductions)
+          if len(next_items) != 0:
+            j = bisect.bisect_right(self.precedences[0], terminal)
+            if j > 0 and terminal0 < self.precedences[0][j - 1]:
+              terminal0 = self.precedences[0][j - 1]
+            assert j < len(self.precedences[0])
+            if terminal1 > self.precedences[0][j]:
+              terminal1 = self.precedences[0][j]
+            shift_precedence = self.precedences[1][j]
+            reduce_precedence = self.precedences[3][
+              bisect.bisect_right(self.precedences[2], reduction)
+            ]
+            if shift_precedence == -1 or reduce_precedence == -1:
+              sys.stderr.write(
+                'state {0:d} shift/reduce conflict: {1:d} vs {2:d}\n'.format(
+                  len(_lr1dfa.states),
+                  terminal,
+                  reduction
+                )
+              )
+              action = add_state(next_items, next_item_to_index) * 2 # shift
+            elif shift_precedence > reduce_precedence:
+              action = add_state(next_items, next_item_to_index) * 2 # shift
+            elif shift_precedence < reduce_precedence:
+              action = reduction * 2 + 1 # reduce
+            else:
+              associativity = self.associativities[shift_precedence]
+              if associativity == LR1.ASSOCIATIVITY_RIGHT:
+                action = add_state(next_items, next_item_to_index) * 2 # shift
+              elif associativity == LR1.ASSOCIATIVITY_LEFT:
+                action = reduction * 2 + 1 # reduce
+              elif associativity == LR1.ASSOCIATIVITY_NON: # run time error
+                action = -1
+              else:
+                assert False # not specified (compile time error)
+          else:
+            action = reduction * 2 + 1 # reduce
+        elif len(next_items) != 0:
+          action = add_state(next_items, next_item_to_index) * 2 # shift
+        else:
+          action = -1
+        state_desc[0].append(terminal1)
+        state_desc[1].append(action)
+        terminal = terminal1
+
+      nonterminal = 0
+      while nonterminal < len(self.productions):
+        next_items, next_item_to_index, nonterminal0, nonterminal1 = (
+          self.lookahead_item_set_goto(items, nonterminal)
+        )
+        assert nonterminal0 == nonterminal and nonterminal1 > nonterminal
+        if len(next_items) != 0:
+          goto = add_state(next_items, next_item_to_index)
+        else:
+          goto = -1
+        state_desc[2].append(nonterminal1)
+        state_desc[3].append(goto)
+        nonterminal = nonterminal1
+
+      _lr1dfa.states.append(state_desc)
+    return _lr1dfa
+
+  def to_lalr1(self):
+    _lr1dfa = lr1dfa.LR1DFA(
+      [],
+      [
+        (len(symbols), ref_data)
+        for symbols, _, ref_data in self.productions
+      ],
+      self.n_terminals,
+      self.eof_terminal
+    )
+
+    items = [(0, 0, [self.eof_terminal, self.eof_terminal + 1])]
+    item_to_index = {(0, 0): 0}
+    self.lookahead_item_set_closure(items, item_to_index)
+
+    items = sorted(items)
+    key = tuple((i, j) for i, j, _ in items) # ignore lookahead
+    state_to_items = [items]
+    items_to_state = {key: 0}
+
+    in_queue = [True]
+    queue = [0]
+
+    qhead = 0
+    while qhead < len(queue):
+      i = queue[qhead]
+      in_queue[i] = False
+      items = state_to_items[i]
+      state_desc = ([], [], [], [])
+
+      def add_state(next_items, next_item_to_index):
+        self.lookahead_item_set_closure(next_items, next_item_to_index)
+        new_items = sorted(next_items)
+        key = tuple((i, j) for i, j, _ in new_items) # ignore lookahead
+        if key in items_to_state:
+          state = items_to_state[key]
+          state_items = state_to_items[state]
+          for i in range(len(new_items)):
+            j, k, lookahead_set = new_items[i]
+            lookahead_set = bisect_set.bisect_set_or(lookahead_set, state_items[i][2])
+            if lookahead_set != state_items[i][2]:
+              state_items[i] = (j, k, lookahead_set)
+              if not in_queue[state]:
+                in_queue[state] = True
+                queue.append(state)
+        else:
+          state = len(state_to_items)
+          state_to_items.append(new_items)
+          items_to_state[key] = state
+          in_queue.append(True)
+          queue.append(state)
+        return state
+
+      terminal = 0
+      while terminal < self.n_terminals:
+        next_items, next_item_to_index, reductions, terminal0, terminal1 = (
+          self.lookahead_item_set_action(items, terminal)
+        )
+        assert terminal0 == terminal and terminal1 > terminal
+        if len(reductions) != 0:
+          if len(reductions) != 1:
+            sys.stderr.write(
+              'state {0:d} reduce/reduce conflict: {1:s}\n'.format(
+                len(_lr1dfa.states),
+                ', '.join([str(i) for i in sorted(reductions)])
+              )
+            )
+          reduction = min(reductions)
+          if len(next_items) != 0:
+            j = bisect.bisect_right(self.precedences[0], terminal)
+            if j > 0 and terminal0 < self.precedences[0][j - 1]:
+              terminal0 = self.precedences[0][j - 1]
+            assert j < len(self.precedences[0])
+            if terminal1 > self.precedences[0][j]:
+              terminal1 = self.precedences[0][j]
+            shift_precedence = self.precedences[1][j]
+            reduce_precedence = self.precedences[3][
+              bisect.bisect_right(self.precedences[2], reduction)
+            ]
+            if shift_precedence == -1 or reduce_precedence == -1:
+              sys.stderr.write(
+                'state {0:d} shift/reduce conflict: {1:d} vs {2:d}\n'.format(
+                  i,
+                  terminal,
+                  reduction
+                )
+              )
+              action = add_state(next_items, next_item_to_index) * 2 # shift
+            elif shift_precedence > reduce_precedence:
+              action = add_state(next_items, next_item_to_index) * 2 # shift
+            elif shift_precedence < reduce_precedence:
+              action = reduction * 2 + 1 # reduce
+            else:
+              associativity = self.associativities[shift_precedence]
+              if associativity == LR1.ASSOCIATIVITY_RIGHT:
+                action = add_state(next_items, next_item_to_index) * 2 # shift
+              elif associativity == LR1.ASSOCIATIVITY_LEFT:
+                action = reduction * 2 + 1 # reduce
+              elif associativity == LR1.ASSOCIATIVITY_NON: # run time error
+                action = -1
+              else:
+                assert False # not specified (compile time error)
+          else:
+            action = reduction * 2 + 1 # reduce
+        elif len(next_items) != 0:
+          action = add_state(next_items, next_item_to_index) * 2 # shift
+        else:
+          action = -1
+        state_desc[0].append(terminal1)
+        state_desc[1].append(action)
+        terminal = terminal1
+
+      nonterminal = 0
+      while nonterminal < len(self.productions):
+        next_items, next_item_to_index, nonterminal0, nonterminal1 = (
+          self.lookahead_item_set_goto(items, nonterminal)
+        )
+        assert nonterminal0 == nonterminal and nonterminal1 > nonterminal
+        if len(next_items) != 0:
+          goto = add_state(next_items, next_item_to_index)
+        else:
+          goto = -1
+        state_desc[2].append(nonterminal1)
+        state_desc[3].append(goto)
+        nonterminal = nonterminal1
+
+      if i < len(_lr1dfa.states):
+        _lr1dfa.states[i] = state_desc
+      else:
+        _lr1dfa.states.append(state_desc)
+      qhead += 1
+    return _lr1dfa
+
+  def __repr__(self):
+    return 'lr1.LR1({0:s}, {1:s}, {2:s}, {3:d}, {4:d})'.format(
+      repr(self.productions),
+      repr(self.precedences),
+      repr(self.associativities),
+      self.n_terminals,
+      self.eof_terminal
+    )
+
+
diff --git a/lr1dfa.py b/lr1dfa.py
new file mode 100644 (file)
index 0000000..d3defa7
--- /dev/null
+++ b/lr1dfa.py
@@ -0,0 +1,261 @@
+import bisect
+import element
+import work
+import sys
+
+# defines the alphabet size, set this to 0x11000 for unicode
+n_characters = 0x100
+
+class LR1DFA:
+  def __init__(
+    self,
+    states = [],
+    productions = [],
+    n_terminals = n_characters + 1,
+    eof_terminal = n_characters
+  ):
+    # states: list of state_desc
+    # state_desc: (terminal breaks, actions, nonterminal breaks, gotos)
+    # action: shift = new state * 2, reduce = production * 2 + 1, error = -1
+    # goto: reduce = production, error = -1 (but error can't really happen)
+    # productions: list of production
+    # production: (len(symbols), ref_data)
+    # len(symbols): how many states to pop stack to reduce this production
+    # ref_data: can be anything for caller's use, usually list of group_bound
+    # group_bound: (start_index, end_index, tag, kwargs)
+    #   where start_index, end_index are indices into list of character_set,
+    #   and tag, kwargs will be passed to apply_markup() hence factory(),
+    #   noting that markup has to be applied in reverse order of the list
+    # n_terminals: offset to apply to productions[] index to get symbol
+    #   (character set code), also symbol for productions[0] = start production
+    # eof_terminal: usually == n_terminals - 1 (must be valid terminal value)
+    self.states = states
+    self.productions = productions
+    self.n_terminals = n_terminals
+    self.eof_terminal = eof_terminal
+
+  def parse_text(self, text, i):
+    state = 0
+    value_stack = []
+    state_stack = []
+    lookahead_character = ord(text[i]) if i < len(text) else self.eof_terminal
+    while True:
+      value_stack.append(i)
+      state_stack.append(state)
+      action = self.states[state][1][
+        bisect.bisect_right(self.states[state][0], lookahead_character)
+      ]
+      if action == -1:
+        raise Exception(
+          'syntax error at {0:d}: {1:s}'.format(i, text[i:])
+        )
+      if (action & 1) == 0:
+        state = action >> 1
+        i += 1
+        lookahead_character = ord(text[i]) if i < len(text) else self.eof_terminal
+      else:
+        reduce = action >> 1
+        len_symbols, ref_data = self.productions[reduce]
+        base = len(value_stack) - len_symbols - 1
+        for j in range(len(ref_data) - 1, -1, -1):
+          k, l, tag, _ = ref_data[j]
+          k += base
+          if l != 1:
+            value_stack[k + 1:k + l + 1] = [value_stack[k + l]]
+          sys.stdout.write(
+            'text \'{0:s}\' tag \'{1:s}\'\n'.format(
+              text[value_stack[k]:value_stack[k + 1]],
+              tag
+            )
+          )
+        del value_stack[base + 1:]
+        del state_stack[base + 1:]
+        if reduce == 0:
+          assert base == 0
+          return
+        state = self.states[state_stack[-1]][3][
+          bisect.bisect_right(self.states[state_stack[-1]][2], reduce)
+        ]
+        assert state != -1
+
+  def parse_yychunk(self, root, pos, off, factory, yychunk_iter):
+    if pos < 0:
+      pos, off = element.to_start_relative(root, pos, off)
+
+    state = 0
+    value_stack = []
+    state_stack = []
+    text = element.get_text(root, pos)
+    while off >= len(text):
+      if pos < len(root):
+        pos += 1
+        off = 0
+      else:
+        try:
+          next(yychunk_iter)
+        except StopIteration:
+          lookahead_character = self.eof_terminal
+          break
+        text = element.get_text(root, pos)
+    else:
+      lookahead_character = ord(text[off])
+    while True:
+      value_stack.append((pos, off))
+      state_stack.append(state)
+      action = self.states[state][1][
+        bisect.bisect_right(self.states[state][0], lookahead_character)
+      ]
+      #print('lookahead_character', lookahead_character, 'action', action)
+      if action == -1:
+        raise Exception(
+          'syntax error at {0:d},{1:d}: {2:s}'.format(pos, off, text[off:])
+        )
+      if (action & 1) == 0:
+        state = action >> 1
+        off += 1
+        while off >= len(text):
+          if pos < len(root):
+            pos += 1
+            off = 0
+          else:
+            try:
+              next(yychunk_iter)
+            except StopIteration:
+              lookahead_character = self.eof_terminal
+              break
+            text = element.get_text(root, pos)
+        else:
+          lookahead_character = ord(text[off])
+      else:
+        reduce = action >> 1
+        len_symbols, ref_data = self.productions[reduce]
+        base = len(value_stack) - len_symbols - 1
+        end_relative = len(value_stack)
+        for j in range(len(ref_data) - 1, -1, -1):
+          k, l, tag, kwargs = ref_data[j]
+          k += base
+          assert k < end_relative
+          if l != 1:
+            value_stack[k + 1:k + l + 1] = [value_stack[k + l]]
+            end_relative = max(k + 1, end_relative + 1 - l)
+          while end_relative > k + 1:
+            end_relative -= 1
+            pos1, off1 = value_stack[end_relative]
+            value_stack[end_relative] = (
+              element.to_end_relative(root, pos1, off1)
+            )
+          pos0, off0 = value_stack[k]
+          pos1, off1 = value_stack[k + 1]
+          work.apply_markup(
+            root,
+            pos0,
+            off0,
+            pos1,
+            off1,
+            factory,
+            tag,
+            **kwargs
+          )
+        if end_relative < len(value_stack):
+          pos, off = value_stack[-1]
+          pos, off = element.to_start_relative(root, pos, off)
+          text = element.get_text(root, pos)
+        del value_stack[base + 1:]
+        del state_stack[base + 1:]
+        if reduce == 0:
+          assert base == 0
+          return
+        state = self.states[state_stack[-1]][3][
+          bisect.bisect_right(self.states[state_stack[-1]][2], reduce)
+        ]
+        assert state != -1
+
+  def yyparse(self, root, pos, off, factory, yylex_iter):
+    if pos < 0:
+      pos, off = element.to_start_relative(root, pos, off)
+
+    state = 0
+    value_stack = []
+    state_stack = []
+    try:
+      end_pos, end_off, lookahead_character = next(yylex_iter)
+      #if lookahead_character < 256:
+      #  print('\'{0:s}\''.format(chr(lookahead_character)))
+      #else:
+      #  print(['IDENTIFIER', 'I_CONSTANT', 'F_CONSTANT', 'STRING_LITERAL', 'FUNC_NAME', 'SIZEOF', 'PTR_OP', 'INC_OP', 'DEC_OP', 'LEFT_OP', 'RIGHT_OP', 'LE_OP', 'GE_OP', 'EQ_OP', 'NE_OP', 'AND_OP', 'OR_OP', 'MUL_ASSIGN', 'DIV_ASSIGN', 'MOD_ASSIGN', 'ADD_ASSIGN', 'SUB_ASSIGN', 'LEFT_ASSIGN', 'RIGHT_ASSIGN', 'AND_ASSIGN', 'XOR_ASSIGN', 'OR_ASSIGN', 'TYPEDEF_NAME', 'ENUMERATION_CONSTANT', 'TYPEDEF', 'EXTERN', 'STATIC', 'AUTO', 'REGISTER', 'INLINE', 'CONST', 'RESTRICT', 'VOLATILE', 'BOOL', 'CHAR', 'SHORT', 'INT', 'LONG', 'SIGNED', 'UNSIGNED', 'FLOAT', 'DOUBLE', 'VOID', 'COMPLEX', 'IMAGINARY', 'STRUCT', 'UNION', 'ENUM', 'ELLIPSIS', 'CASE', 'DEFAULT', 'IF', 'ELSE', 'SWITCH', 'WHILE', 'DO', 'FOR', 'GOTO', 'CONTINUE', 'BREAK', 'RETURN', 'ALIGNAS', 'ALIGNOF', 'ATOMIC', 'GENERIC', 'NORETURN', 'STATIC_ASSERT', 'THREAD_LOCAL'][lookahead_character - 258])
+    except StopIteration:
+      lookahead_character = self.eof_terminal
+      end_pos, end_off = element.to_end_relative(root, pos, off)
+    while True:
+      value_stack.append((pos, off))
+      state_stack.append(state)
+      action = self.states[state][1][
+        bisect.bisect_right(self.states[state][0], lookahead_character)
+      ]
+      #print('lookahead_character', lookahead_character, 'action', action)
+      if action == -1:
+        raise Exception(
+          'syntax error at {0:d},{1:d}: {2:d}'.format(pos, off, lookahead_character)
+        )
+      if (action & 1) == 0:
+        state = action >> 1
+        pos, off = element.to_start_relative(root, end_pos, end_off)
+        try:
+          end_pos, end_off, lookahead_character = next(yylex_iter)
+          #if lookahead_character < 256:
+          #  print('\'{0:s}\''.format(chr(lookahead_character)))
+          #else:
+          #  print(['IDENTIFIER', 'I_CONSTANT', 'F_CONSTANT', 'STRING_LITERAL', 'FUNC_NAME', 'SIZEOF', 'PTR_OP', 'INC_OP', 'DEC_OP', 'LEFT_OP', 'RIGHT_OP', 'LE_OP', 'GE_OP', 'EQ_OP', 'NE_OP', 'AND_OP', 'OR_OP', 'MUL_ASSIGN', 'DIV_ASSIGN', 'MOD_ASSIGN', 'ADD_ASSIGN', 'SUB_ASSIGN', 'LEFT_ASSIGN', 'RIGHT_ASSIGN', 'AND_ASSIGN', 'XOR_ASSIGN', 'OR_ASSIGN', 'TYPEDEF_NAME', 'ENUMERATION_CONSTANT', 'TYPEDEF', 'EXTERN', 'STATIC', 'AUTO', 'REGISTER', 'INLINE', 'CONST', 'RESTRICT', 'VOLATILE', 'BOOL', 'CHAR', 'SHORT', 'INT', 'LONG', 'SIGNED', 'UNSIGNED', 'FLOAT', 'DOUBLE', 'VOID', 'COMPLEX', 'IMAGINARY', 'STRUCT', 'UNION', 'ENUM', 'ELLIPSIS', 'CASE', 'DEFAULT', 'IF', 'ELSE', 'SWITCH', 'WHILE', 'DO', 'FOR', 'GOTO', 'CONTINUE', 'BREAK', 'RETURN', 'ALIGNAS', 'ALIGNOF', 'ATOMIC', 'GENERIC', 'NORETURN', 'STATIC_ASSERT', 'THREAD_LOCAL'][lookahead_character - 258])
+        except StopIteration:
+          lookahead_character = self.eof_terminal
+          #end_pos, end_off = element.to_end_relative(root, pos, off)
+      else:
+        reduce = action >> 1
+        len_symbols, ref_data = self.productions[reduce]
+        base = len(value_stack) - len_symbols - 1
+        end_relative = len(value_stack)
+        for j in range(len(ref_data) - 1, -1, -1):
+          k, l, tag, kwargs = ref_data[j]
+          k += base
+          assert k < end_relative
+          if l != 1:
+            value_stack[k + 1:k + l + 1] = [value_stack[k + l]]
+            end_relative = max(k + 1, end_relative + 1 - l)
+          while end_relative > k + 1:
+            end_relative -= 1
+            pos1, off1 = value_stack[end_relative]
+            value_stack[end_relative] = (
+              element.to_end_relative(root, pos1, off1)
+            )
+          pos0, off0 = value_stack[k]
+          pos1, off1 = value_stack[k + 1]
+          work.apply_markup(
+            root,
+            pos0,
+            off0,
+            pos1,
+            off1,
+            factory,
+            tag,
+            **kwargs
+          )
+        if end_relative < len(value_stack):
+          pos, off = value_stack[-1]
+          pos, off = element.to_start_relative(root, pos, off)
+        del value_stack[base + 1:]
+        del state_stack[base + 1:]
+        if reduce == 0:
+          assert base == 0
+          return
+        state = self.states[state_stack[-1]][3][
+          bisect.bisect_right(self.states[state_stack[-1]][2], reduce)
+        ]
+        assert state != -1
+
+  def __repr__(self):
+    return 'lr1dfa.LR1DFA({0:s}, {1:s}, {2:d}, {3:d})'.format(
+      repr(self.states),
+      repr(self.productions),
+      self.n_terminals,
+      self.eof_terminal
+    )
diff --git a/macify.txt b/macify.txt
new file mode 100644 (file)
index 0000000..7932085
--- /dev/null
@@ -0,0 +1 @@
+s/\([^^I]*\)^I\+\(.*\)/text = text.replace('{\1}\2', '{\1}')/
diff --git a/minilex.py b/minilex.py
new file mode 100755 (executable)
index 0000000..8337229
--- /dev/null
@@ -0,0 +1,76 @@
+#!/usr/bin/env python3
+
+import element
+import nfa
+import regex
+import sys
+import wrap_repr
+
+if len(sys.argv) < 2:
+  sys.stdout.write(
+    'usage: {0:s} regex.xml [tokens.py] <yylex_template.py'.format(
+      sys.argv[0]
+    )
+  )
+  sys.exit(1)
+
+with open(sys.argv[1]) as fin:
+  _regex = element.deserialize(fin, regex.factory)
+
+group_name_to_token = {}
+for i in range(0x100):
+  group_name_to_token['X_{0:02X}'.format(i)] = i
+if len(sys.argv) >= 3:
+  with open(sys.argv[2]) as fin:
+    line = fin.readline()
+    while len(line):
+      fields = line.split()
+      assert fields[1] == '='
+      group_name_to_token[fields[0]] = int(fields[2])
+      line = fin.readline()
+
+line = sys.stdin.readline()
+while len(line):
+  if line[:14] == '# GENERATE DFA':
+    groups = []
+    _regex.to_groups(groups)
+    _nfa = nfa.NFA(groups)
+    _regex.add_to_nfa(_nfa)
+    _dfa = _nfa.to_dfa()
+    sys.stdout.write(
+      '''# GENERATE DFA BEGIN
+{0:s}# GENERATE END
+'''.format(
+        wrap_repr.wrap_repr('_dfa = {0:s}'.format(repr(_dfa)), 79)
+      )
+    )
+    if line[14:20] == ' BEGIN':
+      line = sys.stdin.readline()
+      while len(line):
+        if line[:14] == '# GENERATE END':
+          break
+        line = sys.stdin.readline()
+      else:
+        assert False
+  elif line[:17] == '# GENERATE TOKENS':
+    groups = []
+    _regex.to_groups(groups)
+    tokens = [group_name_to_token.get(i, -1) for i, _ in groups]
+    sys.stdout.write(
+      '''# GENERATE TOKENS BEGIN
+{0:s}# GENERATE END
+'''.format(
+        wrap_repr.wrap_repr('tokens = {0:s}'.format(repr(tokens)), 79)
+      )
+    )
+    if line[17:23] == ' BEGIN':
+      line = sys.stdin.readline()
+      while len(line):
+        if line[:14] == '# GENERATE END':
+          break
+        line = sys.stdin.readline()
+      else:
+        assert False
+  else:
+    sys.stdout.write(line)
+  line = sys.stdin.readline()
diff --git a/miniyacc.py b/miniyacc.py
new file mode 100755 (executable)
index 0000000..4f1e1f9
--- /dev/null
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+
+import element
+import grammar
+import sys
+import wrap_repr
+
+if len(sys.argv) < 2:
+  sys.stdout.write(
+    'usage: {0:s} grammar.xml tokens.py <yyparse_template.py'.format(
+      sys.argv[0]
+    )
+  )
+  sys.exit(1)
+
+with open(sys.argv[1]) as fin:
+  _grammar = element.deserialize(fin, grammar.factory)
+
+line = sys.stdin.readline()
+while len(line):
+  if line[:15] == '# GENERATE CLR1':
+    clr1 = _grammar.to_lr1().to_clr1()
+    sys.stdout.write(
+      '''# GENERATE CLR1 BEGIN
+{0:s}# GENERATE END
+'''.format(
+        wrap_repr.wrap_repr('clr1 = {0:s}'.format(repr(clr1)), 79)
+      )
+    )
+    if line[15:21] == ' BEGIN':
+      line = sys.stdin.readline()
+      while len(line):
+        if line[:14] == '# GENERATE END':
+          break
+        line = sys.stdin.readline()
+      else:
+        assert False
+  if line[:16] == '# GENERATE LALR1':
+    lalr1 = _grammar.to_lr1().to_lalr1()
+    sys.stdout.write(
+      '''# GENERATE LALR1 BEGIN
+{0:s}# GENERATE END
+'''.format(
+        wrap_repr.wrap_repr('lalr1 = {0:s}'.format(repr(lalr1)), 79)
+      )
+    )
+    if line[16:22] == ' BEGIN':
+      line = sys.stdin.readline()
+      while len(line):
+        if line[:14] == '# GENERATE END':
+          break
+        line = sys.stdin.readline()
+      else:
+        assert False
+  else:
+    sys.stdout.write(line)
+  line = sys.stdin.readline()
diff --git a/n.sh b/n.sh
new file mode 100755 (executable)
index 0000000..3f15037
--- /dev/null
+++ b/n.sh
@@ -0,0 +1,5 @@
+#!/bin/sh
+../bootstrap_flex.git/src/flex tests/scan.l 2>tests/scan.l.xml
+./l_to_python.py <tests/scan.l.xml >a
+./xml_to_l.py <a >b
+diff --unified --ignore-space-change tests/scan.l b
diff --git a/nfa.py b/nfa.py
new file mode 100644 (file)
index 0000000..0d108bd
--- /dev/null
+++ b/nfa.py
@@ -0,0 +1,446 @@
+import bisect
+import dfa
+import element
+
+# defines the alphabet size, set this to 0x11000 for unicode
+n_characters = 0x100
+
+class NFA:
+  # state_desc classes:
+  # (STATE_CHARACTER, character_set, next_state)
+  # (STATE_OR, next_state0, next_state1)
+  # (STATE_AND, next_state0, next_state1)
+  # (STATE_JOIN0,)
+  # (STATE_JOIN1, next_state)
+  # (STATE_MARK, mark_value, next_state)
+
+  STATE_CHARACTER = 0
+  STATE_OR = 1
+  STATE_AND = 2
+  STATE_JOIN0 = 3
+  STATE_JOIN1 = 4
+  STATE_MARK = 5
+  join0_state = (STATE_JOIN0,)
+
+  # multistate classes:
+  # (MULTISTATE_ACCEPT, 1)             accept, occupies one thread in list
+  # (MULTISTATE_AND, n, state, child)  and, occupies n threads in list
+  # (MULTISTATE_OR, n, child0, child1)
+  # n = sum of n from child states, that is, multistate[1] is the number of
+  # (MULTISTATE_ACCEPT, 1) leaf states ultimately reachable from this subtree
+
+  MULTISTATE_ACCEPT = 0
+  MULTISTATE_AND = 1
+  MULTISTATE_OR = 2
+  accept_multistate = (MULTISTATE_ACCEPT, 1)
+
+  def __init__(
+    self,
+    groups = [],
+    states = [(STATE_CHARACTER, [0, n_characters], 0)],
+    start_state = [] # can have multiple NFAs in same container
+  ):
+    # groups: list of group_desc
+    # group_desc: (tag, kwargs)
+    #   tag, kwargs will be passed to apply_markup() hence factory()
+    self.groups = groups
+    self.states = states
+    self.start_state = start_state
+
+  def multistate_next(self, root_multistate, character):
+    # the deduplication works as effectively a second pass which goes
+    # over the multistate tree in pre-order, looking for OR-disjunctions
+    # of any depth and configuration, e.g. (a OR b) or (c OR d), and
+    # collecting the subexpressions e.g. a, b, c OR b, c, d, c OR d, and
+    # failing any subexpression that's previously occurred in pre-order
+    # (children of AND-conjunctions get a fresh empty subexpression set)
+
+    # unfortunately it can't be done as a second pass literally, because
+    # we have to generate the transition list, thus we need to know if a
+    # subexpression is going to be failed, so we can delete it's threads
+
+    # therefore the deduplication is tacked onto the end of the building
+    # process, examining each built node just before the builder returns,
+    # if already in the subexpression set we will rewrite the transition
+    # list produced by the recursive calls, otherwise we will add it in
+
+    # the problem is determining the subexpression set to pass into any
+    # recursive calls, the caller's set will be sent unchanged by cases
+    # that return the result unchanged or add an OR-disjuction, an empty
+    # set will be sent by cases that add an AND-conjuction to the result 
+
+    # if we have added something to the node built by a recursive call,
+    # we'll fall into the deduplication logic, otherwise just return it
+
+    def advance1(multistate, join_count, done_multistates):
+      # modifies nonlocal: transition
+      assert multistate[0] == NFA.MULTISTATE_AND
+      _, _, state, child = multistate
+      if state == 0:
+        # note that if we reach the accepting state, we must be a top-level
+        # expression, and could not be part of an AND-conjunction (because
+        # AND-conjunction terms always go to a join0 or join1 state first),
+        # we remove ourselves to indicate to scanner that match is complete
+        assert join_count == 0
+        assert child == NFA.accept_multistate
+        return advance(child, 0, done_multistates)
+      state_desc = self.states[state]
+      if state_desc[0] == NFA.STATE_CHARACTER:
+        if join_count != 0:
+          transition.append((dfa.DFA.TRANSITION_POP, child[1]))
+          return None
+        len_transition = len(transition)
+        child = advance(child, 0, set())
+        if child is None:
+          return None
+        result = (NFA.MULTISTATE_AND, child[1], state, child)
+      elif state_desc[0] == NFA.STATE_OR:
+        _, next_state0, next_state1 = state_desc
+        len_transition = len(transition)
+        transition.append((dfa.DFA.TRANSITION_DUP, child[1]))
+        child0 = advance1(
+          (NFA.MULTISTATE_AND, child[1], next_state0, child),
+          join_count,
+          done_multistates
+        )
+        child1 = advance1(
+          (NFA.MULTISTATE_AND, child[1], next_state1, child),
+          join_count,
+          done_multistates
+        )
+        if child0 is None:
+          return child1
+        if child1 is None:
+          return child0
+        result = (NFA.MULTISTATE_OR, child0[1] + child1[1], child0, child1)
+      elif state_desc[0] == NFA.STATE_AND:
+        _, next_state0, next_state1 = state_desc
+        return advance1(
+          (
+            NFA.MULTISTATE_AND,
+            child[1],
+            next_state0,
+            (NFA.MULTISTATE_AND, child[1], next_state1, child)
+          ),
+          join_count,
+          done_multistates
+        )
+      elif state_desc[0] == NFA.STATE_JOIN0:
+        return advance(child, join_count + 1, done_multistates)
+      elif state_desc[0] == NFA.STATE_JOIN1:
+        _, next_state = state_desc
+        if join_count == 0:
+          transition.append((dfa.DFA.TRANSITION_POP, child[1]))
+          return None
+        return advance1(
+          (NFA.MULTISTATE_AND, child[1], next_state, child),
+          join_count - 1,
+          done_multistates
+        )
+      elif state_desc[0] == NFA.STATE_MARK:
+        _, mark_value, next_state = state_desc
+        transition.append((dfa.DFA.TRANSITION_MARK, child[1], mark_value))
+        return advance1(
+          (NFA.MULTISTATE_AND, child[1], next_state, child),
+          join_count,
+          done_multistates
+        )
+      else:
+        assert False
+      if result in done_multistates:
+        transition[len_transition:] = [(dfa.DFA.TRANSITION_POP, multistate[1])]
+        return None
+      done_multistates.add(result)
+      return result
+
+    def advance(multistate, join_count, done_multistates):
+      nonlocal character0, character1 # modifies nonlocal: transition
+      if multistate[0] == NFA.MULTISTATE_ACCEPT:
+        assert join_count == 0
+        len_transition = len(transition)
+        transition.append((dfa.DFA.TRANSITION_MOVE, 1))
+        result = NFA.accept_multistate # takes no arguments so use static one
+      elif multistate[0] == NFA.MULTISTATE_AND:
+        if character >= 0:
+          _, _, state, child = multistate
+          state_desc = self.states[state]
+          assert state_desc[0] == NFA.STATE_CHARACTER
+          _, character_set, next_state = state_desc
+          k = bisect.bisect_right(character_set, character)
+          if k > 0 and character0 < character_set[k - 1]:
+            character0 = character_set[k - 1]
+          if k < len(character_set) and character1 > character_set[k]:
+            character1 = character_set[k]
+          if (k & 1) == 0:
+            transition.append((dfa.DFA.TRANSITION_POP, child[1]))
+            return None
+          multistate = (NFA.MULTISTATE_AND, child[1], next_state, child)
+        return advance1(multistate, join_count, done_multistates)
+      elif multistate[0] == NFA.MULTISTATE_OR:
+        _, _, child0, child1 = multistate
+        len_transition = len(transition)
+        child0 = advance(child0, join_count, done_multistates)
+        child1 = advance(child1, join_count, done_multistates)
+        if child0 is None:
+          return child1
+        if child1 is None:
+          return child0
+        result = (NFA.MULTISTATE_OR, child0[1] + child1[1], child0, child1)
+      else:
+        assert False
+      if result in done_multistates:
+        transition[len_transition:] = [(dfa.DFA.TRANSITION_POP, multistate[1])]
+        return None
+      done_multistates.add(result)
+      return result
+
+    transition = []
+    character0 = 0
+    character1 = n_characters
+    root_multistate = advance(root_multistate, 0, set())
+    return root_multistate, transition, character0, character1
+
+  def multistate_accept(root_multistate):
+    i = 0
+    def accept(multistate):
+      nonlocal i
+      if multistate[0] == NFA.MULTISTATE_ACCEPT:
+        return True
+      if multistate[0] == NFA.MULTISTATE_AND:
+        _, _, _, child = multistate
+        i += child[1]
+        return False
+      if multistate[0] == NFA.MULTISTATE_OR:
+        _, _, child0, child1 = multistate
+        return accept(child0) or accept(child1)
+      assert False
+    return i if accept(root_multistate) else -1
+
+  def match_text(self, text, i, start_index = 0):
+    def transit(transition):
+      nonlocal threads0, threads1, prefix_slop # note: also uses i
+      j = prefix_slop
+      for trans in transition:
+        if trans[0] == dfa.DFA.TRANSITION_POP:
+          j += trans[1]
+        elif trans[0] == dfa.DFA.TRANSITION_DUP:
+          while j < trans[1]:
+            threads0[:0] = [None] * prefix_slop
+            threads1[:0] = [None] * prefix_slop
+            j += prefix_slop
+            prefix_slop *= 2
+          threads0[j - trans[1]:j] = threads0[j:j + trans[1]]
+          j -= trans[1]
+        elif trans[0] == dfa.DFA.TRANSITION_MARK:
+          threads0[j:j + trans[1]] = [
+            (i, trans[2], thread)
+            for thread in threads0[j:j + trans[1]]
+          ]
+        elif trans[0] == dfa.DFA.TRANSITION_MOVE:
+          threads1.extend(threads0[j:j + trans[1]])
+          j += trans[1]
+        #elif trans[0] == dfa.DFA.TRANSITION_DEL:
+        #  del threads1[-trans[1]:]
+        else:
+          assert False
+      assert j == len(threads0)
+      threads0, threads1 = threads1, threads0
+      del threads1[prefix_slop:]
+
+    threads0 = [None, None]
+    threads1 = [None]
+    prefix_slop = 1
+
+    start_state = self.start_state[start_index]
+    if start_state == -1:
+      return None
+    next_multistate, transition, _, _ = self.multistate_next(
+      (NFA.MULTISTATE_AND, 1, start_state, NFA.accept_multistate),
+      -1
+    )
+    while next_multistate is not None:
+      transit(transition)
+      assert len(threads0) == prefix_slop + next_multistate[1]
+      if next_multistate == NFA.accept_multistate:
+        # there is only one match, which is complete
+        assert len(threads0) == prefix_slop + 1
+        return threads0[prefix_slop]
+      if i >= len(text):
+        # return best match we have, but not incomplete match
+        i = NFA.multistate_accept(next_multistate)
+        return (None if i == -1 else threads0[prefix_slop + i])
+      next_multistate, transition, _, _ = (
+        self.multistate_next(next_multistate, ord(text[i]))
+      )
+      i += 1
+    return None
+
+  def match_yychunk(self, root, pos, off, yychunk_iter, start_index = 0):
+    if pos < 0:
+      pos, off = element.to_start_relative(root, pos, off)
+
+    def transit(transition):
+      nonlocal threads0, threads1, prefix_slop # note: also uses pos, off
+      j = prefix_slop
+      for trans in transition:
+        if trans[0] == dfa.DFA.TRANSITION_POP:
+          j += trans[1]
+        elif trans[0] == dfa.DFA.TRANSITION_DUP:
+          while j < trans[1]:
+            threads0[:0] = [None] * prefix_slop
+            threads1[:0] = [None] * prefix_slop
+            j += prefix_slop
+            prefix_slop *= 2
+          threads0[j - trans[1]:j] = threads0[j:j + trans[1]]
+          j -= trans[1]
+        elif trans[0] == dfa.DFA.TRANSITION_MARK:
+          threads0[j:j + trans[1]] = [
+            (pos, off, trans[2], thread)
+            for thread in threads0[j:j + trans[1]]
+          ]
+        elif trans[0] == dfa.DFA.TRANSITION_MOVE:
+          threads1.extend(threads0[j:j + trans[1]])
+          j += trans[1]
+        #elif trans[0] == dfa.DFA.TRANSITION_DEL:
+        #  del threads1[-trans[1]:]
+        else:
+          assert False
+      assert j == len(threads0)
+      threads0, threads1 = threads1, threads0
+      del threads1[prefix_slop:]
+
+    threads0 = [None, None]
+    threads1 = [None]
+    prefix_slop = 1
+
+    start_state = self.start_state[start_index]
+    if start_state == -1:
+      return None
+    next_multistate, transition, _, _ = self.multistate_next(
+      (NFA.MULTISTATE_AND, 1, start_state, NFA.accept_multistate),
+      -1
+    )
+    text = element.get_text(root, pos)
+    while next_multistate is not None:
+      transit(transition)
+      assert len(threads0) == prefix_slop + next_multistate[1]
+      if next_multistate == NFA.accept_multistate:
+        # there is only one match, which is complete
+        assert len(threads0) == prefix_slop + 1
+        return threads0[prefix_slop]
+      while off >= len(text):
+        if pos < len(root):
+          pos += 1
+          off = 0
+        else:
+          try:
+            next(yychunk_iter)
+          except StopIteration:
+            # return best match we have, but not incomplete match
+            i = NFA.multistate_accept(next_multistate)
+            return (None if i == -1 else threads0[prefix_slop + i])
+          text = element.get_text(root, pos)
+      next_multistate, transition, _, _ = (
+        self.multistate_next(next_multistate, ord(text[off]))
+      )
+      off += 1
+    return None
+
+  def to_dfa(self):
+    _dfa = dfa.DFA(list(self.groups))
+
+    accept_key = (NFA.accept_multistate, ())
+    action_to_meaning = [accept_key]
+    meaning_to_action = {accept_key: 0}
+    state_to_meaning = [NFA.accept_multistate]
+    meaning_to_state = {NFA.accept_multistate: 0}
+
+    for start_state in self.start_state:
+      if start_state == -1:
+        start_action = -1
+      else:
+        next_multistate, transition, _, _ = self.multistate_next(
+          (NFA.MULTISTATE_AND, 1, start_state, NFA.accept_multistate),
+          -1
+        )
+        if next_multistate is None:
+          start_action = -1
+        else:
+          start_key = (next_multistate, tuple(transition))
+          start_action = len(action_to_meaning)
+          meaning_to_action[start_key] = start_action
+          action_to_meaning.append(start_key)
+      _dfa.start_action.append(start_action)
+
+    while len(_dfa.actions) < len(action_to_meaning):
+      next_multistate, transition = action_to_meaning[len(_dfa.actions)]
+      if next_multistate in meaning_to_state:
+        next_state = meaning_to_state[next_multistate]
+      else:
+        next_state = len(state_to_meaning)
+        state_to_meaning.append(next_multistate)
+        meaning_to_state[next_multistate] = next_state
+      _dfa.actions.append((next_state, list(transition)))
+
+      while len(_dfa.states) < len(state_to_meaning):
+        character = 0
+        multistate = state_to_meaning[len(_dfa.states)]
+        state_desc = ([], [], NFA.multistate_accept(multistate))
+        while character < n_characters:
+          next_multistate, transition, character0, character1 = self.multistate_next(
+            multistate,
+            character
+          )
+          assert character0 == character and character1 > character
+          if next_multistate is None:
+            action = -1
+          else:
+            # optimize transition (optional)
+            i = 0
+            j = 0
+            while i < len(transition):
+              if transition[i][0] == dfa.DFA.TRANSITION_POP:
+                n = transition[i][1]
+                i += 1
+                while (
+                  i < len(transition) and
+                  transition[i][0] == dfa.DFA.TRANSITION_POP
+                ):
+                  n += transition[i][1]
+                  i += 1
+                transition[j] = (dfa.DFA.TRANSITION_POP, n)
+              elif transition[i][0] == dfa.DFA.TRANSITION_MOVE:
+                n = transition[i][1]
+                i += 1
+                while (
+                  i < len(transition) and
+                  transition[i][0] == dfa.DFA.TRANSITION_MOVE
+                ):
+                  n += transition[i][1]
+                  i += 1
+                transition[j] = (dfa.DFA.TRANSITION_MOVE, n)
+              else:
+                transition[j] = transition[i]
+                i += 1
+              j += 1
+            del transition[j:]
+            # end optimize transition
+            key = (next_multistate, tuple(transition))
+            if key in meaning_to_action:
+              action = meaning_to_action[key]
+            else:
+              action = len(action_to_meaning)
+              action_to_meaning.append(key)
+              meaning_to_action[key] = action
+          state_desc[0].append(character1)
+          state_desc[1].append(action)
+          character = character1
+        _dfa.states.append(state_desc)
+    return _dfa
+
+  def __repr__(self):
+    return 'nfa.NFA({0:s}, {1:s}, {2:s})'.format(
+      repr(self.groups),
+      repr(self.states),
+      repr(self.start_state)
+    )
diff --git a/regex.py b/regex.py
new file mode 100644 (file)
index 0000000..0193035
--- /dev/null
+++ b/regex.py
@@ -0,0 +1,1055 @@
+import bisect_set
+import element
+import nfa
+
+# defines the alphabet size, set this to 0x11000 for unicode
+n_characters = 0x100
+
+class Regex(element.Element):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'Regex',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    element.Element.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = element.Element.copy(
+      self,
+      Regex if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'regex.Regex({0:s})'.format(', '.join(params))
+  # GENERATE END
+  def post_process(self, group_index = 0): #, rule_name_to_character_set = None):
+    for i in self:
+      group_index = i.post_process(group_index) #, rule_name_to_character_set)
+    return group_index
+  def to_groups(self, groups):
+    for i in self:
+      i.to_groups(groups)
+  def to_nfa_state(self, _nfa, next_state):
+    raise NotImplementedException
+  def add_to_nfa(self, _nfa):
+    _nfa.start_state.append(self.to_nfa_state(_nfa, 0))
+  #def to_lr1_symbols(self, n_terminals, symbols, lookaheads, group_bounds):
+  #  group_count = 0
+  #  for i in self:
+  #    group_count += (
+  #      i.to_lr1_symbols(n_terminals, symbols, lookaheads, group_bounds)
+  #    )
+  #  return group_count # count of groups or ungrouped characters
+
+class RegexNone(Regex):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'RegexNone',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Regex.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Regex.copy(
+      self,
+      RegexNone if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'regex.RegexNone({0:s})'.format(', '.join(params))
+  # GENERATE END
+  def to_nfa_state(self, _nfa, next_state):
+    return -1
+
+class RegexEmpty(Regex):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'RegexEmpty',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Regex.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Regex.copy(
+      self,
+      RegexEmpty if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'regex.RegexEmpty({0:s})'.format(', '.join(params))
+  # GENERATE END
+  def to_nfa_state(self, _nfa, next_state):
+    return next_state
+
+class RegexCharacter(Regex):
+  # GENERATE ELEMENT(list(int) character_set) BEGIN
+  def __init__(
+    self,
+    tag = 'RegexCharacter',
+    attrib = {},
+    text = '',
+    children = [],
+    character_set = []
+  ):
+    Regex.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+    self.character_set = (
+      [element.deserialize_int(i) for i in character_set.split()]
+    if isinstance(character_set, str) else
+      character_set
+    )
+  def serialize(self, ref_list):
+    Regex.serialize(self, ref_list)
+    self.set(
+      'character_set',
+      ' '.join([element.serialize_int(i) for i in self.character_set])
+    )
+  def deserialize(self, ref_list):
+    Regex.deserialize(self, ref_list)
+    self.character_set = [
+      element.deserialize_int(i)
+      for i in self.get('character_set', '').split()
+    ]
+  def copy(self, factory = None):
+    result = Regex.copy(
+      self,
+      RegexCharacter if factory is None else factory
+    )
+    result.character_set = self.character_set
+    return result
+  def repr_serialize(self, params):
+    Regex.repr_serialize(self, params)
+    if len(self.character_set):
+      params.append(
+        'character_set = [{0:s}]'.format(
+          ', '.join([repr(i) for i in self.character_set])
+        )
+      )
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'regex.RegexCharacter({0:s})'.format(', '.join(params))
+  # GENERATE END
+  def to_nfa_state(self, _nfa, next_state):
+    new_state = len(_nfa.states)
+    _nfa.states.append((nfa.NFA.STATE_CHARACTER, self.character_set, next_state))
+    return new_state
+  #def to_lr1_symbols(self, n_terminals, symbols, lookaheads, group_bounds):
+  #  terminal_set = []
+  #  nonterminal_set = []
+  #  i = 0
+  #  while i < len(self.character_set):
+  #    [j, k] = self.character_set[i:i + 2]
+  #    if k > n_terminals:
+  #      if j < n_terminals:
+  #        terminal_set.extend([j, n_terminals])
+  #        nonterminal_set.extend([0, k - n_terminals])
+  #        i += 2
+  #      while i < len(self.character_set):
+  #        [j, k] = self.character_set[i:i + 2]
+  #        nonterminal_set.extend([j - n_terminals, k - n_terminals])
+  #        i += 2
+  #      break
+  #    terminal_set.extend([j, k])
+  #    i += 2
+  #  symbols.append((terminal_set, nonterminal_set))
+  #  lookaheads.append(([], False)) # initial_set, can_be_empty
+  #  return 1 # count of groups or ungrouped characters
+
+class RegexCharacterRange(RegexCharacter):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'RegexCharacterRange',
+    attrib = {},
+    text = '',
+    children = [],
+    character_set = []
+  ):
+    RegexCharacter.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children,
+      character_set
+    )
+  def copy(self, factory = None):
+    result = RegexCharacter.copy(
+      self,
+      RegexCharacterRange if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'regex.RegexCharacterRange({0:s})'.format(', '.join(params))
+  # GENERATE END
+  def post_process(self, group_index = 0): #, rule_name_to_character_set = None):
+    group_index = RegexCharacter.post_process(self, group_index) #, rule_name_to_character_set)
+    self.character_set = [self[0].character_set[0], self[1].character_set[-1]]
+    return group_index
+
+class RegexCharacterOr(RegexCharacter):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'RegexCharacterOr',
+    attrib = {},
+    text = '',
+    children = [],
+    character_set = []
+  ):
+    RegexCharacter.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children,
+      character_set
+    )
+  def copy(self, factory = None):
+    result = RegexCharacter.copy(
+      self,
+      RegexCharacterOr if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'regex.RegexCharacterOr({0:s})'.format(', '.join(params))
+  # GENERATE END
+  def post_process(self, group_index = 0): #, rule_name_to_character_set = None):
+    group_index = RegexCharacter.post_process(self, group_index) #, rule_name_to_character_set)
+    self.character_set = bisect_set.bisect_set_or(self[0].character_set, self[1].character_set)
+    return group_index
+
+class RegexCharacterAnd(RegexCharacter):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'RegexCharacterAnd',
+    attrib = {},
+    text = '',
+    children = [],
+    character_set = []
+  ):
+    RegexCharacter.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children,
+      character_set
+    )
+  def copy(self, factory = None):
+    result = RegexCharacter.copy(
+      self,
+      RegexCharacterAnd if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'regex.RegexCharacterAnd({0:s})'.format(', '.join(params))
+  # GENERATE END
+  def post_process(self, group_index = 0): #, rule_name_to_character_set = None):
+    group_index = RegexCharacter.post_process(self, group_index) #, rule_name_to_character_set)
+    self.character_set = bisect_set.bisect_set_and(self[0].character_set, self[1].character_set)
+    return group_index
+
+class RegexCharacterNot(RegexCharacter):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'RegexCharacterNot',
+    attrib = {},
+    text = '',
+    children = [],
+    character_set = []
+  ):
+    RegexCharacter.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children,
+      character_set
+    )
+  def copy(self, factory = None):
+    result = RegexCharacter.copy(
+      self,
+      RegexCharacterNot if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'regex.RegexCharacterNot({0:s})'.format(', '.join(params))
+  # GENERATE END
+  def post_process(self, group_index = 0): #, rule_name_to_character_set = None):
+    group_index = RegexCharacter.post_process(self, group_index) #, rule_name_to_character_set)
+    self.character_set = bisect_set.bisect_set_not(self[0].character_set)
+    return group_index
+
+#class RegexCharacterRule(RegexCharacter):
+#  # GENERATE ELEMENT(str rule_name) BEGIN
+#  def __init__(
+#    self,
+#    tag = 'RegexCharacterRule',
+#    attrib = {},
+#    text = '',
+#    children = [],
+#    character_set = [],
+#    rule_name = ''
+#  ):
+#    RegexCharacter.__init__(
+#      self,
+#      tag,
+#      attrib,
+#      text,
+#      children,
+#      character_set
+#    )
+#    self.rule_name = rule_name
+#  def serialize(self, ref_list, indent = 0):
+#    RegexCharacter.serialize(self, ref_list, indent)
+#    self.set('rule_name', element.serialize_str(self.rule_name))
+#  def deserialize(self, ref_list):
+#    RegexCharacter.deserialize(self, ref_list)
+#    self.rule_name = element.deserialize_str(self.get('rule_name', ''))
+#  def copy(self, factory = None):
+#    result = RegexCharacter.copy(
+#      self,
+#      RegexCharacterRule if factory is None else factory
+#    )
+#    result.rule_name = self.rule_name
+#    return result
+#  def repr_serialize(self, params):
+#    RegexCharacter.repr_serialize(self, params)
+#    if self.rule_name != '':
+#      params.append(
+#        'rule_name = {0:s}'.format(repr(self.rule_name))
+#      )
+#  def __repr__(self):
+#    params = []
+#    self.repr_serialize(params)
+#    return 'regex.RegexCharacterRule({0:s})'.format(', '.join(params))
+#  # GENERATE END
+#  def post_process(self, group_index = 0, rule_name_to_character_set = None):
+#    if rule_name_to_character_set is not None:
+#      self.character_set = rule_name_to_character_set[self.rule_name]
+#    return RegexCharacter.post_process(self, group_index, rule_name_to_character_set)
+
+class RegexOr(Regex):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'RegexOr',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Regex.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Regex.copy(
+      self,
+      RegexOr if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'regex.RegexOr({0:s})'.format(', '.join(params))
+  # GENERATE END
+  def to_nfa_state(self, _nfa, next_state):
+    child0_state = self[0].to_nfa_state(_nfa, next_state)
+    child1_state = self[1].to_nfa_state(_nfa, next_state)
+    if child0_state == -1:
+      return child1_state
+    if child1_state == -1:
+      return child0_state
+    new_state = len(_nfa.states)
+    _nfa.states.append((nfa.NFA.STATE_OR, child0_state, child1_state))
+    return new_state
+
+class RegexAnd(Regex):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'RegexAnd',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Regex.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Regex.copy(
+      self,
+      RegexAnd if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'regex.RegexAnd({0:s})'.format(', '.join(params))
+  # GENERATE END
+  def to_nfa_state(self, _nfa, next_state):
+    join0_state = len(_nfa.states)
+    _nfa.states.append(nfa.NFA.join0_state) # takes no arguments so use static one
+    join1_state = len(_nfa.states)
+    _nfa.states.append((nfa.NFA.STATE_JOIN1, next_state))
+    child0_state = self[0].to_nfa_state(_nfa, join0_state)
+    if child0_state == -1:
+      return -1
+    child1_state = self[1].to_nfa_state(_nfa, join1_state)
+    if child1_state == -1:
+      return -1
+    new_state = len(_nfa.states)
+    _nfa.states.append((nfa.NFA.STATE_AND, child0_state, child1_state))
+    return new_state
+
+class RegexSequence(Regex):
+  # GENERATE ELEMENT() BEGIN
+  def __init__(
+    self,
+    tag = 'RegexSequence',
+    attrib = {},
+    text = '',
+    children = []
+  ):
+    Regex.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+  def copy(self, factory = None):
+    result = Regex.copy(
+      self,
+      RegexSequence if factory is None else factory
+    )
+    return result
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'regex.RegexSequence({0:s})'.format(', '.join(params))
+  # GENERATE END
+  def to_nfa_state(self, _nfa, next_state):
+    child1_state = self[1].to_nfa_state(_nfa, next_state)
+    if child1_state == -1:
+      return -1
+    return self[0].to_nfa_state(_nfa, child1_state)
+
+class RegexRepeat(Regex):
+  # GENERATE ELEMENT(int count0, int count1, bool non_greedy) BEGIN
+  def __init__(
+    self,
+    tag = 'RegexRepeat',
+    attrib = {},
+    text = '',
+    children = [],
+    count0 = -1,
+    count1 = -1,
+    non_greedy = False
+  ):
+    Regex.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+    self.count0 = (
+      element.deserialize_int(count0)
+    if isinstance(count0, str) else
+      count0
+    )
+    self.count1 = (
+      element.deserialize_int(count1)
+    if isinstance(count1, str) else
+      count1
+    )
+    self.non_greedy = (
+      element.deserialize_bool(non_greedy)
+    if isinstance(non_greedy, str) else
+      non_greedy
+    )
+  def serialize(self, ref_list):
+    Regex.serialize(self, ref_list)
+    self.set('count0', element.serialize_int(self.count0))
+    self.set('count1', element.serialize_int(self.count1))
+    self.set('non_greedy', element.serialize_bool(self.non_greedy))
+  def deserialize(self, ref_list):
+    Regex.deserialize(self, ref_list)
+    self.count0 = element.deserialize_int(self.get('count0', '-1'))
+    self.count1 = element.deserialize_int(self.get('count1', '-1'))
+    self.non_greedy = element.deserialize_bool(self.get('non_greedy', 'false'))
+  def copy(self, factory = None):
+    result = Regex.copy(
+      self,
+      RegexRepeat if factory is None else factory
+    )
+    result.count0 = self.count0
+    result.count1 = self.count1
+    result.non_greedy = self.non_greedy
+    return result
+  def repr_serialize(self, params):
+    Regex.repr_serialize(self, params)
+    if self.count0 != -1:
+      params.append(
+        'count0 = {0:s}'.format(repr(self.count0))
+      )
+    if self.count1 != -1:
+      params.append(
+        'count1 = {0:s}'.format(repr(self.count1))
+      )
+    if self.non_greedy != False:
+      params.append(
+        'non_greedy = {0:s}'.format(repr(self.non_greedy))
+      )
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'regex.RegexRepeat({0:s})'.format(', '.join(params))
+  # GENERATE END
+  def post_process(self, group_index = 0): #, rule_name_to_character_set = None):
+    # total hack which will be done in a Python action in future
+    if len(self) >= 2:
+      assert self[1].tag == 'Number'
+      self.count0 = int(self[1].text)
+      if len(self) >= 3:
+        assert self[2].tag == 'Number'
+        self.count1 = int(self[2].text)
+      else:
+        self.count1 = self.count0
+      del self[1:]
+    # end total hack
+    return Regex.post_process(self, group_index) #, rule_name_to_character_set)
+  def to_nfa_state(self, _nfa, next_state):
+    count0 = self.count0
+    count1 = self.count1
+    if count1 == -1:
+      new_state = len(_nfa.states)
+      _nfa.states.append(None)
+      child_state = self[0].to_nfa_state(_nfa, new_state)
+      if child_state == -1:
+        new_state = next_state # note: unreachable state remains invalid (None)
+      else:
+        _nfa.states[new_state] = (
+          (nfa.NFA.STATE_OR, next_state, child_state)
+        if self.non_greedy else
+          (nfa.NFA.STATE_OR, child_state, next_state)
+        )
+    else:
+      new_state = next_state
+      for i in range(count1 - count0):
+        child_state = self[0].to_nfa_state(_nfa, new_state)
+        if child_state == -1:
+          break
+        new_state = len(_nfa.states)
+        _nfa.states.append(
+          (nfa.NFA.STATE_OR, next_state, child_state)
+        if self.non_greedy else
+          (nfa.NFA.STATE_OR, child_state, next_state)
+        )
+    for i in range(count0):
+      new_state = self[0].to_nfa_state(_nfa, new_state)
+      if new_state == -1:
+        break
+    return new_state
+
+class RegexGroup(Regex):
+  class Attribute(element.Element):
+    # GENERATE ELEMENT(str name, str value) BEGIN
+    def __init__(
+      self,
+      tag = 'RegexGroup_Attribute',
+      attrib = {},
+      text = '',
+      children = [],
+      name = '',
+      value = ''
+    ):
+      element.Element.__init__(
+        self,
+        tag,
+        attrib,
+        text,
+        children
+      )
+      self.name = name
+      self.value = value
+    def serialize(self, ref_list):
+      element.Element.serialize(self, ref_list)
+      self.set('name', element.serialize_str(self.name))
+      self.set('value', element.serialize_str(self.value))
+    def deserialize(self, ref_list):
+      element.Element.deserialize(self, ref_list)
+      self.name = element.deserialize_str(self.get('name', ''))
+      self.value = element.deserialize_str(self.get('value', ''))
+    def copy(self, factory = None):
+      result = element.Element.copy(
+        self,
+        Attribute if factory is None else factory
+      )
+      result.name = self.name
+      result.value = self.value
+      return result
+    def repr_serialize(self, params):
+      element.Element.repr_serialize(self, params)
+      if self.name != '':
+        params.append(
+          'name = {0:s}'.format(repr(self.name))
+        )
+      if self.value != '':
+        params.append(
+          'value = {0:s}'.format(repr(self.value))
+        )
+    def __repr__(self):
+      params = []
+      self.repr_serialize(params)
+      return 'regex.RegexGroup.Attribute({0:s})'.format(', '.join(params))
+    # GENERATE END
+
+  # GENERATE ELEMENT(int group_index, str group_name, list(ref) group_attributes) BEGIN
+  def __init__(
+    self,
+    tag = 'RegexGroup',
+    attrib = {},
+    text = '',
+    children = [],
+    group_index = -1,
+    group_name = '',
+    group_attributes = []
+  ):
+    Regex.__init__(
+      self,
+      tag,
+      attrib,
+      text,
+      children
+    )
+    self.group_index = (
+      element.deserialize_int(group_index)
+    if isinstance(group_index, str) else
+      group_index
+    )
+    self.group_name = group_name
+    self.group_attributes = group_attributes
+  def serialize(self, ref_list):
+    Regex.serialize(self, ref_list)
+    self.set('group_index', element.serialize_int(self.group_index))
+    self.set('group_name', element.serialize_str(self.group_name))
+    self.set(
+      'group_attributes',
+      ' '.join([element.serialize_ref(i, ref_list) for i in self.group_attributes])
+    )
+  def deserialize(self, ref_list):
+    Regex.deserialize(self, ref_list)
+    self.group_index = element.deserialize_int(self.get('group_index', '-1'))
+    self.group_name = element.deserialize_str(self.get('group_name', ''))
+    self.group_attributes = [
+      element.deserialize_ref(i, ref_list)
+      for i in self.get('group_attributes', '').split()
+    ]
+  def copy(self, factory = None):
+    result = Regex.copy(
+      self,
+      RegexGroup if factory is None else factory
+    )
+    result.group_index = self.group_index
+    result.group_name = self.group_name
+    result.group_attributes = self.group_attributes
+    return result
+  def repr_serialize(self, params):
+    Regex.repr_serialize(self, params)
+    if self.group_index != -1:
+      params.append(
+        'group_index = {0:s}'.format(repr(self.group_index))
+      )
+    if self.group_name != '':
+      params.append(
+        'group_name = {0:s}'.format(repr(self.group_name))
+      )
+    if len(self.group_attributes):
+      params.append(
+        'group_attributes = [{0:s}]'.format(
+          ', '.join([repr(i) for i in self.group_attributes])
+        )
+      )
+  def __repr__(self):
+    params = []
+    self.repr_serialize(params)
+    return 'regex.RegexGroup({0:s})'.format(', '.join(params))
+  # GENERATE END
+  def post_process(self, group_index = 0): #, rule_name_to_character_set = None):
+    # total hack which will be done in a Python action in future
+    if len(self) >= 2:
+      assert self[0].tag == 'GroupName'
+      self.group_name = self[0].text[1:-1]
+      del self[:1]
+    # end total hack
+    self.group_index = group_index
+    group_index += 1
+    return Regex.post_process(self, group_index) #, rule_name_to_character_set)
+  def to_groups(self, groups):
+    assert len(groups) == self.group_index
+    groups.append(
+      (self.group_name, {i.name: i.value for i in self.group_attributes})
+    )
+    return Regex.to_groups(self, groups)
+  def to_nfa_state(self, _nfa, next_state):
+    mark_state = len(_nfa.states)
+    _nfa.states.append((nfa.NFA.STATE_MARK, self.group_index * 2 + 1, next_state))
+    child_state = self[0].to_nfa_state(_nfa, mark_state)
+    if child_state == -1:
+      return -1
+    new_state = len(_nfa.states)
+    _nfa.states.append((nfa.NFA.STATE_MARK, self.group_index * 2, child_state))
+    return new_state
+  #def to_lr1_symbols(self, n_terminals, symbols, lookaheads, group_bounds):
+  #  group_start = len(symbols)
+  #  assert self.group_index == len(group_bounds)
+  #  group_bounds.append(None)
+  #  group_count = Regex.to_lr1_symbols(
+  #    self,
+  #    n_terminals,
+  #    symbols,
+  #    lookaheads,
+  #    group_bounds
+  #  )
+  #  group_bounds[self.group_index] = (
+  #    group_start,
+  #    group_count,
+  #    self.group_name,
+  #    {i.name: i.value for i in self.group_attributes}
+  #  )
+  #  return 1 # count of groups or ungrouped characters
+
+# GENERATE FACTORY(element.Element) BEGIN
+tag_to_class = {
+  'Regex': Regex,
+  'RegexNone': RegexNone,
+  'RegexEmpty': RegexEmpty,
+  'RegexCharacter': RegexCharacter,
+  'RegexCharacterRange': RegexCharacterRange,
+  'RegexCharacterOr': RegexCharacterOr,
+  'RegexCharacterAnd': RegexCharacterAnd,
+  'RegexCharacterNot': RegexCharacterNot,
+  'RegexOr': RegexOr,
+  'RegexAnd': RegexAnd,
+  'RegexSequence': RegexSequence,
+  'RegexRepeat': RegexRepeat,
+  'RegexGroup': RegexGroup,
+  'RegexGroup_Attribute': RegexGroup.Attribute
+}
+def factory(tag, attrib = {}, *args, **kwargs):
+  return tag_to_class.get(tag, element.Element)(tag, attrib, *args, **kwargs)
+# GENERATE END
+
+if __name__ == '__main__':
+  import sys
+  import xml.etree.ElementTree
+
+  regex = RegexAnd(children = [RegexRepeat(children = [RegexCharacterNot(
+children = [RegexCharacter()], character_set = [0, 256])]), RegexGroup(children = [
+RegexOr(children = [RegexOr(children = [RegexOr(children = [RegexGroup(children
+= [RegexRepeat(children = [RegexCharacter(character_set = [9, 14, 32, 33])],
+one_or_more = True)], group_index = 1, group_name = 'Whitespace'), RegexGroup(
+children = [RegexRepeat(children = [RegexCharacter(character_set = [48, 58])],
+one_or_more = True)], group_index = 2, group_name = 'Number')]), RegexGroup(
+children = [RegexSequence(children = [RegexSequence(children = [RegexSequence(
+children = [RegexEmpty(), RegexCharacter(character_set = [102, 103])]),
+RegexCharacter(character_set = [111, 112])]), RegexCharacter(character_set = [114, 115])]
+)], group_index = 3, group_name = 'For')]), RegexGroup(children = [
+RegexSequence(children = [RegexCharacter(character_set = [65, 91, 95, 96, 97, 123]),
+RegexRepeat(children = [RegexCharacter(character_set = [48, 58, 65, 91, 95, 96, 97,
+123])])])], group_index = 4, group_name = 'Identifier')])], group_index = 0)])
+  #sys.stdout.write(
+  #  wrap_repr(
+  #    '  regex = {0:s}'.format(repr(regex).replace('regex.', '')),
+  #    79
+  #  )
+  #)
+
+  _nfa = regex.to_nfa()
+  #sys.stdout.write(
+  #  wrap_repr(
+  #    '  _nfa = {0:s}'.format(repr(_nfa).replace('regex.', '')),
+  #    79
+  #  )
+  #)
+
+  text = '     id   99id id99 for forex  '
+  i = 0
+  while i < len(text):
+    print('text "{0:s}"'.format(text[i:i + 72].replace('\n', '$')))
+    thread = _nfa.match_text(text, i)
+    if thread is None:
+      print('no match')
+      break
+    i = thread[0] # end position of overall match
+    group_start = [-1 for j in range(len(_nfa.groups))]
+    group_end = [-1 for j in range(len(_nfa.groups))]
+    while thread is not None:
+      pos, mark, thread = thread
+      group = mark >> 1
+      if (mark & 1) == 0:
+        group_start[group] = pos
+        print(
+          'group {0:d} name "{1:s}" text "{2:s}"'.format(
+             group,
+             _nfa.groups[group][0],
+             text[group_start[group]:group_end[group]].replace('\n', '$')
+          )
+        )
+      else:
+        group_end[group] = pos
+
+  dfa = _nfa.to_dfa()
+  #sys.stdout.write(
+  #  wrap_repr(
+  #    '  dfa = {0:s}'.format(repr(dfa).replace('regex.', '')),
+  #    79
+  #  )
+  #)
+
+  text = '     id   99id id99 for forex  '
+  i = 0
+  while i < len(text):
+    print('text "{0:s}"'.format(text[i:i + 72].replace('\n', '$')))
+    thread = dfa.match_text(text, i)
+    if thread is None:
+      print('no match')
+      break
+    i = thread[0] # end position of overall match
+    group_start = [-1 for j in range(len(dfa.groups))]
+    group_end = [-1 for j in range(len(dfa.groups))]
+    while thread is not None:
+      pos, mark, thread = thread
+      group = mark >> 1
+      if (mark & 1) == 0:
+        group_start[group] = pos
+        print(
+          'group {0:d} name "{1:s}" text "{2:s}"'.format(
+             group,
+             dfa.groups[group][0],
+             text[group_start[group]:group_end[group]].replace('\n', '$')
+          )
+        )
+      else:
+        group_end[group] = pos
+
+  grammar = Grammar(children = [Grammar.Production(children = [RegexSequence(
+children = [RegexSequence(children = [RegexEmpty(), RegexCharacterRule(character_set
+= [288, 295], rule_name = 'whitespace_opt')]), RegexCharacterRule(character_set = [
+259, 262], rule_name = 'expr0')])], nonterminal = 0), Grammar.Production(
+children = [RegexSequence(children = [RegexEmpty(), RegexCharacterRule(character_set
+= [262, 265], rule_name = 'expr1')])], nonterminal = 1), Grammar.Production(
+children = [RegexSequence(children = [RegexEmpty(), RegexGroup(children = [
+RegexSequence(children = [RegexSequence(children = [RegexSequence(children = [
+RegexSequence(children = [RegexEmpty(), RegexCharacterRule(character_set = [259, 262
+], rule_name = 'expr0')]), RegexCharacter(character_set = [43, 44])]),
+RegexCharacterRule(character_set = [288, 295], rule_name = 'whitespace_opt')]),
+RegexCharacterRule(character_set = [262, 265], rule_name = 'expr1')])], group_index
+= 0, group_name = 'Add')])], nonterminal = 2), Grammar.Production(children = [
+RegexSequence(children = [RegexEmpty(), RegexGroup(children = [RegexSequence(
+children = [RegexSequence(children = [RegexSequence(children = [RegexSequence(
+children = [RegexEmpty(), RegexCharacterRule(character_set = [259, 262], rule_name =
+'expr0')]), RegexCharacter(character_set = [45, 46])]), RegexCharacterRule(character_set
+= [288, 295], rule_name = 'whitespace_opt')]), RegexCharacterRule(character_set = [
+262, 265], rule_name = 'expr1')])], group_index = 0, group_name = 'Subtract')])
+], nonterminal = 3), Grammar.Production(children = [RegexSequence(children = [
+RegexEmpty(), RegexCharacterRule(character_set = [265, 268], rule_name = 'expr2')])
+], nonterminal = 4), Grammar.Production(children = [RegexSequence(children = [
+RegexEmpty(), RegexGroup(children = [RegexSequence(children = [RegexSequence(
+children = [RegexSequence(children = [RegexSequence(children = [RegexEmpty(),
+RegexCharacterRule(character_set = [262, 265], rule_name = 'expr1')]),
+RegexCharacter(character_set = [42, 43])]), RegexCharacterRule(character_set = [288, 295
+], rule_name = 'whitespace_opt')]), RegexCharacterRule(character_set = [265, 268],
+rule_name = 'expr2')])], group_index = 0, group_name = 'Multiply')])],
+nonterminal = 5), Grammar.Production(children = [RegexSequence(children = [
+RegexEmpty(), RegexGroup(children = [RegexSequence(children = [RegexSequence(
+children = [RegexSequence(children = [RegexSequence(children = [RegexEmpty(),
+RegexCharacterRule(character_set = [262, 265], rule_name = 'expr1')]),
+RegexCharacter(character_set = [47, 48])]), RegexCharacterRule(character_set = [288, 295
+], rule_name = 'whitespace_opt')]), RegexCharacterRule(character_set = [265, 268],
+rule_name = 'expr2')])], group_index = 0, group_name = 'Divide')])],
+nonterminal = 6), Grammar.Production(children = [RegexSequence(children = [
+RegexSequence(children = [RegexEmpty(), RegexGroup(children = [RegexSequence(
+children = [RegexEmpty(), RegexCharacterRule(character_set = [268, 288], rule_name =
+'number')])], group_index = 0, group_name = 'Number')]), RegexCharacterRule(
+character_set = [288, 295], rule_name = 'whitespace_opt')])], nonterminal = 7),
+Grammar.Production(children = [RegexSequence(children = [RegexEmpty(),
+RegexGroup(children = [RegexSequence(children = [RegexSequence(children = [
+RegexSequence(children = [RegexEmpty(), RegexCharacter(character_set = [45, 46])]),
+RegexCharacterRule(character_set = [288, 295], rule_name = 'whitespace_opt')]),
+RegexCharacterRule(character_set = [265, 268], rule_name = 'expr2')])], group_index
+= 0, group_name = 'Negate')])], nonterminal = 8), Grammar.Production(children =
+[RegexSequence(children = [RegexSequence(children = [RegexSequence(children = [
+RegexSequence(children = [RegexSequence(children = [RegexEmpty(),
+RegexCharacter(character_set = [40, 41])]), RegexCharacterRule(character_set = [288, 295
+], rule_name = 'whitespace_opt')]), RegexCharacterRule(character_set = [259, 262],
+rule_name = 'expr0')]), RegexCharacter(character_set = [41, 42])]),
+RegexCharacterRule(character_set = [288, 295], rule_name = 'whitespace_opt')])],
+nonterminal = 9), Grammar.Production(children = [RegexSequence(children = [
+RegexEmpty(), RegexCharacter(character_set = [48, 49])])], nonterminal = 10),
+Grammar.Production(children = [RegexSequence(children = [RegexEmpty(),
+RegexCharacter(character_set = [49, 50])])], nonterminal = 11), Grammar.Production(
+children = [RegexSequence(children = [RegexEmpty(), RegexCharacter(character_set = [
+50, 51])])], nonterminal = 12), Grammar.Production(children = [RegexSequence(
+children = [RegexEmpty(), RegexCharacter(character_set = [51, 52])])], nonterminal =
+13), Grammar.Production(children = [RegexSequence(children = [RegexEmpty(),
+RegexCharacter(character_set = [52, 53])])], nonterminal = 14), Grammar.Production(
+children = [RegexSequence(children = [RegexEmpty(), RegexCharacter(character_set = [
+53, 54])])], nonterminal = 15), Grammar.Production(children = [RegexSequence(
+children = [RegexEmpty(), RegexCharacter(character_set = [54, 55])])], nonterminal =
+16), Grammar.Production(children = [RegexSequence(children = [RegexEmpty(),
+RegexCharacter(character_set = [55, 56])])], nonterminal = 17), Grammar.Production(
+children = [RegexSequence(children = [RegexEmpty(), RegexCharacter(character_set = [
+56, 57])])], nonterminal = 18), Grammar.Production(children = [RegexSequence(
+children = [RegexEmpty(), RegexCharacter(character_set = [57, 58])])], nonterminal =
+19), Grammar.Production(children = [RegexSequence(children = [RegexSequence(
+children = [RegexEmpty(), RegexCharacterRule(character_set = [268, 288], rule_name =
+'number')]), RegexCharacter(character_set = [48, 49])])], nonterminal = 20),
+Grammar.Production(children = [RegexSequence(children = [RegexSequence(children
+= [RegexEmpty(), RegexCharacterRule(character_set = [268, 288], rule_name = 'number'
+)]), RegexCharacter(character_set = [49, 50])])], nonterminal = 21),
+Grammar.Production(children = [RegexSequence(children = [RegexSequence(children
+= [RegexEmpty(), RegexCharacterRule(character_set = [268, 288], rule_name = 'number'
+)]), RegexCharacter(character_set = [50, 51])])], nonterminal = 22),
+Grammar.Production(children = [RegexSequence(children = [RegexSequence(children
+= [RegexEmpty(), RegexCharacterRule(character_set = [268, 288], rule_name = 'number'
+)]), RegexCharacter(character_set = [51, 52])])], nonterminal = 23),
+Grammar.Production(children = [RegexSequence(children = [RegexSequence(children
+= [RegexEmpty(), RegexCharacterRule(character_set = [268, 288], rule_name = 'number'
+)]), RegexCharacter(character_set = [52, 53])])], nonterminal = 24),
+Grammar.Production(children = [RegexSequence(children = [RegexSequence(children
+= [RegexEmpty(), RegexCharacterRule(character_set = [268, 288], rule_name = 'number'
+)]), RegexCharacter(character_set = [53, 54])])], nonterminal = 25),
+Grammar.Production(children = [RegexSequence(children = [RegexSequence(children
+= [RegexEmpty(), RegexCharacterRule(character_set = [268, 288], rule_name = 'number'
+)]), RegexCharacter(character_set = [54, 55])])], nonterminal = 26),
+Grammar.Production(children = [RegexSequence(children = [RegexSequence(children
+= [RegexEmpty(), RegexCharacterRule(character_set = [268, 288], rule_name = 'number'
+)]), RegexCharacter(character_set = [55, 56])])], nonterminal = 27),
+Grammar.Production(children = [RegexSequence(children = [RegexSequence(children
+= [RegexEmpty(), RegexCharacterRule(character_set = [268, 288], rule_name = 'number'
+)]), RegexCharacter(character_set = [56, 57])])], nonterminal = 28),
+Grammar.Production(children = [RegexSequence(children = [RegexSequence(children
+= [RegexEmpty(), RegexCharacterRule(character_set = [268, 288], rule_name = 'number'
+)]), RegexCharacter(character_set = [57, 58])])], nonterminal = 29),
+Grammar.Production(children = [RegexEmpty()], nonterminal = 30),
+Grammar.Production(children = [RegexSequence(children = [RegexSequence(children
+= [RegexEmpty(), RegexCharacterRule(character_set = [288, 295], rule_name =
+'whitespace_opt')]), RegexCharacter(character_set = [9, 10])])], nonterminal = 31),
+Grammar.Production(children = [RegexSequence(children = [RegexSequence(children
+= [RegexEmpty(), RegexCharacterRule(character_set = [288, 295], rule_name =
+'whitespace_opt')]), RegexCharacter(character_set = [10, 11])])], nonterminal = 32),
+Grammar.Production(children = [RegexSequence(children = [RegexSequence(children
+= [RegexEmpty(), RegexCharacterRule(character_set = [288, 295], rule_name =
+'whitespace_opt')]), RegexCharacter(character_set = [11, 12])])], nonterminal = 33),
+Grammar.Production(children = [RegexSequence(children = [RegexSequence(children
+= [RegexEmpty(), RegexCharacterRule(character_set = [288, 295], rule_name =
+'whitespace_opt')]), RegexCharacter(character_set = [12, 13])])], nonterminal = 34),
+Grammar.Production(children = [RegexSequence(children = [RegexSequence(children
+= [RegexEmpty(), RegexCharacterRule(character_set = [288, 295], rule_name =
+'whitespace_opt')]), RegexCharacter(character_set = [13, 14])])], nonterminal = 35),
+Grammar.Production(children = [RegexSequence(children = [RegexSequence(children
+= [RegexEmpty(), RegexCharacterRule(character_set = [288, 295], rule_name =
+'whitespace_opt')]), RegexCharacter(character_set = [32, 33])])], nonterminal = 36)
+], n_terminals = 258)
+  #sys.stdout.write(
+  #  wrap_repr(
+  #    '  grammar = {0:s}'.format(repr(grammar).replace('regex.', '')),
+  #    79
+  #  )
+  #)
+
+  lr1 = grammar.to_lr1()
+  #sys.stdout.write(
+  #  wrap_repr(
+  #    '  lr1 = {0:s}'.format(repr(lr1).replace('regex.', '')),
+  #    79
+  #  )
+  #)
+
+  lr1.parse_text('(13 + 5 * 6) * 2', 0)
+  root = element.Element('root', text = '(13 + 5 * 6) * 2')
+  lr1.parse_yychunk(root, 0, 0, element.Element, iter([]))
+  xml.etree.ElementTree.dump(root)
+
+  clr1 = lr1.to_clr1()
+  #sys.stdout.write(
+  #  wrap_repr(
+  #    '  clr1 = {0:s}'.format(repr(clr1).replace('regex.', '')),
+  #    79
+  #  )
+  #)
+
+  clr1.parse_text('(13 + 5 * 6) * 2', 0)
+  root = element.Element('root', text = '(13 + 5 * 6) * 2')
+  clr1.parse_yychunk(root, 0, 0, element.Element, iter([]))
+  xml.etree.ElementTree.dump(root)
+
+  lalr1 = lr1.to_lalr1()
+  #sys.stdout.write(
+  #  wrap_repr(
+  #    '  lalr1 = {0:s}'.format(repr(lalr1).replace('regex.', '')),
+  #    79
+  #  )
+  #)
+
+  lalr1.parse_text('(13 + 5 * 6) * 2', 0)
+  root = element.Element('root', text = '(13 + 5 * 6) * 2')
+  lalr1.parse_yychunk(root, 0, 0, element.Element, iter([]))
+  xml.etree.ElementTree.dump(root)
diff --git a/regex.sh b/regex.sh
new file mode 100755 (executable)
index 0000000..8cc339a
--- /dev/null
+++ b/regex.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+if ./generate.py regex <regex.py >regex.py.new && ! diff -q regex.py regex.py.new
+then
+  mv regex.py.new regex.py
+else
+  rm -f regex.py.new
+fi
diff --git a/tests/parse-gram.y b/tests/parse-gram.y
new file mode 100644 (file)
index 0000000..f8f2ef8
--- /dev/null
@@ -0,0 +1,1131 @@
+/* Bison Grammar Parser                             -*- C -*-
+
+   Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   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 3 of the License, 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, see <http://www.gnu.org/licenses/>.  */
+
+%code requires
+{
+  #include "symlist.h"
+  #include "symtab.h"
+}
+
+%code top
+{
+  /* On column 0 to please syntax-check.  */
+#include <config.h>
+}
+
+%code
+{
+  #include "system.h"
+
+  #include "c-ctype.h"
+  #include "complain.h"
+  #include "conflicts.h"
+  #include "files.h"
+  #include "getargs.h"
+  #include "gram.h"
+  #include "named-ref.h"
+  #include "quotearg.h"
+  #include "reader.h"
+  #include "scan-gram.h"
+  #include "scan-code.h"
+  #include "xmemdup0.h"
+
+  static int current_prec = 0;
+  static location current_lhs_location;
+  static named_ref *current_lhs_named_ref;
+  static symbol *current_lhs_symbol;
+  static symbol_class current_class = unknown_sym;
+  static uniqstr current_type = NULL;
+
+  /** Set the new current left-hand side symbol, possibly common
+   * to several right-hand side parts of rule.
+   */
+  static void current_lhs (symbol *sym, location loc, named_ref *ref);
+
+  #define YYLLOC_DEFAULT(Current, Rhs, N)         \
+    (Current) = lloc_default (Rhs, N)
+  static YYLTYPE lloc_default (YYLTYPE const *, int);
+
+  #define YY_LOCATION_PRINT(File, Loc)            \
+    location_print (Loc, File)
+
+  /* Strip initial '{' and final '}' (must be first and last characters).
+     Return the result.  */
+  static char *strip_braces (char *code);
+
+  /* Convert CODE by calling code_props_plain_init if PLAIN, otherwise
+     code_props_symbol_action_init.  Call
+     gram_scanner_last_string_free to release the latest string from
+     the scanner (should be CODE). */
+  static char const *translate_code (char *code, location loc, bool plain);
+
+  /* Convert CODE by calling code_props_plain_init after having
+     stripped the first and last characters (expected to be '{', and
+     '}').  Call gram_scanner_last_string_free to release the latest
+     string from the scanner (should be CODE). */
+  static char const *translate_code_braceless (char *code, location loc);
+
+  static void version_check (location const *loc, char const *version);
+
+  static void gram_error (location const *, char const *);
+
+  /* A string that describes a char (e.g., 'a' -> "'a'").  */
+  static char const *char_name (char);
+
+  #define YYTYPE_INT16 int_fast16_t
+  #define YYTYPE_INT8 int_fast8_t
+  #define YYTYPE_UINT16 uint_fast16_t
+  #define YYTYPE_UINT8 uint_fast8_t
+
+  /* Nick */
+  extern char *code_piece[];
+  extern int code_piece0;
+  void code_piece_append(const char *str);
+  void code_piece_pack();
+  
+  extern char gram_piece_temp[], *gram_piece[];
+  extern int gram_piece0, gram_piece1;
+  int gram_piece2, gram_piece3;
+  void gram_piece_insert(int n, const void *str);
+
+  #define insert_before(n, str) \
+   do { \
+    gram_piece_insert(gram_piece2 + (n) * 2, (str)); \
+    ++gram_piece0; \
+    ++gram_piece3; \
+   } while (0)
+  #define insert_after(n, str) \
+   do { \
+    gram_piece_insert(gram_piece2 + (n) * 2 + 1, (str)); \
+    ++gram_piece0; \
+    ++gram_piece3; \
+   } while (0)
+
+}
+
+%define api.prefix {gram_}
+%define api.pure full
+%define locations
+%define parse.error verbose
+%define parse.lac full
+%define parse.trace
+%defines
+%expect 0
+%verbose
+
+%initial-action
+{
+  /* Bison's grammar can initial empty locations, hence a default
+     location is needed. */
+  boundary_set (&@$.start, current_file, 1, 1);
+  boundary_set (&@$.end, current_file, 1, 1);
+}
+
+/* Define the tokens together with their human representation.  */
+%token GRAM_EOF 0 "end of file"
+%token STRING     "string"
+
+%token PERCENT_TOKEN       "%token"
+%token PERCENT_NTERM       "%nterm"
+
+%token PERCENT_TYPE        "%type"
+%token PERCENT_DESTRUCTOR  "%destructor"
+%token PERCENT_PRINTER     "%printer"
+
+%token PERCENT_LEFT        "%left"
+%token PERCENT_RIGHT       "%right"
+%token PERCENT_NONASSOC    "%nonassoc"
+%token PERCENT_PRECEDENCE  "%precedence"
+
+%token PERCENT_PREC          "%prec"
+%token PERCENT_DPREC         "%dprec"
+%token PERCENT_MERGE         "%merge"
+
+/*----------------------.
+| Global Declarations.  |
+`----------------------*/
+
+%token
+  PERCENT_CODE            "%code"
+  PERCENT_DEFAULT_PREC    "%default-prec"
+  PERCENT_DEFINE          "%define"
+  PERCENT_DEFINES         "%defines"
+  PERCENT_ERROR_VERBOSE   "%error-verbose"
+  PERCENT_EXPECT          "%expect"
+  PERCENT_EXPECT_RR       "%expect-rr"
+  PERCENT_FLAG            "%<flag>"
+  PERCENT_FILE_PREFIX     "%file-prefix"
+  PERCENT_GLR_PARSER      "%glr-parser"
+  PERCENT_INITIAL_ACTION  "%initial-action"
+  PERCENT_LANGUAGE        "%language"
+  PERCENT_NAME_PREFIX     "%name-prefix"
+  PERCENT_NO_DEFAULT_PREC "%no-default-prec"
+  PERCENT_NO_LINES        "%no-lines"
+  PERCENT_NONDETERMINISTIC_PARSER
+                          "%nondeterministic-parser"
+  PERCENT_OUTPUT          "%output"
+  PERCENT_REQUIRE         "%require"
+  PERCENT_SKELETON        "%skeleton"
+  PERCENT_START           "%start"
+  PERCENT_TOKEN_TABLE     "%token-table"
+  PERCENT_VERBOSE         "%verbose"
+  PERCENT_YACC            "%yacc"
+;
+
+%token BRACED_CODE     "{...}"
+%token BRACED_PREDICATE "%?{...}"
+%token BRACKETED_ID    "[identifier]"
+%token CHAR            "char"
+%token EPILOGUE        "epilogue"
+%token EQUAL           "="
+%token ID              "identifier"
+%token ID_COLON        "identifier:"
+%token PERCENT_PERCENT "%%"
+%token PIPE            "|"
+%token PROLOGUE        "%{...%}"
+%token SEMICOLON       ";"
+%token TAG             "<tag>"
+%token TAG_ANY         "<*>"
+%token TAG_NONE        "<>"
+
+%union {unsigned char character;}
+%type <character> CHAR
+%printer { fputs (char_name ($$), yyo); } CHAR
+
+%union {char *code;};
+%type <code> "{...}" "%?{...}" "%{...%}" EPILOGUE STRING
+%printer { fputs (quotearg_style (c_quoting_style, $$), yyo); } STRING
+%printer { fprintf (yyo, "{\n%s\n}", $$); } <code>
+
+%union {uniqstr uniqstr;}
+%type <uniqstr> BRACKETED_ID ID ID_COLON PERCENT_FLAG TAG tag variable
+%printer { fputs ($$, yyo); } <uniqstr>
+%printer { fprintf (yyo, "[%s]", $$); } BRACKETED_ID
+%printer { fprintf (yyo, "%s:", $$); } ID_COLON
+%printer { fprintf (yyo, "%%%s", $$); } PERCENT_FLAG
+%printer { fprintf (yyo, "<%s>", $$); } TAG tag
+
+%union {int integer;};
+%token <integer> INT "integer"
+%printer { fprintf (yyo, "%d", $$); } <integer>
+
+%union {symbol *symbol;}
+%type <symbol> id id_colon string_as_id symbol symbol.prec
+%printer { fprintf (yyo, "%s", $$->tag); } <symbol>
+%printer { fprintf (yyo, "%s:", $$->tag); } id_colon
+
+%union {assoc assoc;};
+%type <assoc> precedence_declarator
+
+%union {symbol_list *list;}
+%type <list>  symbols.1 symbols.prec generic_symlist generic_symlist_item
+
+%union {named_ref *named_ref;}
+%type <named_ref> named_ref.opt
+
+/*---------.
+| %param.  |
+`---------*/
+%code requires
+{
+  typedef enum
+  {
+    param_none   = 0,
+    param_lex    = 1 << 0,
+    param_parse  = 1 << 1,
+    param_both   = param_lex | param_parse
+  } param_type;
+};
+%code
+{
+  /** Add a lex-param and/or a parse-param.
+   *
+   * \param type  where to push this formal argument.
+   * \param decl  the formal argument.  Destroyed.
+   * \param loc   the location in the source.
+   */
+  static void add_param (param_type type, char *decl, location loc);
+  static param_type current_param = param_none;
+};
+%union {param_type param;}
+%token <param> PERCENT_PARAM "%param";
+%printer
+{
+  switch ($$)
+    {
+#define CASE(In, Out)                                           \
+      case param_ ## In: fputs ("%" #Out, yyo); break
+      CASE (lex,   lex-param);
+      CASE (parse, parse-param);
+      CASE (both,  param);
+#undef CASE
+      case param_none: aver (false); break;
+    }
+} <param>;
+
+
+                     /*==========\
+                     | Grammar.  |
+                     \==========*/
+%%
+
+input:
+  prologue_declarations "%%" grammar epilogue.opt
+ {
+ insert_after(2, "</PYACC_Section2>");
+ insert_before(2, "<PYACC_Section2>");
+ insert_after(0, "</PYACC_Section1>");
+ insert_before(0, "<PYACC_Section1>");
+ }
+;
+
+
+        /*------------------------------------.
+        | Declarations: before the first %%.  |
+        `------------------------------------*/
+
+prologue_declarations:
+  %empty
+ {
+ /* in this case, want empty rule associated with stuff on the right of us */
+ /* therefore, move inter-token text from the right of us over to the left */
+ if (yychar == YYEMPTY)
+  yychar = yylex(&yylval, &yylloc);
+ char *temp = gram_piece[gram_piece2 + 1];
+ gram_piece[gram_piece2 + 1] = gram_piece[gram_piece2]; /* empty */
+ gram_piece[gram_piece2] = gram_piece[gram_piece2 - 1]; /* empty */
+ gram_piece[gram_piece2 - 1] = temp;
+ }
+| prologue_declarations prologue_declaration
+;
+
+prologue_declaration:
+  grammar_declaration
+| "%{...%}"
+    {
+ /* inserting %{...%} below is a hack as we may lose some whitespace near it */
+ code_piece_append("<PYACC_Section1_Prologue>%{<PYACC_Text>");
+      muscle_code_grow (union_seen ? "post_prologue" : "pre_prologue",
+                        translate_code ($1, @1, true), @1);
+      code_scanner_last_string_free ();
+ code_piece_append("</PYACC_Text>%}</PYACC_Section1_Prologue>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2]);
+ gram_piece[gram_piece2] = strdup(code_piece[code_piece0 - 1]);
+    }
+| "%<flag>"
+    {
+      muscle_percent_define_ensure ($1, @1, true);
+ if (strcmp($1, "api.pure") == 0) {
+  insert_after(0, "</PYACC_Section1_PureParser>");
+  insert_before(0, "<PYACC_Section1_PureParser>");
+ }
+ else if (strcmp($1, "locations") == 0) {
+  insert_after(0, "</PYACC_Section1_Locations>");
+  insert_before(0, "<PYACC_Section1_Locations>");
+ }
+ else if (strcmp($1, "parse.trace") == 0) {
+  insert_after(0, "</PYACC_Section1_Debug>");
+  insert_before(0, "<PYACC_Section1_Debug>");
+ }
+ else
+  abort();
+    }
+| "%define" variable value
+    {
+      muscle_percent_define_insert ($2, @2, $3.kind, $3.chars,
+                                    MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
+ insert_after(2, "</PYACC_Section1_Define>");
+ insert_before(0, "<PYACC_Section1_Define>");
+    }
+| "%defines"                       { defines_flag = true; /*}*/
+ insert_after(0, "</PYACC_Section1_Defines>");
+ insert_before(0, "<PYACC_Section1_Defines>");
+ }
+| "%defines" STRING
+    {
+      defines_flag = true;
+      spec_defines_file = xstrdup ($2);
+ insert_after(1, "</PYACC_Section1_Defines>");
+ insert_before(0, "<PYACC_Section1_Defines>");
+    }
+| "%error-verbose"
+    {
+      muscle_percent_define_insert ("parse.error", @1, muscle_keyword,
+                                    "verbose",
+                                    MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE);
+ insert_after(0, "</PYACC_Section1_ErrorVerbose>");
+ insert_before(0, "<PYACC_Section1_ErrorVerbose>");
+    }
+| "%expect" INT                    { expected_sr_conflicts = $2; /*}*/
+ insert_after(1, "</PYACC_Section1_Expect>");
+ sprintf(gram_piece_temp, "<PYACC_Section1_Expect value=\"%d\">", $2);
+ insert_before(0, gram_piece_temp);
+ }
+| "%expect-rr" INT                 { expected_rr_conflicts = $2; /*}*/
+ insert_after(1, "</PYACC_Section1_ExpectRR>");
+ sprintf(gram_piece_temp, "<PYACC_Section1_ExpectRR value=\"%d\">", $2);
+ insert_before(0, gram_piece_temp);
+ }
+| "%file-prefix" STRING            { spec_file_prefix = $2; /*}*/
+ insert_after(1, "</PYACC_Section1_FilePrefix>");
+ insert_before(0, "<PYACC_Section1_FilePrefix>");
+ }
+| "%glr-parser"
+    {
+      nondeterministic_parser = true;
+      glr_parser = true;
+ insert_after(0, "</PYACC_Section1_GLRParser>");
+ insert_before(0, "<PYACC_Section1_GLRParser>");
+    }
+| "%initial-action" "{...}"
+    {
+ /* should be BracedCode, but too hard to put PYACC_Text inside braces */
+ code_piece_append("<PYACC_Text>");
+      muscle_code_grow ("initial_action", translate_code ($2, @2, false), @2);
+      code_scanner_last_string_free ();
+ code_piece_append("</PYACC_Text>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = strdup(code_piece[code_piece0 - 1]);
+ insert_after(1, "</PYACC_Section1_InitialAction>");
+ insert_before(0, "<PYACC_Section1_InitialAction>");
+    }
+| "%language" STRING            { language_argmatch ($2, grammar_prio, @1); /*}*/
+ insert_after(1, "</PYACC_Section1_Language>");
+ insert_before(0, "<PYACC_Section1_Language>");
+ }
+| "%name-prefix" STRING         { spec_name_prefix = $2; /*}*/
+ insert_after(1, "</PYACC_Section1_NamePrefix>");
+ insert_before(0, "<PYACC_Section1_NamePrefix>");
+ }
+| "%no-lines"                   { no_lines_flag = true; /*}*/
+ insert_after(0, "</PYACC_Section1_Lines>");
+ insert_before(0, "<PYACC_Section1_Lines value=\"false\">");
+ }
+| "%nondeterministic-parser"    { nondeterministic_parser = true; /*}*/
+ insert_after(0, "</PYACC_Section1_NonDeterministicParser>");
+ insert_before(0, "<PYACC_Section1_NonDeterministicParser>");
+ }
+| "%output" STRING              { spec_outfile = $2; /*}*/
+ insert_after(1, "</PYACC_Section1_Output>");
+ insert_before(0, "<PYACC_Section1_Output>");
+ }
+| "%param" { current_param = $1; } params { current_param = param_none; /*}*/
+ insert_after(2, "</PYACC_Section1_Param>");
+ insert_before(0, "<PYACC_Section1_Param>");
+ }
+| "%require" STRING             { version_check (&@2, $2); /*}*/
+ insert_after(1, "</PYACC_Section1_Require>");
+ insert_before(0, "<PYACC_Section1_Require>");
+ }
+| "%skeleton" STRING
+    {
+      char const *skeleton_user = $2;
+      if (strchr (skeleton_user, '/'))
+        {
+          size_t dir_length = strlen (current_file);
+          char *skeleton_build;
+          while (dir_length && current_file[dir_length - 1] != '/')
+            --dir_length;
+          while (dir_length && current_file[dir_length - 1] == '/')
+            --dir_length;
+          skeleton_build =
+            xmalloc (dir_length + 1 + strlen (skeleton_user) + 1);
+          if (dir_length > 0)
+            {
+              memcpy (skeleton_build, current_file, dir_length);
+              skeleton_build[dir_length++] = '/';
+            }
+          strcpy (skeleton_build + dir_length, skeleton_user);
+          skeleton_user = uniqstr_new (skeleton_build);
+          free (skeleton_build);
+        }
+      skeleton_arg (skeleton_user, grammar_prio, @1);
+ insert_after(1, "</PYACC_Section1_Skeleton>");
+ insert_before(0, "<PYACC_Section1_Skeleton>");
+    }
+| "%token-table"                { token_table_flag = true; /*}*/
+ insert_after(0, "</PYACC_Section1_TokenTable>");
+ insert_before(0, "<PYACC_Section1_TokenTable>");
+ }
+| "%verbose"                    { report_flag |= report_states; /*}*/
+ insert_after(0, "</PYACC_Section1_Verbose>");
+ insert_before(0, "<PYACC_Section1_Verbose>");
+ }
+| "%yacc"                       { yacc_flag = true; /*}*/
+ insert_after(0, "</PYACC_Section1_YACC>");
+ insert_before(0, "<PYACC_Section1_YACC>");
+ }
+| /*FIXME: Err?  What is this horror doing here? */ ";"
+;
+
+params:
+   params "{...}"  { add_param (current_param, $2, @2); }
+| "{...}"          { add_param (current_param, $1, @1); }
+;
+
+
+/*----------------------.
+| grammar_declaration.  |
+`----------------------*/
+
+grammar_declaration:
+  precedence_declaration
+| symbol_declaration
+| "%start" symbol
+    {
+      grammar_start_symbol_set ($2, @2);
+ insert_after(1, "</PYACC_Section1Or2_Start>");
+ insert_after(1, "</PYACC_SymbolRef>");
+ insert_before(1, "<PYACC_SymbolRef>");
+ insert_before(0, "<PYACC_Section1Or2_Start>");
+    }
+| code_props_type "{...}" generic_symlist
+    {
+      code_props code;
+      code_props_symbol_action_init (&code, $2, @2);
+ /* should be BracedCode, but too hard to put PYACC_Text inside braces */
+ code_piece_append("<PYACC_Text>");
+      code_props_translate_code (&code);
+ code_piece_append("</PYACC_Text>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = strdup(code_piece[code_piece0 - 1]);
+      {
+        symbol_list *list;
+        for (list = $3; list; list = list->next)
+          symbol_list_code_props_set (list, $1, &code);
+        symbol_list_free ($3);
+      }
+ insert_after(2, "</PYACC_Section1Or2_CodeProps>");
+ sprintf(gram_piece_temp, "<PYACC_Section1Or2_CodeProps _type=\"%d\">", $1);
+ insert_before(0, gram_piece_temp);
+    }
+| "%default-prec"
+    {
+      default_prec = true;
+ insert_after(0, "</PYACC_Section1Or2_DefaultPrec>");
+ insert_before(0, "<PYACC_Section1Or2_DefaultPrec value=\"true\">");
+   }
+| "%no-default-prec"
+    {
+      default_prec = false;
+ insert_after(0, "</PYACC_Section1Or2_DefaultPrec>");
+ insert_before(0, "<PYACC_Section1Or2_DefaultPrec>");
+    }
+| "%code" "{...}"
+    {
+      /* Do not invoke muscle_percent_code_grow here since it invokes
+         muscle_user_name_list_grow.  */
+ code_piece_append("<PYACC_BracedCode>{<PYACC_Text>");
+      muscle_code_grow ("percent_code()",
+                        translate_code_braceless ($2, @2), @2);
+      code_scanner_last_string_free ();
+ code_piece_append("</PYACC_Text>}</PYACC_BracedCode>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = strdup(code_piece[code_piece0 - 1]);
+ insert_after(1, "</PYACC_Section1Or2_Code>");
+ insert_before(0, "<PYACC_Section1Or2_Code><PYACC_ID />");
+    }
+| "%code" ID "{...}"
+    {
+ code_piece_append("<PYACC_BracedCode>{<PYACC_Text>");
+      muscle_percent_code_grow ($2, @2, translate_code_braceless ($3, @3), @3);
+      code_scanner_last_string_free ();
+ code_piece_append("</PYACC_Text>}</PYACC_BracedCode>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 4]);
+ gram_piece[gram_piece2 + 4] = strdup(code_piece[code_piece0 - 1]);
+ insert_after(2, "</PYACC_Section1Or2_Code>");
+ insert_before(0, "<PYACC_Section1Or2_Code>");
+    }
+;
+
+%type <code_type> code_props_type;
+%union {code_props_type code_type;};
+%printer { fprintf (yyo, "%s", code_props_type_string ($$)); } <code_type>;
+code_props_type:
+  "%destructor"  { $$ = destructor; }
+| "%printer"     { $$ = printer; }
+;
+
+/*---------.
+| %union.  |
+`---------*/
+
+%token PERCENT_UNION "%union";
+
+union_name:
+  %empty { insert_before(0, "<PYACC_ID />"); }
+| ID     { muscle_percent_define_insert ("api.value.union.name",
+                                         @1, muscle_keyword, $1,
+                                         MUSCLE_PERCENT_DEFINE_GRAMMAR_FILE); }
+;
+
+grammar_declaration:
+  "%union" union_name "{...}"
+    {
+      union_seen = true;
+ code_piece_append("<PYACC_BracedCode>{<PYACC_Text>");
+      muscle_code_grow ("union_members", translate_code_braceless ($3, @3), @3);
+      code_scanner_last_string_free ();
+ code_piece_append("</PYACC_Text>}</PYACC_BracedCode>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 4]);
+ gram_piece[gram_piece2 + 4] = strdup(code_piece[code_piece0 - 1]);
+ insert_after(2, "</PYACC_Section1Or2_Union>");
+ insert_before(0, "<PYACC_Section1Or2_Union>");
+    }
+;
+
+
+
+
+symbol_declaration:
+  "%nterm" { current_class = nterm_sym; } symbol_defs.1
+    {
+      current_class = unknown_sym;
+      current_type = NULL;
+ insert_after(2, "</PYACC_Section1Or2_NTerm>");
+ insert_before(0, "<PYACC_Section1Or2_NTerm>");
+    }
+| "%token" { current_class = token_sym; } symbol_defs.1
+    {
+      current_class = unknown_sym;
+      current_type = NULL;
+ insert_after(2, "</PYACC_Section1Or2_Token>");
+ insert_before(0, "<PYACC_Section1Or2_Token>");
+    }
+| "%type" TAG symbols.1
+    {
+      symbol_list *list;
+      tag_seen = true;
+      for (list = $3; list; list = list->next)
+        symbol_type_set (list->content.sym, $2, @2);
+      symbol_list_free ($3);
+ insert_after(2, "</PYACC_Section1Or2_Type>");
+ insert_before(0, "<PYACC_Section1Or2_Type>");
+    }
+;
+
+precedence_declaration:
+  precedence_declarator tag.opt symbols.prec
+    {
+      symbol_list *list;
+      ++current_prec;
+      for (list = $3; list; list = list->next)
+        {
+          symbol_type_set (list->content.sym, current_type, @2);
+          symbol_precedence_set (list->content.sym, current_prec, $1, @1);
+        }
+      symbol_list_free ($3);
+      current_type = NULL;
+ insert_after(2, "</PYACC_Section1Or2_Precedence>");
+ sprintf(gram_piece_temp, "<PYACC_Section1Or2_Precedence _type=\"%d\">", ($1 & 3) - 1); /* -1 precedence, 0 right, 1 left, 2 nonassoc */
+ insert_before(0, gram_piece_temp);
+    }
+;
+
+precedence_declarator:
+  "%left"       { $$ = left_assoc; }
+| "%right"      { $$ = right_assoc;  }
+| "%nonassoc"   { $$ = non_assoc; }
+| "%precedence" { $$ = precedence_assoc; }
+;
+
+tag.opt:
+  %empty { current_type = NULL; }
+| TAG    { current_type = $1; tag_seen = true; }
+;
+
+/* Just like symbols.1 but accept INT for the sake of POSIX.  */
+symbols.prec:
+  symbol.prec
+    { $$ = symbol_list_sym_new ($1, @1); }
+| symbols.prec symbol.prec
+    { $$ = symbol_list_append ($1, symbol_list_sym_new ($2, @2)); }
+;
+
+symbol.prec:
+  symbol
+    {
+      $$ = $1;
+      symbol_class_set ($1, token_sym, @1, false);
+ insert_after(0, "</PYACC_SymbolRef>");
+ insert_before(0, "<PYACC_SymbolRef>");
+    }
+| symbol INT
+    {
+      $$ = $1;
+      symbol_user_token_number_set ($1, $2, @2);
+      symbol_class_set ($1, token_sym, @1, false);
+ insert_after(1, "</PYACC_SymbolRef>");
+ sprintf(gram_piece_temp, "<PYACC_SymbolRef user_token=\"%d\">", $2);
+ insert_before(0, gram_piece_temp);
+    }
+;
+
+/* One or more symbols to be %typed. */
+symbols.1:
+  symbol
+    { $$ = symbol_list_sym_new ($1, @1); /*}*/
+ insert_after(0, "</PYACC_SymbolRef>");
+ insert_before(0, "<PYACC_SymbolRef>");
+ }
+| symbols.1 symbol
+    { $$ = symbol_list_append ($1, symbol_list_sym_new ($2, @2)); /*}*/
+ insert_after(1, "</PYACC_SymbolRef>");
+ insert_before(1, "<PYACC_SymbolRef>");
+ }
+;
+
+generic_symlist:
+  generic_symlist_item { $$ = $1; }
+| generic_symlist generic_symlist_item { $$ = symbol_list_append ($1, $2); }
+;
+
+generic_symlist_item:
+  symbol    { $$ = symbol_list_sym_new ($1, @1); /*}*/
+ insert_after(0, "</PYACC_SymbolRef>");
+ insert_before(0, "<PYACC_SymbolRef>");
+ }
+| tag       { $$ = symbol_list_type_new ($1, @1); }
+;
+
+tag:
+  TAG
+| "<*>" { $$ = uniqstr_new ("*"); }
+| "<>"  { $$ = uniqstr_new (""); }
+;
+
+/* One token definition.  */
+symbol_def:
+  TAG
+    {
+      current_type = $1;
+      tag_seen = true;
+    }
+| id
+    {
+      symbol_class_set ($1, current_class, @1, true);
+      symbol_type_set ($1, current_type, @1);
+ insert_after(0, "</PYACC_SymbolRef>");
+ insert_before(0, "<PYACC_SymbolRef>");
+    }
+| id INT
+    {
+      symbol_class_set ($1, current_class, @1, true);
+      symbol_type_set ($1, current_type, @1);
+      symbol_user_token_number_set ($1, $2, @2);
+ insert_after(1, "</PYACC_SymbolRef>");
+ sprintf(gram_piece_temp, "<PYACC_SymbolRef user_token=\"%d\">", $2);
+ insert_before(0, gram_piece_temp);
+    }
+| id string_as_id
+    {
+      symbol_class_set ($1, current_class, @1, true);
+      symbol_type_set ($1, current_type, @1);
+      symbol_make_alias ($1, $2, @$);
+ insert_after(1, "</PYACC_SymbolRef>");
+ insert_before(0, "<PYACC_SymbolRef>");
+    }
+| id INT string_as_id
+    {
+      symbol_class_set ($1, current_class, @1, true);
+      symbol_type_set ($1, current_type, @1);
+      symbol_user_token_number_set ($1, $2, @2);
+      symbol_make_alias ($1, $3, @$);
+ insert_after(2, "</PYACC_SymbolRef>");
+ sprintf(gram_piece_temp, "<PYACC_SymbolRef user_token=\"%d\">", $2);
+ insert_before(0, gram_piece_temp);
+    }
+;
+
+/* One or more symbol definitions. */
+symbol_defs.1:
+  symbol_def
+| symbol_defs.1 symbol_def
+;
+
+
+        /*------------------------------------------.
+        | The grammar section: between the two %%.  |
+        `------------------------------------------*/
+
+grammar:
+  rules_or_grammar_declaration
+| grammar rules_or_grammar_declaration
+;
+
+/* As a Bison extension, one can use the grammar declarations in the
+   body of the grammar.  */
+rules_or_grammar_declaration:
+  rules
+| grammar_declaration ";"
+| error ";"
+    {
+      yyerrok;
+    }
+;
+
+rules:
+  id_colon named_ref.opt { current_lhs ($1, @1, $2); } rhses.1
+  {
+    /* Free the current lhs. */
+    current_lhs (0, @1, 0);
+ insert_after(3, "</PYACC_Section2_Rules>");
+ /* the following will capture the ':', aesthetically unpleasing but benign */
+ insert_after(0, "</PYACC_SymbolRef>");
+ insert_before(0, "<PYACC_SymbolRef>");
+ insert_before(0, "<PYACC_Section2_Rules>");
+  }
+;
+
+rhses.1:
+  rhs                { grammar_current_rule_end (@1); /*}*/
+ insert_after(0, "</PYACC_Production>");
+ insert_before(0, "<PYACC_Production>");
+ }
+| rhses.1 "|" rhs    { grammar_current_rule_end (@3); /*}*/
+ insert_after(2, "</PYACC_Production>");
+ insert_before(2, "<PYACC_Production>");
+ }
+| rhses.1 ";"
+;
+
+%token PERCENT_EMPTY "%empty";
+rhs:
+  %empty
+    { grammar_current_rule_begin (current_lhs_symbol, current_lhs_location,
+                                  current_lhs_named_ref); /*}*/
+ /* in this case, want empty rule associated with stuff on the right of us */
+ /* therefore, move inter-token text from the right of us over to the left */
+ if (yychar == YYEMPTY)
+  yychar = yylex(&yylval, &yylloc);
+ char *temp = gram_piece[gram_piece2 + 1];
+ gram_piece[gram_piece2 + 1] = gram_piece[gram_piece2]; /* empty */
+ gram_piece[gram_piece2] = gram_piece[gram_piece2 - 1]; /* empty */
+ gram_piece[gram_piece2 - 1] = temp;
+ } 
+| rhs symbol named_ref.opt
+    { grammar_current_rule_symbol_append ($2, @2, $3); /*}*/
+ insert_after(2, "</PYACC_Production_SymbolRef>");
+ insert_after(1, "</PYACC_SymbolRef>");
+ insert_before(1, "<PYACC_Production_SymbolRef><PYACC_SymbolRef>");
+ }
+| rhs "{...}" named_ref.opt
+    { /* should be BracedCode, but too hard to put PYACC_Text inside braces */ code_piece_append("<PYACC_Text>"); grammar_current_rule_action_append ($2, @2, $3, false); /*}*/
+ code_piece_append("</PYACC_Text>");
+ code_piece_pack();
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = strdup(code_piece[code_piece0 - 1]);
+ insert_after(2, "</PYACC_Production_Action>");
+ insert_before(1, "<PYACC_Production_Action>");
+ }
+| rhs "%?{...}"
+    { grammar_current_rule_action_append ($2, @2, NULL, true); }
+| rhs "%empty"
+    { grammar_current_rule_empty_set (@2); /*}*/
+ insert_after(1, "</PYACC_Production_Empty>");
+ insert_before(1, "<PYACC_Production_Empty>");
+ }
+| rhs "%prec" symbol
+    { grammar_current_rule_prec_set ($3, @3); /*}*/
+ insert_after(2, "</PYACC_Production_Prec>");
+ insert_after(2, "</PYACC_SymbolRef>");
+ insert_before(2, "<PYACC_SymbolRef>");
+ insert_before(1, "<PYACC_Production_Prec>");
+ }
+| rhs "%dprec" INT
+    { grammar_current_rule_dprec_set ($3, @3); /*}*/
+ insert_after(2, "</PYACC_Production_DPrec>");
+ sprintf(gram_piece_temp, "<PYACC_Production_DPrec value=\"%d\">", $3);
+ insert_before(1, gram_piece_temp);
+ }
+| rhs "%merge" TAG
+    { grammar_current_rule_merge_set ($3, @3); /*}*/
+ insert_after(2, "</PYACC_Production_Merge>");
+ insert_before(1, "<PYACC_Production_Merge>");
+ }
+;
+
+named_ref.opt:
+  %empty         { $$ = 0; }
+| BRACKETED_ID   { $$ = named_ref_new ($1, @1); }
+;
+
+/*---------------------.
+| variable and value.  |
+`---------------------*/
+
+/* The STRING form of variable is deprecated and is not M4-friendly.
+   For example, M4 fails for '%define "[" "value"'.  */
+variable:
+  ID
+| STRING { $$ = uniqstr_new ($1); }
+;
+
+/* Some content or empty by default. */
+%code requires {#include "muscle-tab.h"};
+%union
+{
+  struct
+  {
+    char const *chars;
+    muscle_kind kind;
+  } value;
+};
+%type <value> value;
+%printer
+{
+  switch ($$.kind)
+    {
+    case muscle_code:    fprintf (yyo,  "{%s}",  $$.chars); break;
+    case muscle_keyword: fprintf (yyo,   "%s",   $$.chars); break;
+    case muscle_string:  fprintf (yyo, "\"%s\"", $$.chars); break;
+    }
+} <value>;
+
+value:
+  %empty  { $$.kind = muscle_keyword; $$.chars = ""; }
+| ID      { $$.kind = muscle_keyword; $$.chars = $1; }
+| STRING  { $$.kind = muscle_string;  $$.chars = $1; }
+| "{...}" { $$.kind = muscle_code;    $$.chars = strip_braces ($1); }
+;
+
+
+/*--------------.
+| Identifiers.  |
+`--------------*/
+
+/* Identifiers are returned as uniqstr values by the scanner.
+   Depending on their use, we may need to make them genuine symbols.  */
+
+id:
+  ID
+    { $$ = symbol_from_uniqstr ($1, @1); }
+| CHAR
+    {
+      $$ = symbol_get (char_name ($1), @1);
+      symbol_class_set ($$, token_sym, @1, false);
+      symbol_user_token_number_set ($$, $1, @1);
+    }
+;
+
+id_colon:
+  ID_COLON { $$ = symbol_from_uniqstr ($1, @1); }
+;
+
+
+symbol:
+  id
+| string_as_id
+;
+
+/* A string used as an ID: quote it.  */
+string_as_id:
+  STRING
+    {
+      $$ = symbol_get (quotearg_style (c_quoting_style, $1), @1);
+      symbol_class_set ($$, token_sym, @1, false);
+    }
+;
+
+epilogue.opt:
+  %empty
+| "%%" EPILOGUE
+    {
+#if 0
+ int gram_piece0_save = gram_piece0, gram_piece1_save = gram_piece1;
+ gram_piece0 = gram_piece1;
+ /*gram_piece_append("<PYACC_Epilogue>");*/
+#endif
+      muscle_code_grow ("epilogue", translate_code ($2, @2, true), @2);
+      code_scanner_last_string_free ();
+#if 0
+ /*gram_piece_append("</PYACC_Epilogue>");*/
+ gram_piece_pack();
+ /* delete marked up code from lexer and use that from translate_code() */
+ free(gram_piece[gram_piece2 + 2]);
+ gram_piece[gram_piece2 + 2] = gram_piece[gram_piece0 - 1];
+ gram_piece0 = gram_piece0_save;
+ gram_piece1 = gram_piece1_save;
+#endif
+ insert_after(1, "</PYACC_Section3>");
+ insert_after(0, "<PYACC_Section3>");
+    }
+;
+
+%%
+
+/* Return the location of the left-hand side of a rule whose
+   right-hand side is RHS[1] ... RHS[N].  Ignore empty nonterminals in
+   the right-hand side, and return an empty location equal to the end
+   boundary of RHS[0] if the right-hand side is empty.  */
+
+static YYLTYPE
+lloc_default (YYLTYPE const *rhs, int n)
+{
+  int i;
+  YYLTYPE loc;
+
+  /* SGI MIPSpro 7.4.1m miscompiles "loc.start = loc.end = rhs[n].end;".
+     The bug is fixed in 7.4.2m, but play it safe for now.  */
+  loc.start = rhs[n].end;
+  loc.end = rhs[n].end;
+
+  /* Ignore empty nonterminals the start of the right-hand side.
+     Do not bother to ignore them at the end of the right-hand side,
+     since empty nonterminals have the same end as their predecessors.  */
+  for (i = 1; i <= n; i++)
+    if (! equal_boundaries (rhs[i].start, rhs[i].end))
+      {
+        loc.start = rhs[i].start;
+        break;
+      }
+
+  return loc;
+}
+
+static
+char *strip_braces (char *code)
+{
+  code[strlen (code) - 1] = 0;
+  return code + 1;
+}
+
+static
+char const *
+translate_code (char *code, location loc, bool plain)
+{
+  code_props plain_code;
+  if (plain)
+    code_props_plain_init (&plain_code, code, loc);
+  else
+    code_props_symbol_action_init (&plain_code, code, loc);
+  code_props_translate_code (&plain_code);
+  gram_scanner_last_string_free ();
+  return plain_code.code;
+}
+
+static
+char const *
+translate_code_braceless (char *code, location loc)
+{
+  return translate_code (strip_braces (code), loc, true);
+}
+
+static void
+add_param (param_type type, char *decl, location loc)
+{
+  static char const alphanum[26 + 26 + 1 + 10 + 1] =
+    "abcdefghijklmnopqrstuvwxyz"
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    "_"
+    "0123456789";
+
+  char const *name_start = NULL;
+  {
+    char *p;
+    /* Stop on last actual character.  */
+    for (p = decl; p[1]; p++)
+      if ((p == decl
+           || ! memchr (alphanum, p[-1], sizeof alphanum - 1))
+          && memchr (alphanum, p[0], sizeof alphanum - 10 - 1))
+        name_start = p;
+
+    /* Strip the surrounding '{' and '}', and any blanks just inside
+       the braces.  */
+    --p;
+    while (c_isspace ((unsigned char) *p))
+      --p;
+    p[1] = '\0';
+    ++decl;
+    while (c_isspace ((unsigned char) *decl))
+      ++decl;
+  }
+
+  if (! name_start)
+    complain (&loc, complaint, _("missing identifier in parameter declaration"));
+  else
+    {
+      char *name = xmemdup0 (name_start, strspn (name_start, alphanum));
+      if (type & param_lex)
+        muscle_pair_list_grow ("lex_param", decl, name);
+      if (type & param_parse)
+        muscle_pair_list_grow ("parse_param", decl, name);
+      free (name);
+    }
+
+  gram_scanner_last_string_free ();
+}
+
+
+static void
+version_check (location const *loc, char const *version)
+{
+  if (strverscmp (version, PACKAGE_VERSION) > 0)
+    {
+      complain (loc, complaint, "require bison %s, but have %s",
+                version, PACKAGE_VERSION);
+      exit (EX_MISMATCH);
+    }
+}
+
+static void
+gram_error (location const *loc, char const *msg)
+{
+  complain (loc, complaint, "%s", msg);
+}
+
+char const *
+token_name (int type)
+{
+  return yytname[YYTRANSLATE (type)];
+}
+
+static char const *
+char_name (char c)
+{
+  if (c == '\'')
+    return "'\\''";
+  else
+    {
+      char buf[4];
+      buf[0] = '\''; buf[1] = c; buf[2] = '\''; buf[3] = '\0';
+      return quotearg_style (escape_quoting_style, buf);
+    }
+}
+
+static
+void
+current_lhs (symbol *sym, location loc, named_ref *ref)
+{
+  current_lhs_symbol = sym;
+  current_lhs_location = loc;
+  /* In order to simplify memory management, named references for lhs
+     are always assigned by deep copy into the current symbol_list
+     node.  This is because a single named-ref in the grammar may
+     result in several uses when the user factors lhs between several
+     rules using "|".  Therefore free the parser's original copy.  */
+  free (current_lhs_named_ref);
+  current_lhs_named_ref = ref;
+}
diff --git a/tests/parse.y b/tests/parse.y
new file mode 100644 (file)
index 0000000..814842a
--- /dev/null
@@ -0,0 +1,1318 @@
+/* parse.y - parser for flex input */
+
+%token CHAR NUMBER SECTEND SCDECL XSCDECL NAME PREVCCL EOF_OP
+%token TOK_OPTION TOK_OUTFILE TOK_PREFIX TOK_YYCLASS TOK_HEADER_FILE TOK_EXTRA_TYPE
+%token TOK_TABLES_FILE
+
+%token CCE_ALNUM CCE_ALPHA CCE_BLANK CCE_CNTRL CCE_DIGIT CCE_GRAPH
+%token CCE_LOWER CCE_PRINT CCE_PUNCT CCE_SPACE CCE_UPPER CCE_XDIGIT
+
+%token CCE_NEG_ALNUM CCE_NEG_ALPHA CCE_NEG_BLANK CCE_NEG_CNTRL CCE_NEG_DIGIT CCE_NEG_GRAPH
+%token CCE_NEG_LOWER CCE_NEG_PRINT CCE_NEG_PUNCT CCE_NEG_SPACE CCE_NEG_UPPER CCE_NEG_XDIGIT
+
+%left CCL_OP_DIFF CCL_OP_UNION
+
+/*
+ *POSIX and AT&T lex place the
+ * precedence of the repeat operator, {}, below that of concatenation.
+ * Thus, ab{3} is ababab.  Most other POSIX utilities use an Extended
+ * Regular Expression (ERE) precedence that has the repeat operator
+ * higher than concatenation.  This causes ab{3} to yield abbb.
+ *
+ * In order to support the POSIX and AT&T precedence and the flex
+ * precedence we define two token sets for the begin and end tokens of
+ * the repeat operator, '{' and '}'.  The lexical scanner chooses
+ * which tokens to return based on whether posix_compat or lex_compat
+ * are specified. Specifying either posix_compat or lex_compat will
+ * cause flex to parse scanner files as per the AT&T and
+ * POSIX-mandated behavior.
+ */
+
+%token BEGIN_REPEAT_POSIX END_REPEAT_POSIX BEGIN_REPEAT_FLEX END_REPEAT_FLEX
+
+
+%{
+/*  Copyright (c) 1990 The Regents of the University of California. */
+/*  All rights reserved. */
+
+/*  This code is derived from software contributed to Berkeley by */
+/*  Vern Paxson. */
+
+/*  The United States Government has rights in this work pursuant */
+/*  to contract no. DE-AC03-76SF00098 between the United States */
+/*  Department of Energy and the University of California. */
+
+/*  This file is part of flex. */
+
+/*  Redistribution and use in source and binary forms, with or without */
+/*  modification, are permitted provided that the following conditions */
+/*  are met: */
+
+/*  1. Redistributions of source code must retain the above copyright */
+/*     notice, this list of conditions and the following disclaimer. */
+/*  2. Redistributions in binary form must reproduce the above copyright */
+/*     notice, this list of conditions and the following disclaimer in the */
+/*     documentation and/or other materials provided with the distribution. */
+
+/*  Neither the name of the University nor the names of its contributors */
+/*  may be used to endorse or promote products derived from this software */
+/*  without specific prior written permission. */
+
+/*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
+/*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
+/*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
+/*  PURPOSE. */
+
+#include "flexdef.h"
+#include "tables.h"
+
+int pat, scnum, eps, headcnt, trailcnt, lastchar, i, rulelen;
+int trlcontxt, xcluflg, currccl, cclsorted, varlength, variable_trail_rule;
+
+int *scon_stk;
+int scon_stk_ptr;
+
+static int madeany = false;  /* whether we've made the '.' character class */
+static int ccldot, cclany;
+int previous_continued_action; /* whether the previous rule's action was '|' */
+
+#define format_warn3(fmt, a1, a2) \
+       do{ \
+        char fw3_msg[MAXLINE];\
+        snprintf( fw3_msg, MAXLINE,(fmt), (a1), (a2) );\
+        lwarn( fw3_msg );\
+       }while(0)
+
+/* Expand a POSIX character class expression. */
+#define CCL_EXPR(func) \
+       do{ \
+       int c; \
+       for ( c = 0; c < csize; ++c ) \
+               if ( isascii(c) && func(c) ) \
+                       ccladd( currccl, c ); \
+       }while(0)
+
+/* negated class */
+#define CCL_NEG_EXPR(func) \
+       do{ \
+       int c; \
+       for ( c = 0; c < csize; ++c ) \
+               if ( !func(c) ) \
+                       ccladd( currccl, c ); \
+       }while(0)
+
+/* While POSIX defines isblank(), it's not ANSI C. */
+#define IS_BLANK(c) ((c) == ' ' || (c) == '\t')
+
+/* On some over-ambitious machines, such as DEC Alpha's, the default
+ * token type is "long" instead of "int"; this leads to problems with
+ * declaring yylval in flexdef.h.  But so far, all the yacc's I've seen
+ * wrap their definitions of YYSTYPE with "#ifndef YYSTYPE"'s, so the
+ * following should ensure that the default token type is "int".
+ */
+#define YYSTYPE int
+
+/* Nick */
+extern char piece_temp[], *piece[];
+extern int piece0, piece1;
+int piece2, piece3;
+void piece_insert(int n, const void *str);
+
+#define insert_before(n, str) \
+ do { \
+  piece_insert(piece2 + (n) * 2, (str)); \
+  ++piece0; \
+  ++piece3; \
+ } while (0)
+#define insert_after(n, str) \
+ do { \
+  piece_insert(piece2 + (n) * 2 + 1, (str)); \
+  ++piece0; \
+  ++piece3; \
+ } while (0)
+
+%}
+
+%%
+goal           :  initlex sect1 sect1end sect2 initforrule
+                       { /* add default rule */
+                       int def_rule;
+
+                       pat = cclinit();
+                       cclnegate( pat );
+
+                       def_rule = mkstate( -pat );
+
+                       /* Remember the number of the default rule so we
+                        * don't generate "can't match" warnings for it.
+                        */
+                       default_rule = num_rules;
+
+                       finish_rule( def_rule, false, 0, 0, 0);
+
+                       for ( i = 1; i <= lastsc; ++i )
+                               scset[i] = mkbranch( scset[i], def_rule );
+
+                       if ( spprdflt )
+                               add_action(
+                               "YY_FATAL_ERROR( \"flex scanner jammed\" )" );
+                       else
+                               add_action( "ECHO" );
+
+                       add_action( ";\n\tYY_BREAK]]\n" );
+                       }
+               ;
+
+initlex                :
+                       { /* initialize for processing rules */
+
+                       /* Create default DFA start condition. */
+                       scinstal( "INITIAL", false );
+                       }
+               ;
+
+sect1          :  sect1 startconddecl namelist1
+ {
+ insert_after(2, "</PLex_Section1_StartConditions>");
+ sprintf(piece_temp, "<PLex_Section1_StartConditions exclusive=\"%s\">", xcluflg ? "true" : "false");
+ insert_before(1, piece_temp);
+ }
+               |  sect1 options
+ {
+ insert_after(1, "</PLex_Section1_Options>");
+ insert_before(1, "<PLex_Section1_Options>");
+ }
+               |
+               |  error
+                       { synerr( _("unknown error processing section 1") ); }
+               ;
+
+sect1end       :  SECTEND
+                       {
+                       check_options();
+                       scon_stk = allocate_integer_array( lastsc + 1 );
+                       scon_stk_ptr = 0;
+                       }
+               ;
+
+startconddecl  :  SCDECL
+                       { xcluflg = false; }
+
+               |  XSCDECL
+                       { xcluflg = true; }
+               ;
+
+namelist1      :  namelist1 NAME
+                       { scinstal( nmstr, xcluflg ); }
+
+               |  NAME
+                       { scinstal( nmstr, xcluflg ); }
+
+               |  error
+                       { synerr( _("bad start condition list") ); }
+               ;
+
+options                :  TOK_OPTION optionlist
+               ;
+
+optionlist     :  optionlist option
+               |
+               ;
+
+option         :  TOK_OUTFILE '=' NAME
+                       {
+                       outfilename = xstrdup(nmstr);
+                       did_outfilename = 1;
+ insert_after(2, "</PLex_Section1_Options_OutFile>");
+ insert_before(0,"<PLex_Section1_Options_OutFile>");
+                       }
+               |  TOK_EXTRA_TYPE '=' NAME
+                       { extra_type = xstrdup(nmstr); /*}*/
+ insert_after(2, "</PLex_Section1_Options_ExtraType>");
+ insert_before(0, "<PLex_Section1_Options_ExtraType>");
+ }
+               |  TOK_PREFIX '=' NAME
+                       { prefix = xstrdup(nmstr);
+                          if (strchr(prefix, '[') || strchr(prefix, ']'))
+                              flexerror(_("Prefix must not contain [ or ]")); /*}*/
+ insert_after(2, "</PLex_Section1_Options_Prefix>");
+ insert_before(0, "<PLex_Section1_Options_Prefix>");
+ }
+               |  TOK_YYCLASS '=' NAME
+                       { yyclass = xstrdup(nmstr); /*}*/
+ insert_after(2, "</PLex_Section1_Options_YYClass>");
+ insert_before(0, "<PLex_Section1_Options_YYClass>");
+ }
+               |  TOK_HEADER_FILE '=' NAME
+                       { headerfilename = xstrdup(nmstr); /*}*/
+ insert_after(2, "</PLex_Section1_Options_HeaderFile>");
+ insert_before(0, "<PLex_Section1_Options_HeaderFile>");
+ }
+           |  TOK_TABLES_FILE '=' NAME
+            { tablesext = true; tablesfilename = xstrdup(nmstr); /*}*/
+ insert_after(2, "</PLex_Section1_Options_TablesFile>");
+ insert_before(0, "<PLex_Section1_Options_TablesFile>");
+ }
+               ;
+
+sect2          :  sect2 scon initforrule flexrule '\n'
+                       { scon_stk_ptr = $2; /*}*/
+ insert_after(4, "</PLex_Section2_Rule>");
+ insert_before(1, "<PLex_Section2_Rule>");
+ }
+               |  sect2 scon '{' sect2 '}'
+                       { scon_stk_ptr = $2; /*}*/
+ insert_after(4, "</PLex_Section2_CompoundRule>");
+ insert_before(1, "<PLex_Section2_CompoundRule>");
+ }
+               |
+               ;
+
+initforrule    :
+                       {
+                       /* Initialize for a parse of one rule. */
+                       trlcontxt = variable_trail_rule = varlength = false;
+                       trailcnt = headcnt = rulelen = 0;
+                       current_state_type = STATE_NORMAL;
+                       previous_continued_action = continued_action;
+                       in_rule = true;
+
+                       new_rule();
+                       }
+               ;
+
+flexrule       :  '^' rule
+                       {
+                       pat = $2;
+                       finish_rule( pat, variable_trail_rule,
+                               headcnt, trailcnt , previous_continued_action);
+
+                       if ( scon_stk_ptr > 0 )
+                               {
+                               for ( i = 1; i <= scon_stk_ptr; ++i )
+                                       scbol[scon_stk[i]] =
+                                               mkbranch( scbol[scon_stk[i]],
+                                                               pat );
+                               }
+
+                       else
+                               {
+                               /* Add to all non-exclusive start conditions,
+                                * including the default (0) start condition.
+                                */
+
+                               for ( i = 1; i <= lastsc; ++i )
+                                       if ( ! scxclu[i] )
+                                               scbol[i] = mkbranch( scbol[i],
+                                                                       pat );
+                               }
+
+                       if ( ! bol_needed )
+                               {
+                               bol_needed = true;
+
+                               if ( performance_report > 1 )
+                                       pinpoint_message(
+                       "'^' operator results in sub-optimal performance" );
+                               }
+ insert_after(1, "</PLex_Section2_Rule_FLexRule>");
+ insert_before(0, "<PLex_Section2_Rule_FLexRule bol=\"true\">");
+                       }
+
+               |  rule
+                       {
+                       pat = $1;
+                       finish_rule( pat, variable_trail_rule,
+                               headcnt, trailcnt , previous_continued_action);
+
+                       if ( scon_stk_ptr > 0 )
+                               {
+                               for ( i = 1; i <= scon_stk_ptr; ++i )
+                                       scset[scon_stk[i]] =
+                                               mkbranch( scset[scon_stk[i]],
+                                                               pat );
+                               }
+
+                       else
+                               {
+                               for ( i = 1; i <= lastsc; ++i )
+                                       if ( ! scxclu[i] )
+                                               scset[i] =
+                                                       mkbranch( scset[i],
+                                                               pat );
+                               }
+ insert_after(0, "</PLex_Section2_Rule_FLexRule>");
+ insert_before(0, "<PLex_Section2_Rule_FLexRule bol=\"false\">");
+                       }
+
+               |  EOF_OP
+                       {
+                       if ( scon_stk_ptr > 0 )
+                               build_eof_action();
+       
+                       else
+                               {
+                               /* This EOF applies to all start conditions
+                                * which don't already have EOF actions.
+                                */
+                               for ( i = 1; i <= lastsc; ++i )
+                                       if ( ! sceof[i] )
+                                               scon_stk[++scon_stk_ptr] = i;
+
+                               if ( scon_stk_ptr == 0 )
+                                       lwarn(
+                       "all start conditions already have <<EOF>> rules" );
+
+                               else
+                                       build_eof_action();
+                               }
+ insert_after(0, "</PLex_Section2_Rule_EOFRule>");
+ insert_before(0, "<PLex_Section2_Rule_EOFRule>");
+                       }
+
+               |  error
+                       { synerr( _("unrecognized rule") ); }
+               ;
+
+scon_stk_ptr   :
+                       { $$ = scon_stk_ptr; }
+               ;
+
+scon           :  '<' scon_stk_ptr namelist2 '>'
+                       { $$ = $2; /*}*/
+ insert_after(3, "</PLex_Section2_StartConditions>");
+ insert_before(0, "<PLex_Section2_StartConditions>");
+ }
+
+               |  '<' '*' '>'
+                       {
+                       $$ = scon_stk_ptr;
+
+                       for ( i = 1; i <= lastsc; ++i )
+                               {
+                               int j;
+
+                               for ( j = 1; j <= scon_stk_ptr; ++j )
+                                       if ( scon_stk[j] == i )
+                                               break;
+
+                               if ( j > scon_stk_ptr )
+                                       scon_stk[++scon_stk_ptr] = i;
+                               }
+ insert_after(2, "</PLex_Section2_StartConditions>");
+ insert_before(0, "<PLex_Section2_StartConditions wildcard=\"true\">");
+                       }
+
+               |
+                       { $$ = scon_stk_ptr; /*}*/
+ /* in this case, want empty rule associated with stuff on the right of us */
+ /* therefore, move inter-token text from the right of us over to the left */
+ if (yychar == YYEMPTY)
+  yychar = yylex();
+ char *temp = piece[piece2 + 1];
+ piece[piece2 + 1] = piece[piece2]; /* empty */
+ piece[piece2] = piece[piece2 - 1]; /* empty */
+ piece[piece2 - 1] = temp;
+ insert_before(0, "<PLex_Section2_StartConditions />");
+ }
+               ;
+
+namelist2      :  namelist2 ',' sconname
+
+               |  sconname
+
+               |  error
+                       { synerr( _("bad start condition list") ); }
+               ;
+
+sconname       :  NAME
+                       {
+                       if ( (scnum = sclookup( nmstr )) == 0 )
+                               format_pinpoint_message(
+                                       "undeclared start condition %s",
+                                       nmstr );
+                       else
+                               {
+                               for ( i = 1; i <= scon_stk_ptr; ++i )
+                                       if ( scon_stk[i] == scnum )
+                                               {
+                                               format_warn(
+                                                       "<%s> specified twice",
+                                                       scname[scnum] );
+                                               break;
+                                               }
+
+                               if ( i > scon_stk_ptr )
+                                       scon_stk[++scon_stk_ptr] = scnum;
+                               }
+                       }
+               ;
+
+/* this rule handles trailing context, it must produce two separate regexes,
+ * where the first is the expression to be matched, and the second is the
+ * trailing context, RegexEmpty (matches empty string) if no trailing context
+ */
+rule           :  re2 re
+                       {
+                       if ( transchar[lastst[$2]] != SYM_EPSILON )
+                               /* Provide final transition \now/ so it
+                                * will be marked as a trailing context
+                                * state.
+                                */
+                               $2 = link_machines( $2,
+                                               mkstate( SYM_EPSILON ) );
+
+                       mark_beginning_as_normal( $2 );
+                       current_state_type = STATE_NORMAL;
+
+                       if ( previous_continued_action )
+                               {
+                               /* We need to treat this as variable trailing
+                                * context so that the backup does not happen
+                                * in the action but before the action switch
+                                * statement.  If the backup happens in the
+                                * action, then the rules "falling into" this
+                                * one's action will *also* do the backup,
+                                * erroneously.
+                                */
+                               if ( ! varlength || headcnt != 0 )
+                                       lwarn(
+               "trailing context made variable due to preceding '|' action" );
+
+                               /* Mark as variable. */
+                               varlength = true;
+                               headcnt = 0;
+
+                               }
+
+                       if ( lex_compat || (varlength && headcnt == 0) )
+                               { /* variable trailing context rule */
+                               /* Mark the first part of the rule as the
+                                * accepting "head" part of a trailing
+                                * context rule.
+                                *
+                                * By the way, we didn't do this at the
+                                * beginning of this production because back
+                                * then current_state_type was set up for a
+                                * trail rule, and add_accept() can create
+                                * a new state ...
+                                */
+                               add_accept( $1,
+                                       num_rules | YY_TRAILING_HEAD_MASK );
+                               variable_trail_rule = true;
+                               }
+                       
+                       else
+                               trailcnt = rulelen;
+
+                       $$ = link_machines( $1, $2 );
+                       }
+
+               |  re2 re '$'
+                       { synerr( _("trailing context used twice") ); }
+
+               |  re '$'
+                       {
+                       headcnt = 0;
+                       trailcnt = 1;
+                       rulelen = 1;
+                       varlength = false;
+
+                       current_state_type = STATE_TRAILING_CONTEXT;
+
+                       if ( trlcontxt )
+                               {
+                               synerr( _("trailing context used twice") );
+                               $$ = mkstate( SYM_EPSILON );
+                               }
+
+                       else if ( previous_continued_action )
+                               {
+                               /* See the comment in the rule for "re2 re"
+                                * above.
+                                */
+                               lwarn(
+               "trailing context made variable due to preceding '|' action" );
+
+                               varlength = true;
+                               }
+
+                       if ( lex_compat || varlength )
+                               {
+                               /* Again, see the comment in the rule for
+                                * "re2 re" above.
+                                */
+                               add_accept( $1,
+                                       num_rules | YY_TRAILING_HEAD_MASK );
+                               variable_trail_rule = true;
+                               }
+
+                       trlcontxt = true;
+
+                       eps = mkstate( SYM_EPSILON );
+                       $$ = link_machines( $1,
+                               link_machines( eps, mkstate( '\n' ) ) );
+ insert_after(1, "</RegexCharacterLiteral>");
+ insert_before(1, "<RegexCharacterLiteral character_set=\"10 11\">");
+                       }
+
+               |  re
+                       {
+                       $$ = $1;
+
+                       if ( trlcontxt )
+                               {
+                               if ( lex_compat || (varlength && headcnt == 0) )
+                                       /* Both head and trail are
+                                        * variable-length.
+                                        */
+                                       variable_trail_rule = true;
+                               else
+                                       trailcnt = rulelen;
+                               }
+ insert_after(0, "<RegexEmpty />");
+                       }
+               ;
+
+
+re             :  re '|' series
+                       {
+                       varlength = true;
+                       $$ = mkor( $1, $3 );
+ insert_after(2, "</RegexOr>");
+ insert_before(0, "<RegexOr>");
+                       }
+
+               |  series
+                       { $$ = $1; }
+               ;
+
+
+re2            :  re '/'
+                       {
+                       /* This rule is written separately so the
+                        * reduction will occur before the trailing
+                        * series is parsed.
+                        */
+
+                       if ( trlcontxt )
+                               synerr( _("trailing context used twice") );
+                       else
+                               trlcontxt = true;
+
+                       if ( varlength )
+                               /* We hope the trailing context is
+                                * fixed-length.
+                                */
+                               varlength = false;
+                       else
+                               headcnt = rulelen;
+
+                       rulelen = 0;
+
+                       current_state_type = STATE_TRAILING_CONTEXT;
+                       $$ = $1;
+                       }
+               ;
+
+series         :  series singleton
+                       {
+                       /* This is where concatenation of adjacent patterns
+                        * gets done.
+                        */
+                       $$ = link_machines( $1, $2 );
+ insert_after(1, "</RegexSequence>");
+ insert_before(0, "<RegexSequence>");
+                       }
+
+               |  singleton
+                       { $$ = $1; }
+
+               |  series BEGIN_REPEAT_POSIX NUMBER ',' NUMBER END_REPEAT_POSIX
+                       {
+                       varlength = true;
+
+                       if ( $3 > $5 || $3 < 0 )
+                               {
+                               synerr( _("bad iteration values") );
+                               $$ = $1;
+                               }
+                       else
+                               {
+                               if ( $3 == 0 )
+                                       {
+                                       if ( $5 <= 0 )
+                                               {
+                                               synerr(
+                                               _("bad iteration values") );
+                                               $$ = $1;
+                                               }
+                                       else
+                                               $$ = mkopt(
+                                                       mkrep( $1, 1, $5 ) );
+                                       }
+                               else
+                                       $$ = mkrep( $1, $3, $5 );
+                               }
+ insert_after(5, "</RegexRepeat>");
+ sprintf(piece_temp, "<RegexRepeat count0=\"%d\" count1=\"%d\">", $3, $5);
+ insert_before(0, piece_temp);
+                       }
+
+               |  series BEGIN_REPEAT_POSIX NUMBER ',' END_REPEAT_POSIX
+                       {
+                       varlength = true;
+
+                       if ( $3 <= 0 )
+                               {
+                               synerr( _("iteration value must be positive") );
+                               $$ = $1;
+                               }
+
+                       else
+                               $$ = mkrep( $1, $3, INFINITE_REPEAT );
+ insert_after(4, "</RegexRepeat>");
+ sprintf(piece_temp, "<RegexRepeat count0=\"%d\">", $3);
+ insert_before(0, piece_temp);
+                       }
+
+               |  series BEGIN_REPEAT_POSIX NUMBER END_REPEAT_POSIX
+                       {
+                       /* The series could be something like "(foo)",
+                        * in which case we have no idea what its length
+                        * is, so we punt here.
+                        */
+                       varlength = true;
+
+                       if ( $3 <= 0 )
+                               {
+                                 synerr( _("iteration value must be positive")
+                                         );
+                               $$ = $1;
+                               }
+
+                       else
+                               $$ = link_machines( $1,
+                                               copysingl( $1, $3 - 1 ) );
+ insert_after(3, "</RegexRepeat>");
+ sprintf(piece_temp, "<RegexRepeat count0=\"%d\" count1=\"%d\">", $3, $3);
+ insert_before(0, piece_temp);
+                       }
+
+               ;
+
+singleton      :  singleton '*'
+                       {
+                       varlength = true;
+
+                       $$ = mkclos( $1 );
+ insert_after(1, "</RegexRepeat>");
+ insert_before(0, "<RegexRepeat count0=\"0\">");
+                       }
+
+               |  singleton '+'
+                       {
+                       varlength = true;
+                       $$ = mkposcl( $1 );
+ insert_after(1, "</RegexRepeat>");
+ insert_before(0, "<RegexRepeat count0=\"1\">");
+                       }
+
+               |  singleton '?'
+                       {
+                       varlength = true;
+                       $$ = mkopt( $1 );
+ insert_after(1, "</RegexRepeat>");
+ insert_before(0, "<RegexRepeat count0=\"0\" count1=\"1\">");
+                       }
+
+               |  singleton BEGIN_REPEAT_FLEX NUMBER ',' NUMBER END_REPEAT_FLEX
+                       {
+                       varlength = true;
+
+                       if ( $3 > $5 || $3 < 0 )
+                               {
+                               synerr( _("bad iteration values") );
+                               $$ = $1;
+                               }
+                       else
+                               {
+                               if ( $3 == 0 )
+                                       {
+                                       if ( $5 <= 0 )
+                                               {
+                                               synerr(
+                                               _("bad iteration values") );
+                                               $$ = $1;
+                                               }
+                                       else
+                                               $$ = mkopt(
+                                                       mkrep( $1, 1, $5 ) );
+                                       }
+                               else
+                                       $$ = mkrep( $1, $3, $5 );
+                               }
+ insert_after(5, "</RegexRepeat>");
+ sprintf(piece_temp, "<RegexRepeat count0=\"%d\" count1=\"%d\">", $3, $5);
+ insert_before(0, piece_temp);
+                       }
+
+               |  singleton BEGIN_REPEAT_FLEX NUMBER ',' END_REPEAT_FLEX
+                       {
+                       varlength = true;
+
+                       if ( $3 <= 0 )
+                               {
+                               synerr( _("iteration value must be positive") );
+                               $$ = $1;
+                               }
+
+                       else
+                               $$ = mkrep( $1, $3, INFINITE_REPEAT );
+ insert_after(4, "</RegexRepeat>");
+ sprintf(piece_temp, "<RegexRepeat count0=\"%d\">", $3);
+ insert_before(0, piece_temp);
+                       }
+
+               |  singleton BEGIN_REPEAT_FLEX NUMBER END_REPEAT_FLEX
+                       {
+                       /* The singleton could be something like "(foo)",
+                        * in which case we have no idea what its length
+                        * is, so we punt here.
+                        */
+                       varlength = true;
+
+                       if ( $3 <= 0 )
+                               {
+                               synerr( _("iteration value must be positive") );
+                               $$ = $1;
+                               }
+
+                       else
+                               $$ = link_machines( $1,
+                                               copysingl( $1, $3 - 1 ) );
+ insert_after(3, "</RegexRepeat>");
+ sprintf(piece_temp, "<RegexRepeat count0=\"%d\" count1=\"%d\">", $3, $3);
+ insert_before(0, piece_temp);
+                       }
+
+               |  '.'
+                       {
+                       if ( ! madeany )
+                               {
+                               /* Create the '.' character class. */
+                    ccldot = cclinit();
+                    ccladd( ccldot, '\n' );
+                    cclnegate( ccldot );
+
+                    if ( useecs )
+                        mkeccl( ccltbl + cclmap[ccldot],
+                            ccllen[ccldot], nextecm,
+                            ecgroup, csize, csize );
+
+                               /* Create the (?s:'.') character class. */
+                    cclany = cclinit();
+                    cclnegate( cclany );
+
+                    if ( useecs )
+                        mkeccl( ccltbl + cclmap[cclany],
+                            ccllen[cclany], nextecm,
+                            ecgroup, csize, csize );
+
+                               madeany = true;
+                               }
+
+                       ++rulelen;
+
+            if (sf_dot_all())
+ {
+                $$ = mkstate( -cclany );
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"0 256\">");
+ }
+            else
+ {
+                $$ = mkstate( -ccldot );
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"0 10 11 256\">");
+ }
+                       }
+
+               |  fullccl
+                       {
+                               /* Sort characters for fast searching.
+                                */
+                               qsort( ccltbl + cclmap[$1], (size_t) ccllen[$1], sizeof (*ccltbl), cclcmp );
+
+                       if ( useecs )
+                               mkeccl( ccltbl + cclmap[$1], ccllen[$1],
+                                       nextecm, ecgroup, csize, csize );
+
+                       ++rulelen;
+
+                       if (ccl_has_nl[$1])
+                               rule_has_nl[num_rules] = true;
+
+                       $$ = mkstate( -$1 );
+                       }
+
+               |  PREVCCL
+                       {
+                       ++rulelen;
+
+                       if (ccl_has_nl[$1])
+                               rule_has_nl[num_rules] = true;
+
+                       $$ = mkstate( -$1 );
+                       }
+
+               |  '"' string '"'
+                       { $$ = $2; }
+
+               |  '(' re ')'
+                       { $$ = $2; /*}*/
+#if 0 /* for now do things in the traditional lex way without subexpressions */
+ insert_after(2, "</RegexGroup>");
+ insert_before(0, "<RegexGroup>");
+#endif
+ }
+
+               |  CHAR
+                       {
+                       ++rulelen;
+
+                       if ($1 == nlch)
+                               rule_has_nl[num_rules] = true;
+
+            if (sf_case_ins() && has_case($1))
+                /* create an alternation, as in (a|A) */
+                $$ = mkor (mkstate($1), mkstate(reverse_case($1)));
+            else
+                $$ = mkstate( $1 );
+ insert_after(0, "</RegexCharacterLiteral>");
+ sprintf(piece_temp, "<RegexCharacterLiteral character_set=\"%d %d\">", $1, $1 + 1);
+ insert_before(0, piece_temp);
+                       }
+               ;
+fullccl:
+        fullccl CCL_OP_DIFF  braceccl  { $$ = ccl_set_diff  ($1, $3); /*}*/
+ insert_after(2, "</RegexCharacterAnd>");
+ insert_after(2, "</RegexCharacterNot>");
+ insert_before(2, "<RegexCharacterNot>");
+ insert_before(0, "<RegexCharacterAnd>");
+ }
+    |   fullccl CCL_OP_UNION braceccl  { $$ = ccl_set_union ($1, $3); /*}*/
+ insert_after(2, "</RegexCharacterOr>");
+ insert_before(0, "<RegexCharacterOr>");
+ }
+    |   braceccl
+    ;
+
+braceccl: 
+
+            '[' ccl ']' { $$ = $2; }
+
+               |  '[' '^' ccl ']'
+                       {
+                       cclnegate( $3 );
+                       $$ = $3;
+ insert_after(2, "</RegexCharacterNot>");
+ insert_before(1, "<RegexCharacterNot>");
+                       }
+               ;
+
+ccl            :  ccl CHAR '-' CHAR
+                       {
+
+                       if (sf_case_ins())
+                         {
+
+                           /* If one end of the range has case and the other
+                            * does not, or the cases are different, then we're not
+                            * sure what range the user is trying to express.
+                            * Examples: [@-z] or [S-t]
+                            */
+                           if (has_case ($2) != has_case ($4)
+                                    || (has_case ($2) && (b_islower ($2) != b_islower ($4)))
+                                    || (has_case ($2) && (b_isupper ($2) != b_isupper ($4))))
+                             format_warn3 (
+                             _("the character range [%c-%c] is ambiguous in a case-insensitive scanner"),
+                                           $2, $4);
+
+                           /* If the range spans uppercase characters but not
+                            * lowercase (or vice-versa), then should we automatically
+                            * include lowercase characters in the range?
+                            * Example: [@-_] spans [a-z] but not [A-Z]
+                            */
+                           else if (!has_case ($2) && !has_case ($4) && !range_covers_case ($2, $4))
+                             format_warn3 (
+                             _("the character range [%c-%c] is ambiguous in a case-insensitive scanner"),
+                                           $2, $4);
+                         }
+
+                       if ( $2 > $4 )
+                               synerr( _("negative range in character class") );
+
+                       else
+                               {
+                               for ( i = $2; i <= $4; ++i )
+                                       ccladd( $1, i );
+
+                               /* Keep track if this ccl is staying in
+                                * alphabetical order.
+                                */
+                               cclsorted = cclsorted && ($2 > lastchar);
+                               lastchar = $4;
+
+                /* Do it again for upper/lowercase */
+                if (sf_case_ins() && has_case($2) && has_case($4)){
+                    $2 = reverse_case ($2);
+                    $4 = reverse_case ($4);
+                    
+                    for ( i = $2; i <= $4; ++i )
+                        ccladd( $1, i );
+
+                    cclsorted = cclsorted && ($2 > lastchar);
+                    lastchar = $4;
+                }
+
+                               }
+
+                       $$ = $1;
+ insert_after(3, "</RegexCharacterOr>");
+ insert_after(3, "</RegexCharacterLiteral>");
+ sprintf(piece_temp, "<RegexCharacterLiteral character_set=\"%d %d\">", $2, $4 + 1);
+ insert_before(1, piece_temp);
+ insert_before(0, "<RegexCharacterOr>");
+                       }
+
+               |  ccl CHAR
+                       {
+                       ccladd( $1, $2 );
+                       cclsorted = cclsorted && ($2 > lastchar);
+                       lastchar = $2;
+
+            /* Do it again for upper/lowercase */
+            if (sf_case_ins() && has_case($2)){
+                $2 = reverse_case ($2);
+                ccladd ($1, $2);
+
+                cclsorted = cclsorted && ($2 > lastchar);
+                lastchar = $2;
+            }
+
+                       $$ = $1;
+ insert_after(1, "</RegexCharacterOr>");
+ insert_after(1, "</RegexCharacterLiteral>");
+ sprintf(piece_temp, "<RegexCharacterLiteral character_set=\"%d %d\">", $2, $2 + 1);
+ insert_before(1, piece_temp);
+ insert_before(0, "<RegexCharacterOr>");
+                       }
+
+               |  ccl ccl_expr
+                       {
+                       /* Too hard to properly maintain cclsorted. */
+                       cclsorted = false;
+                       $$ = $1;
+ insert_after(1, "</RegexCharacterOr>");
+ insert_before(0, "<RegexCharacterOr>");
+                       }
+
+               |
+                       {
+                       cclsorted = true;
+                       lastchar = 0;
+                       currccl = $$ = cclinit();
+ insert_before(0, "<RegexCharacterLiteral character_set=\"\" />");
+                       }
+               ;
+
+ccl_expr:         
+           CCE_ALNUM   { CCL_EXPR(isalnum); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"48 58 65 91 97 123\">");
+ }
+               |  CCE_ALPHA    { CCL_EXPR(isalpha); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"65 91 97 123\">");
+ }
+               |  CCE_BLANK    { CCL_EXPR(IS_BLANK); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"9 10 32 33\">");
+ }
+               |  CCE_CNTRL    { CCL_EXPR(iscntrl); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"0 32\">");
+ }
+               |  CCE_DIGIT    { CCL_EXPR(isdigit); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"48 58\">");
+ }
+               |  CCE_GRAPH    { CCL_EXPR(isgraph); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"33 127\">");
+ }
+               |  CCE_LOWER    { 
+                          CCL_EXPR(islower);
+                          if (sf_case_ins())
+ {
+                              CCL_EXPR(isupper);
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"65 91 97 123\">");
+ }
+ else
+ {
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"97 123\">");
+ }
+                        }
+               |  CCE_PRINT    { CCL_EXPR(isprint); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"32 127\">");
+ }
+               |  CCE_PUNCT    { CCL_EXPR(ispunct); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"33 48 58 65 91 97 123 127\">");
+ }
+               |  CCE_SPACE    { CCL_EXPR(isspace); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"9 14 32 33\">");
+ }
+               |  CCE_XDIGIT   { CCL_EXPR(isxdigit); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"48 58 65 71 97 103\">");
+ }
+               |  CCE_UPPER    {
+                    CCL_EXPR(isupper);
+                    if (sf_case_ins())
+ {
+                        CCL_EXPR(islower);
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"65 91 97 123\">");
+ }
+ else
+ {
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"65 91\">");
+ }
+                               }
+
+        |  CCE_NEG_ALNUM       { CCL_NEG_EXPR(isalnum); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"0 48 58 65 91 97 123 256\">");
+ }
+               |  CCE_NEG_ALPHA        { CCL_NEG_EXPR(isalpha); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"0 65 91 97 123 256\">");
+ }
+               |  CCE_NEG_BLANK        { CCL_NEG_EXPR(IS_BLANK); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"0 9 10 32 33 256\">");
+ }
+               |  CCE_NEG_CNTRL        { CCL_NEG_EXPR(iscntrl); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"32 256\">");
+ }
+               |  CCE_NEG_DIGIT        { CCL_NEG_EXPR(isdigit); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"0 48 58 256\">");
+ }
+               |  CCE_NEG_GRAPH        { CCL_NEG_EXPR(isgraph); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"0 33 127 256\">");
+ }
+               |  CCE_NEG_PRINT        { CCL_NEG_EXPR(isprint); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"0 32 127 256\">");
+ }
+               |  CCE_NEG_PUNCT        { CCL_NEG_EXPR(ispunct); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"0 33 48 58 65 91 97 123 127 256\">");
+ }
+               |  CCE_NEG_SPACE        { CCL_NEG_EXPR(isspace); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"0 9 14 32 33 256\">");
+ }
+               |  CCE_NEG_XDIGIT       { CCL_NEG_EXPR(isxdigit); /*}*/
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"0 48 58 65 71 97 103 256\">");
+ }
+               |  CCE_NEG_LOWER        { 
+                               if ( sf_case_ins() )
+                                       lwarn(_("[:^lower:] is ambiguous in case insensitive scanner"));
+                               else
+                                       CCL_NEG_EXPR(islower);
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"0 97 123 256\">");
+                               }
+               |  CCE_NEG_UPPER        {
+                               if ( sf_case_ins() )
+                                       lwarn(_("[:^upper:] ambiguous in case insensitive scanner"));
+                               else
+                                       CCL_NEG_EXPR(isupper);
+ insert_after(0, "</RegexCharacterLiteral>");
+ insert_before(0, "<RegexCharacterLiteral character_set=\"0 65 91 256\">");
+                               }
+               ;
+               
+string         :  string CHAR
+                       {
+                       if ( $2 == nlch )
+                               rule_has_nl[num_rules] = true;
+
+                       ++rulelen;
+
+            if (sf_case_ins() && has_case($2))
+                $$ = mkor (mkstate($2), mkstate(reverse_case($2)));
+            else
+                $$ = mkstate ($2);
+
+                       $$ = link_machines( $1, $$);
+ insert_after(1, "</RegexSequence>");
+ insert_after(1, "</RegexCharacterLiteral>");
+ sprintf(piece_temp, "<RegexCharacterLiteral character_set=\"%d %d\">", $2, $2 + 1);
+ insert_before(1, piece_temp);
+ insert_before(0, "<RegexSequence>");
+                       }
+
+               |
+                       { $$ = mkstate( SYM_EPSILON ); /*}*/
+ insert_before(0, "<RegexEmpty />");
+ }
+
+               ;
+
+%%
+
+
+/* build_eof_action - build the "<<EOF>>" action for the active start
+ *                    conditions
+ */
+
+void build_eof_action(void)
+       {
+       int i;
+       char action_text[MAXLINE];
+
+       for ( i = 1; i <= scon_stk_ptr; ++i )
+               {
+               if ( sceof[scon_stk[i]] )
+                       format_pinpoint_message(
+                               "multiple <<EOF>> rules for start condition %s",
+                               scname[scon_stk[i]] );
+
+               else
+                       {
+                       sceof[scon_stk[i]] = true;
+
+                       if (previous_continued_action /* && previous action was regular */)
+                               add_action("YY_RULE_SETUP\n");
+
+                       snprintf( action_text, sizeof(action_text), "case YY_STATE_EOF(%s):\n",
+                               scname[scon_stk[i]] );
+                       add_action( action_text );
+                       }
+               }
+
+       line_directive_out(NULL, 1);
+        add_action("[[");
+
+       /* This isn't a normal rule after all - don't count it as
+        * such, so we don't have any holes in the rule numbering
+        * (which make generating "rule can never match" warnings
+        * more difficult.
+        */
+       --num_rules;
+       ++num_eof_rules;
+       }
+
+
+/* format_synerr - write out formatted syntax error */
+
+void format_synerr( const char *msg, const char arg[] )
+       {
+       char errmsg[MAXLINE];
+
+       (void) snprintf( errmsg, sizeof(errmsg), msg, arg );
+       synerr( errmsg );
+       }
+
+
+/* synerr - report a syntax error */
+
+void synerr( const char *str )
+       {
+       syntaxerror = true;
+       pinpoint_message( str );
+       }
+
+
+/* format_warn - write out formatted warning */
+
+void format_warn( const char *msg, const char arg[] )
+       {
+       char warn_msg[MAXLINE];
+
+       snprintf( warn_msg, sizeof(warn_msg), msg, arg );
+       lwarn( warn_msg );
+       }
+
+
+/* lwarn - report a warning, unless -w was given */
+
+void lwarn( const char *str )
+       {
+       line_warning( str, linenum );
+       }
+
+/* format_pinpoint_message - write out a message formatted with one string,
+ *                          pinpointing its location
+ */
+
+void format_pinpoint_message( const char *msg, const char arg[] )
+       {
+       char errmsg[MAXLINE];
+
+       snprintf( errmsg, sizeof(errmsg), msg, arg );
+       pinpoint_message( errmsg );
+       }
+
+
+/* pinpoint_message - write out a message, pinpointing its location */
+
+void pinpoint_message( const char *str )
+       {
+       line_pinpoint( str, linenum );
+       }
+
+
+/* line_warning - report a warning at a given line, unless -w was given */
+
+void line_warning( const char *str, int line )
+       {
+       char warning[MAXLINE];
+
+       if ( ! nowarn )
+               {
+               snprintf( warning, sizeof(warning), "warning, %s", str );
+               line_pinpoint( warning, line );
+               }
+       }
+
+
+/* line_pinpoint - write out a message, pinpointing it at the given line */
+
+void line_pinpoint( const char *str, int line )
+       {
+       fprintf( stderr, "%s:%d: %s\n", infilename, line, str );
+       }
+
+
+/* yyerror - eat up an error message from the parser;
+ *          currently, messages are ignore
+ */
+
+void yyerror( const char *msg )
+       {
+               (void)msg;
+       }
diff --git a/tests/scan-code.l b/tests/scan-code.l
new file mode 100644 (file)
index 0000000..c31d066
--- /dev/null
@@ -0,0 +1,1002 @@
+/* Bison Action Scanner                             -*- C -*-
+
+   Copyright (C) 2006-2015, 2018 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   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 3 of the License, 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, see <http://www.gnu.org/licenses/>.  */
+
+%option debug nodefault noinput nounput noyywrap never-interactive
+%option prefix="code_" outfile="lex.yy.c"
+
+%{
+/* Work around a bug in flex 2.5.31.  See Debian bug 333231
+   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
+#undef code_wrap
+#define code_wrap() 1
+
+#define FLEX_PREFIX(Id) code_ ## Id
+#include <src/flex-scanner.h>
+
+#include <src/complain.h>
+#include <src/reader.h>
+#include <src/getargs.h>
+#include <src/muscle-tab.h>
+#include <src/scan-code.h>
+#include <src/symlist.h>
+
+#include <c-ctype.h>
+#include <get-errno.h>
+#include <quote.h>
+
+/* The current calling start condition: SC_RULE_ACTION or
+   SC_SYMBOL_ACTION. */
+# define YY_DECL static char *code_lex (code_props *self, int sc_context)
+YY_DECL;
+
+#define YY_USER_ACTION  location_compute (loc, &loc->end, yytext, yyleng);
+
+static char *fetch_type_name (char *cp, char const **type_name,
+                              location dollar_loc);
+
+static void handle_action_dollar (symbol_list *rule, char *cp,
+                                  location dollar_loc);
+static void handle_action_at (symbol_list *rule, char *cp, location at_loc);
+
+/* A string to be pushed to obstack after dollar/at has been handled. */
+static char *ref_tail_fields;
+
+static location the_location;
+static location *loc = &the_location;
+
+/* A string representing the most recent translation.  */
+static char *last_string;
+
+/* True if an untyped $$ or $n was seen.  */
+static bool untyped_var_seen;
+
+/* Nick */
+char code_piece_temp[100], *code_piece[10000];
+int code_piece0, code_piece1;
+
+void code_piece_append(const char *str);
+void code_piece_escape(const char *p, size_t n);
+void code_piece_flush(size_t n);
+void code_piece_pack();
+
+int no_handle_action;
+
+%}
+ /* C and C++ comments in code. */
+%x SC_COMMENT SC_LINE_COMMENT
+ /* Strings and characters in code. */
+%x SC_STRING SC_CHARACTER
+ /* Whether in a rule or symbol action.  Specifies the translation
+    of $ and @.  */
+%x SC_RULE_ACTION SC_SYMBOL_ACTION
+
+
+/* POSIX says that a tag must be both an id and a C union member, but
+   historically almost any character is allowed in a tag.  We disallow
+   NUL and newline, as this simplifies our implementation.  We allow
+   "->" as a means to dereference a pointer.  */
+tag      ([^\0\n>]|->)+
+
+/* Zero or more instances of backslash-newline.  Following GCC, allow
+   white space between the backslash and the newline.  */
+splice   (\\[ \f\t\v]*\n)*
+
+/* C style identifier. Must start with letter. Will be used for
+   named symbol references. Shall be kept synchronized with
+   scan-gram.l "letter" and "id". */
+letter    [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
+id        {letter}({letter}|[-0-9])*
+ref      -?[0-9]+|{id}|"["{id}"]"|"$"
+
+%%
+
+%{
+  /* This scanner is special: it is invoked only once, henceforth
+     is expected to return only once.  This initialization is
+     therefore done once per action to translate. */
+  aver (sc_context == SC_SYMBOL_ACTION
+        || sc_context == SC_RULE_ACTION
+        || sc_context == INITIAL);
+  BEGIN sc_context;
+%}
+
+  /*------------------------------------------------------------.
+  | Scanning a C comment.  The initial '/ *' is already eaten.  |
+  `------------------------------------------------------------*/
+
+<SC_COMMENT>
+{
+  "*"{splice}"/"  STRING_GROW; BEGIN sc_context;
+}
+
+
+  /*--------------------------------------------------------------.
+  | Scanning a line comment.  The initial '//' is already eaten.  |
+  `--------------------------------------------------------------*/
+
+<SC_LINE_COMMENT>
+{
+  "\n"           STRING_GROW; BEGIN sc_context;
+  {splice}       STRING_GROW;
+}
+
+
+  /*--------------------------------------------.
+  | Scanning user-code characters and strings.  |
+  `--------------------------------------------*/
+
+<SC_CHARACTER,SC_STRING>
+{
+  {splice}|\\{splice}.  STRING_GROW;
+}
+
+<SC_CHARACTER>
+{
+  "'"           STRING_GROW; BEGIN sc_context;
+}
+
+<SC_STRING>
+{
+  "\""          STRING_GROW; BEGIN sc_context;
+}
+
+
+<SC_RULE_ACTION,SC_SYMBOL_ACTION>
+{
+  "'"              STRING_GROW; BEGIN SC_CHARACTER;
+  "\""             STRING_GROW; BEGIN SC_STRING;
+  "/"{splice}"*"   STRING_GROW; BEGIN SC_COMMENT;
+  "/"{splice}"/"   STRING_GROW; BEGIN SC_LINE_COMMENT;
+
+  [$@]  {
+    complain (loc, Wother, _("stray '%s'"), yytext);
+    obstack_escape (&obstack_for_string, yytext);
+  }
+}
+
+<SC_RULE_ACTION>
+{
+  "$"("<"{tag}">")?{ref}  {
+    ref_tail_fields = NULL;
+    handle_action_dollar (self->rule, yytext, *loc);
+    if (ref_tail_fields)
+      obstack_sgrow (&obstack_for_string, ref_tail_fields);
+  }
+  "@"{ref} {
+    ref_tail_fields = NULL;
+    handle_action_at (self->rule, yytext, *loc);
+    if (ref_tail_fields)
+      obstack_sgrow (&obstack_for_string, ref_tail_fields);
+  }
+}
+
+<SC_SYMBOL_ACTION>
+{
+  "$"("<"{tag}">")?"$" {
+ int i = sprintf(code_piece_temp, "<PYACC_Text_ValueReference tag_name=\"");
+ int j = i + sprintf(code_piece_temp + i, "%s", yytext + 2);
+ while (j > i && code_piece_temp[--j] != '>')
+  ;
+ sprintf(code_piece_temp + j, "\">");
+ code_piece_append(code_piece_temp);
+ i = strlen(yytext);
+ code_piece_escape(yytext, i);
+ code_piece_append("</PYACC_Text_ValueReference>");
+    const char *type_name = NULL;
+    fetch_type_name (yytext + 1, &type_name, *loc)[-1] = 0;
+    obstack_sgrow (&obstack_for_string, "]b4_dollar_dollar(");
+    obstack_quote (&obstack_for_string, type_name);
+    obstack_sgrow (&obstack_for_string, ")[");
+    self->is_value_used = true;
+ yytext += i;
+  }
+  "@$" {
+    obstack_sgrow (&obstack_for_string, "]b4_at_dollar[");
+    muscle_percent_define_ensure("locations", the_location, true);
+ code_piece_append("<PYACC_Text_ValueLocation>");
+ code_piece_flush(strlen(yytext));
+ code_piece_append("</PYACC_Text_ValueLocation>");
+  }
+}
+
+
+<*>
+{
+  /* Escape M4 quoting characters in C code.  */
+  [$@\[\]]    obstack_escape (&obstack_for_string, yytext);
+
+  /* By default, grow the string obstack with the input.  */
+  .|\n        STRING_GROW;
+
+ /* End of processing. */
+  <<EOF>>     STRING_FINISH; /*code_piece_pack(); --code_piece0;*/ return last_string;
+}
+
+%%
+
+static inline bool
+is_dot_or_dash (char ch)
+{
+  return ch == '.' || ch == '-';
+}
+
+static inline bool
+contains_dot_or_dash (const char* p)
+{
+  for (; *p; ++p)
+    if (is_dot_or_dash (*p))
+      return true;
+  return false;
+}
+
+/* Defines a variant of a symbolic name resolution. */
+typedef struct
+{
+  /* Index in symbol list. */
+  unsigned symbol_index;
+
+  /* Matched symbol id and loc. */
+  uniqstr id;
+  location loc;
+
+  /* Hiding named reference. */
+  named_ref* hidden_by;
+
+  /* Error flags. May contain zero (no errors) or
+     a combination of VARIANT_* values. */
+  unsigned err;
+} variant;
+
+/* Set when the variant refers to a symbol hidden
+   by an explicit symbol reference. */
+#define VARIANT_HIDDEN (1 << 0)
+
+/* Set when the variant refers to a symbol containing
+   dots or dashes. Will require explicit bracketing. */
+#define VARIANT_BAD_BRACKETING (1 << 1)
+
+/* Set when the variant refers to a symbol which is
+   not visible from current midrule. */
+#define VARIANT_NOT_VISIBLE_FROM_MIDRULE (1 << 2)
+
+static variant *variant_table = NULL;
+static unsigned variant_table_size = 0;
+static unsigned variant_count = 0;
+
+static variant *
+variant_table_grow (void)
+{
+  ++variant_count;
+  if (variant_count > variant_table_size)
+    {
+      while (variant_count > variant_table_size)
+        variant_table_size = 2 * variant_table_size + 3;
+      variant_table = xnrealloc (variant_table, variant_table_size,
+                                 sizeof *variant_table);
+    }
+  return &variant_table[variant_count - 1];
+}
+
+static void
+variant_table_free (void)
+{
+  free (variant_table);
+  variant_table = NULL;
+  variant_table_size = variant_count = 0;
+}
+
+static char *
+find_prefix_end (const char *prefix, char *begin, char *end)
+{
+  char *ptr = begin;
+
+  for (; *prefix && ptr != end; ++prefix, ++ptr)
+    if (*prefix != *ptr)
+      return 0;
+
+  if (*prefix)
+    return 0;
+
+  return ptr;
+}
+
+static variant *
+variant_add (uniqstr id, location id_loc, unsigned symbol_index,
+             char *cp, char *cp_end, bool explicit_bracketing)
+{
+  char *prefix_end;
+
+  prefix_end = find_prefix_end (id, cp, cp_end);
+  if (prefix_end &&
+      (prefix_end == cp_end ||
+       (!explicit_bracketing && is_dot_or_dash (*prefix_end))))
+    {
+      variant *r = variant_table_grow ();
+      r->symbol_index = symbol_index;
+      r->id = id;
+      r->loc = id_loc;
+      r->hidden_by = NULL;
+      r->err = 0;
+      return r;
+    }
+  else
+    return NULL;
+}
+
+static const char *
+get_at_spec(unsigned symbol_index)
+{
+  static char at_buf[20];
+  if (symbol_index == 0)
+    strcpy (at_buf, "$$");
+  else
+    snprintf (at_buf, sizeof at_buf, "$%u", symbol_index);
+  return at_buf;
+}
+
+static void
+show_sub_message (warnings warning,
+                  const char* cp, bool explicit_bracketing,
+                  int midrule_rhs_index, char dollar_or_at,
+                  unsigned indent, const variant *var)
+{
+  const char *at_spec = get_at_spec (var->symbol_index);
+
+  if (var->err == 0)
+    complain_indent (&var->loc, warning, &indent,
+                     _("refers to: %c%s at %s"), dollar_or_at,
+                     var->id, at_spec);
+  else
+    {
+      static struct obstack msg_buf;
+      const char *tail = explicit_bracketing ? "" : cp + strlen (var->id);
+      const char *id;
+      location id_loc;
+
+      if (var->hidden_by)
+        {
+          id = var->hidden_by->id;
+          id_loc = var->hidden_by->loc;
+        }
+      else
+        {
+          id = var->id;
+          id_loc = var->loc;
+        }
+
+      /* Create the explanation message. */
+      obstack_init (&msg_buf);
+
+      obstack_printf (&msg_buf, _("possibly meant: %c"), dollar_or_at);
+      if (contains_dot_or_dash (id))
+        obstack_printf (&msg_buf, "[%s]", id);
+      else
+        obstack_sgrow (&msg_buf, id);
+      obstack_sgrow (&msg_buf, tail);
+
+      if (var->err & VARIANT_HIDDEN)
+        {
+          obstack_printf (&msg_buf, _(", hiding %c"), dollar_or_at);
+          if (contains_dot_or_dash (var->id))
+            obstack_printf (&msg_buf, "[%s]", var->id);
+          else
+            obstack_sgrow (&msg_buf, var->id);
+          obstack_sgrow (&msg_buf, tail);
+        }
+
+      obstack_printf (&msg_buf, _(" at %s"), at_spec);
+
+      if (var->err & VARIANT_NOT_VISIBLE_FROM_MIDRULE)
+        obstack_printf (&msg_buf,
+                        _(", cannot be accessed from mid-rule action at $%d"),
+                        midrule_rhs_index);
+
+      complain_indent (&id_loc, warning, &indent, "%s",
+                        obstack_finish0 (&msg_buf));
+      obstack_free (&msg_buf, 0);
+    }
+}
+
+static void
+show_sub_messages (warnings warning,
+                   const char* cp, bool explicit_bracketing,
+                   int midrule_rhs_index, char dollar_or_at,
+                   unsigned indent)
+{
+  unsigned i;
+
+  for (i = 0; i < variant_count; ++i)
+    show_sub_message (warning | silent,
+                      cp, explicit_bracketing,
+                      midrule_rhs_index, dollar_or_at,
+                      indent, &variant_table[i]);
+}
+
+/* Returned from "parse_ref" when the reference
+   is inappropriate. */
+#define INVALID_REF (INT_MIN)
+
+/* Returned from "parse_ref" when the reference
+   points to LHS ($$) of the current rule or midrule. */
+#define LHS_REF (INT_MIN + 1)
+
+/* Parse named or positional reference. In case of positional
+   references, can return negative values for $-n "deep" stack
+   accesses. */
+static long int
+parse_ref (char *cp, symbol_list *rule, int rule_length,
+           int midrule_rhs_index, char *text, location text_loc,
+           char dollar_or_at)
+{
+  symbol_list *l;
+  char *cp_end;
+  bool explicit_bracketing;
+  unsigned i;
+  unsigned valid_variants = 0;
+  unsigned valid_variant_index = 0;
+
+  if ('$' == *cp)
+    return LHS_REF;
+
+  if (c_isdigit (*cp) || (*cp == '-' && c_isdigit (* (cp + 1))))
+    {
+      long int num = strtol (cp, &cp, 10);
+      if (1 - INT_MAX + rule_length <= num && num <= rule_length)
+        return num;
+      else
+        {
+          complain (&text_loc, complaint, _("integer out of range: %s"),
+                    quote (text));
+          return INVALID_REF;
+        }
+    }
+
+  if ('[' == *cp)
+    {
+      /* Ignore the brackets. */
+      char *p;
+      for (p = ++cp; *p != ']'; ++p)
+        continue;
+      cp_end = p;
+
+      explicit_bracketing = true;
+    }
+  else
+    {
+      /* Take all characters of the name. */
+      char* p;
+      for (p = cp; *p; ++p)
+        if (is_dot_or_dash (*p))
+          {
+            ref_tail_fields = p;
+            break;
+          }
+      for (p = cp; *p; ++p)
+        continue;
+      cp_end = p;
+
+      explicit_bracketing = false;
+    }
+
+  /* Add all relevant variants. */
+  {
+    unsigned symbol_index;
+    variant_count = 0;
+    for (symbol_index = 0, l = rule; !symbol_list_null (l);
+         ++symbol_index, l = l->next)
+      {
+        variant *var;
+        if (l->content_type != SYMLIST_SYMBOL)
+          continue;
+
+        var = variant_add (l->content.sym->tag, l->sym_loc,
+                           symbol_index, cp, cp_end, explicit_bracketing);
+        if (var && l->named_ref)
+          var->hidden_by = l->named_ref;
+
+        if (l->named_ref)
+          variant_add (l->named_ref->id, l->named_ref->loc,
+                       symbol_index, cp, cp_end, explicit_bracketing);
+      }
+  }
+
+  /* Check errors. */
+  for (i = 0; i < variant_count; ++i)
+    {
+      variant *var = &variant_table[i];
+      unsigned symbol_index = var->symbol_index;
+
+      /* Check visibility from mid-rule actions. */
+      if (midrule_rhs_index != 0
+          && (symbol_index == 0 || midrule_rhs_index < symbol_index))
+        var->err |= VARIANT_NOT_VISIBLE_FROM_MIDRULE;
+
+      /* Check correct bracketing. */
+      if (!explicit_bracketing && contains_dot_or_dash (var->id))
+        var->err |= VARIANT_BAD_BRACKETING;
+
+      /* Check using of hidden symbols. */
+      if (var->hidden_by)
+        var->err |= VARIANT_HIDDEN;
+
+      if (!var->err)
+        {
+          valid_variant_index = i;
+          ++valid_variants;
+        }
+    }
+
+  switch (valid_variants)
+    {
+    case 0:
+      {
+        unsigned len = (explicit_bracketing || !ref_tail_fields) ?
+          cp_end - cp : ref_tail_fields - cp;
+        unsigned indent = 0;
+
+        complain_indent (&text_loc, complaint, &indent,
+                         _("invalid reference: %s"), quote (text));
+        indent += SUB_INDENT;
+        if (len == 0)
+          {
+            location sym_loc = text_loc;
+            sym_loc.start.column += 1;
+            sym_loc.end = sym_loc.start;
+            complain_indent (&sym_loc, complaint, &indent,
+                             _("syntax error after '%c', expecting integer, "
+                               "letter, '_', '[', or '$'"),
+                             dollar_or_at);
+          }
+        else if (midrule_rhs_index)
+          complain_indent (&rule->location, complaint, &indent,
+                           _("symbol not found in production before $%d: "
+                             "%.*s"),
+                           midrule_rhs_index, len, cp);
+        else
+          complain_indent (&rule->location, complaint, &indent,
+                           _("symbol not found in production: %.*s"),
+                           len, cp);
+
+        if (variant_count > 0)
+          show_sub_messages (complaint,
+                             cp, explicit_bracketing, midrule_rhs_index,
+                             dollar_or_at, indent);
+        return INVALID_REF;
+      }
+    case 1:
+      {
+        unsigned indent = 0;
+        if (variant_count > 1)
+          {
+            complain_indent (&text_loc, Wother, &indent,
+                             _("misleading reference: %s"), quote (text));
+            show_sub_messages (Wother,
+                               cp, explicit_bracketing, midrule_rhs_index,
+                               dollar_or_at, indent + SUB_INDENT);
+          }
+        {
+          unsigned symbol_index =
+            variant_table[valid_variant_index].symbol_index;
+          return (symbol_index == midrule_rhs_index) ? LHS_REF : symbol_index;
+        }
+      }
+    case 2:
+    default:
+      {
+        unsigned indent = 0;
+        complain_indent (&text_loc, complaint, &indent,
+                         _("ambiguous reference: %s"), quote (text));
+        show_sub_messages (complaint,
+                           cp, explicit_bracketing, midrule_rhs_index,
+                           dollar_or_at, indent + SUB_INDENT);
+        return INVALID_REF;
+      }
+    }
+}
+
+/* Keeps track of the maximum number of semantic values to the left of
+   a handle (those referenced by $0, $-1, etc.) are required by the
+   semantic actions of this grammar. */
+int max_left_semantic_context = 0;
+
+
+/* If CP points to a typename (i.e., <.*?>), set TYPE_NAME to its
+   beginning (i.e., after the opening "<", and return the pointer
+   immediately after it.  */
+
+static
+char *
+fetch_type_name (char *cp, char const **type_name,
+                 location dollar_loc)
+{
+  if (*cp == '<')
+    {
+      *type_name = ++cp;
+      /* Series of non-'>' or "->".  */
+      while (*cp != '>' || cp[-1] == '-')
+        ++cp;
+
+      /* The '>' symbol will be later replaced by '\0'. Original
+         'text' is needed for error messages. */
+      ++cp;
+      if (untyped_var_seen)
+        complain (&dollar_loc, complaint,
+                  _("explicit type given in untyped grammar"));
+      tag_seen = true;
+    }
+  return cp;
+}
+
+/*------------------------------------------------------------------.
+| TEXT is pointing to a wannabee semantic value (i.e., a '$').      |
+|                                                                   |
+| Possible inputs: $[<TYPENAME>]($|integer)                         |
+|                                                                   |
+| Output to OBSTACK_FOR_STRING a reference to this semantic value.  |
+`------------------------------------------------------------------*/
+
+static void
+handle_action_dollar (symbol_list *rule, char *text, location dollar_loc)
+{
+  char const *type_name = NULL;
+  char *cp = text + 1;
+  symbol_list *effective_rule;
+  int effective_rule_length;
+  int n;
+
+  if (rule->midrule_parent_rule)
+    {
+      effective_rule = rule->midrule_parent_rule;
+      effective_rule_length = rule->midrule_parent_rhs_index - 1;
+    }
+  else
+    {
+      effective_rule = rule;
+      effective_rule_length = symbol_list_length (rule->next);
+    }
+
+  /* Get the type name if explicit. */
+  cp = fetch_type_name (cp, &type_name, dollar_loc);
+
+  n = parse_ref (cp, effective_rule, effective_rule_length,
+                 rule->midrule_parent_rhs_index, text, dollar_loc, '$');
+#if 1
+ if (n == LHS_REF) {
+  int i = sprintf(code_piece_temp, "<PYACC_Text_ValueReference tag_name=\"");
+  int j = i + sprintf(code_piece_temp + i, "%s", yytext + 2);
+  while (j > i && code_piece_temp[--j] != '>')
+   ;
+  sprintf(code_piece_temp + j, "\">");
+  code_piece_append(code_piece_temp);
+  code_piece_flush(strlen(yytext));
+  code_piece_append("</PYACC_Text_ValueReference>");
+ }
+ else {
+  int i = sprintf(code_piece_temp, "<PYACC_Text_StackReference tag_name=\"");
+  int j = i + sprintf(code_piece_temp + i, "%s", yytext + 2);
+  while (j > i && code_piece_temp[--j] != '>')
+   ;
+  sprintf(code_piece_temp + j, "\" index=\"%d\">", n);
+  code_piece_append(code_piece_temp);
+  code_piece_flush(strlen(yytext));
+  code_piece_append("</PYACC_Text_StackReference>");
+ }
+ if (no_handle_action)
+  return;
+#endif
+
+  /* End type_name. */
+  if (type_name)
+    cp[-1] = '\0';
+
+  switch (n)
+    {
+    case INVALID_REF:
+      break;
+
+    case LHS_REF:
+      if (!type_name)
+        type_name = symbol_list_n_type_name_get (rule, 0);
+
+      if (!type_name)
+        {
+          if (union_seen | tag_seen)
+            {
+              if (rule->midrule_parent_rule)
+                complain (&dollar_loc, complaint,
+                             _("$$ for the midrule at $%d of %s"
+                               " has no declared type"),
+                             rule->midrule_parent_rhs_index,
+                             quote (effective_rule->content.sym->tag));
+              else
+                complain (&dollar_loc, complaint,
+                          _("$$ of %s has no declared type"),
+                          quote (rule->content.sym->tag));
+            }
+          else
+            untyped_var_seen = true;
+        }
+
+      obstack_sgrow (&obstack_for_string, "]b4_lhs_value(");
+      obstack_quote (&obstack_for_string, type_name);
+      obstack_sgrow (&obstack_for_string, ")[");
+      rule->action_props.is_value_used = true;
+      break;
+
+    default:
+      if (max_left_semantic_context < 1 - n)
+        max_left_semantic_context = 1 - n;
+      if (!type_name && 0 < n)
+        type_name = symbol_list_n_type_name_get (effective_rule, n);
+      if (!type_name)
+        {
+          if (union_seen | tag_seen)
+            complain (&dollar_loc, complaint,
+                      _("$%s of %s has no declared type"), cp,
+                      quote (effective_rule->content.sym->tag));
+          else
+            untyped_var_seen = true;
+        }
+
+      obstack_printf (&obstack_for_string,
+                      "]b4_rhs_value(%d, %d, ", effective_rule_length, n);
+      obstack_quote (&obstack_for_string, type_name);
+      obstack_sgrow (&obstack_for_string, ")[");
+      if (0 < n)
+        symbol_list_n_get (effective_rule, n)->action_props.is_value_used =
+          true;
+      break;
+    }
+}
+
+
+/*------------------------------------------------------.
+| TEXT is a location token (i.e., a '@...').  Output to |
+| OBSTACK_FOR_STRING a reference to this location.      |
+`------------------------------------------------------*/
+
+static void
+handle_action_at (symbol_list *rule, char *text, location at_loc)
+{
+  char *cp = text + 1;
+  symbol_list *effective_rule;
+  int effective_rule_length;
+  int n;
+
+  if (rule->midrule_parent_rule)
+    {
+      effective_rule = rule->midrule_parent_rule;
+      effective_rule_length = rule->midrule_parent_rhs_index - 1;
+    }
+  else
+    {
+      effective_rule = rule;
+      effective_rule_length = symbol_list_length (rule->next);
+    }
+
+  muscle_percent_define_ensure("locations", at_loc, true);
+
+  n = parse_ref (cp, effective_rule, effective_rule_length,
+                       rule->midrule_parent_rhs_index, text, at_loc, '@');
+#if 1
+ if (n == LHS_REF) {
+  code_piece_append("<PYACC_Text_ValueLocation>");
+  code_piece_flush(strlen(yytext));
+  code_piece_append("</PYACC_Text_ValueLocation>");
+ }
+ else {
+  sprintf(code_piece_temp, "<PYACC_Text_StackLocation index=\"%d\">", n);
+  code_piece_append(code_piece_temp);
+  code_piece_flush(strlen(yytext));
+  code_piece_append("</PYACC_Text_StackLocation>");
+ }
+ if (no_handle_action)
+  return;
+#endif
+  switch (n)
+    {
+    case INVALID_REF:
+      break;
+
+    case LHS_REF:
+      obstack_sgrow (&obstack_for_string, "]b4_lhs_location[");
+      break;
+
+    default:
+      obstack_printf (&obstack_for_string, "]b4_rhs_location(%d, %d)[",
+                      effective_rule_length, n);
+      break;
+    }
+}
+
+
+/*-------------------------.
+| Initialize the scanner.  |
+`-------------------------*/
+
+/* Translate the dollars and ats in \a self, in the context \a sc_context
+   (SC_RULE_ACTION, SC_SYMBOL_ACTION, INITIAL).  */
+
+static char const *
+translate_action (code_props *self, int sc_context)
+{
+  char *res;
+  static bool initialized = false;
+  if (!initialized)
+    {
+      obstack_init (&obstack_for_string);
+      yy_flex_debug = 0;
+      initialized = true;
+    }
+
+  loc->start = loc->end = self->location.start;
+  yy_switch_to_buffer (yy_scan_string (self->code));
+  res = code_lex (self, sc_context);
+  yy_delete_buffer (YY_CURRENT_BUFFER);
+
+  return res;
+}
+
+/*------------------------------------------------------------------------.
+| Implementation of the public interface as documented in "scan-code.h".  |
+`------------------------------------------------------------------------*/
+
+void
+code_props_none_init (code_props *self)
+{
+  *self = code_props_none;
+}
+
+code_props code_props_none = CODE_PROPS_NONE_INIT;
+
+void
+code_props_plain_init (code_props *self, char const *code,
+                       location code_loc)
+{
+  code_props_none_init (self);
+  self->kind = CODE_PROPS_PLAIN;
+  self->code = code;
+  self->location = code_loc;
+}
+
+void
+code_props_symbol_action_init (code_props *self, char const *code,
+                               location code_loc)
+{
+  code_props_none_init (self);
+  self->kind = CODE_PROPS_SYMBOL_ACTION;
+  self->code = code;
+  self->location = code_loc;
+}
+
+void
+code_props_rule_action_init (code_props *self, char const *code,
+                             location code_loc, symbol_list *rule,
+                             named_ref *name, bool is_predicate)
+{
+  code_props_none_init (self);
+  self->kind = CODE_PROPS_RULE_ACTION;
+  self->code = code;
+  self->location = code_loc;
+  self->rule = rule;
+  self->named_ref = name;
+  self->is_predicate = is_predicate;
+}
+
+void
+code_props_translate_code (code_props *self)
+{
+  switch (self->kind)
+    {
+      case CODE_PROPS_NONE:
+        break;
+      case CODE_PROPS_PLAIN:
+        self->code = translate_action (self, INITIAL);
+        break;
+      case CODE_PROPS_SYMBOL_ACTION:
+        self->code = translate_action (self, SC_SYMBOL_ACTION);
+        break;
+      case CODE_PROPS_RULE_ACTION:
+        self->code = translate_action (self, SC_RULE_ACTION);
+        break;
+    }
+}
+
+void
+code_scanner_last_string_free (void)
+{
+  STRING_FREE;
+}
+
+void
+code_scanner_free (void)
+{
+  obstack_free (&obstack_for_string, 0);
+  variant_table_free ();
+
+  /* Reclaim Flex's buffers.  */
+  yylex_destroy ();
+}
+
+/* Nick */
+void code_piece_append(const char *str) {
+ code_piece[code_piece1++] = strdup(str);
+}
+
+void code_piece_escape(const char *p, size_t n) {
+ size_t i, j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+  case '>':
+   j += 4;
+   break;
+  case '&':
+   j += 5;
+   break;
+  default:
+   ++j;
+   break;
+  }
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+   memcpy(q + j, "&lt;", 4);
+   j += 4;
+   break;
+  case '>':
+   memcpy(q + j, "&gt;", 4);
+   j += 4;
+   break;
+  case '&':
+   memcpy(q + j, "&amp;", 5);
+   j += 5;
+   break;
+  default:
+   q[j++] = p[i];
+   break;
+  }
+ q[j] = 0;
+ code_piece[code_piece1++] = q;
+}
+
+void code_piece_flush(size_t n) {
+ code_piece_escape(yytext, n);
+ yytext += n;
+}
+
+void code_piece_pack() {
+ int i;
+ size_t j = 0;
+ for (i = code_piece0; i < code_piece1; ++i)
+  j += strlen(code_piece[i]);
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = code_piece0; i < code_piece1; ++i) {
+  int k = strlen(code_piece[i]);
+  memcpy(q + j, code_piece[i], k);
+  free(code_piece[i]);
+  j += k;
+ }
+ q[j] = 0;
+ code_piece[code_piece0++] = q;
+ code_piece1 = code_piece0;
+}
diff --git a/tests/scan-gram.l b/tests/scan-gram.l
new file mode 100644 (file)
index 0000000..9c9ef0a
--- /dev/null
@@ -0,0 +1,1246 @@
+/* Bison Grammar Scanner                             -*- C -*-
+
+   Copyright (C) 2002-2015, 2018 Free Software Foundation, Inc.
+
+   This file is part of Bison, the GNU Compiler Compiler.
+
+   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 3 of the License, 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, see <http://www.gnu.org/licenses/>.  */
+
+%option debug nodefault noinput noyywrap never-interactive
+%option prefix="gram_" outfile="lex.yy.c"
+
+%{
+/* Work around a bug in flex 2.5.31.  See Debian bug 333231
+   <http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>.  */
+#undef gram_wrap
+#define gram_wrap() 1
+
+#define FLEX_PREFIX(Id) gram_ ## Id
+#include <src/flex-scanner.h>
+
+#include <src/complain.h>
+#include <src/files.h>
+#include <src/getargs.h>
+#include <src/gram.h>
+#include <quotearg.h>
+#include <src/reader.h>
+#include <src/uniqstr.h>
+
+#include <c-ctype.h>
+#include <mbswidth.h>
+#include <quote.h>
+
+#include <src/scan-gram.h>
+
+#if 1
+#define YY_DECL static int real_gram_lex (GRAM_STYPE *val, location *loc)
+#else
+#define YY_DECL GRAM_LEX_DECL
+#endif
+
+/* Location of scanner cursor.  */
+static boundary scanner_cursor;
+
+#define YY_USER_ACTION  location_compute (loc, &scanner_cursor, yytext, yyleng);
+
+static size_t no_cr_read (FILE *, char *, size_t);
+#define YY_INPUT(buf, result, size) ((result) = no_cr_read (yyin, buf, size))
+
+#define RETURN_PERCENT_PARAM(Value)                     \
+  RETURN_VALUE(PERCENT_PARAM, param, param_ ## Value)
+
+#define RETURN_PERCENT_FLAG(Value)                              \
+  RETURN_VALUE(PERCENT_FLAG, uniqstr, uniqstr_new (Value))
+
+#define RETURN_VALUE(Token, Field, Value)       \
+  do {                                          \
+    val->Field = Value;                         \
+    return Token;                               \
+  } while (0)
+
+#define ROLLBACK_CURRENT_TOKEN                                  \
+  do {                                                          \
+    scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0);     \
+    yyless (0);                                                 \
+  } while (0)
+
+#define DEPRECATED(Msg)                                         \
+  do {                                                          \
+    size_t i;                                                   \
+    deprecated_directive (loc, yytext, Msg);                    \
+    scanner_cursor.column -= mbsnwidth (Msg, strlen (Msg), 0);  \
+    for (i = strlen (Msg); i != 0; --i)                         \
+      unput (Msg[i - 1]);                                       \
+  } while (0)
+
+/* A string representing the most recently saved token.  */
+static char *last_string;
+
+/* Bracketed identifier. */
+static uniqstr bracketed_id_str = 0;
+static location bracketed_id_loc;
+static boundary bracketed_id_start;
+static int bracketed_id_context_state = 0;
+
+void
+gram_scanner_last_string_free (void)
+{
+  STRING_FREE;
+}
+
+static void handle_syncline (char *, location);
+static unsigned long int scan_integer (char const *p, int base, location loc);
+static int convert_ucn_to_byte (char const *hex_text);
+static void unexpected_eof (boundary, char const *);
+static void unexpected_newline (boundary, char const *);
+
+/* Nick */
+char gram_piece_temp[100], *gram_piece[10000];
+int gram_piece0, gram_piece1;
+
+void gram_piece_append(const char *str);
+void gram_piece_insert(int n, const char *str);
+void gram_piece_escape(const char *p, size_t n);
+void gram_piece_flush(size_t n);
+void gram_piece_pack();
+
+%}
+ /* A C-like comment in directives/rules. */
+%x SC_YACC_COMMENT
+ /* Strings and characters in directives/rules. */
+%x SC_ESCAPED_STRING SC_ESCAPED_CHARACTER
+ /* A identifier was just read in directives/rules.  Special state
+    to capture the sequence 'identifier :'. */
+%x SC_AFTER_IDENTIFIER
+
+ /* POSIX says that a tag must be both an id and a C union member, but
+    historically almost any character is allowed in a tag.  We
+    disallow NUL, as this simplifies our implementation.  We match
+    angle brackets in nested pairs: several languages use them for
+    generics/template types.  */
+%x SC_TAG
+
+ /* Four types of user code:
+    - prologue (code between '%{' '%}' in the first section, before %%);
+    - actions, printers, union, etc, (between braced in the middle section);
+    - epilogue (everything after the second %%).
+    - predicate (code between '%?{' and '{' in middle section); */
+%x SC_PROLOGUE SC_BRACED_CODE SC_EPILOGUE SC_PREDICATE
+ /* C and C++ comments in code. */
+%x SC_COMMENT SC_LINE_COMMENT
+ /* Strings and characters in code. */
+%x SC_STRING SC_CHARACTER
+ /* Bracketed identifiers support. */
+%x SC_BRACKETED_ID SC_RETURN_BRACKETED_ID
+
+letter    [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]
+notletter [^.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_]{-}[%\{]
+id        {letter}({letter}|[-0-9])*
+int       [0-9]+
+
+/* Zero or more instances of backslash-newline.  Following GCC, allow
+   white space between the backslash and the newline.  */
+splice   (\\[ \f\t\v]*\n)*
+
+/* An equal sign, with optional leading whitespaces. This is used in some
+   deprecated constructs. */
+eqopt    ([[:space:]]*=)?
+
+%%
+%{
+  /* Nesting level.  Either for nested braces, or nested angle brackets
+     (but not mixed).  */
+  int nesting PACIFY_CC (= 0);
+
+  /* Parent context state, when applicable.  */
+  int context_state PACIFY_CC (= 0);
+
+  /* Location of most recent identifier, when applicable.  */
+  location id_loc PACIFY_CC (= empty_location);
+
+  /* Where containing code started, when applicable.  Its initial
+     value is relevant only when yylex is invoked in the SC_EPILOGUE
+     start condition.  */
+  boundary code_start = scanner_cursor;
+
+  /* Where containing comment or string or character literal started,
+     when applicable.  */
+  boundary token_start PACIFY_CC (= scanner_cursor);
+
+  /* We cannot trust YY_USER_INIT, whose semantics changes over time
+     (it moved in Flex 2.5.38).  */
+  static bool first = true;
+  if (first)
+    {
+      scanner_cursor = loc->start;
+      first = false;
+    }
+%}
+
+
+  /*-----------------------.
+  | Scanning white space.  |
+  `-----------------------*/
+
+<INITIAL,SC_AFTER_IDENTIFIER,SC_BRACKETED_ID,SC_RETURN_BRACKETED_ID>
+{
+  /* Comments and white space.  */
+  "," {
+     complain (loc, Wother, _("stray ',' treated as white space"));
+  }
+  [ \f\n\t\v]  |
+  "//".*       continue;
+  "/*" {
+    token_start = loc->start;
+    context_state = YY_START;
+    BEGIN SC_YACC_COMMENT;
+  }
+
+  /* #line directives are not documented, and may be withdrawn or
+     modified in future versions of Bison.  */
+  ^"#line "{int}(" \"".*"\"")?"\n" {
+    handle_syncline (yytext + sizeof "#line " - 1, *loc);
+  }
+}
+
+
+  /*----------------------------.
+  | Scanning Bison directives.  |
+  `----------------------------*/
+
+  /* For directives that are also command line options, the regex must be
+        "%..."
+     after "[-_]"s are removed, and the directive must match the --long
+     option name, with a single string argument.  Otherwise, add exceptions
+     to ../build-aux/cross-options.pl.  */
+
+<INITIAL>
+{
+  "%binary"                         return PERCENT_NONASSOC;
+  "%code"                           return PERCENT_CODE;
+  "%debug"                          RETURN_PERCENT_FLAG("parse.trace");
+  "%default-prec"                   return PERCENT_DEFAULT_PREC;
+  "%define"                         return PERCENT_DEFINE;
+  "%defines"                        return PERCENT_DEFINES;
+  "%destructor"                     return PERCENT_DESTRUCTOR;
+  "%dprec"                          return PERCENT_DPREC;
+  "%empty"                          return PERCENT_EMPTY;
+  "%error-verbose"                  return PERCENT_ERROR_VERBOSE;
+  "%expect"                         return PERCENT_EXPECT;
+  "%expect-rr"                      return PERCENT_EXPECT_RR;
+  "%file-prefix"                    return PERCENT_FILE_PREFIX;
+  "%fixed-output-files"             return PERCENT_YACC;
+  "%initial-action"                 return PERCENT_INITIAL_ACTION;
+  "%glr-parser"                     return PERCENT_GLR_PARSER;
+  "%language"                       return PERCENT_LANGUAGE;
+  "%left"                           return PERCENT_LEFT;
+  "%lex-param"                      RETURN_PERCENT_PARAM(lex);
+  "%locations"                      RETURN_PERCENT_FLAG("locations");
+  "%merge"                          return PERCENT_MERGE;
+  "%name-prefix"                    return PERCENT_NAME_PREFIX;
+  "%no-default-prec"                return PERCENT_NO_DEFAULT_PREC;
+  "%no-lines"                       return PERCENT_NO_LINES;
+  "%nonassoc"                       return PERCENT_NONASSOC;
+  "%nondeterministic-parser"        return PERCENT_NONDETERMINISTIC_PARSER;
+  "%nterm"                          return PERCENT_NTERM;
+  "%output"                         return PERCENT_OUTPUT;
+  "%param"                          RETURN_PERCENT_PARAM(both);
+  "%parse-param"                    RETURN_PERCENT_PARAM(parse);
+  "%prec"                           return PERCENT_PREC;
+  "%precedence"                     return PERCENT_PRECEDENCE;
+  "%printer"                        return PERCENT_PRINTER;
+  "%pure-parser"                    RETURN_PERCENT_FLAG("api.pure");
+  "%require"                        return PERCENT_REQUIRE;
+  "%right"                          return PERCENT_RIGHT;
+  "%skeleton"                       return PERCENT_SKELETON;
+  "%start"                          return PERCENT_START;
+  "%term"                           return PERCENT_TOKEN;
+  "%token"                          return PERCENT_TOKEN;
+  "%token-table"                    return PERCENT_TOKEN_TABLE;
+  "%type"                           return PERCENT_TYPE;
+  "%union"                          return PERCENT_UNION;
+  "%verbose"                        return PERCENT_VERBOSE;
+  "%yacc"                           return PERCENT_YACC;
+
+  /* deprecated */
+  "%default"[-_]"prec"              DEPRECATED("%default-prec");
+  "%error"[-_]"verbose"             DEPRECATED("%define parse.error verbose");
+  "%expect"[-_]"rr"                 DEPRECATED("%expect-rr");
+  "%file-prefix"{eqopt}             DEPRECATED("%file-prefix");
+  "%fixed"[-_]"output"[-_]"files"   DEPRECATED("%fixed-output-files");
+  "%name"[-_]"prefix"{eqopt}        DEPRECATED("%name-prefix");
+  "%no"[-_]"default"[-_]"prec"      DEPRECATED("%no-default-prec");
+  "%no"[-_]"lines"                  DEPRECATED("%no-lines");
+  "%output"{eqopt}                  DEPRECATED("%output");
+  "%pure"[-_]"parser"               DEPRECATED("%pure-parser");
+  "%token"[-_]"table"               DEPRECATED("%token-table");
+
+  "%"{id} {
+    complain (loc, complaint, _("invalid directive: %s"), quote (yytext));
+  }
+
+  "="                     return EQUAL;
+  "|"                     return PIPE;
+  ";"                     return SEMICOLON;
+
+  {id} {
+    val->uniqstr = uniqstr_new (yytext);
+    id_loc = *loc;
+    bracketed_id_str = NULL;
+    BEGIN SC_AFTER_IDENTIFIER;
+ gram_piece_pack();
+ gram_piece_append("<PYACC_ID>");
+ gram_piece_flush(strlen(yytext));
+ gram_piece_append("</PYACC_ID>");
+ gram_piece_pack();
+  }
+
+  {int} {
+    val->integer = scan_integer (yytext, 10, *loc);
+#if 0
+ gram_piece_pack();
+ sprintf(gram_piece_temp, "<PYACC_Int value=\"%d\">", val->integer);
+ gram_piece_append(gram_piece_temp);
+ gram_piece_escape(yytext, strlen(yytext));
+ gram_piece_append("</PYACC_Int>");
+ gram_piece_pack();
+ return ~INT;
+#else
+    return INT;
+#endif
+  }
+  0[xX][0-9abcdefABCDEF]+ {
+    val->integer = scan_integer (yytext, 16, *loc);
+#if 0
+ gram_piece_pack();
+ sprintf(gram_piece_temp, "<PYACC_Int value=\"%d\">", val->integer);
+ gram_piece_append(gram_piece_temp);
+ gram_piece_escape(yytext, strlen(yytext));
+ gram_piece_append("</PYACC_Int>");
+ gram_piece_pack();
+ return ~INT;
+#else
+    return INT;
+#endif
+  }
+
+  /* Identifiers may not start with a digit.  Yet, don't silently
+     accept "1FOO" as "1 FOO".  */
+  {int}{id} {
+    complain (loc, complaint, _("invalid identifier: %s"), quote (yytext));
+  }
+
+  /* Characters.  */
+  "'"         token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; gram_piece_pack(); gram_piece_append("<PYACC_Char>"); gram_piece_flush(strlen(yytext)); gram_piece_append("<PYACC_Text>");
+
+  /* Strings. */
+  "\""        token_start = loc->start; BEGIN SC_ESCAPED_STRING; gram_piece_pack(); gram_piece_append("<PYACC_String>"); gram_piece_flush(strlen(yytext)); gram_piece_append("<PYACC_Text>");
+
+  /* Prologue. */
+  "%{"        code_start = loc->start; BEGIN SC_PROLOGUE; gram_piece_pack(); gram_piece_append("<PYACC_Section1_Prologue>"); gram_piece_flush(strlen(yytext)); gram_piece_append("<PYACC_Text>");
+
+  /* Code in between braces.  */
+  "{" {
+    STRING_GROW;
+    nesting = 0;
+    code_start = loc->start;
+    BEGIN SC_BRACED_CODE;
+ gram_piece_pack();
+ gram_piece_append("<PYACC_BracedCode>");
+ gram_piece_flush(strlen(yytext));
+ gram_piece_append("<PYACC_Text>");
+  }
+
+  /* Semantic predicate. */
+  "%?"[ \f\n\t\v]*"{" {
+    nesting = 0;
+    code_start = loc->start;
+ gram_piece_pack();
+ gram_piece_append("<PYACC_BracedPredicate>");
+ gram_piece_flush(strlen(yytext));
+ gram_piece_append("<PYACC_Text>");
+    BEGIN SC_PREDICATE;
+  }
+
+  /* A type. */
+  "<*>"       gram_piece_pack(); gram_piece_append("<PYACC_TagRef>&lt;<PYACC_Text>*</PYACC_Text>&gt;</PYACC_TagRef>"); return ~TAG_ANY; /*return TAG_ANY;*/
+  "<>"        gram_piece_pack(); gram_piece_append("<PYACC_TagRef>&lt;<PYACC_Text />&gt;</PYACC_TagRef>"); return ~TAG_NONE; /*return TAG_NONE;*/
+  "<"         {
+    nesting = 0;
+    token_start = loc->start;
+    BEGIN SC_TAG;
+ gram_piece_pack();
+ gram_piece_append("<PYACC_TagRef>");
+ gram_piece_flush(strlen(yytext));
+ gram_piece_append("<PYACC_Text>");
+  }
+
+  "%%" {
+    static int percent_percent_count;
+    if (++percent_percent_count == 2)
+ {
+      BEGIN SC_EPILOGUE;
+  gram_piece_pack();
+  gram_piece_escape(yytext, strlen(yytext));
+  gram_piece_pack();
+  gram_piece_pack();
+  return ~PERCENT_PERCENT;
+ }
+    return PERCENT_PERCENT;
+  }
+
+  "[" {
+    bracketed_id_str = NULL;
+    bracketed_id_start = loc->start;
+    bracketed_id_context_state = YY_START;
+    BEGIN SC_BRACKETED_ID;
+  }
+
+  [^\[%A-Za-z0-9_<>{}\"\'*;|=/, \f\n\t\v]+|. {
+    complain (loc, complaint, "%s: %s",
+              ngettext ("invalid character", "invalid characters", yyleng),
+              quote_mem (yytext, yyleng));
+  }
+
+  <<EOF>> {
+    loc->start = loc->end = scanner_cursor;
+    yyterminate ();
+  }
+}
+
+
+  /*--------------------------------------------------------------.
+  | Supporting \0 complexifies our implementation for no expected |
+  | added value.                                                  |
+  `--------------------------------------------------------------*/
+
+<SC_ESCAPED_CHARACTER,SC_ESCAPED_STRING,SC_TAG>
+{
+  \0        complain (loc, complaint, _("invalid null character"));
+}
+
+
+  /*-----------------------------------------------------------------.
+  | Scanning after an identifier, checking whether a colon is next.  |
+  `-----------------------------------------------------------------*/
+
+<SC_AFTER_IDENTIFIER>
+{
+  "[" {
+    if (bracketed_id_str)
+      {
+        ROLLBACK_CURRENT_TOKEN;
+        BEGIN SC_RETURN_BRACKETED_ID;
+        *loc = id_loc;
+        return ID;
+      }
+    else
+      {
+        bracketed_id_start = loc->start;
+        bracketed_id_context_state = YY_START;
+        BEGIN SC_BRACKETED_ID;
+      }
+  }
+  ":" {
+    BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL);
+    *loc = id_loc;
+#if 1
+ gram_piece_escape(yytext, strlen(yytext));
+ return ~ID_COLON;
+#else
+    return ID_COLON;
+#endif
+  }
+  . {
+    ROLLBACK_CURRENT_TOKEN;
+    BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL);
+    *loc = id_loc;
+#if 1
+ return ~ID;
+#else
+    return ID;
+#endif
+  }
+  <<EOF>> {
+    BEGIN (bracketed_id_str ? SC_RETURN_BRACKETED_ID : INITIAL);
+    *loc = id_loc;
+#if 1
+ return ~ID;
+#else
+    return ID;
+#endif
+  }
+}
+
+  /*--------------------------------.
+  | Scanning bracketed identifiers. |
+  `--------------------------------*/
+
+<SC_BRACKETED_ID>
+{
+  {id} {
+    if (bracketed_id_str)
+      {
+        complain (loc, complaint,
+                  _("unexpected identifier in bracketed name: %s"),
+                  quote (yytext));
+      }
+    else
+      {
+        bracketed_id_str = uniqstr_new (yytext);
+        bracketed_id_loc = *loc;
+      }
+  }
+  "]" {
+    BEGIN bracketed_id_context_state;
+    if (bracketed_id_str)
+      {
+        if (INITIAL == bracketed_id_context_state)
+          {
+            val->uniqstr = bracketed_id_str;
+            bracketed_id_str = 0;
+            *loc = bracketed_id_loc;
+            return BRACKETED_ID;
+          }
+      }
+    else
+      complain (loc, complaint, _("an identifier expected"));
+  }
+
+  [^\].A-Za-z0-9_/ \f\n\t\v]+|. {
+    complain (loc, complaint, "%s: %s",
+              ngettext ("invalid character in bracketed name",
+                        "invalid characters in bracketed name", yyleng),
+              quote_mem (yytext, yyleng));
+  }
+
+  <<EOF>> {
+    BEGIN bracketed_id_context_state;
+    unexpected_eof (bracketed_id_start, "]");
+  }
+}
+
+<SC_RETURN_BRACKETED_ID>
+{
+  . {
+    ROLLBACK_CURRENT_TOKEN;
+    val->uniqstr = bracketed_id_str;
+    bracketed_id_str = 0;
+    *loc = bracketed_id_loc;
+    BEGIN INITIAL;
+    return BRACKETED_ID;
+  }
+}
+
+
+  /*---------------------------------------------------------------.
+  | Scanning a Yacc comment.  The initial '/ *' is already eaten.  |
+  `---------------------------------------------------------------*/
+
+<SC_YACC_COMMENT>
+{
+  "*/"     BEGIN context_state;
+  .|\n     continue;
+  <<EOF>>  unexpected_eof (token_start, "*/"); BEGIN context_state;
+}
+
+
+  /*------------------------------------------------------------.
+  | Scanning a C comment.  The initial '/ *' is already eaten.  |
+  `------------------------------------------------------------*/
+
+<SC_COMMENT>
+{
+  "*"{splice}"/"  STRING_GROW; BEGIN context_state;
+  <<EOF>>         unexpected_eof (token_start, "*/"); BEGIN context_state;
+}
+
+
+  /*--------------------------------------------------------------.
+  | Scanning a line comment.  The initial '//' is already eaten.  |
+  `--------------------------------------------------------------*/
+
+<SC_LINE_COMMENT>
+{
+  "\n"           STRING_GROW; BEGIN context_state;
+  {splice}       STRING_GROW;
+  <<EOF>>        BEGIN context_state;
+}
+
+
+  /*------------------------------------------------.
+  | Scanning a Bison string, including its escapes. |
+  | The initial quote is already eaten.             |
+  `------------------------------------------------*/
+
+<SC_ESCAPED_STRING>
+{
+  "\"" {
+    STRING_FINISH;
+    loc->start = token_start;
+    val->code = last_string;
+    BEGIN INITIAL;
+#if 1
+ gram_piece_append("</PYACC_Text>");
+ gram_piece_escape(yytext, strlen(yytext));
+ gram_piece_append("</PYACC_String>");
+ gram_piece_pack();
+ return ~STRING;
+#else
+    return STRING;
+#endif
+  }
+  <<EOF>>   unexpected_eof (token_start, "\"");
+  "\n"      unexpected_newline (token_start, "\"");
+}
+
+  /*----------------------------------------------------------.
+  | Scanning a Bison character literal, decoding its escapes. |
+  | The initial quote is already eaten.                       |
+  `----------------------------------------------------------*/
+
+<SC_ESCAPED_CHARACTER>
+{
+  "'" {
+    STRING_FINISH;
+    loc->start = token_start;
+    val->character = last_string[0];
+
+    /* FIXME: Eventually, make these errors.  */
+    if (last_string[0] == '\0')
+    {
+      complain (loc, Wother, _("empty character literal"));
+      /* '\0' seems dangerous even if we are about to complain.  */
+      val->character = '\'';
+    }
+    else if (last_string[1] != '\0')
+      complain (loc, Wother,
+                _("extra characters in character literal"));
+    STRING_FREE;
+    BEGIN INITIAL;
+#if 1
+ gram_piece_append("</PYACC_Text>");
+ gram_piece_escape(yytext, strlen(yytext));
+ gram_piece_append("</PYACC_Char>");
+ gram_piece_pack();
+ return ~CHAR;
+#else
+    return CHAR;
+#endif
+  }
+  "\n"      unexpected_newline (token_start, "'");
+  <<EOF>>   unexpected_eof (token_start, "'");
+}
+
+
+
+  /*--------------------------------------------------------------.
+  | Scanning a tag.  The initial angle bracket is already eaten.  |
+  `--------------------------------------------------------------*/
+
+<SC_TAG>
+{
+  ">" {
+    --nesting;
+    if (nesting < 0)
+      {
+        STRING_FINISH;
+        loc->start = token_start;
+        val->uniqstr = uniqstr_new (last_string);
+        STRING_FREE;
+        BEGIN INITIAL;
+#if 1
+ gram_piece_append("</PYACC_Text>");
+ gram_piece_escape(yytext, strlen(yytext));
+ gram_piece_append("</PYACC_TagRef>");
+ gram_piece_pack();
+ return ~TAG;
+#else
+        return TAG;
+#endif
+      }
+    STRING_GROW;
+  }
+
+  ([^<>]|->)+ STRING_GROW;
+  "<"+   STRING_GROW; nesting += yyleng;
+
+  <<EOF>>   unexpected_eof (token_start, ">");
+}
+
+  /*----------------------------.
+  | Decode escaped characters.  |
+  `----------------------------*/
+
+<SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>
+{
+  \\[0-7]{1,3} {
+    unsigned long int c = strtoul (yytext + 1, NULL, 8);
+    if (!c || UCHAR_MAX < c)
+      complain (loc, complaint, _("invalid number after \\-escape: %s"),
+                   yytext+1);
+    else
+ {
+      obstack_1grow (&obstack_for_string, c);
+  sprintf(gram_piece_temp, "<PYACC_Text_Escape character=\"%d\">", (int)c);
+  gram_piece_append(gram_piece_temp);
+  gram_piece_flush(strlen(yytext));
+  gram_piece_append("</PYACC_Text_Escape>"); 
+ }
+  }
+
+  \\x[0-9abcdefABCDEF]+ {
+    verify (UCHAR_MAX < ULONG_MAX);
+    unsigned long int c = strtoul (yytext + 2, NULL, 16);
+    if (!c || UCHAR_MAX < c)
+      complain (loc, complaint, _("invalid number after \\-escape: %s"),
+                   yytext+1);
+    else
+ {
+      obstack_1grow (&obstack_for_string, c);
+  sprintf(gram_piece_temp, "<PYACC_Text_Escape character=\"%d\">", (int)c);
+  gram_piece_append(gram_piece_temp);
+  gram_piece_flush(strlen(yytext));
+  gram_piece_append("</PYACC_Text_Escape>"); 
+ }
+  }
+
+  \\a   obstack_1grow (&obstack_for_string, '\a'); gram_piece_append("<PYACC_Text_Escape character=\"7\">"); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>");
+  \\b   obstack_1grow (&obstack_for_string, '\b'); gram_piece_append("<PYACC_Text_Escape character=\"8\">"); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>");
+  \\f   obstack_1grow (&obstack_for_string, '\f'); gram_piece_append("<PYACC_Text_Escape character=\"12\">"); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>");
+  \\n   obstack_1grow (&obstack_for_string, '\n'); gram_piece_append("<PYACC_Text_Escape character=\"10\">"); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>");
+  \\r   obstack_1grow (&obstack_for_string, '\r'); gram_piece_append("<PYACC_Text_Escape character=\"13\">"); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>");
+  \\t   obstack_1grow (&obstack_for_string, '\t'); gram_piece_append("<PYACC_Text_Escape character=\"9\">"); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>");
+  \\v   obstack_1grow (&obstack_for_string, '\v'); gram_piece_append("<PYACC_Text_Escape character=\"11\">"); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>");
+
+  /* \\[\"\'?\\] would be shorter, but it confuses xgettext.  */
+  \\("\""|"'"|"?"|"\\")  obstack_1grow (&obstack_for_string, yytext[1]); sprintf(gram_piece_temp, "<PYACC_Text_Escape character=\"%d\">", yytext[1]); gram_piece_append(gram_piece_temp); gram_piece_flush(strlen(yytext)); gram_piece_append("</PYACC_Text_Escape>"); 
+  \\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} {
+    int c = convert_ucn_to_byte (yytext);
+    if (c <= 0)
+      complain (loc, complaint, _("invalid number after \\-escape: %s"),
+                   yytext+1);
+    else
+ {
+      obstack_1grow (&obstack_for_string, c);
+  sprintf(gram_piece_temp, "<PYACC_Text_Escape character=\"%d\">", c);
+  gram_piece_append(gram_piece_temp);
+  gram_piece_flush(strlen(yytext));
+  gram_piece_append("</PYACC_Text_Escape>"); 
+ }
+  }
+  \\(.|\n)      {
+    char const *p = yytext + 1;
+    /* Quote only if escaping won't make the character visible.  */
+    if (c_isspace ((unsigned char) *p) && c_isprint ((unsigned char) *p))
+      p = quote (p);
+    else
+      p = quotearg_style_mem (escape_quoting_style, p, 1);
+    complain (loc, complaint, _("invalid character after \\-escape: %s"),
+                 p);
+  }
+}
+
+  /*--------------------------------------------.
+  | Scanning user-code characters and strings.  |
+  `--------------------------------------------*/
+
+<SC_CHARACTER,SC_STRING>
+{
+  {splice}|\\{splice}[^\n\[\]]  STRING_GROW;
+}
+
+<SC_CHARACTER>
+{
+  "'"           STRING_GROW; BEGIN context_state;
+  \n            unexpected_newline (token_start, "'");
+  <<EOF>>       unexpected_eof (token_start, "'");
+}
+
+<SC_STRING>
+{
+  "\""          STRING_GROW; BEGIN context_state;
+  \n            unexpected_newline (token_start, "\"");
+  <<EOF>>       unexpected_eof (token_start, "\"");
+}
+
+
+  /*---------------------------------------------------.
+  | Strings, comments etc. can be found in user code.  |
+  `---------------------------------------------------*/
+
+<SC_BRACED_CODE,SC_PROLOGUE,SC_EPILOGUE,SC_PREDICATE>
+{
+  "'" {
+    STRING_GROW;
+    context_state = YY_START;
+    token_start = loc->start;
+    BEGIN SC_CHARACTER;
+  }
+  "\"" {
+    STRING_GROW;
+    context_state = YY_START;
+    token_start = loc->start;
+    BEGIN SC_STRING;
+  }
+  "/"{splice}"*" {
+    STRING_GROW;
+    context_state = YY_START;
+    token_start = loc->start;
+    BEGIN SC_COMMENT;
+  }
+  "/"{splice}"/" {
+    STRING_GROW;
+    context_state = YY_START;
+    BEGIN SC_LINE_COMMENT;
+  }
+}
+
+
+
+  /*-----------------------------------------------------------.
+  | Scanning some code in braces (actions, predicates). The    |
+  | initial "{" is already eaten.                              |
+  `-----------------------------------------------------------*/
+
+<SC_BRACED_CODE,SC_PREDICATE>
+{
+  "{"|"<"{splice}"%"  STRING_GROW; nesting++;
+  "%"{splice}">"      STRING_GROW; nesting--;
+
+  /* Tokenize '<<%' correctly (as '<<' '%') rather than incorrrectly
+     (as '<' '<%').  */
+  "<"{splice}"<"  STRING_GROW;
+
+  <<EOF>>   unexpected_eof (code_start, "}");
+}
+
+<SC_BRACED_CODE>
+{
+  "}" {
+    obstack_1grow (&obstack_for_string, '}');
+
+    --nesting;
+    if (nesting < 0)
+      {
+        STRING_FINISH;
+        loc->start = code_start;
+        val->code = last_string;
+        BEGIN INITIAL;
+#if 1
+ gram_piece_append("</PYACC_Text>");
+ gram_piece_escape(yytext, strlen(yytext));
+ gram_piece_append("</PYACC_BracedCode>");
+ gram_piece_pack();
+ return ~BRACED_CODE;
+#else
+        return BRACED_CODE;
+#endif
+      }
+  }
+}
+
+<SC_PREDICATE>
+{
+  "}" {
+    --nesting;
+    if (nesting < 0)
+      {
+        STRING_FINISH;
+        loc->start = code_start;
+        val->code = last_string;
+        BEGIN INITIAL;
+#if 1
+ gram_piece_append("</PYACC_Text>");
+ gram_piece_escape(yytext, strlen(yytext));
+ gram_piece_append("</PYACC_BracedPredicate>");
+ gram_piece_pack();
+ return ~BRACED_PREDICATE;
+#else
+        return BRACED_PREDICATE;
+#endif
+      }
+    else
+      obstack_1grow (&obstack_for_string, '}');
+  }
+}
+
+  /*--------------------------------------------------------------.
+  | Scanning some prologue: from "%{" (already scanned) to "%}".  |
+  `--------------------------------------------------------------*/
+
+<SC_PROLOGUE>
+{
+  "%}" {
+    STRING_FINISH;
+    loc->start = code_start;
+    val->code = last_string;
+    BEGIN INITIAL;
+#if 1
+ gram_piece_append("</PYACC_Text>");
+ gram_piece_escape(yytext, strlen(yytext));
+ gram_piece_append("</PYACC_Section1_Prologue>");
+ gram_piece_pack();
+ return ~PROLOGUE;
+#else
+    return PROLOGUE;
+#endif
+  }
+
+  <<EOF>>   unexpected_eof (code_start, "%}");
+}
+
+
+  /*---------------------------------------------------------------.
+  | Scanning the epilogue (everything after the second "%%", which |
+  | has already been eaten).                                       |
+  `---------------------------------------------------------------*/
+
+<SC_EPILOGUE>
+{
+  <<EOF>> {
+    STRING_FINISH;
+    loc->start = code_start;
+    val->code = last_string;
+    BEGIN INITIAL;
+#if 1
+ gram_piece_pack();
+ return ~EPILOGUE;
+#else
+    return EPILOGUE;
+#endif
+  }
+}
+
+
+  /*-----------------------------------------------------.
+  | By default, grow the string obstack with the input.  |
+  `-----------------------------------------------------*/
+
+<SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PREDICATE,SC_PROLOGUE,SC_EPILOGUE,SC_STRING,SC_CHARACTER,SC_ESCAPED_STRING,SC_ESCAPED_CHARACTER>. |
+  <SC_COMMENT,SC_LINE_COMMENT,SC_BRACED_CODE,SC_PREDICATE,SC_PROLOGUE,SC_EPILOGUE>\n    STRING_GROW;
+
+
+%%
+
+/* Read bytes from FP into buffer BUF of size SIZE.  Return the
+   number of bytes read.  Remove '\r' from input, treating \r\n
+   and isolated \r as \n.  */
+
+static size_t
+no_cr_read (FILE *fp, char *buf, size_t size)
+{
+  size_t bytes_read = fread (buf, 1, size, fp);
+  if (bytes_read)
+    {
+      char *w = memchr (buf, '\r', bytes_read);
+      if (w)
+        {
+          char const *r = ++w;
+          char const *lim = buf + bytes_read;
+
+          for (;;)
+            {
+              /* Found an '\r'.  Treat it like '\n', but ignore any
+                 '\n' that immediately follows.  */
+              w[-1] = '\n';
+              if (r == lim)
+                {
+                  int ch = getc (fp);
+                  if (ch != '\n' && ungetc (ch, fp) != ch)
+                    break;
+                }
+              else if (*r == '\n')
+                r++;
+
+              /* Copy until the next '\r'.  */
+              do
+                {
+                  if (r == lim)
+                    return w - buf;
+                }
+              while ((*w++ = *r++) != '\r');
+            }
+
+          return w - buf;
+        }
+    }
+
+  return bytes_read;
+}
+
+
+
+/*------------------------------------------------------.
+| Scan NUMBER for a base-BASE integer at location LOC.  |
+`------------------------------------------------------*/
+
+static unsigned long int
+scan_integer (char const *number, int base, location loc)
+{
+  verify (INT_MAX < ULONG_MAX);
+  unsigned long int num = strtoul (number, NULL, base);
+
+  if (INT_MAX < num)
+    {
+      complain (&loc, complaint, _("integer out of range: %s"),
+                   quote (number));
+      num = INT_MAX;
+    }
+
+  return num;
+}
+
+
+/*------------------------------------------------------------------.
+| Convert universal character name UCN to a single-byte character,  |
+| and return that character.  Return -1 if UCN does not correspond  |
+| to a single-byte character.                                       |
+`------------------------------------------------------------------*/
+
+static int
+convert_ucn_to_byte (char const *ucn)
+{
+  verify (UCHAR_MAX <= INT_MAX);
+  unsigned long int code = strtoul (ucn + 2, NULL, 16);
+
+  /* FIXME: Currently we assume Unicode-compatible unibyte characters
+     on ASCII hosts (i.e., Latin-1 on hosts with 8-bit bytes).  On
+     non-ASCII hosts we support only the portable C character set.
+     These limitations should be removed once we add support for
+     multibyte characters.  */
+
+  if (UCHAR_MAX < code)
+    return -1;
+
+#if ! ('$' == 0x24 && '@' == 0x40 && '`' == 0x60 && '~' == 0x7e)
+  {
+    /* A non-ASCII host.  Use CODE to index into a table of the C
+       basic execution character set, which is guaranteed to exist on
+       all Standard C platforms.  This table also includes '$', '@',
+       and '`', which are not in the basic execution character set but
+       which are unibyte characters on all the platforms that we know
+       about.  */
+    static signed char const table[] =
+      {
+        '\0',   -1,   -1,   -1,   -1,   -1,   -1, '\a',
+        '\b', '\t', '\n', '\v', '\f', '\r',   -1,   -1,
+          -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+          -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+         ' ',  '!',  '"',  '#',  '$',  '%',  '&', '\'',
+         '(',  ')',  '*',  '+',  ',',  '-',  '.',  '/',
+         '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',
+         '8',  '9',  ':',  ';',  '<',  '=',  '>',  '?',
+         '@',  'A',  'B',  'C',  'D',  'E',  'F',  'G',
+         'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',
+         'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',
+         'X',  'Y',  'Z',  '[', '\\',  ']',  '^',  '_',
+         '`',  'a',  'b',  'c',  'd',  'e',  'f',  'g',
+         'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',
+         'p',  'q',  'r',  's',  't',  'u',  'v',  'w',
+         'x',  'y',  'z',  '{',  '|',  '}',  '~'
+      };
+
+    code = code < sizeof table ? table[code] : -1;
+  }
+#endif
+
+  return code;
+}
+
+
+/*---------------------------------------------------------------------.
+| Handle '#line INT( "FILE")?\n'.  ARGS has already skipped '#line '.  |
+`---------------------------------------------------------------------*/
+
+static void
+handle_syncline (char *args, location loc)
+{
+  char *file;
+  unsigned long int lineno = strtoul (args, &file, 10);
+  if (INT_MAX <= lineno)
+    {
+      complain (&loc, Wother, _("line number overflow"));
+      lineno = INT_MAX;
+    }
+
+  file = strchr (file, '"');
+  if (file)
+    {
+      *strchr (file + 1, '"') = '\0';
+      current_file = uniqstr_new (file + 1);
+    }
+  boundary_set (&scanner_cursor, current_file, lineno, 1);
+}
+
+
+/*----------------------------------------------------------------.
+| For a token or comment starting at START, report message MSGID, |
+| which should say that an end marker was found before the        |
+| expected TOKEN_END. Then, pretend that TOKEN_END was found.     |
+`----------------------------------------------------------------*/
+
+static void
+unexpected_end (boundary start, char const *msgid, char const *token_end)
+{
+  location loc;
+  loc.start = start;
+  loc.end = scanner_cursor;
+  size_t i = strlen (token_end);
+
+/* Adjust scanner cursor so that any later message does not count
+     the characters about to be inserted.  */
+  scanner_cursor.column -= i;
+
+  while (i != 0)
+    unput (token_end[--i]);
+
+  token_end = quote (token_end);
+  /* Instead of '\'', display "'".  */
+  if (STREQ (token_end, "'\\''"))
+    token_end = "\"'\"";
+  complain (&loc, complaint, _(msgid), token_end);
+}
+
+
+/*------------------------------------------------------------------------.
+| Report an unexpected EOF in a token or comment starting at START.       |
+| An end of file was encountered and the expected TOKEN_END was missing.  |
+| After reporting the problem, pretend that TOKEN_END was found.          |
+`------------------------------------------------------------------------*/
+
+static void
+unexpected_eof (boundary start, char const *token_end)
+{
+  unexpected_end (start, N_("missing %s at end of file"), token_end);
+}
+
+
+/*----------------------------------------.
+| Likewise, but for unexpected newlines.  |
+`----------------------------------------*/
+
+static void
+unexpected_newline (boundary start, char const *token_end)
+{
+  unexpected_end (start, N_("missing %s at end of line"), token_end);
+}
+
+
+/*-------------------------.
+| Initialize the scanner.  |
+`-------------------------*/
+
+void
+gram_scanner_initialize (void)
+{
+  obstack_init (&obstack_for_string);
+}
+
+
+/*-----------------------------------------------.
+| Free all the memory allocated to the scanner.  |
+`-----------------------------------------------*/
+
+void
+gram_scanner_free (void)
+{
+  obstack_free (&obstack_for_string, 0);
+  /* Reclaim Flex's buffers.  */
+  yylex_destroy ();
+}
+
+/* Nick */
+void gram_piece_append(const char *str) {
+ gram_piece[gram_piece1++] = strdup(str);
+}
+
+void gram_piece_insert(int n, const char *str) {
+ memmove(gram_piece + n + 1, gram_piece + n, (gram_piece1 - n) * sizeof(char *));
+ gram_piece[n] = strdup(str);
+ ++gram_piece1;
+}
+
+void gram_piece_escape(const char *p, size_t n) {
+ size_t i, j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+  case '>':
+   j += 4;
+   break;
+  case '&':
+   j += 5;
+   break;
+  default:
+   ++j;
+   break;
+  }
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+   memcpy(q + j, "&lt;", 4);
+   j += 4;
+   break;
+  case '>':
+   memcpy(q + j, "&gt;", 4);
+   j += 4;
+   break;
+  case '&':
+   memcpy(q + j, "&amp;", 5);
+   j += 5;
+   break;
+  default:
+   q[j++] = p[i];
+   break;
+  }
+ q[j] = 0;
+ gram_piece[gram_piece1++] = q;
+}
+
+void gram_piece_flush(size_t n) {
+ gram_piece_escape(yytext, n);
+ yytext += n;
+}
+
+void gram_piece_pack() {
+ int i;
+ size_t j = 0;
+ for (i = gram_piece0; i < gram_piece1; ++i)
+  j += strlen(gram_piece[i]);
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = gram_piece0; i < gram_piece1; ++i) {
+  int k = strlen(gram_piece[i]);
+  memcpy(q + j, gram_piece[i], k);
+  free(gram_piece[i]);
+  j += k;
+ }
+ q[j] = 0;
+ gram_piece[gram_piece0++] = q;
+ gram_piece1 = gram_piece0;
+}
+
+GRAM_LEX_DECL {
+ int result = real_gram_lex(val, loc);
+ if (result < 0)
+  return ~result;
+ gram_piece_pack();
+ gram_piece_escape(yytext, strlen(yytext));
+ gram_piece_pack();
+ return result;
+}
diff --git a/tests/scan.l b/tests/scan.l
new file mode 100644 (file)
index 0000000..8e21e78
--- /dev/null
@@ -0,0 +1,1322 @@
+/* scan.l - scanner for flex input -*-C-*- */
+
+%{
+/*  Copyright (c) 1990 The Regents of the University of California. */
+/*  All rights reserved. */
+
+/*  This code is derived from software contributed to Berkeley by */
+/*  Vern Paxson. */
+
+/*  The United States Government has rights in this work pursuant */
+/*  to contract no. DE-AC03-76SF00098 between the United States */
+/*  Department of Energy and the University of California. */
+
+/*  This file is part of flex. */
+
+/*  Redistribution and use in source and binary forms, with or without */
+/*  modification, are permitted provided that the following conditions */
+/*  are met: */
+
+/*  1. Redistributions of source code must retain the above copyright */
+/*     notice, this list of conditions and the following disclaimer. */
+/*  2. Redistributions in binary form must reproduce the above copyright */
+/*     notice, this list of conditions and the following disclaimer in the */
+/*     documentation and/or other materials provided with the distribution. */
+
+/*  Neither the name of the University nor the names of its contributors */
+/*  may be used to endorse or promote products derived from this software */
+/*  without specific prior written permission. */
+
+/*  THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR */
+/*  IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED */
+/*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */
+/*  PURPOSE. */
+
+#include "flexdef.h"
+#include "parse.h"
+extern bool tablesverify, tablesext;
+extern int trlcontxt; /* Set in  parse.y for each rule. */
+extern const char *escaped_qstart, *escaped_qend;
+
+#define M4QSTART "[""["
+#define M4QEND "]""]"
+
+#define ESCAPED_QSTART "[" M4QEND M4QSTART "[" M4QEND M4QSTART
+#define ESCAPED_QEND M4QEND "]" M4QSTART M4QEND "]" M4QSTART
+
+#define ACTION_ECHO add_action( yytext )
+#define ACTION_IFDEF(def, should_define) \
+       { \
+       if ( should_define ) \
+               action_define( def, 1 ); \
+       }
+
+#define ACTION_ECHO_QSTART add_action (ESCAPED_QSTART)
+#define ACTION_ECHO_QEND   add_action (ESCAPED_QEND)
+
+#define ACTION_M4_IFDEF(def, should_define) \
+    do{ \
+        if ( should_define ) \
+            buf_m4_define( &m4defs_buf, def, NULL);\
+        else \
+            buf_m4_undefine( &m4defs_buf, def);\
+    } while(0)
+
+#define MARK_END_OF_PROLOG mark_prolog();
+
+#if 1
+#define YY_DECL \
+       static int real_flexscan(void)
+#else
+#define YY_DECL \
+       int flexscan(void)
+#endif
+
+#define RETURNCHAR \
+       yylval = (unsigned char) yytext[0]; \
+       return CHAR;
+
+#define RETURNNAME \
+       if(yyleng < MAXLINE) \
+         { \
+       strncpy( nmstr, yytext, sizeof(nmstr) ); \
+ piece_pack(); \
+ piece_append("<PLex_Name>"); \
+ piece_escape(yytext, strlen(yytext)); \
+ piece_append("</PLex_Name>"); \
+ piece_pack(); \
+ return ~NAME; \
+ /*    return NAME;*/ \
+        } \
+       else \
+        do { \
+          synerr(_("Input line too long\n")); \
+          FLEX_EXIT(EXIT_FAILURE);  \
+        } while (0)
+
+#define PUT_BACK_STRING(str, start) \
+       { size_t i = strlen( str );     \
+         while ( i > start )           \
+           unput((str)[--i]);          \
+       }
+
+#define CHECK_REJECT(str) \
+       if ( all_upper( str ) ) \
+               reject = true;
+
+#define CHECK_YYMORE(str) \
+       if ( all_lower( str ) ) \
+               yymore_used = true;
+
+#define YY_USER_INIT \
+       if ( getenv("POSIXLY_CORRECT") ) \
+               posix_compat = true;
+
+#define START_CODEBLOCK(x) do { \
+    /* Emit the needed line directive... */\
+    if (indented_code == false) { \
+        linenum++; \
+        line_directive_out(NULL, 1); \
+    } \
+    add_action(M4QSTART); \
+    yy_push_state(CODEBLOCK); \
+    if ((indented_code = x)) ACTION_ECHO; \
+ piece_append("<PLex_Section1Or2_CodeBlock>"); \
+} while(0)
+
+#define END_CODEBLOCK do { \
+    yy_pop_state();\
+    add_action(M4QEND); \
+    if (!indented_code) line_directive_out(NULL, 0);\
+ piece_append("</PLex_Section1Or2_CodeBlock>"); \
+} while (0)
+
+/* Nick */
+char piece_temp[100], *piece[10000];
+int piece0, piece1;
+
+void piece_append(const char *str);
+void piece_insert(int n, const char *str);
+void piece_escape(const char *p, size_t n);
+void piece_flush(size_t n);
+void piece_pack();
+
+static void markup_action(const char *text);
+static void markup_option(const char *name, int sense);
+
+%}
+
+%option caseless nodefault noreject stack noyy_top_state
+%option nostdinit
+
+%x SECT2 SECT2PROLOG SECT3 CODEBLOCK PICKUPDEF SC CARETISBOL NUM QUOTE
+%x FIRSTCCL CCL ACTION RECOVER COMMENT ACTION_STRING PERCENT_BRACE_ACTION
+%x OPTION LINEDIR CODEBLOCK_MATCH_BRACE
+%x GROUP_WITH_PARAMS
+%x GROUP_MINUS_PARAMS
+%x EXTENDED_COMMENT
+%x COMMENT_DISCARD CODE_COMMENT
+%x SECT3_NOESCAPE
+%x CHARACTER_CONSTANT
+
+WS             [[:blank:]]+
+OPTWS          [[:blank:]]*
+NOT_WS         [^[:blank:]\r\n]
+
+NL             \r?\n
+
+NAME           ([[:alpha:]_][[:alnum:]_-]*)
+NOT_NAME       [^[:alpha:]_*\n]+
+
+SCNAME         {NAME}
+
+ESCSEQ         (\\([^\n]|[0-7]{1,3}|x[[:xdigit:]]{1,2}))
+
+FIRST_CCL_CHAR ([^\\\n]|{ESCSEQ})
+CCL_CHAR       ([^\\\n\]]|{ESCSEQ})
+CCL_EXPR       ("[:"^?[[:alpha:]]+":]")
+
+LEXOPT         [aceknopr]
+
+M4QSTART    "[""["
+M4QEND      "]""]"
+
+%%
+       static int bracelevel, didadef, indented_code;
+       static int doing_rule_action = false;
+       static int option_sense;
+
+       int doing_codeblock = false;
+       int brace_depth=0, brace_start_line=0;
+       char nmdef[MAXLINE];
+
+
+<INITIAL>{
+       ^{WS}           START_CODEBLOCK(true); piece_append("<PLex_Text>");
+       ^"/*"           add_action("/*[""["); yy_push_state( COMMENT );
+       ^#{OPTWS}line{WS}       yy_push_state( LINEDIR );
+       ^"%s"{NAME}?    return SCDECL;
+       ^"%x"{NAME}?    return XSCDECL;
+       ^"%{".*{NL}     START_CODEBLOCK(false); piece_flush(strlen(yytext)); piece_append("<PLex_Text>");
+    ^"%top"[[:blank:]]*"{"[[:blank:]]*{NL}    {
+                brace_start_line = linenum;
+                ++linenum;
+                buf_linedir( &top_buf, infilename?infilename:"<stdin>", linenum);
+                brace_depth = 1;
+                yy_push_state(CODEBLOCK_MATCH_BRACE);
+            }
+
+    ^"%top".*   synerr( _("malformed '%top' directive") );
+
+       {WS}            /* discard */
+
+       ^"%%".*         {
+                       sectnum = 2;
+                       bracelevel = 0;
+                       mark_defs1();
+                       line_directive_out(NULL, 1);
+                       BEGIN(SECT2PROLOG);
+#if 1
+ piece_append("</PLex_Section1>");
+ piece_pack();
+ piece_escape(yytext, strlen(yytext));
+ piece_append("<PLex_Section2>");
+ piece_pack();
+ return ~SECTEND;
+#else
+                       return SECTEND;
+#endif
+                       }
+
+       ^"%pointer".*{NL}       yytext_is_array = false; ++linenum; piece_append("<PLex_Section1_Options><PLex_Section1_Options_Array>"); piece_flush(strlen(yytext) - 1); piece_append("</PLex_Section1_Options_Array></PLex_Section1_Options>"); 
+       ^"%array".*{NL}         yytext_is_array = true; ++linenum; piece_append("<PLex_Section1_Options><PLex_Section1_Options_Array value=\"true\">"); piece_flush(strlen(yytext) - 1); piece_append("</PLex_Section1_Options_Array></PLex_Section1_Options>");
+
+       ^"%option"      BEGIN(OPTION); return TOK_OPTION;
+
+       ^"%"{LEXOPT}{OPTWS}[[:digit:]]*{OPTWS}{NL}      ++linenum; /* ignore */
+       ^"%"{LEXOPT}{WS}.*{NL}  ++linenum;      /* ignore */
+
+       /* xgettext: no-c-format */
+       ^"%"[^sxaceknopr{}].*   synerr( _( "unrecognized '%' directive" ) );
+
+       ^{NAME}         {
+                       if(yyleng < MAXLINE)
+                        {
+                       strncpy( nmstr, yytext, sizeof(nmstr) );
+                        }
+                       else
+                        {
+                          synerr( _("Definition name too long\n"));
+                          FLEX_EXIT(EXIT_FAILURE);
+                        }
+
+                       didadef = false;
+                       BEGIN(PICKUPDEF);
+                       }
+
+       {SCNAME}        RETURNNAME;
+       ^{OPTWS}{NL}    ++linenum; /* allows blank lines in section 1 */
+       {OPTWS}{NL}     ACTION_ECHO; ++linenum; /* maybe end of comment line */
+}
+
+
+<COMMENT,CODE_COMMENT>{ /* */
+        [^\[\]\*\n]*  ACTION_ECHO;
+        .           ACTION_ECHO;
+
+       {NL}        ++linenum; ACTION_ECHO;
+}
+<COMMENT>{
+       "*/"        add_action("*/]""]"); yy_pop_state();
+}
+<CODE_COMMENT>{
+        "*/"        ACTION_ECHO; yy_pop_state();
+}
+
+<COMMENT_DISCARD>{
+        /* This is the same as COMMENT, but is discarded rather than output. */
+       "*/"            yy_pop_state();
+    "*"         ;
+       [^*\n]      ;
+       {NL}        ++linenum;
+}
+
+<EXTENDED_COMMENT>{
+    ")"         yy_pop_state();
+    [^\n\)]+      ;
+    {NL}        ++linenum;
+}
+
+<LINEDIR>{
+       \n              yy_pop_state();
+       [[:digit:]]+    linenum = myctoi( yytext );
+
+       \"[^"\n]*\"     {
+                       free(infilename);
+                       infilename = xstrdup(yytext + 1);
+                       infilename[strlen( infilename ) - 1] = '\0';
+                       }
+       .               /* ignore spurious characters */
+}
+<ACTION,CODEBLOCK,ACTION_STRING,PERCENT_BRACE_ACTION,CHARACTER_CONSTANT,COMMENT,CODE_COMMENT>{
+   {M4QSTART}   ACTION_ECHO_QSTART;
+   {M4QEND}     ACTION_ECHO_QEND;
+}
+
+<CODEBLOCK>{
+       ^"%}".*{NL}     ++linenum; piece_append("</PLex_Text>"); piece_flush(strlen(yytext)); END_CODEBLOCK;
+       [^\n%\[\]]*         ACTION_ECHO;
+        .              ACTION_ECHO;
+       {NL}            {
+                       ++linenum;
+                       ACTION_ECHO;
+                       if ( indented_code ) { piece_flush(strlen(yytext)); piece_append("</PLex_Text>"); END_CODEBLOCK; }
+                       }
+}
+
+<CODEBLOCK_MATCH_BRACE>{
+    "}"     {
+                if( --brace_depth == 0){
+                    /* TODO: Matched. */
+                    yy_pop_state();
+                }else
+                    buf_strnappend(&top_buf, yytext, yyleng);
+            }
+
+    "{"     {
+                brace_depth++;
+                buf_strnappend(&top_buf, yytext, yyleng);
+            }
+
+    {NL}    {
+                ++linenum;
+                buf_strnappend(&top_buf, yytext, yyleng);
+            }
+
+    {M4QSTART}  buf_strnappend(&top_buf, escaped_qstart, (int) strlen(escaped_qstart));
+    {M4QEND}    buf_strnappend(&top_buf, escaped_qend, (int) strlen(escaped_qend));
+    ([^{}\r\n\[\]]+)|[^{}\r\n]  {
+       buf_strnappend(&top_buf, yytext, yyleng);
+    }
+
+    <<EOF>>     {
+                linenum = brace_start_line;
+                synerr(_("Unmatched '{'"));
+                yyterminate();
+                }
+}
+
+
+<PICKUPDEF>{
+       {WS}            /* separates name and definition */
+
+       {NOT_WS}[^\r\n]*        {
+                       if(yyleng < MAXLINE)
+                        {
+                       strncpy( nmdef, yytext, sizeof(nmdef) );
+                        }
+                       else
+                        {
+                          format_synerr( _("Definition value for {%s} too long\n"), nmstr);
+                          FLEX_EXIT(EXIT_FAILURE);
+                        }
+                       /* Skip trailing whitespace. */
+                       {
+                           size_t i = strlen( nmdef );
+                           while (i > 0 && (nmdef[i-1] == ' ' || nmdef[i-1] == '\t'))
+                              --i;
+                           nmdef[i] = '\0';
+                       }
+
+                       ndinstal( nmstr, nmdef );
+                       didadef = true;
+                       }
+
+       {NL}            {
+                       if ( ! didadef )
+                               synerr( _( "incomplete name definition" ) );
+                       BEGIN(INITIAL);
+                       ++linenum;
+                       }
+}
+
+
+<OPTION>{
+       {NL}            ++linenum; BEGIN(INITIAL);
+       {WS}            option_sense = true;
+
+       "="             return '=';
+
+       no              option_sense = ! option_sense;
+
+       7bit            csize = option_sense ? 128 : 256; markup_option("SevenBit", option_sense);
+       8bit            csize = option_sense ? 256 : 128; markup_option("SevenBit", !option_sense);
+
+       align           long_align = option_sense; markup_option("Align", option_sense);
+       always-interactive      {
+                       ACTION_M4_IFDEF( "M4""_YY_ALWAYS_INTERACTIVE", option_sense );
+            interactive = option_sense;
+ markup_option("AlwaysInteractive", option_sense);
+                       }
+       array           yytext_is_array = option_sense; markup_option("Array", option_sense);
+       backup          backing_up_report = option_sense; markup_option("Backup", option_sense);
+       batch           interactive = ! option_sense; markup_option("Interactive", !option_sense);
+    bison-bridge     bison_bridge_lval = option_sense; markup_option("BisonBridge", option_sense);
+    bison-locations  { if((bison_bridge_lloc = option_sense))
+                            bison_bridge_lval = true;
+ markup_option("BisonLocations", option_sense);
+                     }
+       "c++"           C_plus_plus = option_sense; markup_option("CPlusPlus", option_sense);
+       caseful|case-sensitive          sf_set_case_ins(!option_sense); markup_option("Caseless", !option_sense);
+       caseless|case-insensitive       sf_set_case_ins(option_sense); markup_option("Caseless", option_sense);
+       debug           ddebug = option_sense; markup_option("Debug", option_sense);
+       default         spprdflt = ! option_sense; markup_option("Default", option_sense);
+       ecs             useecs = option_sense; markup_option("ECS", option_sense);
+       fast            {
+                       useecs = usemecs = false;
+                       use_read = fullspd = true;
+ markup_option("Fast", option_sense);
+                       }
+       full            {
+                       useecs = usemecs = false;
+                       use_read = fulltbl = true;
+ markup_option("Full", option_sense);
+                       }
+       input           ACTION_IFDEF("YY_NO_INPUT", ! option_sense); markup_option("Input", option_sense);
+       interactive     interactive = option_sense; markup_option("Interactive", option_sense);
+       lex-compat      lex_compat = option_sense; markup_option("LexCompat", option_sense);
+       posix-compat    posix_compat = option_sense; markup_option("PosixCompat", option_sense);
+       line            gen_line_dirs = option_sense; markup_option("Line", option_sense);
+       main            {
+                       ACTION_M4_IFDEF( "M4""_YY_MAIN", option_sense);
+            /* Override yywrap */
+            if( option_sense == true )
+                do_yywrap = false;
+ markup_option("Main", option_sense);
+                       }
+       meta-ecs        usemecs = option_sense; markup_option("MetaECS", option_sense);
+       never-interactive       {
+                       ACTION_M4_IFDEF( "M4""_YY_NEVER_INTERACTIVE", option_sense );
+            interactive = !option_sense;
+ markup_option("NeverInteractive", option_sense);
+                       }
+       perf-report     performance_report += option_sense ? 1 : -1; markup_option("PerfReport", option_sense);
+       pointer         yytext_is_array = ! option_sense; markup_option("Array", !option_sense);
+       read            use_read = option_sense; markup_option("Read", option_sense);
+    reentrant   reentrant = option_sense; markup_option("Reentrant", option_sense);
+       reject          reject_really_used = option_sense; markup_option("Reject", option_sense);
+       stack           ACTION_M4_IFDEF( "M4""_YY_STACK_USED", option_sense ); markup_option("Stack", option_sense);
+       stdinit         do_stdinit = option_sense; markup_option("StdInit", option_sense);
+       stdout          use_stdout = option_sense; markup_option("StdOut", option_sense);
+    unistd      ACTION_IFDEF("YY_NO_UNISTD_H", ! option_sense); markup_option("UniStd", option_sense);
+       unput           ACTION_M4_IFDEF("M4""_YY_NO_UNPUT", ! option_sense); markup_option("Unput", option_sense);
+       verbose         printstats = option_sense; markup_option("Verbose", option_sense);
+       warn            nowarn = ! option_sense; markup_option("Warn", option_sense);
+       yylineno        do_yylineno = option_sense; ACTION_M4_IFDEF("M4""_YY_USE_LINENO", option_sense); markup_option("YYLineNo", option_sense);
+       yymore          yymore_really_used = option_sense; markup_option("YYMore", option_sense);
+       yywrap      do_yywrap = option_sense; markup_option("YYWrap", option_sense);
+
+       yy_push_state   ACTION_M4_IFDEF("M4""_YY_NO_PUSH_STATE", ! option_sense); markup_option("YYPushState", option_sense);
+       yy_pop_state    ACTION_M4_IFDEF("M4""_YY_NO_POP_STATE", ! option_sense); markup_option("YYPopState", option_sense);
+       yy_top_state    ACTION_M4_IFDEF("M4""_YY_NO_TOP_STATE", ! option_sense); markup_option("YYTopState", option_sense);
+
+       yy_scan_buffer  ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BUFFER", ! option_sense); markup_option("YYScanBuffer", option_sense);
+       yy_scan_bytes   ACTION_M4_IFDEF("M4""_YY_NO_SCAN_BYTES", ! option_sense); markup_option("YYScanBytes", option_sense);
+       yy_scan_string  ACTION_M4_IFDEF("M4""_YY_NO_SCAN_STRING", ! option_sense); markup_option("YYScanString", option_sense);
+
+    yyalloc         ACTION_M4_IFDEF("M4""_YY_NO_FLEX_ALLOC", ! option_sense); markup_option("YYAlloc", option_sense);
+    yyrealloc       ACTION_M4_IFDEF("M4""_YY_NO_FLEX_REALLOC", ! option_sense); markup_option("YYRealloc", option_sense);
+    yyfree          ACTION_M4_IFDEF("M4""_YY_NO_FLEX_FREE", ! option_sense); markup_option("YYFree", option_sense);
+
+    yyget_debug     ACTION_M4_IFDEF("M4""_YY_NO_GET_DEBUG", ! option_sense); markup_option("YYGetDebug", option_sense);
+    yyset_debug     ACTION_M4_IFDEF("M4""_YY_NO_SET_DEBUG", ! option_sense); markup_option("YYSetDebug", option_sense);
+    yyget_extra     ACTION_M4_IFDEF("M4""_YY_NO_GET_EXTRA", ! option_sense); markup_option("YYGetExtra", option_sense);
+    yyset_extra     ACTION_M4_IFDEF("M4""_YY_NO_SET_EXTRA", ! option_sense); markup_option("YYSetExtra", option_sense);
+    yyget_leng      ACTION_M4_IFDEF("M4""_YY_NO_GET_LENG", ! option_sense); markup_option("YYGetLeng", option_sense);
+    yyget_text      ACTION_M4_IFDEF("M4""_YY_NO_GET_TEXT", ! option_sense); markup_option("YYGetText", option_sense);
+    yyget_lineno    ACTION_M4_IFDEF("M4""_YY_NO_GET_LINENO", ! option_sense); markup_option("YYGetLineNo", option_sense);
+    yyset_lineno    ACTION_M4_IFDEF("M4""_YY_NO_SET_LINENO", ! option_sense); markup_option("YYSetLineNo", option_sense);
+    yyget_in        ACTION_M4_IFDEF("M4""_YY_NO_GET_IN", ! option_sense); markup_option("YYGetIn", option_sense);
+    yyset_in        ACTION_M4_IFDEF("M4""_YY_NO_SET_IN", ! option_sense); markup_option("YYSetIn", option_sense);
+    yyget_out       ACTION_M4_IFDEF("M4""_YY_NO_GET_OUT", ! option_sense); markup_option("YYGetOut", option_sense);
+    yyset_out       ACTION_M4_IFDEF("M4""_YY_NO_SET_OUT", ! option_sense); markup_option("YYSetOut", option_sense);
+    yyget_lval      ACTION_M4_IFDEF("M4""_YY_NO_GET_LVAL", ! option_sense); markup_option("YYGetLVal", option_sense);
+    yyset_lval      ACTION_M4_IFDEF("M4""_YY_NO_SET_LVAL", ! option_sense); markup_option("YYSetLVal", option_sense);
+    yyget_lloc      ACTION_M4_IFDEF("M4""_YY_NO_GET_LLOC", ! option_sense); markup_option("YYGetLLoc", option_sense);
+    yyset_lloc      ACTION_M4_IFDEF("M4""_YY_NO_SET_LLOC", ! option_sense); markup_option("YYSetLLoc", option_sense);
+
+       extra-type      return TOK_EXTRA_TYPE;
+       outfile         return TOK_OUTFILE;
+       prefix          return TOK_PREFIX;
+       yyclass         return TOK_YYCLASS;
+       header(-file)?      return TOK_HEADER_FILE;
+       tables-file         return TOK_TABLES_FILE;
+       tables-verify   {
+                    tablesverify = option_sense;
+                    if(!tablesext && option_sense)
+                        tablesext = true;
+ markup_option("TablesVerify", option_sense);
+                    }
+
+
+       \"[^"\n]*\"     {
+                       if(yyleng-1 < MAXLINE)
+                        {
+                       strncpy( nmstr, yytext + 1, sizeof(nmstr) );
+                        }
+                       else
+                        {
+                          synerr( _("Option line too long\n"));
+                          FLEX_EXIT(EXIT_FAILURE);
+                        }
+                       nmstr[strlen( nmstr ) - 1] = '\0';
+#if 1
+ piece_pack();
+ piece_append("<PLex_String>\"<PLex_Text>");
+ piece_escape(yytext + 1, strlen(yytext + 1) - 1);
+ piece_append("</PLex_Text>\"</PLex_String>");
+ piece_pack();
+ return ~NAME; /* actually a misnomer */
+#else
+                       return NAME;
+#endif
+                       }
+
+       (([a-mo-z]|n[a-np-z])[[:alpha:]\-+]*)|. {
+                       format_synerr( _( "unrecognized %%option: %s" ),
+                               yytext );
+                       BEGIN(RECOVER);
+                       }
+}
+
+<RECOVER>.*{NL}                ++linenum; BEGIN(INITIAL);
+
+
+<SECT2PROLOG>{
+       ^"%{".* ++bracelevel; yyless( 2 );      /* eat only %{ */
+       ^"%}".* --bracelevel; yyless( 2 );      /* eat only %} */
+
+       ^{WS} START_CODEBLOCK(true); piece_append("<PLex_Text>"); /* indented code in prolog */
+
+       ^{NOT_WS}.*     {
+        /* non-indented code */
+               if ( bracelevel <= 0 ) {
+            /* not in %{ ... %} */
+            yyless( 0 );       /* put it all back */
+            yy_set_bol( 1 );
+            mark_prolog();
+            BEGIN(SECT2);
+        } else {
+            START_CODEBLOCK(true);
+ piece_append("<PLex_Text>");
+        }
+    }
+
+       .               ACTION_ECHO;
+       {NL}    ++linenum; ACTION_ECHO;
+
+       <<EOF>>         {
+                       mark_prolog();
+                       sectnum = 0;
+#if 1
+ piece_pack();
+ piece_append("</PLex_Section2>");
+ piece_pack();
+ return ~YY_NULL;
+#else
+                       yyterminate(); /* to stop the parser */
+#endif
+                       }
+}
+
+<SECT2>{
+       ^{OPTWS}{NL}    ++linenum; /* allow blank lines in section 2 */
+
+       ^{OPTWS}"%{"    {
+                       indented_code = false;
+                       doing_codeblock = true;
+                       bracelevel = 1;
+                       BEGIN(PERCENT_BRACE_ACTION);
+ piece_flush(strlen(yytext) - 2);
+ piece_append("<PLex_Section1Or2_CodeBlock>");
+ piece_flush(2);
+ piece_append("<PLex_Text>");
+                       }
+
+       ^{OPTWS}"<"         {
+                        /* Allow "<" to appear in (?x) patterns. */
+                        if (!sf_skip_ws())
+                            BEGIN(SC);
+                        return '<';
+                    }
+       ^{OPTWS}"^"     return '^';
+       \"              BEGIN(QUOTE); return '"';
+       "{"/[[:digit:]] {
+                       BEGIN(NUM);
+                       if ( lex_compat || posix_compat )
+                               return BEGIN_REPEAT_POSIX;
+                       else
+                               return BEGIN_REPEAT_FLEX;
+                       }
+       "$"/([[:blank:]]|{NL})  return '$';
+
+       {WS}"%{"                {
+                       bracelevel = 1;
+                       BEGIN(PERCENT_BRACE_ACTION);
+ piece_flush(strlen(yytext) - 2);
+ piece_append("<PLex_Section2_Rule_Action>");
+
+                       if ( in_rule )
+                               {
+                               doing_rule_action = true;
+                               in_rule = false;
+#if 1
+ piece_pack();
+ piece_escape(yytext, 2);
+ piece_pack();
+ piece_append("<PLex_Text>");
+ return ~'\n';
+#else
+                               return '\n';
+#endif
+                               }
+#if 1 /* don't think this can really happen */
+ abort();
+#else
+ piece_flush(strlen(yytext));
+ piece_append("<PLex_Text>");
+#endif
+                       }
+       {WS}"|".*{NL}   {
+                        if (sf_skip_ws()){
+                            /* We're in the middle of a (?x: ) pattern. */
+                            /* Push back everything starting at the "|" */
+                            int amt = (int) (strchr (yytext, '|') - yytext);
+                            yyless(amt);
+                        }
+                        else {
+                            add_action("]""]");
+                            continued_action = true;
+                            ++linenum;
+#if 1
+ int i;
+ for (i = 0; yytext[i] == '\t' || yytext[i] == ' '; ++i)
+  ;
+ piece_flush(i);
+ piece_pack();
+ piece_append("<PLex_Section2_Rule_Action continued=\"true\">");
+ piece_escape(yytext, strlen(yytext));
+ piece_append("</PLex_Section2_Rule_Action>");
+ piece_pack();
+ return ~'\n';
+#else
+                            return '\n';
+#endif
+                        }
+                    }
+
+       ^{WS}"/*"       {
+
+                if (sf_skip_ws()){
+                    /* We're in the middle of a (?x: ) pattern. */
+                    yy_push_state(COMMENT_DISCARD);
+                }
+                else{
+                    yyless( yyleng - 2 );      /* put back '/', '*' */
+                    bracelevel = 0;
+                    continued_action = false;
+                    BEGIN(ACTION);
+                }
+                       }
+
+       ^{WS}           /* allow indented rules */ ;
+
+       {WS}            {
+            if (sf_skip_ws()){
+                /* We're in the middle of a (?x: ) pattern. */
+            }
+            else{
+                /* This rule is separate from the one below because
+                 * otherwise we get variable trailing context, so
+                 * we can't build the scanner using -{f,F}.
+                 */
+                bracelevel = 0;
+                continued_action = false;
+                BEGIN(ACTION);
+
+                if ( in_rule )
+                    {
+                    doing_rule_action = true;
+                    in_rule = false;
+#if 1
+ piece_pack();
+ piece_escape(yytext, strlen(yytext));
+ piece_pack();
+ piece_append("<PLex_Section2_Rule_Action><PLex_Text>");
+ return ~'\n';
+#else
+                    return '\n';
+#endif
+                    }
+            }
+                       }
+
+       {OPTWS}{NL}     {
+            if (sf_skip_ws()){
+                /* We're in the middle of a (?x: ) pattern. */
+                ++linenum;
+            }
+            else{
+                bracelevel = 0;
+                continued_action = false;
+                BEGIN(ACTION);
+#if 1
+ yyless(yyleng - 1);
+#else
+                unput( '\n' ); /* so <ACTION> sees it */
+#endif
+
+                if ( in_rule )
+                    {
+                    doing_rule_action = true;
+                    in_rule = false;
+#if 1
+ piece_pack();
+ piece_escape(yytext, strlen(yytext));
+ piece_pack();
+ piece_append("<PLex_Section2_Rule_Action><PLex_Text>");
+ return ~'\n';
+#else
+                    return '\n';
+#endif
+                    }
+            }
+                       }
+
+       ^{OPTWS}"<<EOF>>"       |
+       "<<EOF>>"       return EOF_OP;
+
+       ^"%%".*         {
+                       sectnum = 3;
+                       BEGIN(no_section3_escape ? SECT3_NOESCAPE : SECT3);
+                       outn("/* Begin user sect3 */");
+#if 1
+ piece_pack();
+ piece_append("</PLex_Section2>");
+ piece_escape(yytext, strlen(yytext));
+ piece_pack();
+ piece_append("<PLex_Section3>");
+ return ~YY_NULL;
+#else
+                       yyterminate(); /* to stop the parser */
+#endif
+
+                       }
+
+       "["({FIRST_CCL_CHAR}|{CCL_EXPR})({CCL_CHAR}|{CCL_EXPR})*        {
+                       int cclval;
+
+                       if(yyleng < MAXLINE)
+                        {
+                       strncpy( nmstr, yytext, sizeof(nmstr) );
+                        }
+                       else
+                        {
+                          synerr( _("Input line too long\n"));
+                          FLEX_EXIT(EXIT_FAILURE);
+                        }
+
+                       /* Check to see if we've already encountered this
+                        * ccl.
+                        */
+                       if (0 /* <--- This "0" effectively disables the reuse of a
+                   * character class (purely based on its source text).
+                   * The reason it was disabled is so yacc/bison can parse
+                   * ccl operations, such as ccl difference and union.
+                   */
+                &&  (cclval = ccllookup( nmstr )) != 0 )
+                               {
+                               if ( input() != ']' )
+                                       synerr( _( "bad character class" ) );
+
+                               yylval = cclval;
+                               ++cclreuse;
+                               return PREVCCL;
+                               }
+                       else
+                               {
+                               /* We fudge a bit.  We know that this ccl will
+                                * soon be numbered as lastccl + 1 by cclinit.
+                                */
+                               cclinstal( nmstr, lastccl + 1 );
+
+                               /* Push back everything but the leading bracket
+                                * so the ccl can be rescanned.
+                                */
+                               yyless( 1 );
+
+                               BEGIN(FIRSTCCL);
+                               return '[';
+                               }
+                       }
+    "{-}"       return CCL_OP_DIFF;
+    "{+}"       return CCL_OP_UNION;
+
+
+    /* Check for :space: at the end of the rule so we don't
+     * wrap the expanded regex in '(' ')' -- breaking trailing
+     * context.
+     */
+       "{"{NAME}"}"[[:space:]]?         {
+                       char *nmdefptr;
+            int end_is_ws, end_ch;
+
+            end_ch = yytext[yyleng-1];
+            end_is_ws = end_ch != '}' ? 1 : 0;
+
+                       if(yyleng-1 < MAXLINE)
+                        {
+                       strncpy( nmstr, yytext + 1, sizeof(nmstr) );
+                        }
+                       else
+                        {
+                          synerr( _("Input line too long\n"));
+                          FLEX_EXIT(EXIT_FAILURE);
+                        }
+nmstr[yyleng - 2 - end_is_ws] = '\0';  /* chop trailing brace */
+
+                       if ( (nmdefptr = ndlookup( nmstr )) == 0 )
+                               format_synerr(
+                                       _( "undefined definition {%s}" ),
+                                               nmstr );
+
+                       else
+                               { /* push back name surrounded by ()'s */
+                               size_t len = strlen( nmdefptr );
+                if (end_is_ws)
+#if 1
+ yyless(yyleng - 1);
+#else
+                    unput(end_ch);
+#endif
+
+                               if ( lex_compat || nmdefptr[0] == '^' ||
+                                    (len > 0 && nmdefptr[len - 1] == '$')
+                     || (end_is_ws && trlcontxt && !sf_skip_ws()))
+                                       { /* don't use ()'s after all */
+                                       PUT_BACK_STRING(nmdefptr, 0);
+
+                                       if ( nmdefptr[0] == '^' )
+                                               BEGIN(CARETISBOL);
+                                       }
+
+                               else
+                                       {
+                                       unput(')');
+                                       PUT_BACK_STRING(nmdefptr, 0);
+                                       unput('(');
+                                       }
+                               }
+                       }
+
+    "/*"        {
+                    if (sf_skip_ws())
+                        yy_push_state(COMMENT_DISCARD);
+                    else{
+                        /* Push back the "*" and return "/" as usual. */
+                        yyless(1);
+                        return '/';
+                    }
+                }
+
+    "(?#"       {
+                    if (lex_compat || posix_compat){
+                        /* Push back the "?#" and treat it like a normal parens. */
+                        yyless(1);
+                        sf_push(); 
+                        return '(';
+                    }
+                    else
+                        yy_push_state(EXTENDED_COMMENT);
+                }
+    "(?"        {
+                    sf_push();
+                    if (lex_compat || posix_compat)
+                        /* Push back the "?" and treat it like a normal parens. */
+                        yyless(1);
+                    else
+                        BEGIN(GROUP_WITH_PARAMS);
+                    return '(';
+                }
+    "("         sf_push(); return '(';
+    ")"         {
+                    if (_sf_top_ix > 0) {
+                        sf_pop();
+                        return ')';
+                    } else
+                        synerr(_("unbalanced parenthesis"));
+                }
+
+       [/|*+?.(){}]    return (unsigned char) yytext[0];
+       .               RETURNCHAR;
+
+       /* Nick added this rule for consistency with rest of scanner */
+       <<EOF>>         {
+                       sectnum = 0;
+#if 1
+ piece_pack();
+ piece_append("</PLex_Section2>");
+ piece_pack();
+ return ~YY_NULL;
+#else
+                       yyterminate(); /* to stop the parser */
+#endif
+                       }
+}
+
+
+<SC>{
+       {OPTWS}{NL}{OPTWS}      ++linenum;      /* Allow blank lines & continuations */
+       [,*]            return (unsigned char) yytext[0];
+       ">"             BEGIN(SECT2); return '>';
+       ">"/^           BEGIN(CARETISBOL); return '>';
+       {SCNAME}        RETURNNAME;
+       .               {
+                       format_synerr( _( "bad <start condition>: %s" ),
+                               yytext );
+                       }
+}
+
+<CARETISBOL>"^"                BEGIN(SECT2); return '^';
+
+
+<QUOTE>{
+       [^"\n]          RETURNCHAR;
+       \"              BEGIN(SECT2); return '"';
+
+       {NL}            {
+                       synerr( _( "missing quote" ) );
+                       BEGIN(SECT2);
+                       ++linenum;
+                       return '"';
+                       }
+}
+
+<GROUP_WITH_PARAMS>{
+    ":"     BEGIN(SECT2);
+    "-"     BEGIN(GROUP_MINUS_PARAMS);
+    i       sf_set_case_ins(1);
+    s       sf_set_dot_all(1);
+    x       sf_set_skip_ws(1);
+}
+<GROUP_MINUS_PARAMS>{
+    ":"     BEGIN(SECT2);
+    i       sf_set_case_ins(0);
+    s       sf_set_dot_all(0);
+    x       sf_set_skip_ws(0);
+}
+
+<FIRSTCCL>{
+       "^"/[^-\]\n]    BEGIN(CCL); return '^';
+       "^"/("-"|"]")   return '^';
+       .               BEGIN(CCL); RETURNCHAR;
+}
+
+<CCL>{
+       -/[^\]\n]       return '-';
+       [^\]\n]         RETURNCHAR;
+       "]"             BEGIN(SECT2); return ']';
+       .|{NL}          {
+                       synerr( _( "bad character class" ) );
+                       BEGIN(SECT2);
+                       return ']';
+                       }
+}
+
+<FIRSTCCL,CCL>{
+       "[:alnum:]"     BEGIN(CCL); return CCE_ALNUM;
+       "[:alpha:]"     BEGIN(CCL); return CCE_ALPHA;
+       "[:blank:]"     BEGIN(CCL); return CCE_BLANK;
+       "[:cntrl:]"     BEGIN(CCL); return CCE_CNTRL;
+       "[:digit:]"     BEGIN(CCL); return CCE_DIGIT;
+       "[:graph:]"     BEGIN(CCL); return CCE_GRAPH;
+       "[:lower:]"     BEGIN(CCL); return CCE_LOWER;
+       "[:print:]"     BEGIN(CCL); return CCE_PRINT;
+       "[:punct:]"     BEGIN(CCL); return CCE_PUNCT;
+       "[:space:]"     BEGIN(CCL); return CCE_SPACE;
+       "[:upper:]"     BEGIN(CCL); return CCE_UPPER;
+       "[:xdigit:]"    BEGIN(CCL); return CCE_XDIGIT;
+
+       "[:^alnum:]"    BEGIN(CCL); return CCE_NEG_ALNUM;
+       "[:^alpha:]"    BEGIN(CCL); return CCE_NEG_ALPHA;
+       "[:^blank:]"    BEGIN(CCL); return CCE_NEG_BLANK;
+       "[:^cntrl:]"    BEGIN(CCL); return CCE_NEG_CNTRL;
+       "[:^digit:]"    BEGIN(CCL); return CCE_NEG_DIGIT;
+       "[:^graph:]"    BEGIN(CCL); return CCE_NEG_GRAPH;
+       "[:^lower:]"    BEGIN(CCL); return CCE_NEG_LOWER;
+       "[:^print:]"    BEGIN(CCL); return CCE_NEG_PRINT;
+       "[:^punct:]"    BEGIN(CCL); return CCE_NEG_PUNCT;
+       "[:^space:]"    BEGIN(CCL); return CCE_NEG_SPACE;
+       "[:^upper:]"    BEGIN(CCL); return CCE_NEG_UPPER;
+       "[:^xdigit:]"   BEGIN(CCL); return CCE_NEG_XDIGIT;
+       {CCL_EXPR}      {
+                       format_synerr(
+                               _( "bad character class expression: %s" ),
+                                       yytext );
+                       BEGIN(CCL); return CCE_ALNUM;
+                       }
+}
+
+<NUM>{
+       [[:digit:]]+    {
+                       yylval = myctoi( yytext );
+                       return NUMBER;
+                       }
+
+       ","             return ',';
+       "}"             {
+                       BEGIN(SECT2);
+                       if ( lex_compat || posix_compat )
+                               return END_REPEAT_POSIX;
+                       else
+                               return END_REPEAT_FLEX;
+                       }
+
+       .               {
+                       synerr( _( "bad character inside {}'s" ) );
+                       BEGIN(SECT2);
+                       return '}';
+                       }
+
+       {NL}            {
+                       synerr( _( "missing }" ) );
+                       BEGIN(SECT2);
+                       ++linenum;
+                       return '}';
+                       }
+}
+
+
+<PERCENT_BRACE_ACTION>{
+       {OPTWS}"%}".*           bracelevel = 0; piece_append("</PLex_Text>");
+
+       <ACTION>"/*"            ACTION_ECHO; yy_push_state( CODE_COMMENT );
+
+       <CODEBLOCK,ACTION>{
+               "reject" {
+            ACTION_ECHO;
+            CHECK_REJECT(yytext);
+        }
+               "yymore" {
+            ACTION_ECHO;
+            CHECK_YYMORE(yytext);
+        }
+       }
+
+    .       ACTION_ECHO;
+       {NL}    {
+               ++linenum;
+               ACTION_ECHO;
+               if (bracelevel <= 0 || (doing_codeblock && indented_code)) {
+            if ( doing_rule_action )
+                add_action( "\tYY_BREAK]""]\n" );
+
+ piece_flush(strlen(yytext));
+ if (doing_codeblock)
+  piece_append("</PLex_Section1Or2_CodeBlock>");
+ else
+  markup_action("</PLex_Section2_Rule_Action>");
+            doing_rule_action = doing_codeblock = false;
+            BEGIN(SECT2);
+        }
+    }
+}
+
+
+       /* Reject and YYmore() are checked for above, in PERCENT_BRACE_ACTION */
+<ACTION>{
+       "{"             ACTION_ECHO; ++bracelevel;
+       "}"             ACTION_ECHO; --bracelevel;
+       [^[:alpha:]_{}\"'/\n\[\]]+      ACTION_ECHO;
+        {NAME}         ACTION_ECHO;
+        "'"([^\'\\\n]|\\.)"'" ACTION_ECHO; /* character constant */
+        "'"             ACTION_ECHO; BEGIN(CHARACTER_CONSTANT);
+       \"              ACTION_ECHO; BEGIN(ACTION_STRING);
+       {NL} {
+                ++linenum;
+                ACTION_ECHO;
+                if (bracelevel <= 0) {
+                   if ( doing_rule_action )
+ {
+                      add_action( "\tYY_BREAK]""]\n" );
+  piece_flush(strlen(yytext));
+  markup_action("</PLex_Text></PLex_Section2_Rule_Action>");
+ }
+
+                   doing_rule_action = false;
+                   BEGIN(SECT2);
+                }
+             }
+        .      ACTION_ECHO;
+}
+
+<ACTION_STRING>{
+       [^\[\]\"\\\n]+  ACTION_ECHO;
+       \"              ACTION_ECHO; BEGIN(ACTION);
+}
+<CHARACTER_CONSTANT>{
+       [^\[\]\'\\\n]+  ACTION_ECHO;
+        \'              ACTION_ECHO; BEGIN(ACTION);
+}
+<ACTION_STRING,CHARACTER_CONSTANT>{
+        (\\\n)*         ACTION_ECHO;
+       \\(\\\n)*.      ACTION_ECHO;
+       {NL}    ++linenum; ACTION_ECHO; if (bracelevel <= 0) { BEGIN(SECT2); piece_flush(strlen(yytext)); if (doing_rule_action) markup_action("</PLex_Text></PLex_Section2_Rule_Action>"); } else { BEGIN(ACTION); }
+        .      ACTION_ECHO;
+}
+
+<COMMENT,CODE_COMMENT,COMMENT_DISCARD,ACTION,ACTION_STRING,CHARACTER_CONSTANT><<EOF>>  {
+                       synerr( _( "EOF encountered inside an action" ) );
+                       yyterminate();
+                       }
+
+<EXTENDED_COMMENT,GROUP_WITH_PARAMS,GROUP_MINUS_PARAMS><<EOF>> {
+                       synerr( _( "EOF encountered inside pattern" ) );
+                       yyterminate();
+                       }
+
+<SECT2,QUOTE,FIRSTCCL,CCL>{ESCSEQ}     {
+                       yylval = myesc( (unsigned char *) yytext );
+
+                       if ( YY_START == FIRSTCCL )
+                               BEGIN(CCL);
+
+                       return CHAR;
+                       }
+
+<SECT3>{
+    {M4QSTART}   fputs(escaped_qstart, yyout);
+    {M4QEND}     fputs(escaped_qend, yyout);
+    [^\[\]]*     ECHO;
+    [][]         ECHO;
+    <<EOF>>      {
+        sectnum = 0;
+#if 1
+ piece_pack();
+ piece_append("</PLex_Section3>");
+ piece_pack();
+ return ~YY_NULL;
+#else
+        yyterminate();
+#endif
+    }
+}
+<SECT3_NOESCAPE>{
+    {M4QSTART}  fprintf(yyout, "[""[%s]""]", escaped_qstart);
+    {M4QEND}    fprintf(yyout, "[""[%s]""]", escaped_qend);
+    [^][]*      ECHO;
+    [][]        ECHO;
+    <<EOF>>            {
+       sectnum = 0;
+#if 1
+ piece_pack();
+ piece_append("</PLex_Section3>");
+ piece_pack();
+ return ~YY_NULL;
+#else
+       yyterminate();
+#endif
+    }
+}
+<*>.|\n                        format_synerr( _( "bad character: %s" ), yytext );
+
+%%
+
+
+int yywrap(void)
+       {
+       if ( --num_input_files > 0 )
+               {
+               set_input_file( *++input_files );
+               return 0;
+               }
+
+       else
+               return 1;
+       }
+
+
+/* set_input_file - open the given file (if NULL, stdin) for scanning */
+
+void set_input_file( char *file )
+       {
+       if ( file && strcmp( file, "-" ) )
+               {
+               infilename = xstrdup(file);
+               yyin = fopen( infilename, "r" );
+
+               if ( yyin == NULL )
+                       lerr( _( "can't open %s" ), file );
+               }
+
+       else
+               {
+               yyin = stdin;
+               infilename = xstrdup("<stdin>");
+               }
+
+       linenum = 1;
+       }
+
+/* Nick */
+void piece_append(const char *str) {
+ piece[piece1++] = strdup(str);
+}
+
+void piece_insert(int n, const char *str) {
+ memmove(piece + n + 1, piece + n, (piece1 - n) * sizeof(char *));
+ piece[n] = strdup(str);
+ ++piece1;
+}
+
+void piece_escape(const char *p, size_t n) {
+ size_t i, j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+  case '>':
+   j += 4;
+   break;
+  case '&':
+   j += 5;
+   break;
+  default:
+   ++j;
+   break;
+  }
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = 0; i < n; ++i)
+  switch (p[i]) {
+  case '<':
+   memcpy(q + j, "&lt;", 4);
+   j += 4;
+   break;
+  case '>':
+   memcpy(q + j, "&gt;", 4);
+   j += 4;
+   break;
+  case '&':
+   memcpy(q + j, "&amp;", 5);
+   j += 5;
+   break;
+  default:
+   q[j++] = p[i];
+   break;
+  }
+ q[j] = 0;
+ piece[piece1++] = q;
+}
+
+void piece_flush(size_t n) {
+ piece_escape(yytext, n);
+ yytext += n;
+}
+
+void piece_pack() {
+ int i;
+ size_t j = 0;
+ for (i = piece0; i < piece1; ++i)
+  j += strlen(piece[i]);
+ char *q = malloc(j + 1);
+ j = 0;
+ for (i = piece0; i < piece1; ++i) {
+  int k = strlen(piece[i]);
+  memcpy(q + j, piece[i], k);
+  free(piece[i]);
+  j += k;
+ }
+ q[j] = 0;
+ piece[piece0++] = q;
+ piece1 = piece0;
+}
+
+int flexscan(void) {
+ int result = real_flexscan();
+ if (result < 0)
+  return ~result;
+ piece_pack();
+ piece_escape(yytext, strlen(yytext));
+ piece_pack();
+ return result;
+}
+
+static void markup_action(const char *text) {
+ /* append to last token text so it appears inside <PLex_Section2_Rule>..</PLex_Section2_Rule> */
+ /* a problem here is that Rule has already been reduced (marked up), */
+ /* because we returned a '\n' token when we detected start of action, */
+ /* hence we need to move the closing </PLex_Section2_Rule> tag over to our right */
+ int i = strlen(piece[--piece0]);
+ if (i < 21 || strcmp(piece[piece0] + i - 21, "</PLex_Section2_Rule>") != 0)
+  abort();
+ piece[piece0][i - 21] = 0;
+ piece_append(text);
+ piece_append("</PLex_Section2_Rule>");
+ piece_pack();
+}
+
+static void markup_option(const char *name, int sense) {
+ /* a problem here is that we couldn't apply markup when scanning the "no" */
+ /* prefix because we didn't know what option it was, back up to include it */
+ int i = piece1;
+ while (--i >= piece0 && strcmp(piece[i], "no") == 0)
+  ;
+ sprintf(piece_temp, "<PLex_Section1_Options_%s%s>", name, sense ? " value=\"true\"" : "");
+ piece_insert(i + 1, piece_temp);
+ piece_flush(strlen(yytext));
+ sprintf(piece_temp, "</PLex_Section1_Options_%s>", name);
+ piece_append(piece_temp);
+ /* append to last token text so it appears inside <PLex_Section1_Options>..</PLex_Section1_Options> */
+ --piece0;
+ piece_pack();
+}
diff --git a/work.py b/work.py
new file mode 100644 (file)
index 0000000..cf832c4
--- /dev/null
+++ b/work.py
@@ -0,0 +1,173 @@
+import sys
+import element
+
+def yychunk_line(root, fin):
+  line = fin.readline()
+  while len(line):
+    element.set_text(root, -1, element.get_text(root, -1) + line)
+    yield
+    line = fin.readline()
+
+def yychunk_block(root, fin, count):
+  block = fin.read(count)
+  while len(block):
+    element.set_text(root, -1, element.get_text(root, -1) + line)
+    yield
+    block = fin.read(count)
+
+def replace_with_element(root, pos0, off0, pos1, off1, child):
+  if pos0 < 0:
+    pos0, off0 = element.to_start_relative(root, pos0, off0)
+  if pos1 < 0:
+    pos1, off1 = element.to_start_relative(root, pos1, off1)
+  count = pos1 - pos0
+  assert count >= 0
+
+  temp = element.get_text(root, pos1)
+  root[pos0:pos1] = [child]
+  element.set_text(root, pos0 + 1, temp[off1:])
+  if count != 0:
+    temp = element.get_text(root, pos0)
+  element.set_text(root, pos0, temp[:off0])
+
+def replace_with_text(root, mark, i, j, text):
+  (pos0, off0) = mark[i]
+  (pos1, off1) = mark[j]
+  count = pos1 - pos0
+  assert count >= 0
+
+  temp = element.get_tail(root, pos1)
+  del root[pos0 + 1:pos1 + 1]
+  element.set_tail(
+    root,
+    pos0,
+    element.get_tail(root, pos0)[:off0] + text + temp[off1:]
+  )
+
+  if j != i + 1:
+    mark[i + 1:j + 1] = [mark[j]]
+  k = i + 1
+  delta_pos = -count
+  delta_off = off0 + len(text) - off1
+  while k < len(mark):
+    (pos2, off2) = mark[k]
+    if pos2 > pos1:
+      break
+    mark[k] = (pos2 + delta_pos, off2 + delta_off)
+    k += 1
+  if delta_pos != 0:
+    while k < len(mark):
+      (pos2, off2) = mark[k]
+      mark[k] = (pos2 + delta_pos, off2)
+      k += 1
+
+def replace_with_content(root, mark, i, j, child):
+  text = element.get_tail(child, -1)
+  if len(child) == 0:
+    replace_with_text(root, mark, i, j, text)
+  else:
+    (pos0, off0) = mark[i]
+    (pos1, off1) = mark[j]
+    count = pos1 - pos0
+    assert count >= 0
+  
+    temp = element.get_tail(root, pos1)
+    root[pos0 + 1:pos1 + 1] = child[:]
+    tail = element.get_tail(root, pos0 + len(child))
+    element.set_tail(root, pos0 + len(child), tail + temp[off1:])
+    if count != 0:
+      temp = element.get_tail(root, pos0)
+    element.set_tail(root, pos0, temp[:off0] + text)
+  
+    if j != i + 1:
+      mark[i + 1:j + 1] = [mark[j]]
+    k = i + 1
+    delta_pos = len(child) - count
+    delta_off = len(tail) - off1
+    while k < len(mark):
+      (pos2, off2) = mark[k]
+      if pos2 > pos1:
+        break
+      mark[k] = (pos2 + delta_pos, off2 + delta_off)
+      k += 1
+    if delta_pos != 0:
+      while k < len(mark):
+        (pos2, off2) = mark[k]
+        mark[k] = (pos2 + delta_pos, off2)
+        k += 1
+
+def extract_element(root, mark, i, j, factory, *args, **kwargs):
+  (pos0, off0) = mark[i]
+  (pos1, off1) = mark[j]
+  count = pos1 - pos0
+  assert count >= 0
+
+  result = factory(*args, **kwargs)
+  result[:] = [i.copy() for i in root[pos0 + 1:pos1 + 1]]
+  tail = element.get_tail(root, pos1)
+  if count == 0:
+    element.set_tail(result, -1, tail[off0:off1])
+  else:
+    element.set_tail(result, count - 1, tail[:off1])
+    tail = element.get_tail(root, pos0)
+    element.set_tail(result, -1, tail[off0:])
+  return result
+
+def extract_text(root, mark, i, j):
+  (pos0, off0) = mark[i]
+  (pos1, off1) = mark[j]
+  #result = [element.get_tail(root, i) for i in range(pos0, pos1 + 1)]
+  #result[-1] = result[-1][:off1]
+  #result[0] = result[0][off0:]
+  #return ''.join(result)
+  assert pos1 == pos0
+  return element.get_tail(root, pos0)[off0:off1]
+
+def apply_markup(root, pos0, off0, pos1, off1, factory, *args, **kwargs):
+  if pos0 < 0:
+    pos0, off0 = element.to_start_relative(root, pos0, off0)
+  if pos1 < 0:
+    pos1, off1 = element.to_start_relative(root, pos1, off1)
+  count = pos1 - pos0
+  assert count >= 0
+
+  child = factory(*args, **kwargs)
+  child[:] = root[pos0:pos1]
+
+  tail = element.get_text(root, pos1)
+  # at present, if count > 0, child[-1] is shared with root[pos1 - 1],
+  # so we cannot change child[-1].tail until after the replacement
+  if count == 0:
+    replace_with_element(root, pos0, off0, pos1, off1, child)
+    element.set_text(child, 0, tail[off0:off1])
+  else:
+    temp = element.get_text(root, pos0)
+    replace_with_element(root, pos0, off0, pos1, off1, child)
+    element.set_text(child, count, tail[:off1])
+    element.set_text(child, 0, temp[off0:])
+  return child
+
+def dump(root, mark):
+  i = 0
+  pos = -1
+  result = ''
+  while True:
+    assert i >= len(mark) or mark[i][0] >= pos
+    tail = element.get_tail(root, pos) 
+    off = 0
+    while off < len(tail) or (i < len(mark) and mark[i][0] == pos):
+      end = len(tail) if i >= len(mark) or mark[i][0] != pos else mark[i][1]
+      if end > off:
+        result += tail[off:end].replace('\n', '(lf)').replace('\t', '(tab)')
+        off = end
+      if i < len(mark) and mark[i][0] == pos:
+        result += '({0:d})'.format(i)
+        i += 1
+    pos += 1
+    if pos >= len(root):
+      break
+    result += '({0:s}{1:d})'.format(root[pos].tag, pos)
+  assert i >= len(mark)
+  result += '(eof)'
+  sys.stdout.write('{0:s}\n'.format(result[-159:])) #79:]))
+  sys.stdout.flush()
diff --git a/wrap_repr.py b/wrap_repr.py
new file mode 100644 (file)
index 0000000..935e8c4
--- /dev/null
@@ -0,0 +1,24 @@
+def wrap_repr(text, width):
+  lines = []
+  i = 0
+  while i < len(text):
+    j = i + width
+    if j < len(text):
+      j = max(
+        [
+          text.rfind('(', i, j) + 1,
+          text.rfind('[', i, j) + 1,
+          text.rfind('{', i, j) + 1,
+          text.rfind('.', i, j) + 1,
+          text.rfind(')', i, j + 1),
+          text.rfind(']', i, j + 1),
+          text.rfind('}', i, j + 1),
+          text.rfind(' ', i, j + 1),
+        ]
+      )
+      assert j > 0
+    lines.append(text[i:j] + '\n')
+    i = j
+    while text[i:i + 1] == ' ':
+      i += 1
+  return ''.join(lines) 
diff --git a/xml_to_l.py b/xml_to_l.py
new file mode 100755 (executable)
index 0000000..1035c3e
--- /dev/null
@@ -0,0 +1,47 @@
+#!/usr/bin/env python3
+
+import c_to_python
+import sys
+import xml.etree.ElementTree
+
+root = xml.etree.ElementTree.parse(sys.stdin).getroot()
+text = c_to_python.extract(root)
+
+# see tests/scan.l
+text = text.replace(r'{WS}[[:blank:]]+', '{WS}')
+text = text.replace(r'{WS}([[:blank:]]+)', '{WS}')
+text = text.replace(r'{OPTWS}[[:blank:]]*', '{OPTWS}')
+text = text.replace(r'{OPTWS}([[:blank:]]*)', '{OPTWS}')
+text = text.replace(r'{NOT_WS}[^[:blank:]\r\n]', '{NOT_WS}')
+text = text.replace(r'{NOT_WS}([^[:blank:]\r\n])', '{NOT_WS}')
+
+text = text.replace(r'{NL}\r?\n', '{NL}')
+text = text.replace(r'{NL}(\r?\n)', '{NL}')
+
+text = text.replace(r'{NAME}([[:alpha:]_][[:alnum:]_-]*)', '{NAME}')
+text = text.replace(r'{NAME}(([[:alpha:]_][[:alnum:]_-]*))', '{NAME}')
+text = text.replace(r'{NOT_NAME}[^[:alpha:]_*\n]+', '{NOT_NAME}')
+text = text.replace(r'{NOT_NAME}([^[:alpha:]_*\n]+)', '{NOT_NAME}')
+
+text = text.replace(r'{SCNAME}{NAME}', '{SCNAME}')
+text = text.replace(r'{SCNAME}({NAME})', '{SCNAME}')
+
+text = text.replace(r'{ESCSEQ}(\\([^\n]|[0-7]{1,3}|x[[:xdigit:]]{1,2}))', '{ESCSEQ}')
+text = text.replace(r'{ESCSEQ}((\\([^\n]|[0-7]{1,3}|x[[:xdigit:]]{1,2})))', '{ESCSEQ}')
+
+text = text.replace(r'{FIRST_CCL_CHAR}([^\\\n]|{ESCSEQ})', '{FIRST_CCL_CHAR}')
+text = text.replace(r'{FIRST_CCL_CHAR}(([^\\\n]|{ESCSEQ}))', '{FIRST_CCL_CHAR}')
+text = text.replace(r'{CCL_CHAR}([^\\\n\]]|{ESCSEQ})', '{CCL_CHAR}')
+text = text.replace(r'{CCL_CHAR}(([^\\\n\]]|{ESCSEQ}))', '{CCL_CHAR}')
+text = text.replace(r'{CCL_EXPR}("[:"^?[[:alpha:]]+":]")', '{CCL_EXPR}')
+text = text.replace(r'{CCL_EXPR}(("[:"^?[[:alpha:]]+":]"))', '{CCL_EXPR}')
+
+text = text.replace(r'{LEXOPT}[aceknopr]', '{LEXOPT}')
+text = text.replace(r'{LEXOPT}([aceknopr])', '{LEXOPT}')
+
+text = text.replace(r'{M4QSTART}"[""["', '{M4QSTART}')
+text = text.replace(r'{M4QSTART}("[""[")', '{M4QSTART}')
+text = text.replace(r'{M4QEND}"]""]"', '{M4QEND}')
+text = text.replace(r'{M4QEND}("]""]")', '{M4QEND}')
+
+sys.stdout.write(text)