UNPKG

univac

Version:

Generate AST of lots of common programming languages using antlr4. JavaScript API and CLI tool.

11,646 lines 425 kB
// @ts-nocheck
// Generated from C.g4 by ANTLR 4.7.2
// jshint ignore: start
var antlr4 = require('antlr4/index');
var CListener = require('./CListener').CListener;
var grammarFileName = "C.g4";


var serializedATN = ["\u0003\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964",
    "\u0003x\u0516\u0004\u0002\t\u0002\u0004\u0003\t\u0003\u0004\u0004\t",
    "\u0004\u0004\u0005\t\u0005\u0004\u0006\t\u0006\u0004\u0007\t\u0007\u0004",
    "\b\t\b\u0004\t\t\t\u0004\n\t\n\u0004\u000b\t\u000b\u0004\f\t\f\u0004",
    "\r\t\r\u0004\u000e\t\u000e\u0004\u000f\t\u000f\u0004\u0010\t\u0010\u0004",
    "\u0011\t\u0011\u0004\u0012\t\u0012\u0004\u0013\t\u0013\u0004\u0014\t",
    "\u0014\u0004\u0015\t\u0015\u0004\u0016\t\u0016\u0004\u0017\t\u0017\u0004",
    "\u0018\t\u0018\u0004\u0019\t\u0019\u0004\u001a\t\u001a\u0004\u001b\t",
    "\u001b\u0004\u001c\t\u001c\u0004\u001d\t\u001d\u0004\u001e\t\u001e\u0004",
    "\u001f\t\u001f\u0004 \t \u0004!\t!\u0004\"\t\"\u0004#\t#\u0004$\t$\u0004",
    "%\t%\u0004&\t&\u0004\'\t\'\u0004(\t(\u0004)\t)\u0004*\t*\u0004+\t+\u0004",
    ",\t,\u0004-\t-\u0004.\t.\u0004/\t/\u00040\t0\u00041\t1\u00042\t2\u0004",
    "3\t3\u00044\t4\u00045\t5\u00046\t6\u00047\t7\u00048\t8\u00049\t9\u0004",
    ":\t:\u0004;\t;\u0004<\t<\u0004=\t=\u0004>\t>\u0004?\t?\u0004@\t@\u0004",
    "A\tA\u0004B\tB\u0004C\tC\u0004D\tD\u0004E\tE\u0004F\tF\u0004G\tG\u0004",
    "H\tH\u0004I\tI\u0004J\tJ\u0004K\tK\u0004L\tL\u0004M\tM\u0004N\tN\u0004",
    "O\tO\u0004P\tP\u0004Q\tQ\u0004R\tR\u0004S\tS\u0004T\tT\u0004U\tU\u0004",
    "V\tV\u0004W\tW\u0004X\tX\u0003\u0002\u0003\u0002\u0003\u0002\u0006\u0002",
    "\u00b4\n\u0002\r\u0002\u000e\u0002\u00b5\u0003\u0002\u0003\u0002\u0003",
    "\u0002\u0003\u0002\u0003\u0002\u0003\u0002\u0005\u0002\u00be\n\u0002",
    "\u0003\u0002\u0003\u0002\u0003\u0002\u0003\u0002\u0003\u0002\u0003\u0002",
    "\u0003\u0002\u0003\u0002\u0003\u0002\u0003\u0002\u0003\u0002\u0003\u0002",
    "\u0003\u0002\u0003\u0002\u0003\u0002\u0003\u0002\u0003\u0002\u0003\u0002",
    "\u0005\u0002\u00d2\n\u0002\u0003\u0003\u0003\u0003\u0003\u0003\u0003",
    "\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0003\u0004\u0003\u0004\u0003",
    "\u0004\u0003\u0004\u0003\u0004\u0003\u0004\u0007\u0004\u00e1\n\u0004",
    "\f\u0004\u000e\u0004\u00e4\u000b\u0004\u0003\u0005\u0003\u0005\u0003",
    "\u0005\u0003\u0005\u0003\u0005\u0003\u0005\u0003\u0005\u0005\u0005\u00ed",
    "\n\u0005\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006",
    "\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006",
    "\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006",
    "\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006",
    "\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006",
    "\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0005\u0006",
    "\u0111\n\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003",
    "\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0005\u0006\u011b\n\u0006",
    "\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006",
    "\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0003\u0006\u0007\u0006",
    "\u0128\n\u0006\f\u0006\u000e\u0006\u012b\u000b\u0006\u0003\u0007\u0003",
    "\u0007\u0003\u0007\u0003\u0007\u0003\u0007\u0003\u0007\u0007\u0007\u0133",
    "\n\u0007\f\u0007\u000e\u0007\u0136\u000b\u0007\u0003\b\u0003\b\u0003",
    "\b\u0003\b\u0003\b\u0003\b\u0003\b\u0003\b\u0003\b\u0003\b\u0003\b\u0003",
    "\b\u0003\b\u0003\b\u0003\b\u0003\b\u0003\b\u0003\b\u0003\b\u0003\b\u0003",
    "\b\u0003\b\u0005\b\u014e\n\b\u0003\t\u0003\t\u0003\n\u0003\n\u0003\n",
    "\u0003\n\u0003\n\u0003\n\u0003\n\u0003\n\u0003\n\u0003\n\u0003\n\u0003",
    "\n\u0003\n\u0005\n\u015f\n\n\u0003\u000b\u0003\u000b\u0003\u000b\u0003",
    "\u000b\u0003\u000b\u0003\u000b\u0003\u000b\u0003\u000b\u0003\u000b\u0003",
    "\u000b\u0003\u000b\u0003\u000b\u0007\u000b\u016d\n\u000b\f\u000b\u000e",
    "\u000b\u0170\u000b\u000b\u0003\f\u0003\f\u0003\f\u0003\f\u0003\f\u0003",
    "\f\u0003\f\u0003\f\u0003\f\u0007\f\u017b\n\f\f\f\u000e\f\u017e\u000b",
    "\f\u0003\r\u0003\r\u0003\r\u0003\r\u0003\r\u0003\r\u0003\r\u0003\r\u0003",
    "\r\u0007\r\u0189\n\r\f\r\u000e\r\u018c\u000b\r\u0003\u000e\u0003\u000e",
    "\u0003\u000e\u0003\u000e\u0003\u000e\u0003\u000e\u0003\u000e\u0003\u000e",
    "\u0003\u000e\u0003\u000e\u0003\u000e\u0003\u000e\u0003\u000e\u0003\u000e",
    "\u0003\u000e\u0007\u000e\u019d\n\u000e\f\u000e\u000e\u000e\u01a0\u000b",
    "\u000e\u0003\u000f\u0003\u000f\u0003\u000f\u0003\u000f\u0003\u000f\u0003",
    "\u000f\u0003\u000f\u0003\u000f\u0003\u000f\u0007\u000f\u01ab\n\u000f",
    "\f\u000f\u000e\u000f\u01ae\u000b\u000f\u0003\u0010\u0003\u0010\u0003",
    "\u0010\u0003\u0010\u0003\u0010\u0003\u0010\u0007\u0010\u01b6\n\u0010",
    "\f\u0010\u000e\u0010\u01b9\u000b\u0010\u0003\u0011\u0003\u0011\u0003",
    "\u0011\u0003\u0011\u0003\u0011\u0003\u0011\u0007\u0011\u01c1\n\u0011",
    "\f\u0011\u000e\u0011\u01c4\u000b\u0011\u0003\u0012\u0003\u0012\u0003",
    "\u0012\u0003\u0012\u0003\u0012\u0003\u0012\u0007\u0012\u01cc\n\u0012",
    "\f\u0012\u000e\u0012\u01cf\u000b\u0012\u0003\u0013\u0003\u0013\u0003",
    "\u0013\u0003\u0013\u0003\u0013\u0003\u0013\u0007\u0013\u01d7\n\u0013",
    "\f\u0013\u000e\u0013\u01da\u000b\u0013\u0003\u0014\u0003\u0014\u0003",
    "\u0014\u0003\u0014\u0003\u0014\u0003\u0014\u0007\u0014\u01e2\n\u0014",
    "\f\u0014\u000e\u0014\u01e5\u000b\u0014\u0003\u0015\u0003\u0015\u0003",
    "\u0015\u0003\u0015\u0003\u0015\u0003\u0015\u0005\u0015\u01ed\n\u0015",
    "\u0003\u0016\u0003\u0016\u0003\u0016\u0003\u0016\u0003\u0016\u0003\u0016",
    "\u0005\u0016\u01f5\n\u0016\u0003\u0017\u0003\u0017\u0003\u0018\u0003",
    "\u0018\u0003\u0018\u0003\u0018\u0003\u0018\u0003\u0018\u0007\u0018\u01ff",
    "\n\u0018\f\u0018\u000e\u0018\u0202\u000b\u0018\u0003\u0019\u0003\u0019",
    "\u0003\u001a\u0003\u001a\u0003\u001a\u0003\u001a\u0003\u001a\u0003\u001a",
    "\u0003\u001a\u0003\u001a\u0005\u001a\u020e\n\u001a\u0003\u001b\u0006",
    "\u001b\u0211\n\u001b\r\u001b\u000e\u001b\u0212\u0003\u001c\u0006\u001c",
    "\u0216\n\u001c\r\u001c\u000e\u001c\u0217\u0003\u001d\u0003\u001d\u0003",
    "\u001d\u0003\u001d\u0003\u001d\u0005\u001d\u021f\n\u001d\u0003\u001e",
    "\u0003\u001e\u0003\u001e\u0003\u001e\u0003\u001e\u0003\u001e\u0007\u001e",
    "\u0227\n\u001e\f\u001e\u000e\u001e\u022a\u000b\u001e\u0003\u001f\u0003",
    "\u001f\u0003\u001f\u0003\u001f\u0003\u001f\u0005\u001f\u0231\n\u001f",
    "\u0003 \u0003 \u0003!\u0003!\u0003!\u0003!\u0003!\u0003!\u0003!\u0003",
    "!\u0003!\u0003!\u0003!\u0003!\u0003!\u0003!\u0003!\u0005!\u0244\n!\u0003",
    "!\u0003!\u0007!\u0248\n!\f!\u000e!\u024b\u000b!\u0003\"\u0003\"\u0005",
    "\"\u024f\n\"\u0003\"\u0003\"\u0003\"\u0003\"\u0003\"\u0003\"\u0003\"",
    "\u0005\"\u0258\n\"\u0003#\u0003#\u0003$\u0003$\u0003$\u0003$\u0003$",
    "\u0007$\u0261\n$\f$\u000e$\u0264\u000b$\u0003%\u0003%\u0005%\u0268\n",
    "%\u0003%\u0003%\u0003%\u0005%\u026d\n%\u0003&\u0003&\u0005&\u0271\n",
    "&\u0003&\u0003&\u0005&\u0275\n&\u0005&\u0277\n&\u0003\'\u0003\'\u0003",
    "\'\u0003\'\u0003\'\u0003\'\u0007\'\u027f\n\'\f\'\u000e\'\u0282\u000b",
    "\'\u0003(\u0003(\u0005(\u0286\n(\u0003(\u0003(\u0005(\u028a\n(\u0003",
    ")\u0003)\u0005)\u028e\n)\u0003)\u0003)\u0003)\u0003)\u0003)\u0003)\u0005",
    ")\u0296\n)\u0003)\u0003)\u0003)\u0003)\u0003)\u0003)\u0003)\u0005)\u029f",
    "\n)\u0003*\u0003*\u0003*\u0003*\u0003*\u0003*\u0007*\u02a7\n*\f*\u000e",
    "*\u02aa\u000b*\u0003+\u0003+\u0003+\u0003+\u0003+\u0005+\u02b1\n+\u0003",
    ",\u0003,\u0003-\u0003-\u0003-\u0003-\u0003-\u0003.\u0003.\u0003/\u0003",
    "/\u0003/\u0003/\u0003/\u0003/\u0005/\u02c2\n/\u00030\u00030\u00030\u0003",
    "0\u00030\u00030\u00030\u00030\u00030\u00030\u00050\u02ce\n0\u00031\u0005",
    "1\u02d1\n1\u00031\u00031\u00071\u02d5\n1\f1\u000e1\u02d8\u000b1\u0003",
    "2\u00032\u00032\u00032\u00032\u00032\u00032\u00032\u00032\u00032\u0003",
    "2\u00052\u02e5\n2\u00032\u00032\u00032\u00032\u00052\u02eb\n2\u0003",
    "2\u00032\u00032\u00052\u02f0\n2\u00032\u00052\u02f3\n2\u00032\u0003",
    "2\u00032\u00032\u00032\u00052\u02fa\n2\u00032\u00032\u00032\u00032\u0003",
    "2\u00032\u00032\u00032\u00032\u00032\u00032\u00032\u00032\u00052\u0309",
    "\n2\u00032\u00032\u00032\u00032\u00032\u00032\u00032\u00032\u00032\u0003",
    "2\u00052\u0315\n2\u00032\u00072\u0318\n2\f2\u000e2\u031b\u000b2\u0003",
    "3\u00033\u00033\u00063\u0320\n3\r3\u000e3\u0321\u00033\u00033\u0005",
    "3\u0326\n3\u00034\u00034\u00034\u00034\u00034\u00034\u00034\u00035\u0003",
    "5\u00035\u00075\u0332\n5\f5\u000e5\u0335\u000b5\u00035\u00055\u0338",
    "\n5\u00036\u00036\u00036\u00056\u033d\n6\u00036\u00056\u0340\n6\u0003",
    "6\u00056\u0343\n6\u00037\u00037\u00037\u00037\u00037\u00077\u034a\n",
    "7\f7\u000e7\u034d\u000b7\u00038\u00038\u00058\u0351\n8\u00038\u0003",
    "8\u00058\u0355\n8\u00038\u00038\u00038\u00058\u035a\n8\u00038\u0003",
    "8\u00058\u035e\n8\u00038\u00058\u0361\n8\u00039\u00039\u00039\u0003",
    "9\u00039\u00079\u0368\n9\f9\u000e9\u036b\u000b9\u0003:\u0003:\u0003",
    ":\u0003:\u0003:\u0005:\u0372\n:\u0003;\u0003;\u0003;\u0003;\u0003;\u0003",
    ";\u0007;\u037a\n;\f;\u000e;\u037d\u000b;\u0003<\u0003<\u0003<\u0003",
    "<\u0003<\u0005<\u0384\n<\u0005<\u0386\n<\u0003=\u0003=\u0003=\u0003",
    "=\u0003=\u0003=\u0007=\u038e\n=\f=\u000e=\u0391\u000b=\u0003>\u0003",
    ">\u0005>\u0395\n>\u0003?\u0003?\u0005?\u0399\n?\u0003?\u0003?\u0007",
    "?\u039d\n?\f?\u000e?\u03a0\u000b?\u0005?\u03a2\n?\u0003@\u0003@\u0003",
    "@\u0003@\u0003@\u0007@\u03a9\n@\f@\u000e@\u03ac\u000b@\u0003@\u0003",
    "@\u0005@\u03b0\n@\u0003@\u0005@\u03b3\n@\u0003@\u0003@\u0003@\u0003",
    "@\u0005@\u03b9\n@\u0003@\u0003@\u0003@\u0003@\u0003@\u0003@\u0003@\u0003",
    "@\u0003@\u0003@\u0003@\u0003@\u0003@\u0003@\u0005@\u03c9\n@\u0003@\u0003",
    "@\u0007@\u03cd\n@\f@\u000e@\u03d0\u000b@\u0005@\u03d2\n@\u0003@\u0003",
    "@\u0003@\u0005@\u03d7\n@\u0003@\u0005@\u03da\n@\u0003@\u0003@\u0003",
    "@\u0003@\u0003@\u0005@\u03e1\n@\u0003@\u0003@\u0003@\u0003@\u0003@\u0003",
    "@\u0003@\u0003@\u0003@\u0003@\u0003@\u0003@\u0003@\u0003@\u0003@\u0003",
    "@\u0003@\u0005@\u03f4\n@\u0003@\u0003@\u0007@\u03f8\n@\f@\u000e@\u03fb",
    "\u000b@\u0007@\u03fd\n@\f@\u000e@\u0400\u000b@\u0003A\u0003A\u0003B",
    "\u0003B\u0003B\u0003B\u0003B\u0003B\u0003B\u0003B\u0003B\u0003B\u0005",
    "B\u040e\nB\u0003C\u0003C\u0005C\u0412\nC\u0003C\u0003C\u0003C\u0003",
    "C\u0003C\u0005C\u0419\nC\u0003C\u0007C\u041c\nC\fC\u000eC\u041f\u000b",
    "C\u0003D\u0003D\u0003D\u0003E\u0003E\u0003E\u0003E\u0003E\u0007E\u0429",
    "\nE\fE\u000eE\u042c\u000bE\u0003F\u0003F\u0003F\u0003F\u0003F\u0003",
    "F\u0005F\u0434\nF\u0003G\u0003G\u0003G\u0003G\u0003G\u0006G\u043b\n",
    "G\rG\u000eG\u043c\u0003G\u0003G\u0003G\u0003H\u0003H\u0003H\u0003H\u0003",
    "H\u0003H\u0003H\u0003H\u0003H\u0003H\u0003H\u0003H\u0007H\u044e\nH\f",
    "H\u000eH\u0451\u000bH\u0005H\u0453\nH\u0003H\u0003H\u0003H\u0003H\u0007",
    "H\u0459\nH\fH\u000eH\u045c\u000bH\u0005H\u045e\nH\u0007H\u0460\nH\f",
    "H\u000eH\u0463\u000bH\u0003H\u0003H\u0005H\u0467\nH\u0003I\u0003I\u0003",
    "I\u0003I\u0003I\u0003I\u0003I\u0003I\u0003I\u0003I\u0003I\u0005I\u0474",
    "\nI\u0003J\u0003J\u0005J\u0478\nJ\u0003J\u0003J\u0003K\u0003K\u0003",
    "K\u0003K\u0003K\u0007K\u0481\nK\fK\u000eK\u0484\u000bK\u0003L\u0003",
    "L\u0005L\u0488\nL\u0003M\u0005M\u048b\nM\u0003M\u0003M\u0003N\u0003",
    "N\u0003N\u0003N\u0003N\u0003N\u0003N\u0005N\u0496\nN\u0003N\u0003N\u0003",
    "N\u0003N\u0003N\u0003N\u0005N\u049e\nN\u0003O\u0003O\u0003O\u0003O\u0003",
    "O\u0003O\u0003O\u0003O\u0003O\u0003O\u0003O\u0003O\u0003O\u0003O\u0003",
    "O\u0003O\u0003O\u0003O\u0003O\u0003O\u0005O\u04b4\nO\u0003P\u0003P\u0003",
    "P\u0005P\u04b9\nP\u0003P\u0003P\u0005P\u04bd\nP\u0003P\u0005P\u04c0",
    "\nP\u0003P\u0003P\u0005P\u04c4\nP\u0003P\u0003P\u0005P\u04c8\nP\u0005",
    "P\u04ca\nP\u0003Q\u0003Q\u0003Q\u0003Q\u0005Q\u04d0\nQ\u0003R\u0003",
    "R\u0003R\u0003R\u0003R\u0003R\u0007R\u04d8\nR\fR\u000eR\u04db\u000b",
    "R\u0003S\u0003S\u0003S\u0003S\u0003S\u0003S\u0003S\u0003S\u0003S\u0005",
    "S\u04e6\nS\u0003S\u0003S\u0003S\u0003S\u0003S\u0005S\u04ed\nS\u0003",
    "T\u0005T\u04f0\nT\u0003T\u0003T\u0003U\u0003U\u0003U\u0003U\u0003U\u0007",
    "U\u04f9\nU\fU\u000eU\u04fc\u000bU\u0003V\u0003V\u0003V\u0005V\u0501",
    "\nV\u0003W\u0005W\u0504\nW\u0003W\u0003W\u0005W\u0508\nW\u0003W\u0003",
    "W\u0003X\u0003X\u0003X\u0003X\u0003X\u0007X\u0511\nX\fX\u000eX\u0514",
    "\u000bX\u0003X\u0002 \u0006\n\f\u0014\u0016\u0018\u001a\u001c\u001e",
    " \"$&.:@FLRbptx~\u0084\u0088\u0094\u00a2\u00a8\u00aeY\u0002\u0004\u0006",
    "\b\n\f\u000e\u0010\u0012\u0014\u0016\u0018\u001a\u001c\u001e \"$&(*",
    ",.02468:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086",
    "\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098\u009a\u009c\u009e",
    "\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u0002\u000e\u0007\u0002",
    "IIKKMMPPUV\u0003\u0002[e\b\u0002\u0011\u0011\u001c\u001c$$**--<<\n\u0002",
    "\u0006\b\u0014\u0014\u0019\u0019\u001d\u001d\"#\'(/067\u0003\u0002\u0006",
    "\b\u0004\u0002++..\u0006\u0002\u0015\u0015%%1155\u0005\u0002\n\u000b",
    "!!::\u0004\u0002=>ZZ\u0003\u0002=>\u0004\u0002\r\r\u000f\u000f\u0004",
    "\u0002\u0010\u001011\u0002\u058b\u0002\u00d1\u0003\u0002\u0002\u0002",
    "\u0004\u00d3\u0003\u0002\u0002\u0002\u0006\u00da\u0003\u0002\u0002\u0002",
    "\b\u00ec\u0003\u0002\u0002\u0002\n\u0110\u0003\u0002\u0002\u0002\f\u012c",
    "\u0003\u0002\u0002\u0002\u000e\u014d\u0003\u0002\u0002\u0002\u0010\u014f",
    "\u0003\u0002\u0002\u0002\u0012\u015e\u0003\u0002\u0002\u0002\u0014\u0160",
    "\u0003\u0002\u0002\u0002\u0016\u0171\u0003\u0002\u0002\u0002\u0018\u017f",
    "\u0003\u0002\u0002\u0002\u001a\u018d\u0003\u0002\u0002\u0002\u001c\u01a1",
    "\u0003\u0002\u0002\u0002\u001e\u01af\u0003\u0002\u0002\u0002 \u01ba",
    "\u0003\u0002\u0002\u0002\"\u01c5\u0003\u0002\u0002\u0002$\u01d0\u0003",
    "\u0002\u0002\u0002&\u01db\u0003\u0002\u0002\u0002(\u01e6\u0003\u0002",
    "\u0002\u0002*\u01f4\u0003\u0002\u0002\u0002,\u01f6\u0003\u0002\u0002",
    "\u0002.\u01f8\u0003\u0002\u0002\u00020\u0203\u0003\u0002\u0002\u0002",
    "2\u020d\u0003\u0002\u0002\u00024\u0210\u0003\u0002\u0002\u00026\u0215",
    "\u0003\u0002\u0002\u00028\u021e\u0003\u0002\u0002\u0002:\u0220\u0003",
    "\u0002\u0002\u0002<\u0230\u0003\u0002\u0002\u0002>\u0232\u0003\u0002",
    "\u0002\u0002@\u0243\u0003\u0002\u0002\u0002B\u0257\u0003\u0002\u0002",
    "\u0002D\u0259\u0003\u0002\u0002\u0002F\u025b\u0003\u0002\u0002\u0002",
    "H\u026c\u0003\u0002\u0002\u0002J\u0276\u0003\u0002\u0002\u0002L\u0278",
    "\u0003\u0002\u0002\u0002N\u0289\u0003\u0002\u0002\u0002P\u029e\u0003",
    "\u0002\u0002\u0002R\u02a0\u0003\u0002\u0002\u0002T\u02b0\u0003\u0002",
    "\u0002\u0002V\u02b2\u0003\u0002\u0002\u0002X\u02b4\u0003\u0002\u0002",
    "\u0002Z\u02b9\u0003\u0002\u0002\u0002\\\u02c1\u0003\u0002\u0002\u0002",
    "^\u02cd\u0003\u0002\u0002\u0002`\u02d0\u0003\u0002\u0002\u0002b\u02ea",
    "\u0003\u0002\u0002\u0002d\u0325\u0003\u0002\u0002\u0002f\u0327\u0003",
    "\u0002\u0002\u0002h\u0337\u0003\u0002\u0002\u0002j\u0342\u0003\u0002",
    "\u0002\u0002l\u034b\u0003\u0002\u0002\u0002n\u0360\u0003\u0002\u0002",
    "\u0002p\u0362\u0003\u0002\u0002\u0002r\u0371\u0003\u0002\u0002\u0002",
    "t\u0373\u0003\u0002\u0002\u0002v\u0385\u0003\u0002\u0002\u0002x\u0387",
    "\u0003\u0002\u0002\u0002z\u0392\u0003\u0002\u0002\u0002|\u03a1\u0003",
    "\u0002\u0002\u0002~\u03d1\u0003\u0002\u0002\u0002\u0080\u0401\u0003",
    "\u0002\u0002\u0002\u0082\u040d\u0003\u0002\u0002\u0002\u0084\u040f\u0003",
    "\u0002\u0002\u0002\u0086\u0420\u0003\u0002\u0002\u0002\u0088\u0423\u0003",
    "\u0002\u0002\u0002\u008a\u0433\u0003\u0002\u0002\u0002\u008c\u0435\u0003",
    "\u0002\u0002\u0002\u008e\u0466\u0003\u0002\u0002\u0002\u0090\u0473\u0003",
    "\u0002\u0002\u0002\u0092\u0475\u0003\u0002\u0002\u0002\u0094\u047b\u0003",
    "\u0002\u0002\u0002\u0096\u0487\u0003\u0002\u0002\u0002\u0098\u048a\u0003",
    "\u0002\u0002\u0002\u009a\u049d\u0003\u0002\u0002\u0002\u009c\u04b3\u0003",
    "\u0002\u0002\u0002\u009e\u04c9\u0003\u0002\u0002\u0002\u00a0\u04cf\u0003",
    "\u0002\u0002\u0002\u00a2\u04d1\u0003\u0002\u0002\u0002\u00a4\u04ec\u0003",
    "\u0002\u0002\u0002\u00a6\u04ef\u0003\u0002\u0002\u0002\u00a8\u04f3\u0003",
    "\u0002\u0002\u0002\u00aa\u0500\u0003\u0002\u0002\u0002\u00ac\u0503\u0003",
    "\u0002\u0002\u0002\u00ae\u050b\u0003\u0002\u0002\u0002\u00b0\u00d2\u0007",
    "k\u0002\u0002\u00b1\u00d2\u0007l\u0002\u0002\u00b2\u00b4\u0007n\u0002",
    "\u0002\u00b3\u00b2\u0003\u0002\u0002\u0002\u00b4\u00b5\u0003\u0002\u0002",
    "\u0002\u00b5\u00b3\u0003\u0002\u0002\u0002\u00b5\u00b6\u0003\u0002\u0002",
    "\u0002\u00b6\u00d2\u0003\u0002\u0002\u0002\u00b7\u00b8\u0007=\u0002",
    "\u0002\u00b8\u00b9\u0005.\u0018\u0002\u00b9\u00ba\u0007>\u0002\u0002",
    "\u00ba\u00d2\u0003\u0002\u0002\u0002\u00bb\u00d2\u0005\u0004\u0003\u0002",
    "\u00bc\u00be\u0007\u0003\u0002\u0002\u00bd\u00bc\u0003\u0002\u0002\u0002",
    "\u00bd\u00be\u0003\u0002\u0002\u0002\u00be\u00bf\u0003\u0002\u0002\u0002",
    "\u00bf\u00c0\u0007=\u0002\u0002\u00c0\u00c1\u0005\u0092J\u0002\u00c1",
    "\u00c2\u0007>\u0002\u0002\u00c2\u00d2\u0003\u0002\u0002\u0002\u00c3",
    "\u00c4\u0007\u0004\u0002\u0002\u00c4\u00c5\u0007=\u0002\u0002\u00c5",
    "\u00c6\u0005\u000e\b\u0002\u00c6\u00c7\u0007Z\u0002\u0002\u00c7\u00c8",
    "\u0005z>\u0002\u00c8\u00c9\u0007>\u0002\u0002\u00c9\u00d2\u0003\u0002",
    "\u0002\u0002\u00ca\u00cb\u0007\u0005\u0002\u0002\u00cb\u00cc\u0007=",
    "\u0002\u0002\u00cc\u00cd\u0005z>\u0002\u00cd\u00ce\u0007Z\u0002\u0002",
    "\u00ce\u00cf\u0005\u000e\b\u0002\u00cf\u00d0\u0007>\u0002\u0002\u00d0",
    "\u00d2\u0003\u0002\u0002\u0002\u00d1\u00b0\u0003\u0002\u0002\u0002\u00d1",
    "\u00b1\u0003\u0002\u0002\u0002\u00d1\u00b3\u0003\u0002\u0002\u0002\u00d1",
    "\u00b7\u0003\u0002\u0002\u0002\u00d1\u00bb\u0003\u0002\u0002\u0002\u00d1",
    "\u00bd\u0003\u0002\u0002\u0002\u00d1\u00c3\u0003\u0002\u0002\u0002\u00d1",
    "\u00ca\u0003\u0002\u0002\u0002\u00d2\u0003\u0003\u0002\u0002\u0002\u00d3",
    "\u00d4\u00078\u0002\u0002\u00d4\u00d5\u0007=\u0002\u0002\u00d5\u00d6",
    "\u0005*\u0016\u0002\u00d6\u00d7\u0007Z\u0002\u0002\u00d7\u00d8\u0005",
    "\u0006\u0004\u0002\u00d8\u00d9\u0007>\u0002\u0002\u00d9\u0005\u0003",
    "\u0002\u0002\u0002\u00da\u00db\b\u0004\u0001\u0002\u00db\u00dc\u0005",
    "\b\u0005\u0002\u00dc\u00e2\u0003\u0002\u0002\u0002\u00dd\u00de\f\u0003",
    "\u0002\u0002\u00de\u00df\u0007Z\u0002\u0002\u00df\u00e1\u0005\b\u0005",
    "\u0002\u00e0\u00dd\u0003\u0002\u0002\u0002\u00e1\u00e4\u0003\u0002\u0002",
    "\u0002\u00e2\u00e0\u0003\u0002\u0002\u0002\u00e2\u00e3\u0003\u0002\u0002",
    "\u0002\u00e3\u0007\u0003\u0002\u0002\u0002\u00e4\u00e2\u0003\u0002\u0002",
    "\u0002\u00e5\u00e6\u0005z>\u0002\u00e6\u00e7\u0007X\u0002\u0002\u00e7",
    "\u00e8\u0005*\u0016\u0002\u00e8\u00ed\u0003\u0002\u0002\u0002\u00e9",
    "\u00ea\u0007\u0017\u0002\u0002\u00ea\u00eb\u0007X\u0002\u0002\u00eb",
    "\u00ed\u0005*\u0016\u0002\u00ec\u00e5\u0003\u0002\u0002\u0002\u00ec",
    "\u00e9\u0003\u0002\u0002\u0002\u00ed\t\u0003\u0002\u0002\u0002\u00ee",
    "\u00ef\b\u0006\u0001\u0002\u00ef\u0111\u0005\u0002\u0002\u0002\u00f0",
    "\u00f1\u0007=\u0002\u0002\u00f1\u00f2\u0005z>\u0002\u00f2\u00f3\u0007",
    ">\u0002\u0002\u00f3\u00f4\u0007A\u0002\u0002\u00f4\u00f5\u0005\u0084",
    "C\u0002\u00f5\u00f6\u0007B\u0002\u0002\u00f6\u0111\u0003\u0002\u0002",
    "\u0002\u00f7\u00f8\u0007=\u0002\u0002\u00f8\u00f9\u0005z>\u0002\u00f9",
    "\u00fa\u0007>\u0002\u0002\u00fa\u00fb\u0007A\u0002\u0002\u00fb\u00fc",
    "\u0005\u0084C\u0002\u00fc\u00fd\u0007Z\u0002\u0002\u00fd\u00fe\u0007",
    "B\u0002\u0002\u00fe\u0111\u0003\u0002\u0002\u0002\u00ff\u0100\u0007",
    "\u0003\u0002\u0002\u0100\u0101\u0007=\u0002\u0002\u0101\u0102\u0005",
    "z>\u0002\u0102\u0103\u0007>\u0002\u0002\u0103\u0104\u0007A\u0002\u0002",
    "\u0104\u0105\u0005\u0084C\u0002\u0105\u0106\u0007B\u0002\u0002\u0106",
    "\u0111\u0003\u0002\u0002\u0002\u0107\u0108\u0007\u0003\u0002\u0002\u0108",
    "\u0109\u0007=\u0002\u0002\u0109\u010a\u0005z>\u0002\u010a\u010b\u0007",
    ">\u0002\u0002\u010b\u010c\u0007A\u0002\u0002\u010c\u010d\u0005\u0084",
    "C\u0002\u010d\u010e\u0007Z\u0002\u0002\u010e\u010f\u0007B\u0002\u0002",
    "\u010f\u0111\u0003\u0002\u0002\u0002\u0110\u00ee\u0003\u0002\u0002\u0002",
    "\u0110\u00f0\u0003\u0002\u0002\u0002\u0110\u00f7\u0003\u0002\u0002\u0002",
    "\u0110\u00ff\u0003\u0002\u0002\u0002\u0110\u0107\u0003\u0002\u0002\u0002",
    "\u0111\u0129\u0003\u0002\u0002\u0002\u0112\u0113\f\f\u0002\u0002\u0113",
    "\u0114\u0007?\u0002\u0002\u0114\u0115\u0005.\u0018\u0002\u0115\u0116",
    "\u0007@\u0002\u0002\u0116\u0128\u0003\u0002\u0002\u0002\u0117\u0118",
    "\f\u000b\u0002\u0002\u0118\u011a\u0007=\u0002\u0002\u0119\u011b\u0005",
    "\f\u0007\u0002\u011a\u0119\u0003\u0002\u0002\u0002\u011a\u011b\u0003",
    "\u0002\u0002\u0002\u011b\u011c\u0003\u0002\u0002\u0002\u011c\u0128\u0007",
    ">\u0002\u0002\u011d\u011e\f\n\u0002\u0002\u011e\u011f\u0007i\u0002\u0002",
    "\u011f\u0128\u0007k\u0002\u0002\u0120\u0121\f\t\u0002\u0002\u0121\u0122",
    "\u0007h\u0002\u0002\u0122\u0128\u0007k\u0002\u0002\u0123\u0124\f\b\u0002",
    "\u0002\u0124\u0128\u0007J\u0002\u0002\u0125\u0126\f\u0007\u0002\u0002",
    "\u0126\u0128\u0007L\u0002\u0002\u0127\u0112\u0003\u0002\u0002\u0002",
    "\u0127\u0117\u0003\u0002\u0002\u0002\u0127\u011d\u0003\u0002\u0002\u0002",
    "\u0127\u0120\u0003\u0002\u0002\u0002\u0127\u0123\u0003\u0002\u0002\u0002",
    "\u0127\u0125\u0003\u0002\u0002\u0002\u0128\u012b\u0003\u0002\u0002\u0002",
    "\u0129\u0127\u0003\u0002\u0002\u0002\u0129\u012a\u0003\u0002\u0002\u0002",
    "\u012a\u000b\u0003\u0002\u0002\u0002\u012b\u0129\u0003\u0002\u0002\u0002",
    "\u012c\u012d\b\u0007\u0001\u0002\u012d\u012e\u0005*\u0016\u0002\u012e",
    "\u0134\u0003\u0002\u0002\u0002\u012f\u0130\f\u0003\u0002\u0002\u0130",
    "\u0131\u0007Z\u0002\u0002\u0131\u0133\u0005*\u0016\u0002\u0132\u012f",
    "\u0003\u0002\u0002\u0002\u0133\u0136\u0003\u0002\u0002\u0002\u0134\u0132",
    "\u0003\u0002\u0002\u0002\u0134\u0135\u0003\u0002\u0002\u0002\u0135\r",
    "\u0003\u0002\u0002\u0002\u0136\u0134\u0003\u0002\u0002\u0002\u0137\u014e",
    "\u0005\n\u0006\u0002\u0138\u0139\u0007J\u0002\u0002\u0139\u014e\u0005",
    "\u000e\b\u0002\u013a\u013b\u0007L\u0002\u0002\u013b\u014e\u0005\u000e",
    "\b\u0002\u013c\u013d\u0005\u0010\t\u0002\u013d\u013e\u0005\u0012\n\u0002",
    "\u013e\u014e\u0003\u0002\u0002\u0002\u013f\u0140\u0007)\u0002\u0002",
    "\u0140\u014e\u0005\u000e\b\u0002\u0141\u0142\u0007)\u0002\u0002\u0142",
    "\u0143\u0007=\u0002\u0002\u0143\u0144\u0005z>\u0002\u0144\u0145\u0007",
    ">\u0002\u0002\u0145\u014e\u0003\u0002\u0002\u0002\u0146\u0147\u0007",
    "4\u0002\u0002\u0147\u0148\u0007=\u0002\u0002\u0148\u0149\u0005z>\u0002",
    "\u0149\u014a\u0007>\u0002\u0002\u014a\u014e\u0003\u0002\u0002\u0002",
    "\u014b\u014c\u0007R\u0002\u0002\u014c\u014e\u0007k\u0002\u0002\u014d",
    "\u0137\u0003\u0002\u0002\u0002\u014d\u0138\u0003\u0002\u0002\u0002\u014d",
    "\u013a\u0003\u0002\u0002\u0002\u014d\u013c\u0003\u0002\u0002\u0002\u014d",
    "\u013f\u0003\u0002\u0002\u0002\u014d\u0141\u0003\u0002\u0002\u0002\u014d",
    "\u0146\u0003\u0002\u0002\u0002\u014d\u014b\u0003\u0002\u0002\u0002\u014e",
    "\u000f\u0003\u0002\u0002\u0002\u014f\u0150\t\u0002\u0002\u0002\u0150",
    "\u0011\u0003\u0002\u0002\u0002\u0151\u0152\u0007=\u0002\u0002\u0152",
    "\u0153\u0005z>\u0002\u0153\u0154\u0007>\u0002\u0002\u0154\u0155\u0005",
    "\u0012\n\u0002\u0155\u015f\u0003\u0002\u0002\u0002\u0156\u0157\u0007",
    "\u0003\u0002\u0002\u0157\u0158\u0007=\u0002\u0002\u0158\u0159\u0005",
    "z>\u0002\u0159\u015a\u0007>\u0002\u0002\u015a\u015b\u0005\u0012\n\u0002",
    "\u015b\u015f\u0003\u0002\u0002\u0002\u015c\u015f\u0005\u000e\b\u0002",
    "\u015d\u015f\u0007m\u0002\u0002\u015e\u0151\u0003\u0002\u0002\u0002",
    "\u015e\u0156\u0003\u0002\u0002\u0002\u015e\u015c\u0003\u0002\u0002\u0002",
    "\u015e\u015d\u0003\u0002\u0002\u0002\u015f\u0013\u0003\u0002\u0002\u0002",
    "\u0160\u0161\b\u000b\u0001\u0002\u0161\u0162\u0005\u0012\n\u0002\u0162",
    "\u016e\u0003\u0002\u0002\u0002\u0163\u0164\f\u0005\u0002\u0002\u0164",
    "\u0165\u0007M\u0002\u0002\u0165\u016d\u0005\u0012\n\u0002\u0166\u0167",
    "\f\u0004\u0002\u0002\u0167\u0168\u0007N\u0002\u0002\u0168\u016d\u0005",
    "\u0012\n\u0002\u0169\u016a\f\u0003\u0002\u0002\u016a\u016b\u0007O\u0002",
    "\u0002\u016b\u016d\u0005\u0012\n\u0002\u016c\u0163\u0003\u0002\u0002",
    "\u0002\u016c\u0166\u0003\u0002\u0002\u0002\u016c\u0169\u0003\u0002\u0002",
    "\u0002\u016d\u0170\u0003\u0002\u0002\u0002\u016e\u016c\u0003\u0002\u0002",
    "\u0002\u016e\u016f\u0003\u0002\u0002\u0002\u016f\u0015\u0003\u0002\u0002",
    "\u0002\u0170\u016e\u0003\u0002\u0002\u0002\u0171\u0172\b\f\u0001\u0002",
    "\u0172\u0173\u0005\u0014\u000b\u0002\u0173\u017c\u0003\u0002\u0002\u0002",
    "\u0174\u0175\f\u0004\u0002\u0002\u0175\u0176\u0007I\u0002\u0002\u0176",
    "\u017b\u0005\u0014\u000b\u0002\u0177\u0178\f\u0003\u0002\u0002\u0178",
    "\u0179\u0007K\u0002\u0002\u0179\u017b\u0005\u0014\u000b\u0002\u017a",
    "\u0174\u0003\u0002\u0002\u0002\u017a\u0177\u0003\u0002\u0002\u0002\u017b",
    "\u017e\u0003\u0002\u0002\u0002\u017c\u017a\u0003\u0002\u0002\u0002\u017c",
    "\u017d\u0003\u0002\u0002\u0002\u017d\u0017\u0003\u0002\u0002\u0002\u017e",
    "\u017c\u0003\u0002\u0002\u0002\u017f\u0180\b\r\u0001\u0002\u0180\u0181",
    "\u0005\u0016\f\u0002\u0181\u018a\u0003\u0002\u0002\u0002\u0182\u0183",
    "\f\u0004\u0002\u0002\u0183\u0184\u0007G\u0002\u0002\u0184\u0189\u0005",
    "\u0016\f\u0002\u0185\u0186\f\u0003\u0002\u0002\u0186\u0187\u0007H\u0002",
    "\u0002\u0187\u0189\u0005\u0016\f\u0002\u0188\u0182\u0003\u0002\u0002",
    "\u0002\u0188\u0185\u0003\u0002\u0002\u0002\u0189\u018c\u0003\u0002\u0002",
    "\u0002\u018a\u0188\u0003\u0002\u0002\u0002\u018a\u018b\u0003\u0002\u0002",
    "\u0002\u018b\u0019\u0003\u0002\u0002\u0002\u018c\u018a\u0003\u0002\u0002",
    "\u0002\u018d\u018e\b\u000e\u0001\u0002\u018e\u018f\u0005\u0018\r\u0002",
    "\u018f\u019e\u0003\u0002\u0002\u0002\u0190\u0191\f\u0006\u0002\u0002",
    "\u0191\u0192\u0007C\u0002\u0002\u0192\u019d\u0005\u0018\r\u0002\u0193",
    "\u0194\f\u0005\u0002\u0002\u0194\u0195\u0007E\u0002\u0002\u0195\u019d",
    "\u0005\u0018\r\u0002\u0196\u0197\f\u0004\u0002\u0002\u0197\u0198\u0007",
    "D\u0002\u0002\u0198\u019d\u0005\u0018\r\u0002\u0199\u019a\f\u0003\u0002",
    "\u0002\u019a\u019b\u0007F\u0002\u0002\u019b\u019d\u0005\u0018\r\u0002",
    "\u019c\u0190\u0003\u0002\u0002\u0002\u019c\u0193\u0003\u0002\u0002\u0002",
    "\u019c\u0196\u0003\u0002\u0002\u0002\u019c\u0199\u0003\u0002\u0002\u0002",
    "\u019d\u01a0\u0003\u0002\u0002\u0002\u019e\u019c\u0003\u0002\u0002\u0002",
    "\u019e\u019f\u0003\u0002\u0002\u0002\u019f\u001b\u0003\u0002\u0002\u0002",
    "\u01a0\u019e\u0003\u0002\u0002\u0002\u01a1\u01a2\b\u000f\u0001\u0002",
    "\u01a2\u01a3\u0005\u001a\u000e\u0002\u01a3\u01ac\u0003\u0002\u0002\u0002",
    "\u01a4\u01a5\f\u0004\u0002\u0002\u01a5\u01a6\u0007f\u0002\u0002\u01a6",
    "\u01ab\u0005\u001a\u000e\u0002\u01a7\u01a8\f\u0003\u0002\u0002\u01a8",
    "\u01a9\u0007g\u0002\u0002\u01a9\u01ab\u0005\u001a\u000e\u0002\u01aa",
    "\u01a4\u0003\u0002\u0002\u0002\u01aa\u01a7\u0003\u0002\u0002\u0002\u01ab",
    "\u01ae\u0003\u0002\u0002\u0002\u01ac\u01aa\u0003\u0002\u0002\u0002\u01ac",
    "\u01ad\u0003\u0002\u0002\u0002\u01ad\u001d\u0003\u0002\u0002\u0002\u01ae",
    "\u01ac\u0003\u0002\u0002\u0002\u01af\u01b0\b\u0010\u0001\u0002\u01b0",
    "\u01b1\u0005\u001c\u000f\u0002\u01b1\u01b7\u0003\u0002\u0002\u0002\u01b2",
    "\u01b3\f\u0003\u0002\u0002\u01b3\u01b4\u0007P\u0002\u0002\u01b4\u01b6",
    "\u0005\u001c\u000f\u0002\u01b5\u01b2\u0003\u0002\u0002\u0002\u01b6\u01b9",
    "\u0003\u0002\u0002\u0002\u01b7\u01b5\u0003\u0002\u0002\u0002\u01b7\u01b8",
    "\u0003\u0002\u0002\u0002\u01b8\u001f\u0003\u0002\u0002\u0002\u01b9\u01b7",
    "\u0003\u0002\u0002\u0002\u01ba\u01bb\b\u0011\u0001\u0002\u01bb\u01bc",
    "\u0005\u001e\u0010\u0002\u01bc\u01c2\u0003\u0002\u0002\u0002\u01bd\u01be",
    "\f\u0003\u0002\u0002\u01be\u01bf\u0007T\u0002\u0002\u01bf\u01c1\u0005",
    "\u001e\u0010\u0002\u01c0\u01bd\u0003\u0002\u0002\u0002\u01c1\u01c4\u0003",
    "\u0002\u0002\u0002\u01c2\u01c0\u0003\u0002\u0002\u0002\u01c2\u01c3\u0003",
    "\u0002\u0002\u0002\u01c3!\u0003\u0002\u0002\u0002\u01c4\u01c2\u0003",
    "\u0002\u0002\u0002\u01c5\u01c6\b\u0012\u0001\u0002\u01c6\u01c7\u0005",
    " \u0011\u0002\u01c7\u01cd\u0003\u0002\u0002\u0002\u01c8\u01c9\f\u0003",
    "\u0002\u0002\u01c9\u01ca\u0007Q\u0002\u0002\u01ca\u01cc\u0005 \u0011",
    "\u0002\u01cb\u01c8\u0003\u0002\u0002\u0002\u01cc\u01cf\u0003\u0002\u0002",
    "\u0002\u01cd\u01cb\u0003\u0002\u0002\u0002\u01cd\u01ce\u0003\u0002\u0002",
    "\u0002\u01ce#\u0003\u0002\u0002\u0002\u01cf\u01cd\u0003\u0002\u0002",
    "\u0002\u01d0\u01d1\b\u0013\u0001\u0002\u01d1\u01d2\u0005\"\u0012\u0002",
    "\u01d2\u01d8\u0003\u0002\u0002\u0002\u01d3\u01d4\f\u0003\u0002\u0002",
    "\u01d4\u01d5\u0007R\u0002\u0002\u01d5\u01d7\u0005\"\u0012\u0002\u01d6",
    "\u01d3\u0003\u0002\u0002\u0002\u01d7\u01da\u0003\u0002\u0002\u0002\u01d8",
    "\u01d6\u0003\u0002\u0002\u0002\u01d8\u01d9\u0003\u0002\u0002\u0002\u01d9",
    "%\u0003\u0002\u0002\u0002\u01da\u01d8\u0003\u0002\u0002\u0002\u01db",
    "\u01dc\b\u0014\u0001\u0002\u01dc\u01dd\u0005$\u0013\u0002\u01dd\u01e3",
    "\u0003\u0002\u0002\u0002\u01de\u01df\f\u0003\u0002\u0002\u01df\u01e0",
    "\u0007S\u0002\u0002\u01e0\u01e2\u0005$\u0013\u0002\u01e1\u01de\u0003",
    "\u0002\u0002\u0002\u01e2\u01e5\u0003\u0002\u0002\u0002\u01e3\u01e1\u0003",
    "\u0002\u0002\u0002\u01e3\u01e4\u0003\u0002\u0002\u0002\u01e4\'\u0003",
    "\u0002\u0002\u0002\u01e5\u01e3\u0003\u0002\u0002\u0002\u01e6\u01ec\u0005",
    "&\u0014\u0002\u01e7\u01e8\u0007W\u0002\u0002\u01e8\u01e9\u0005.\u0018",
    "\u0002\u01e9\u01ea\u0007X\u0002\u0002\u01ea\u01eb\u0005(\u0015\u0002",
    "\u01eb\u01ed\u0003\u0002\u0002\u0002\u01ec\u01e7\u0003\u0002\u0002\u0002",
    "\u01ec\u01ed\u0003\u0002\u0002\u0002\u01ed)\u0003\u0002\u0002\u0002",
    "\u01ee\u01f5\u0005(\u0015\u0002\u01ef\u01f0\u0005\u000e\b\u0002\u01f0",
    "\u01f1\u0005,\u0017\u0002\u01f1\u01f2\u0005*\u0016\u0002\u01f2\u01f5",
    "\u0003\u0002\u0002\u0002\u01f3\u01f5\u0007m\u0002\u0002\u01f4\u01ee",
    "\u0003\u0002\u0002\u0002\u01f4\u01ef\u0003\u0002\u0002\u0002\u01f4\u01f3",
    "\u0003\u0002\u0002\u0002\u01f5+\u0003\u0002\u0002\u0002\u01f6\u01f7",
    "\t\u0003\u0002\u0002\u01f7-\u0003\u0002\u0002\u0002\u01f8\u01f9\b\u0018",
    "\u0001\u0002\u01f9\u01fa\u0005*\u0016\u0002\u01fa\u0200\u0003\u0002",
    "\u0002\u0002\u01fb\u01fc\f\u0003\u0002\u0002\u01fc\u01fd\u0007Z\u0002",
    "\u0002\u01fd\u01ff\u0005*\u0016\u0002\u01fe\u01fb\u0003\u0002\u0002",
    "\u0002\u01ff\u0202\u0003\u0002\u0002\u0002\u0200\u01fe\u0003\u0002\u0002",
    "\u0002\u0200\u0201\u0003\u0002\u0002\u0002\u0201/\u0003\u0002\u0002",
    "\u0002\u0202\u0200\u0003\u0002\u0002\u0002\u0203\u0204\u0005(\u0015",
    "\u0002\u02041\u0003\u0002\u0002\u0002\u0205\u0206\u00054\u001b\u0002",
    "\u0206\u0207\u0005:\u001e\u0002\u0207\u0208\u0007Y\u0002\u0002\u0208",
    "\u020e\u0003\u0002\u0002\u0002\u0209\u020a\u00054\u001b\u0002\u020a",
    "\u020b\u0007Y\u0002\u0002\u020b\u020e\u0003\u0002\u0002\u0002\u020c",
    "\u020e\u0005\u008cG\u0002\u020d\u0205\u0003\u0002\u0002\u0002\u020d",
    "\u0209\u0003\u0002\u0002\u0002\u020d\u020c\u0003\u0002\u0002\u0002\u020e",
    "3\u0003\u0002\u0002\u0002\u020f\u0211\u00058\u001d\u0002\u0210\u020f",
    "\u0003\u0002\u0002\u0002\u0211\u0212\u0003\u0002\u0002\u0002\u0212\u0210",
    "\u0003\u0002\u0002\u0002\u0212\u0213\u0003\u0002\u0002\u0002\u02135",
    "\u0003\u0002\u0002\u0002\u0214\u0216\u00058\u001d\u0002\u0215\u0214",
    "\u0003\u0002\u0002\u0002\u0216\u0217\u0003\u0002\u0002\u0002\u0217\u0215",
    "\u0003\u0002\u0002\u0002\u0217\u0218\u0003\u0002\u0002\u0002\u02187",
    "\u0003\u0002\u0002\u0002\u0219\u021f\u0005> \u0002\u021a\u021f\u0005",
    "@!\u0002\u021b\u021f\u0005Z.\u0002\u021c\u021f\u0005\\/\u0002\u021d",
    "\u021f\u0005^0\u0002\u021e\u0219\u0003\u0002\u0002\u0002\u021e\u021a",
    "\u0003\u0002\u0002\u0002\u021e\u021b\u0003\u0002\u0002\u0002\u021e\u021c",
    "\u0003\u0002\u0002\u0002\u021e\u021d\u0003\u0002\u0002\u0002\u021f9",
    "\u0003\u0002\u0002\u0002\u0220\u0221\b\u001e\u0001\u0002\u0221\u0222",
    "\u0005<\u001f\u0002\u0222\u0228\u0003\u0002\u0002\u0002\u0223\u0224",
    "\f\u0003\u0002\u0002\u0224\u0225\u0007Z\u0002\u0002\u0225\u0227\u0005",
    "<\u001f\u0002\u0226\u0223\u0003\u0002\u0002\u0002\u0227\u022a\u0003",
    "\u0002\u0002\u0002\u0228\u0226\u0003\u0002\u0002\u0002\u0228\u0229\u0003",
    "\u0002\u0002\u0002\u0229;\u0003\u0002\u0002\u0002\u022a\u0228\u0003",
    "\u0002\u0002\u0002\u022b\u0231\u0005`1\u0002\u022c\u022d\u0005`1\u0002",
    "\u022d\u022e\u0007[\u0002\u0002\u022e\u022f\u0005\u0082B\u0002\u022f",
    "\u0231\u0003\u0002\u0002\u0002\u0230\u022b\u0003\u0002\u0002\u0002\u0230",
    "\u022c\u0003\u0002\u0002\u0002\u0231=\u0003\u0002\u0002\u0002\u0232",
    "\u0233\t\u0004\u0002\u0002\u0233?\u0003\u0002\u0002\u0002\u0234\u0235",
    "\b!\u0001\u0002\u0235\u0244\t\u0005\u0002\u0002\u0236\u0237\u0007\u0003",
    "\u0002\u0002\u0237\u0238\u0007=\u0002\u0002\u0238\u0239\t\u0006\u0002",
    "\u0002\u0239\u0244\u0007>\u0002\u0002\u023a\u0244\u0005X-\u0002\u023b",
    "\u0244\u0005B\"\u0002\u023c\u0244\u0005P)\u0002\u023d\u0244\u0005\u0080",
    "A\u0002\u023e\u023f\u0007\t\u0002\u0002\u023f\u0240\u0007=\u0002\u0002",
    "\u0240\u0241\u00050\u0019\u0002\u0241\u0242\u0007>\u0002\u0002\u0242",
    "\u0244\u0003\u0002\u0002\u0002\u0243\u0234\u0003\u0002\u0002\u0002\u0243",
    "\u0236\u0003\u0002\u0002\u0002\u0243\u023a\u0003\u0002\u0002\u0002\u0243",
    "\u023b\u0003\u0002\u0002\u0002\u0243\u023c\u0003\u0002\u0002\u0002\u0243",
    "\u023d\u0003\u0002\u0002\u0002\u0243\u023e\u0003\u0002\u0002\u0002\u0244",
    "\u0249\u0003\u0002\u0002\u0002\u0245\u0246\f\u0003\u0002\u0002\u0246",
    "\u0248\u0005n8\u0002\u0247\u0245\u0003\u0002\u0002\u0002\u0248\u024b",
    "\u0003\u0002\u0002\u0002\u0249\u0247\u0003\u0002\u0002\u0002\u0249\u024a",
    "\u0003\u0002\u0002\u0002\u024aA\u0003\u0002\u0002\u0002\u024b\u0249",
    "\u0003\u0002\u0002\u0002\u024c\u024e\u0005D#\u0002\u024d\u024f\u0007",
    "k\u0002\u0002\u024e\u024d\u0003\u0002\u0002\u0002\u024e\u024f\u0003",
    "\u0002\u0002\u0002\u024f\u0250\u0003\u0002\u0002\u0002\u0250\u0251\u0007",
    "A\u0002\u0002\u0251\u0252\u0005F$\u0002\u0252\u0253\u0007B\u0002\u0002",
    "\u0253\u0258\u0003\u0002\u0002\u0002\u0254\u0255\u0005D#\u0002\u0255",
    "\u0256\u0007k\u0002\u0002\u0256\u0258\u0003\u0002\u0002\u0002\u0257",
    "\u024c\u0003\u0002\u0002\u0002\u0257\u0254\u0003\u0002\u0002\u0002\u0258",
    "C\u0003\u0002\u0002\u0002\u0259\u025a\t\u0007\u0002\u0002\u025aE\u0003",
    "\u0002\u0002\u0002\u025b\u025c\b$\u0001\u0002\u025c\u025d\u0005H%\u0002",
    "\u025d\u0262\u0003\u0002\u0002\u0002\u025e\u025f\f\u0003\u0002\u0002",
    "\u025f\u0261\u0005H%\u0002\u0260\u025e\u0003\u0002\u0002\u0002\u0261",
    "\u0264\u0003\u0002\u0002\u0002\u0262\u0260\u0003\u0002\u0002\u0002\u0262",
    "\u0263\u0003\u0002\u0002\u0002\u0263G\u0003\u0002\u0002\u0002\u0264",
    "\u0262\u0003\u0002\u0002\u0002\u0265\u0267\u0005J&\u0002\u0266\u0268",
    "\u0005L\'\u0002\u0267\u0266\u0003\u0002\u0002\u0002\u0267\u0268\u0003",
    "\u0002\u0002\u0002\u0268\u0269\u0003\u0002\u0002\u0002\u0269\u026a\u0007",
    "Y\u0002\u0002\u026a\u026d\u0003\u0002\u0002\u0002\u026b\u026d\u0005",
    "\u008cG\u0002\u026c\u0265\u0003\u0002\u0002\u0002\u026c\u026b\u0003",
    "\u0002\u0002\u0002\u026dI\u0003\u0002\u0002\u0002\u026e\u0270\u0005",
    "@!\u0002\u026f\u0271\u0005J&\u0002\u0270\u026f\u0003\u0002\u0002\u0002",
    "\u0270\u0271\u0003\u0002\u0002\u0002\u0271\u0277\u0003\u0002\u0002\u0002",
    "\u0272\u0274\u0005Z.\u0002\u0273\u0275\u0005J&\u0002\u0274\u0273\u0003",
    "\u0002\u0002\u0002\u0274\u0275\u0003\u0002\u0002\u0002\u0275\u0277\u0003",
    "\u0002\u0002\u0002\u0276\u026e\u0003\u0002\u0002\u0002\u0276\u0272\u0003",
    "\u0002\u0002\u0002\u0277K\u0003\u0002\u0002\u0002\u0278\u0279\b\'\u0001",
    "\u0002\u0279\u027a\u0005N(\u0002\u027a\u0280\u0003\u0002\u0002\u0002",
    "\u027b\u027c\f\u0003\u0002\u0002\u027c\u027d\u0007Z\u0002\u0002\u027d",
    "\u027f\u0005N(\u0002\u027e\u027b\u0003\u0002\u0002\u0002\u027f\u0282",
    "\u0003\u0002\u0002\u0002\u0280\u027e\u0003\u0002\u0002\u0002\u0280\u0281",
    "\u0003\u0002\u0002\u0002\u0281M\u0003\u0002\u0002\u0002\u0282\u0280",
    "\u0003\u0002\u0002\u0002\u0283\u028a\u0005`1\u0002\u0284\u0286\u0005",
    "`1\u0002\u0285\u0284\u0003\u0002\u0002\u0002\u0285\u0286\u0003\u0002",
    "\u0002\u0002\u0286\u0287\u0003\u0002\u0002\u0002\u0287\u0288\u0007X",
    "\u0002\u0002\u0288\u028a\u00050\u0019\u0002\u0289\u0283\u0003\u0002",
    "\u0002\u0002\u0289\u0285\u0003\u0002\u0002\u0002\u028aO\u0003\u0002",
    "\u0002\u0002\u028b\u028d\u0007\u001b\u0002\u0002\u028c\u028e\u0007k",
    "\u0002\u0002\u028d\u028c\u0003\u0002\u0002\u0002\u028d\u028e\u0003\u0002",
    "\u0002\u0002\u028e\u028f\u0003\u0002\u0002\u0002\u028f\u0290\u0007A",
    "\u0002\u0002\u0290\u0291\u0005R*\u0002\u0291\u0292\u0007B\u0002\u0002",
    "\u0292\u029f\u0003\u0002\u0002\u0002\u0293\u0295\u0007\u001b\u0002\u0002",
    "\u0294\u0296\u0007k\u0002\u0002\u0295\u0294\u0003\u0002\u0002\u0002",
    "\u0295\u0296\u0003\u0002\u0002\u0002\u0296\u0297\u0003\u0002\u0002\u0002",
    "\u0297\u0298\u0007A\u0002\u0002\u0298\u0299\u0005R*\u0002\u0299\u029a",
    "\u0007Z\u0002\u0002\u029a\u029b\u0007B\u0002\u0002\u029b\u029f\u0003",
    "\u0002\u0002\u0002\u029c\u029d\u0007\u001b\u0002\u0002\u029d\u029f\u0007",
    "k\u0002\u0002\u029e\u028b\u0003\u0002\u0002\u0002\u029e\u0293\u0003",
    "\u0002\u0002\u0002\u029e\u029c\u0003\u0002\u0002\u0002\u029fQ\u0003",
    "\u0002\u0002\u0002\u02a0\u02a1\b*\u0001\u0002\u02a1\u02a2\u0005T+\u0002",
    "\u02a2\u02a8\u0003\u0002\u0002\u0002\u02a3\u02a4\f\u0003\u0002\u0002",
    "\u02a4\u02a5\u0007Z\u0002\u0002\u02a5\u02a7\u0005T+\u0002\u02a6\u02a3",
    "\u0003\u0002\u0002\u0002\u02a7\u02aa\u0003\u0002\u0002\u0002\u02a8\u02a6",
    "\u0003\u0002\u0002\u0002\u02a8\u02a9\u0003\u0002\u0002\u0002\u02a9S",
    "\u0003\u0002\u0002\u0002\u02aa\u02a8\u0003\u0002\u0002\u0002\u02ab\u02b1",
    "\u0005V,\u0002\u02ac\u02ad\u0005V,\u0002\u02ad\u02ae\u0007[\u0002\u0002",
    "\u02ae\u02af\u00050\u0019\u0002\u02af\u02b1\u0003\u0002\u0002\u0002",
    "\u02b0\u02ab\u0003\u0002\u0002\u0002\u02b0\u02ac\u0003\u0002\u0002\u0002",
    "\u02b1U\u0003\u0002\u0002\u0002\u02b2\u02b3\u0007k\u0002\u0002\u02b3",
    "W\u0003\u0002\u0002\u0002\u02b4\u02b5\u00075\u0002\u0002\u02b5\u02b6",
    "\u0007=\u0002\u0002\u02b6\u02b7\u0005z>\u0002\u02b7\u02b8\u0007>\u0002",
    "\u0002\u02b8Y\u0003\u0002\u0002\u0002\u02b9\u02ba\t\b\u0002\u0002\u02ba",
    "[\u0003\u0002\u0002\u0002\u02bb\u02c2\t\t\u0002\u0002\u02bc\u02c2\u0005",
    "f4\u0002\u02bd\u02be\u0007\f\u0002\u0002\u02be\u02bf\u0007=\u0002\u0002",
    "\u02bf\u02c0\u0007k\u0002\u0002\u02c0\u02c2\u0007>\u0002\u0002\u02c1",
    "\u02bb\u0003\u0002\u0002\u0002\u02c1\u02bc\u0003\u0002\u0002\u0002\u02c1",
    "\u02bd\u0003\u0002\u0002\u0002\u02c2]\u0003\u0002\u0002\u0002\u02c3",
    "\u02c4\u00073\u0002\u0002\u02c4\u02c5\u0007=\u0002\u0002\u02c5\u02c6",
    "\u0005z>\u0002\u02c6\u02c7\u0007>\u0002\u0002\u02c7\u02ce\u0003\u0002",
    "\u0002\u0002\u02c8\u02c9\u00073\u0002\u0002\u02c9\u02ca\u0007=\u0002",
    "\u0002\u02ca\u02cb\u00050\u0019\u0002\u02cb\u02cc\u0007>\u0002\u0002",
    "\u02cc\u02ce\u0003\u0002\u0002\u0002\u02cd\u02c3\u0003\u0002\u0002\u0002",
    "\u02cd\u02c8\u0003\u0002\u0002\u0002\u02ce_\u0003\u0002\u0002\u0002",
    "\u02cf\u02d1\u0005n8\u0002\u02d0\u02cf\u0003\u0002\u0002\u0002\u02d0",
    "\u02d1\u0003\u0002\u0002\u0002\u02d1\u02d2\u0003\u0002\u0002\u0002\u02d2",
    "\u02d6\u0005b2\u0002\u02d3\u02d5\u0005d3\u0002\u02d4\u02d3\u0003\u0002",
    "\u0002\u0002\u02d5\u02d8\u0003\u0002\u0002\u0002\u02d6\u02d4\u0003\u0002",
    "\u0002\u0002\u02d6\u02d7\u0003\u0002\u0002\u0002\u02d7a\u0003\u0002",
    "\u0002\u0002\u02d8\u02d6\u0003\u0002\u0002\u0002\u02d9\u02da\b2\u0001",
    "\u0002\u02da\u02eb\u0007k\u0002\u0002\u02db\u02dc\u0007=\u0002\u0002",
    "\u02dc\u02dd\u0005`1\u0002\u02dd\u02de\u0007>\u0002\u0002\u02de\u02eb",
    "\u0003\u0002\u0002\u0002\u02df\u02e0\u0007k\u0002\u0002\u02e0\u02e1",
    "\u0007X\u0002\u0002\u02e1\u02eb\u0007m\u0002\u0002\u02e2\u02e4\u0007",
    "=\u0002\u0002\u02e3\u02e5\u0005@!\u0002\u02e4\u02e3\u0003\u0002\u0002",
    "\u0002\u02e4\u02e5\u0003\u0002\u0002\u0002\u02e5\u02e6\u0003\u0002\u0002",
    "\u0002\u02e6\u02e7\u0005n8\u0002\u02e7\u02e8\u0005b2\u0002\u02e8\u02e9",
    "\u0007>\u0002\u0002\u02e9\u02eb\u0003\u0002\u0002\u0002\u02ea\u02d9",
    "\u0003\u0002\u0002\u0002\u02ea\u02db\u0003\u0002\u0002\u0002\u02ea\u02df",
    "\u0003\u0002\u0002\u0002\u02ea\u02e2\u0003\u0002\u0002\u0002\u02eb\u0319",
    "\u0003\u0002\u0002\u0002\u02ec\u02ed\f\n\u0002\u0002\u02ed\u02ef\u0007",
    "?\u0002\u0002\u02ee\u02f0\u0005p9\u0002\u02ef\u02ee\u0003\u0002\u0002",
    "\u0002\u02ef\u02f0\u0003\u0002\u0002\u0002\u02f0\u02f2\u0003\u0002\u0002",
    "\u0002\u02f1\u02f3\u0005*\u0016\u0002\u02f2\u02f1\u0003\u0002\u0002",
    "\u0002\u02f2\u02f3\u0003\u0002\u0002\u0002\u02f3\u02f4\u0003\u0002\u0002",
    "\u0002\u02f4\u0318\u0007@\u0002\u0002\u02f5\u02f6\f\t\u0002\u0002\u02f6",
    "\u02f7\u0007?\u0002\u0002\u02f7\u02f9\u0007*\u0002\u0002\u02f8\u02fa",
    "\u0005p9\u0002\u02f9\u02f8\u0003\u0002\u0002\u0002\u02f9\u02fa\u0003",
    "\u0002\u0002\u0002\u02fa\u02fb\u0003\u0002\u0002\u0002\u02fb\u02fc\u0005",
    "*\u0016\u0002\u02fc\u02fd\u0007@\u0002\u0002\u02fd\u0318\u0003\u0002",
    "\u0002\u0002\u02fe\u02ff\f\b\u0002\u0002\u02ff\u0300\u0007?\u0002\u0002",
    "\u0300\u0301\u0005p9\u0002\u0301\u0302\u0007*\u0002\u0002\u0302\u0303",
    "\u0005*\u0016\u0002\u0303\u0304\u0007@\u0002\u0002\u0304\u0318\u0003",
    "\u0002\u0002\u0002\u0305\u0306\f\u0007\u0002\u0002\u0306\u0308\u0007",
    "?\u0002\u0002\u0307\u0309\u0005p9\u0002\u0308\u0307\u0003\u0002\u0002",
    "\u0002\u0308\u0309\u0003\u0002\u0002\u0002\u0309\u030a\u0003\u0002\u0002",
    "\u0002\u030a\u030b\u0007M\u0002\u0002\u030b\u0318\u0007@\u0002\u0002",
    "\u030c\u030d\f\u0006\u0002\u0002\u030d\u030e\u0007=\u0002\u0002\u030e",
    "\u030f\u0005r:\u0002\u030f\u0310\u0007>\u0002\u0002\u0310\u0318\u0003",
    "\u0002\u0002\u0002\u0311\u0312\f\u0005\u0002\u0002\u0312\u0314\u0007",
    "=\u0002\u0002\u0313\u0315\u0005x=\u0002\u0314\u0313\u0003\u0002\u0002",
    "\u0002\u0314\u0315\u0003\u0002\u0002\u0002\u0315\u0316\u0003\u0002\u0002",
    "\u0002\u0316\u0318\u0007>\u0002\u0002\u0317\u02ec\u0003\u0002\u0002",
    "\u0002\u0317\u02f5\u0003\u0002\u0002\u0002\u0317\u02fe\u0003\u0002\u0002",
    "\u0002\u0317\u0305\u0003\u0002\u0002\u0002\u0317\u030c\u0003\u0002\u0002",
    "\u0002\u0317\u0311\u0003\u0002\u0002\u0002\u0318\u031b\u0003\u0002\u0002",
    "\u0002\u0319\u0317\u0003\u0002\u0002\u0002\u0319\u031a\u0003\u0002\u0002",
    "\u0002\u031ac\u0003\u0002\u0002\u0002\u031b\u0319\u0003\u0002\u0002",
    "\u0002\u031c\u031d\u0007\r\u0002\u0002\u031d\u031f\u0007=\u0002\u0002",
    "\u031e\u0320\u0007n\u0002\u0002\u031f\u031e\u0003\u0002\u0002\u0002",
    "\u0320\u0321\u0003\u0002\u0002\u0002\u0321\u031f\u0003\u0002\u0002\u0002",
    "\u0321\u0322\u0003\u0002\u0002\u0002\u0322\u0323\u0003\u0002\u0002\u0002",
    "\u0323\u0326\u0007>\u0002\u0002\u0324\u0326\u0005f4\u0002\u0325\u031c",
    "\u0003\u0002\u0002\u0002\u0325\u0324\u0003\u0002\u0002\u0002\u0326e",
    "\u0003\u0002\u0002\u0002\u0327\u0328\u0007\u000e\u0002\u0002\u0328\u0329",
    "\u0007=\u0002\u0002\u0329\u032a\u0007=\u0002\u0002\u032a\u032b\u0005",
    "h5\u0002\u032b\u032c\u0007>\u0002\u0002\u032c\u032d\u0007>\u0002\u0002",
    "\u032dg\u0003\u0002\u0002\u0002\u032e\u0333\u0005j6\u0002\u032f\u0330",
    "\u0007Z\u0002\u0002\u0330\u0332\u0005j6\u0002\u0331\u032f\u0003\u0002",
    "\u0002\u0002\u0332\u0335\u0003\u0002\u0002\u0002\u0333\u0331\u0003\u0002",
    "\u0002\u0002\u0333\u0334\u0003\u0002\u0002\u0002\u0334\u0338\u0003\u0002",
    "\u0002\u0002\u0335\u0333\u0003\u0002\u0002\u0002\u0336\u0338\u0003\u0002",
    "\u0002\u0002\u0337\u032e\u0003\u0002\u0002\u0002\u0337\u0336\u0003\u0002",
    "\u0002\u0002\u0338i\u0003\u0002\u0002\u0002\u0339\u033f\n\n\u0002\u0002",
    "\u033a\u033c\u0007=\u0002\u0002\u033b\u033d\u0005\f\u0007\u0002\u033c",
    "\u033b\u0003\u0002\u0002\u0002\u033c\u033d\u0003\u0002\u0002\u0002\u033d",
    "\u033e\u0003\u0002\u0002\u0002\u033e\u0340\u0007>\u0002\u0002\u033f",
    "\u033a\u0003\u0002\u0002\u0002\u033f\u0340\u0003\u0002\u0002\u0002\u0340",
    "\u0343\u0003\u0002\u0002\u0002\u0341\u0343\u0003\u0002\u0002\u0002\u0342",
    "\u0339\u0003\u0002\u0002\u0002\u0342\u0341\u0003\u0002\u0002\u0002\u0343",
    "k\u0003\u0002\u0002\u0002\u0344\u034a\n\u000b\u0002\u0002\u0345\u0346",
    "\u0007=\u0002\u0002\u0346\u0347\u0005l7\u0002\u0347\u0348\u0007>\u0002",
    "\u0002\u0348\u034a\u0003\u0002\u0002\u0002\u0349\u0344\u0003\u0002\u0002",
    "\u0002\u0349\u0345\u0003\u0002\u0002\u0002\u034a\u034d\u0003\u0002\u0002",
    "\u0002\u034b\u0349\u0003\u0002\u0002\u0002\u034b\u034c\u0003\u0002\u0002",
    "\u0002\u034cm\u0003\u0002\u0002\u0002\u034d\u034b\u0003\u0002\u0002",
    "\u0002\u034e\u0350\u0007M\u0002\u0002\u034f\u0351\u0005p9\u0002\u0350",
    "\u034f\u0003\u0002\u0002\u0002\u0350\u0351\u0003\u0002\u0002\u0002\u0351",
    "\u0361\u0003\u0002\u0002\u0002\u0352\u0354\u0007M\u0002\u0002\u0353",
    "\u0355\u0005p9\u0002\u0354\u0353\u0003\u0002\u0002\u0002\u0354\u0355",
    "\u0003\u0002\u0002\u0002\u0355\u0356\u0003\u0002\u0002\u0002\u0356\u0361",
    "\u0005n8\u0002\u0357\u0359\u0007T\u0002\u0002\u0358\u035a\u0005p9\u0002",
    "\u0359\u0358\u0003\u0002\u0002\u0002\u0359\u035a\u0003\u0002\u0002\u0002",
    "\u035a\u0361\u0003\u0002\u0002\u0002\u035b\u035d\u0007T\u0002\u0002",
    "\u035c\u035e\u0005p9\u0002\u035d\u035c\u0003\u0002\u0002\u0002\u035d",
    "\u035e\u0003\u0002\u0002\u0002\u035e\u035f\u0003\u0002\u0002\u0002\u035f",
    "\u0361\u0005n8\u0002\u0360\u034e\u0003\u0002\u0002\u0002\u0360\u0352",
    "\u0003\u0002\u0002\u0002\u0360\u0357\u0003\u0002\u0002\u0002\u0360\u035b",
    "\u0003\u0002\u0002\u0002\u0361o\u0003\u0002\u0002\u0002\u0362\u0363",
    "\b9\u0001\u0002\u0363\u0364\u0005Z.\u0002\u0364\u0369\u0003\u0002\u0002",
    "\u0002\u0365\u0366\f\u0003\u0002\u0002\u0366\u0368\u0005Z.\u0002\u0367",
    "\u0365\u0003\u0002\u0002\u0002\u0368\u036b\u0003\u0002\u0002\u0002\u0369",
    "\u0367\u0003\u0002\u0002\u0002\u0369\u036a\u0003\u0002\u0002\u0002\u036a",
    "q\u0003\u0002\u0002\u0002\u036b\u0369\u0003\u0002\u0002\u0002\u036c",
    "\u0372\u0005t;\u0002\u036d\u036e\u0005t;\u0002\u036e\u036f\u0007Z\u0002",
    "\u0002\u036f\u0370\u0007j\u0002\u0002\u0370\u0372\u0003\u0002\u0002",
    "\u0002\u0371\u036c\u0003\u0002\u0002\u0002\u0371\u036d\u0003\u0002\u0002",
    "\u0002\u0372s\u0003\u0002\u0002\u0002\u0373\u0374\b;\u0001\u0002\u0374",
    "\u0375\u0005v<\u0002\u0375\u037b\u0003\u0002\u0002\u0002\u0376\u0377",
    "\f\u0003\u0002\u0002\u0377\u0378\u0007Z\u0002\u0002\u0378\u037a\u0005",
    "v<\u0002\u0379\u0376\u0003\u0002\u0002\u0002\u037a\u037d\u0003\u0002",
    "\u0002\u0002\u037b\u0379\u0003\u0002\u0002\u0002\u037b\u037c\u0003\u0002",
    "\u0002\u0002\u037cu\u0003\u0002\u0002\u0002\u037d\u037b\u0003\u0002",
    "\u0002\u0002\u037e\u037f\u00054\u001b\u0002\u037f\u0380\u0005`1\u0002",
    "\u0380\u0386\u0003\u0002\u0002\u0002\u0381\u0383\u00056\u001c\u0002",
    "\u0382\u0384\u0005|?\u0002\u0383\u0382\u0003\u0002\u0002\u0002\u0383",
    "\u0384\u0003\u0002\u0002\u0002\u0384\u0386\u0003\u0002\u0002\u0002\u0385",
    "\u037e\u0003\u0002\u0002\u0002\u0385\u0381\u0003\u0002\u0002\u0002\u0386",
    "w\u0003\u0002\u0002\u0002\u0387\u0388\b=\u0001\u0002\u0388\u0389\u0007",
    "k\u0002\u0002\u0389\u038f\u0003\u0002\u0002\u0002\u038a\u038b\f\u0003",
    "\u0002\u0002\u038b\u038c\u0007Z\u0002\u0002\u038c\u038e\u0007k\u0002",
    "\u0002\u038d\u038a\u0003\u0002\u0002\u0002\u038e\u0391\u0003\u0002\u0002",
    "\u0002\u038f\u038d\u0003\u0002\u0002\u0002\u038f\u0390\u0003\u0002\u0002",
    "\u0002\u0390y\u0003\u0002\u0002\u0002\u0391\u038f\u0003\u0002\u0002",
    "\u0002\u0392\u0394\u0005J&\u0002\u0393\u0395\u0005|?\u0002\u0394\u0393",
    "\u0003\u0002\u0002\u0002\u0394\u0395\u0003\u0002\u0002\u0002\u0395{",
    "\u0003\u0002\u0002\u0002\u0396\u03a2\u0005n8\u0002\u0397\u0399\u0005",
    "n8\u0002\u0398\u0397\u0003\u0002\u0002\u0002\u0398\u0399\u0003\u0002",
    "\u0002\u0002\u0399\u039a\u0003\u0002\u0002\u0002\u039a\u039e\u0005~",
    "@\u0002\u039b\u039d\u0005d3\u0002\u039c\u039b\u0003\u0002\u0002\u0002",
    "\u039d\u03a0\u0003\u0002\u0002\u0002\u039e\u039c\u0003\u0002\u0002\u0002",
    "\u039e\u039f\u0003\u0002\u0002\u0002\u039f\u03a2\u0003\u0002\u0002\u0002",
    "\u03a0\u039e\u0003\u0002\u0002\u0002\u03a1\u0396\u0003\u0002\u0002\u0002",
    "\u03a1\u0398\u0003\u0002\u0002\u0002\u03a2}\u0003\u0002\u0002\u0002",
    "\u03a3\u03a4\b@\u0001\u0002\u03a4\u03a5\u0007=\u0002\u0002\u03a5\u03a6",
    "\u0005|?\u0002\u03a6\u03aa\u0007>\u0002\u0002\u03a7\u03a9\u0005d3\u0002",
    "\u03a8\u03a7\u0003\u0002\u0002\u0002\u03a9\u03ac\u0003\u0002\u0002\u0002",
    "\u03aa\u03a8\u0003\u0002\u0002\u0002\u03aa\u03ab\u0003\u0002\u0002\u0002",
    "\u03ab\u03d2\u0003\u0002\u0002\u0002\u03ac\u03aa\u0003\u0002\u0002\u0002",
    "\u03ad\u03af\u0007?\u0002\u0002\u03ae\u03b0\u0005p9\u0002\u03af\u03ae",
    "\u0003\u0002\u0002\u0002\u03af\u03b0\u0003\u0002\u0002\u0002\u03b0\u03b2",
    "\u0003\u0002\u0002\u0002\u03b1\u03b3\u0005*\u0016\u0002\u03b2\u03b1",
    "\u0003\u0002\u0002\u0002\u03b2\u03b3\u0003\u0002\u0002\u0002\u03b3\u03b4",
    "\u0003\u0002\u0002\u0002\u03b4\u03d2\u0007@\u0002\u0002\u03b5\u03b6",
    "\u0007?\u0002\u0002\u03b6\u03b8\u0007*\u0002\u0002\u03b7\u03b9\u0005",
    "p9\u0002\u03b8\u03b7\u0003\u0002\u0002\u0002\u03b8\u03b9\u0003\u0002",
    "\u0002\u0002\u03b9\u03ba\u0003\u0002\u0002\u0002\u03ba\u03bb\u0005*",
    "\u0016\u0002\u03bb\u03bc\u0007@\u0002\u0002\u03bc\u03d2\u0003\u0002",
    "\u0002\u0002\u03bd\u03be\u0007?\u0002\u0002\u03be\u03bf\u0005p9\u0002",
    "\u03bf\u03c0\u0007*\u0002\u0002\u03c0\u03c1\u0005*\u0016\u0002\u03c1",
    "\u03c2\u0007@\u0002\u0002\u03c2\u03d2\u0003\u0002\u0002\u0002\u03c3",
    "\u03c4\u0007?\u0002\u0002\u03c4\u03c5\u0007M\u0002\u0002\u03c5\u03d2",
    "\u0007@\u0002\u0002\u03c6\u03c8\u0007=\u0002\u0002\u03c7\u03c9\u0005",
    "r:\u0002\u03c8\u03c7\u0003\u0002\u0002\u0002\u03c8\u03c9\u0003\u0002",
    "\u0002\u0002\u03c9\u03ca\u0003\u0002\u0002\u0002\u03ca\u03ce\u0007>",
    "\u0002\u0002\u03cb\u03cd\u0005d3\u0002\u03cc\u03cb\u0003\u0002\u0002",
    "\u0002\u03cd\u03d0\u0003\u0002\u0002\u0002\u03ce\u03cc\u0003\u0002\u0002",
    "\u0002\u03ce\u03cf\u0003\u0002\u0002\u0002\u03cf\u03d2\u0003\u0002\u0002",
    "\u0002\u03d0\u03ce\u0003\u0002\u0002\u0002\u03d1\u03a3\u0003\u0002\u0002",
    "\u0002\u03d1\u03ad\u0003\u0002\u0002\u0002\u03d1\u03b5\u0003\u0002\u0002",
    "\u0002\u03d1\u03bd\u0003\u0002\u0002\u0002\u03d1\u03c3\u0003\u0002\u0002",
    "\u0002\u03d1\u03c6\u0003\u0002\u0002\u0002\u03d2\u03fe\u0003\u0002\u0002",
    "\u0002\u03d3\u03d4\f\u0007\u0002\u0002\u03d4\u03d6\u0007?\u0002\u0002",
    "\u03d5\u03d7\u0005p9\u0002\u03d6\u03d5\u0003\u0002\u0002\u0002\u03d6",
    "\u03d7\u0003\u0002\u0002\u0002\u03d7\u03d9\u0003\u0002\u0002\u0002\u03d8",
    "\u03da\u0005*\u0016\u0002\u03d9\u03d8\u0003\u0002\u0002\u0002\u03d9",
    "\u03da\u0003\u0002\u0002\u0002\u03da\u03db\u0003\u0002\u0002\u0002\u03db",
    "\u03fd\u0007@\u0002\u0002\u03dc\u03dd\f\u0006\u0002\u0002\u03dd\u03de",
    "\u0007?\u0002\u0002\u03de\u03e0\u0007*\u0002\u0002\u03df\u03e1\u0005",
    "p9\u0002\u03e0\u03df\u0003\u0002\u0002\u0002\u03e0\u03e1\u0003\u0002",
    "\u0002\u0002\u03e1\u03e2\u0003\u0002\u0002\u0002\u03e2\u03e3\u0005*",
    "\u0016\u0002\u03e3\u03e4\u0007@\u0002\u0002\u03e4\u03fd\u0003\u0002",
    "\u0002\u0002\u03e5\u03e6\f\u0005\u0002\u0002\u03e6\u03e7\u0007?\u0002",
    "\u0002\u03e7\u03e8\u0005p9\u0002\u03e8\u03e9\u0007*\u0002\u0002\u03e9",
    "\u03ea\u0005*\u0016\u0002\u03ea\u03eb\u0007@\u0002\u0002\u03eb\u03fd",
    "\u0003\u0002\u0002\u0002\u03ec\u03ed\f\u0004\u0002\u0002\u03ed\u03ee",
    "\u0007?\u0002\u0002\u03ee\u03ef\u0007M\u0002\u0002\u03ef\u03fd\u0007",
    "@\u0002\u0002\u03f0\u03f1\f\u0003\u0002\u0002\u03f1\u03f3\u0007=\u0002",
    "\u0002\u03f2\u03f4\u0005r:\u0002\u03f3\u03f2\u0003\u0002\u0002\u0002",
    "\u03f3\u03f4\u0003\u0002\u0002\u0002\u03f4\u03f5\u0003\u0002\u0002\u0002",
    "\u03f5\u03f9\u0007>\u0002\u0002\u03f6\u03f8\u0005d3\u0002\u03f7\u03f6",
    "\u0003\u0002\u0002\u0002\u03f8\u03fb\u0003\u0002\u0002\u0002\u03f9\u03f7",
    "\u0003\u0002\u0002\u0002\u03f9\u03fa\u0003\u0002\u0002\u0002\u03fa\u03fd",
    "\u0003\u0002\u0002\u0002\u03fb\u03f9\u0003\u0002\u0002\u0002\u03fc\u03d3",
    "\u0003\u0002\u0002\u0002\u03fc\u03dc\u0003\u0002\u0002\u0002\u03fc\u03e5",
    "\u0003\u0002\u0002\u0002\u03fc\u03ec\u0003\u0002\u0002\u0002\u03fc\u03f0",
    "\u0003\u0002\u0002\u0002\u03fd\u0400\u0003\u0002\u0002\u0002\u03fe\u03fc",
    "\u0003\u0002\u0002\u0002\u03fe\u03ff\u0003\u0002\u0002\u0002\u03ff\u007f",
    "\u0003\u0002\u0002\u0002\u0400\u03fe\u0003\u0002\u0002\u0002\u0401\u0402",
    "\u0007k\u0002\u0002\u0402\u0081\u0003\u0002\u0002\u0002\u0403\u040e",
    "\u0005*\u0016\u0002\u0404\u0405\u0007A\u0002\u0002\u0405\u0406\u0005",
    "\u0084C\u0002\u0406\u0407\u0007B\u0002\u0002\u0407\u040e\u0003\u0002",
    "\u0002\u0002\u0408\u0409\u0007A\u0002\u0002\u0409\u040a\u0005\u0084",
    "C\u0002\u040a\u040b\u0007Z\u0002\u0002\u040b\u040c\u0007B\u0002\u0002",
    "\u040c\u040e\u0003\u0002\u0002\u0002\u040d\u0403\u0003\u0002\u0002\u0002",
    "\u040d\u0404\u0003\u0002\u0002\u0002\u040d\u0408\u0003\u0002\u0002\u0002",
    "\u040e\u0083\u0003\u0002\u0002\u0002\u040f\u0411\bC\u0001\u0002\u0410",
    "\u0412\u0005\u0086D\u0002\u0411\u0410\u0003\u0002\u0002\u0002\u0411",
    "\u0412\u0003\u0002\u0002\u0002\u0412\u0413\u0003\u0002\u0002\u0002\u0413",
    "\u0414\u0005\u0082B\u0002\u0414\u041d\u0003\u0002\u0002\u0002\u0415",
    "\u0416\f\u0003\u0002\u0002\u0416\u0418\u0007Z\u0002\u0002\u0417\u0419",
    "\u0005\u0086D\u0002\u0418\u0417\u0003\u0002\u0002\u0002\u0418\u0419",
    "\u0003\u0002\u0002\u0002\u0419\u041a\u0003\u0002\u0002\u0002\u041a\u041c",
    "\u0005\u0082B\u0002\u041b\u0415\u0003\u0002\u0002\u0002\u041c\u041f",
    "\u0003\u0002\u0002\u0002\u041d\u041b\u0003\u0002\u0002\u0002\u041d\u041e",
    "\u0003\u0002\u0002\u0002\u041e\u0085\u0003\u0002\u0002\u0002\u041f\u041d",
    "\u0003\u0002\u0002\u0002\u0420\u0421\u0005\u0088E\u0002\u0421\u0422",
    "\u0007[\u0002\u0002\u0422\u0087\u0003\u0002\u0002\u0002\u0423\u0424",
    "\bE\u0001\u0002\u0424\u0425\u0005\u008aF\u0002\u0425\u042a\u0003\u0002",
    "\u0002\u0002\u0426\u0427\f\u0003\u0002\u0002\u0427\u0429\u0005\u008a",
    "F\u0002\u0428\u0426\u0003\u0002\u0002\u0002\u0429\u042c\u0003\u0002",
    "\u0002\u0002\u042a\u0428\u0003\u0002\u0002\u0002\u042a\u042b\u0003\u0002",
    "\u0002\u0002\u042b\u0089\u0003\u0002\u0002\u0002\u042c\u042a\u0003\u0002",
    "\u0002\u0002\u042d\u042e\u0007?\u0002\u0002\u042e\u042f\u00050\u0019",
    "\u0002\u042f\u0430\u0007@\u0002\u0002\u0430\u0434\u0003\u0002\u0002",
    "\u0002\u0431\u0432\u0007i\u0002\u0002\u0432\u0434\u0007k\u0002\u0002",
    "\u0433\u042d\u0003\u0002\u0002\u0002\u0433\u0431\u0003\u0002\u0002\u0002",
    "\u0434\u008b\u0003\u0002\u0002\u0002\u0435\u0436\u0007;\u0002\u0002",
    "\u0436\u0437\u0007=\u0002\u0002\u0437\u0438\u00050\u0019\u0002\u0438",
    "\u043a\u0007Z\u0002\u0002\u0439\u043b\u0007n\u0002\u0002\u043a\u0439",
    "\u0003\u0002\u0002\u0002\u043b\u043c\u0003\u0002\u0002\u0002\u043c\u043a",
    "\u0003\u0002\u0002\u0002\u043c\u043d\u0003\u0002\u0002\u0002\u043d\u043e",
    "\u0003\u0002\u0002\u0002\u043e\u043f\u0007>\u0002\u0002\u043f\u0440",
    "\u0007Y\u0002\u0002\u0440\u008d\u0003\u0002\u0002\u0002\u0441\u0467",
    "\u0005\u0090I\u0002\u0442\u0467\u0005\u0092J\u0002\u0443\u0467\u0005",
    "\u0098M\u0002\u0444\u0467\u0005\u009aN\u0002\u0445\u0467\u0005\u009c",
    "O\u0002\u0446\u0467\u0005\u00a4S\u0002\u0447\u0448\t\f\u0002\u0002\u0448",
    "\u0449\t\r\u0002\u0002\u0449\u0452\u0007=\u0002\u0002\u044a\u044f\u0005",
    "&\u0014\u0002\u044b\u044c\u0007Z\u0002\u0002\u044c\u044e\u0005&\u0014",
    "\u0002\u044d\u044b\u0003\u0002\u0002\u0002\u044e\u0451\u0003\u0002\u0002",
    "\u0002\u044f\u044d\u0003\u0002\u0002\u0002\u044f\u0450\u0003\u0002\u0002",
    "\u0002\u0450\u0453\u0003\u0002\u0002\u0002\u0451\u044f\u0003\u0002\u0002",
    "\u0002\u0452\u044a\u0003\u0002\u0002\u0002\u0452\u0453\u0003\u0002\u0002",
    "\u0002\u0453\u0461\u0003\u0002\u0002\u0002\u0454\u045d\u0007X\u0002",
    "\u0002\u0455\u045a\u0005&\u0014\u0002\u0456\u0457\u0007Z\u0002\u0002",
    "\u0457\u0459\u0005&\u0014\u0002\u0458\u0456\u0003\u0002\u0002\u0002",
    "\u0459\u045c\u0003\u0002\u0002\u0002\u045a\u0458\u0003\u0002\u0002\u0002",
    "\u045a\u045b\u0003\u0002\u0002\u0002\u045b\u045e\u0003\u0002\u0002\u0002",
    "\u045c\u045a\u0003\u0002\u0002\u0002\u045d\u0455\u0003\u0002\u0002\u0002",
    "\u045d\u045e\u0003\u0002\u0002\u0002\u045e\u0460\u0003\u0002\u0002\u0002",
    "\u045f\u0454\u0003\u0002\u0002\u0002\u0460\u0463\u0003\u0002\u0002\u0002",
    "\u0461\u045f\u0003\u0002\u0002\u0002\u0461\u0462\u0003\u0002\u0002\u0002",
    "\u0462\u0464\u0003\u0002\u0002\u0002\u0463\u0461\u0003\u0002\u0002\u0002",
    "\u0464\u0465\u0007>\u0002\u0002\u0465\u0467\u0007Y\u0002\u0002\u0466",
    "\u0441\u0003\u0002\u0002\u0002\u0466\u0442\u0003\u0002\u0002\u0002\u0466",
    "\u0443\u0003\u0002\u0002\u0002\u0466\u0444\u0003\u0002\u0002\u0002\u0466",
    "\u0445\u0003\u0002\u0002\u0002\u0466\u0446\u0003\u0002\u0002\u0002\u0466",
    "\u0447\u0003\u0002\u0002\u0002\u0467\u008f\u0003\u0002\u0002\u0002\u0468",
    "\u0469\u0007k\u0002\u0002\u0469\u046a\u0007X\u0002\u0002\u046a\u0474",
    "\u0005\u008eH\u0002\u046b\u046c\u0007\u0013\u0002\u0002\u046c\u046d",
    "\u00050\u0019\u0002\u046d\u046e\u0007X\u0002\u0002\u046e\u046f\u0005",
    "\u008eH\u0002\u046f\u0474\u0003\u0002\u0002\u0002\u0470\u0471\u0007",
    "\u0017\u0002\u0002\u0471\u0472\u0007X\u0002\u0002\u0472\u0474\u0005",
    "\u008eH\u0002\u0473\u0468\u0003\u0002\u0002\u0002\u0473\u046b\u0003",
    "\u0002\u0002\u0002\u0473\u0470\u0003\u0002\u0002\u0002\u0474\u0091\u0003",
    "\u0002\u0002\u0002\u0475\u0477\u0007A\u0002\u0002\u0476\u0478\u0005",
    "\u0094K\u0002\u0477\u0476\u0003\u0002\u0002\u0002\u0477\u0478\u0003",
    "\u0002\u0002\u0002\u0478\u0479\u0003\u0002\u0002\u0002\u0479\u047a\u0007",
    "B\u0002\u0002\u047a\u0093\u0003\u0002\u0002\u0002\u047b\u047c\bK\u0001",
    "\u0002\u047c\u047d\u0005\u0096L\u0002\u047d\u0482\u0003\u0002\u0002",
    "\u0002\u047e\u047f\f\u0003\u0002\u0002\u047f\u0481\u0005\u0096L\u0002",
    "\u0480\u047e\u0003\u0002\u0002\u0002\u0481\u0484\u0003\u0002\u0002\u0002",
    "\u0482\u0480\u0003\u0002\u0002\u0002\u0482\u0483\u0003\u0002\u0002\u0002",
    "\u0483\u0095\u0003\u0002\u0002\u0002\u0484\u0482\u0003\u0002\u0002\u0002",
    "\u0485\u0488\u0005\u008eH\u0002\u0486\u0488\u00052\u001a\u0002\u0487",
    "\u0485\u0003\u0002\u0002\u0002\u0487\u0486\u0003\u0002\u0002\u0002\u0488",
    "\u0097\u0003\u0002\u0002\u0002\u0489\u048b\u0005.\u0018\u0002\u048a",
    "\u0489\u0003\u0002\u0002\u0002\u048a\u048b\u0003\u0002\u0002\u0002\u048b",
    "\u048c\u0003\u0002\u0002\u0002\u048c\u048d\u0007Y\u0002\u0002\u048d",
    "\u0099\u0003\u0002\u0002\u0002\u048e\u048f\u0007 \u0002\u0002\u048f",
    "\u0490\u0007=\u0002\u0002\u0490\u0491\u0005.\u0018\u0002\u0491\u0492",
    "\u0007>\u0002\u0002\u0492\u0495\u0005\u008eH\u0002\u0493\u0494\u0007",
    "\u001a\u0002\u0002\u0494\u0496\u0005\u008eH\u0002\u0495\u0493\u0003",
    "\u0002\u0002\u0002\u0495\u0496\u0003\u0002\u0002\u0002\u0496\u049e\u0003",
    "\u0002\u0002\u0002\u0497\u0498\u0007,\u0002\u0002\u0498\u0499\u0007",
    "=\u0002\u0002\u0499\u049a\u0005.\u0018\u0002\u049a\u049b\u0007>\u0002",
    "\u0002\u049b\u049c\u0005\u008eH\u0002\u049c\u049e\u0003\u0002\u0002",
    "\u0002\u049d\u048e\u0003\u0002\u0002\u0002\u049d\u0497\u0003\u0002\u0002",
    "\u0002\u049e\u009b\u0003\u0002\u0002\u0002\u049f\u04a0\u00072\u0002",
    "\u0002\u04a0\u04a1\u0007=\u0002\u0002\u04a1\u04a2\u0005.\u0018\u0002",
    "\u04a2\u04a3\u0007>\u0002\u0002\u04a3\u04a4\u0005\u008eH\u0002\u04a4",
    "\u04b4\u0003\u0002\u0002\u0002\u04a5\u04a6\u0007\u0018\u0002\u0002\u04a6",
    "\u04a7\u0005\u008eH\u0002\u04a7\u04a8\u00072\u0002\u0002\u04a8\u04a9",
    "\u0007=\u0002\u0002\u04a9\u04aa\u0005.\u0018\u0002\u04aa\u04ab\u0007",
    ">\u0002\u0002\u04ab\u04ac\u0007Y\u0002\u0002\u04ac\u04b4\u0003\u0002",
    "\u0002\u0002\u04ad\u04ae\u0007\u001e\u0002\u0002\u04ae\u04af\u0007=",
    "\u0002\u0002\u04af\u04b0\u0005\u009eP\u0002\u04b0\u04b1\u0007>\u0002",
    "\u0002\u04b1\u04b2\u0005\u008eH\u0002\u04b2\u04b4\u0003\u0002\u0002",
    "\u0002\u04b3\u049f\u0003\u0002\u0002\u0002\u04b3\u04a5\u0003\u0002\u0002",
    "\u0002\u04b3\u04ad\u0003\u0002\u0002\u0002\u04b4\u009d\u0003\u0002\u0002",
    "\u0002\u04b5\u04b6\u0005\u00a0Q\u0002\u04b6\u04b8\u0007Y\u0002\u0002",
    "\u04b7\u04b9\u0005\u00a2R\u0002\u04b8\u04b7\u0003\u0002\u0002\u0002",
    "\u04b8\u04b9\u0003\u0002\u0002\u0002\u04b9\u04ba\u0003\u0002\u0002\u0002",
    "\u04ba\u04bc\u0007Y\u0002\u0002\u04bb\u04bd\u0005\u00a2R\u0002\u04bc",
    "\u04bb\u0003\u0002\u0002\u0002\u04bc\u04bd\u0003\u0002\u0002\u0002\u04bd",
    "\u04ca\u0003\u0002\u0002\u0002\u04be\u04c0\u0005.\u0018\u0002\u04bf",
    "\u04be\u0003\u0002\u0002\u0002\u04bf\u04c0\u0003\u0002\u0002\u0002\u04c0",
    "\u04c1\u0003\u0002\u0002\u0002\u04c1\u04c3\u0007Y\u0002\u0002\u04c2",
    "\u04c4\u0005\u00a2R\u0002\u04c3\u04c2\u0003\u0002\u0002\u0002\u04c3",
    "\u04c4\u0003\u0002\u0002\u0002\u04c4\u04c5\u0003\u0002\u0002\u0002\u04c5",
    "\u04c7\u0007Y\u0002\u0002\u04c6\u04c8\u0005\u00a2R\u0002\u04c7\u04c6",
    "\u0003\u0002\u0002\u0002\u04c7\u04c8\u0003\u0002\u0002\u0002\u04c8\u04ca",
    "\u0003\u0002\u0002\u0002\u04c9\u04b5\u0003\u0002\u0002\u0002\u04c9\u04bf",
    "\u0003\u0002\u0002\u0002\u04ca\u009f\u0003\u0002\u0002\u0002\u04cb\u04cc",
    "\u00054\u001b\u0002\u04cc\u04cd\u0005:\u001e\u0002\u04cd\u04d0\u0003",
    "\u0002\u0002\u0002\u04ce\u04d0\u00054\u001b\u0002\u04cf\u04cb\u0003",
    "\u0002\u0002\u0002\u04cf\u04ce\u0003\u0002\u0002\u0002\u04d0\u00a1\u0003",
    "\u0002\u0002\u0002\u04d1\u04d2\bR\u0001\u0002\u04d2\u04d3\u0005*\u0016",
    "\u0002\u04d3\u04d9\u0003\u0002\u0002\u0002\u04d4\u04d5\f\u0003\u0002",
    "\u0002\u04d5\u04d6\u0007Z\u0002\u0002\u04d6\u04d8\u0005*\u0016\u0002",
    "\u04d7\u04d4\u0003\u0002\u0002\u0002\u04d8\u04db\u0003\u0002\u0002\u0002",
    "\u04d9\u04d7\u0003\u0002\u0002\u0002\u04d9\u04da\u0003\u0002\u0002\u0002",
    "\u04da\u00a3\u0003\u0002\u0002\u0002\u04db\u04d9\u0003\u0002\u0002\u0002",
    "\u04dc\u04dd\u0007\u001f\u0002\u0002\u04dd\u04de\u0007k\u0002\u0002",
    "\u04de\u04ed\u0007Y\u0002\u0002\u04df\u04e0\u0007\u0016\u0002\u0002",
    "\u04e0\u04ed\u0007Y\u0002\u0002\u04e1\u04e2\u0007\u0012\u0002\u0002",
    "\u04e2\u04ed\u0007Y\u0002\u0002\u04e3\u04e5\u0007&\u0002\u0002\u04e4",
    "\u04e6\u0005.\u0018\u0002\u04e5\u04e4\u0003\u0002\u0002\u0002\u04e5",
    "\u04e6\u0003\u0002\u0002\u0002\u04e6\u04e7\u0003\u0002\u0002\u0002\u04e7",
    "\u04ed\u0007Y\u0002\u0002\u04e8\u04e9\u0007\u001f\u0002\u0002\u04e9",
    "\u04ea\u0005\u000e\b\u0002\u04ea\u04eb\u0007Y\u0002\u0002\u04eb\u04ed",
    "\u0003\u0002\u0002\u0002\u04ec\u04dc\u0003\u0002\u0002\u0002\u04ec\u04df",
    "\u0003\u0002\u0002\u0002\u04ec\u04e1\u0003\u0002\u0002\u0002\u04ec\u04e3",
    "\u0003\u0002\u0002\u0002\u04ec\u04e8\u0003\u0002\u0002\u0002\u04ed\u00a5",
    "\u0003\u0002\u0002\u0002\u04ee\u04f0\u0005\u00a8U\u0002\u04ef\u04ee",
    "\u0003\u0002\u0002\u0002\u04ef\u04f0\u0003\u0002\u0002\u0002\u04f0\u04f1",
    "\u0003\u0002\u0002\u0002\u04f1\u04f2\u0007\u0002\u0002\u0003\u04f2\u00a7",
    "\u0003\u0002\u0002\u0002\u04f3\u04f4\bU\u0001\u0002\u04f4\u04f5\u0005",
    "\u00aaV\u0002\u04f5\u04fa\u0003\u0002\u0002\u0002\u04f6\u04f7\f\u0003",
    "\u0002\u0002\u04f7\u04f9\u0005\u00aaV\u0002\u04f8\u04f6\u0003\u0002",
    "\u0002\u0002\u04f9\u04fc\u0003\u0002\u0002\u0002\u04fa\u04f8\u0003\u0002",
    "\u0002\u0002\u04fa\u04fb\u0003\u0002\u0002\u0002\u04fb\u00a9\u0003\u0002",
    "\u0002\u0002\u04fc\u04fa\u0003\u0002\u0002\u0002\u04fd\u0501\u0005\u00ac",
    "W\u0002\u04fe\u0501\u00052\u001a\u0002\u04ff\u0501\u0007Y\u0002\u0002",
    "\u0500\u04fd\u0003\u0002\u0002\u0002\u0500\u04fe\u0003\u0002\u0002\u0002",
    "\u0500\u04ff\u0003\u0002\u0002\u0002\u0501\u00ab\u0003\u0002\u0002\u0002",
    "\u0502\u0504\u00054\u001b\u0002\u0503\u0502\u0003\u0002\u0002\u0002",
    "\u0503\u0504\u0003\u0002\u0002\u0002\u0504\u0505\u0003\u0002\u0002\u0002",
    "\u0505\u0507\u0005`1\u0002\u0506\u0508\u0005\u00aeX\u0002\u0507\u0506",
    "\u0003\u0002\u0002\u0002\u0507\u0508\u0003\u0002\u0002\u0002\u0508\u0509",
    "\u0003\u0002\u0002\u0002\u0509\u050a\u0005\u0092J\u0002\u050a\u00ad",
    "\u0003\u0002\u0002\u0002\u050b\u050c\bX\u0001\u0002\u050c\u050d\u0005",
    "2\u001a\u0002\u050d\u0512\u0003\u0002\u0002\u0002\u050e\u050f\f\u0003",
    "\u0002\u0002\u050f\u0511\u00052\u001a\u0002\u0510\u050e\u0003\u0002",
    "\u0002\u0002\u0511\u0514\u0003\u0002\u0002\u0002\u0512\u0510\u0003\u0002",
    "\u0002\u0002\u0512\u0513\u0003\u0002\u0002\u0002\u0513\u00af\u0003\u0002",
    "\u0002\u0002\u0514\u0512\u0003\u0002\u0002\u0002\u0090\u00b5\u00bd\u00d1",
    "\u00e2\u00ec\u0110\u011a\u0127\u0129\u0134\u014d\u015e\u016c\u016e\u017a",
    "\u017c\u0188\u018a\u019c\u019e\u01aa\u01ac\u01b7\u01c2\u01cd\u01d8\u01e3",
    "\u01ec\u01f4\u0200\u020d\u0212\u0217\u021e\u0228\u0230\u0243\u0249\u024e",
    "\u0257\u0262\u0267\u026c\u0270\u0274\u0276\u0280\u0285\u0289\u028d\u0295",
    "\u029e\u02a8\u02b0\u02c1\u02cd\u02d0\u02d6\u02e4\u02ea\u02ef\u02f2\u02f9",
    "\u0308\u0314\u0317\u0319\u0321\u0325\u0333\u0337\u033c\u033f\u0342\u0349",
    "\u034b\u0350\u0354\u0359\u035d\u0360\u0369\u0371\u037b\u0383\u0385\u038f",
    "\u0394\u0398\u039e\u03a1\u03aa\u03af\u03b2\u03b8\u03c8\u03ce\u03d1\u03d6",
    "\u03d9\u03e0\u03f3\u03f9\u03fc\u03fe\u040d\u0411\u0418\u041d\u042a\u0433",
    "\u043c\u044f\u0452\u045a\u045d\u0461\u0466\u0473\u0477\u0482\u0487\u048a",
    "\u0495\u049d\u04b3\u04b8\u04bc\u04bf\u04c3\u04c7\u04c9\u04cf\u04d9\u04e5",
    "\u04ec\u04ef\u04fa\u0500\u0503\u0507\u0512"].join("");


var atn = new antlr4.atn.ATNDeserializer().deserialize(serializedATN);

var decisionsToDFA = atn.decisionToState.map( function(ds, index) { return new antlr4.dfa.DFA(ds, index); });

var sharedContextCache = new antlr4.PredictionContextCache();

var literalNames = [ null, "'__extension__'", "'__builtin_va_arg'", "'__builtin_offsetof'", 
                     "'__m128'", "'__m128d'", "'__m128i'", "'__typeof__'", 
                     "'__inline__'", "'__stdcall'", "'__declspec'", "'__asm'", 
                     "'__attribute__'", "'__asm__'", "'__volatile__'", "'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'", "'('", "')'", "'['", "']'", "'{'", 
                     "'}'", "'<'", "'<='", "'>'", "'>='", "'<<'", "'>>'", 
                     "'+'", "'++'", "'-'", "'--'", "'*'", "'/'", "'%'", 
                     "'&'", "'|'", "'&&'", "'||'", "'^'", "'!'", "'~'", 
                     "'?'", "':'", "';'", "','", "'='", "'*='", "'/='", 
                     "'%='", "'+='", "'-='", "'<<='", "'>>='", "'&='", "'^='", 
                     "'|='", "'=='", "'!='", "'->'", "'.'", "'...'" ];

var symbolicNames = [ null, null, null, null, null, null, null, null, null, 
                      null, null, null, null, null, null, "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", "StaticAssert", "ThreadLocal", 
                      "LeftParen", "RightParen", "LeftBracket", "RightBracket", 
                      "LeftBrace", "RightBrace", "Less", "LessEqual", "Greater", 
                      "GreaterEqual", "LeftShift", "RightShift", "Plus", 
                      "PlusPlus", "Minus", "MinusMinus", "Star", "Div", 
                      "Mod", "And", "Or", "AndAnd", "OrOr", "Caret", "Not", 
                      "Tilde", "Question", "Colon", "Semi", "Comma", "Assign", 
                      "StarAssign", "DivAssign", "ModAssign", "PlusAssign", 
                      "MinusAssign", "LeftShiftAssign", "RightShiftAssign", 
                      "AndAssign", "XorAssign", "OrAssign", "Equal", "NotEqual", 
                      "Arrow", "Dot", "Ellipsis", "Identifier", "Constant", 
                      "DigitSequence", "StringLiteral", "ComplexDefine", 
                      "IncludeDirective", "AsmBlock", "LineAfterPreprocessing", 
                      "LineDirective", "PragmaDirective", "Whitespace", 
                      "Newline", "BlockComment", "LineComment" ];

var ruleNames =  [ "primaryExpression", "genericSelection", "genericAssocList", 
                   "genericAssociation", "postfixExpression", "argumentExpressionList", 
                   "unaryExpression", "unaryOperator", "castExpression", 
                   "multiplicativeExpression", "additiveExpression", "shiftExpression", 
                   "relationalExpression", "equalityExpression", "andExpression", 
                   "exclusiveOrExpression", "inclusiveOrExpression", "logicalAndExpression", 
                   "logicalOrExpression", "conditionalExpression", "assignmentExpression", 
                   "assignmentOperator", "expression", "constantExpression", 
                   "declaration", "declarationSpecifiers", "declarationSpecifiers2", 
                   "declarationSpecifier", "initDeclaratorList", "initDeclarator", 
                   "storageClassSpecifier", "typeSpecifier", "structOrUnionSpecifier", 
                   "structOrUnion", "structDeclarationList", "structDeclaration", 
                   "specifierQualifierList", "structDeclaratorList", "structDeclarator", 
                   "enumSpecifier", "enumeratorList", "enumerator", "enumerationConstant", 
                   "atomicTypeSpecifier", "typeQualifier", "functionSpecifier", 
                   "alignmentSpecifier", "declarator", "directDeclarator", 
                   "gccDeclaratorExtension", "gccAttributeSpecifier", "gccAttributeList", 
                   "gccAttribute", "nestedParenthesesBlock", "pointer", 
                   "typeQualifierList", "parameterTypeList", "parameterList", 
                   "parameterDeclaration", "identifierList", "typeName", 
                   "abstractDeclarator", "directAbstractDeclarator", "typedefName", 
                   "initializer", "initializerList", "designation", "designatorList", 
                   "designator", "staticAssertDeclaration", "statement", 
                   "labeledStatement", "compoundStatement", "blockItemList", 
                   "blockItem", "expressionStatement", "selectionStatement", 
                   "iterationStatement", "forCondition", "forDeclaration", 
                   "forExpression", "jumpStatement", "compilationUnit", 
                   "translationUnit", "externalDeclaration", "functionDefinition", 
                   "declarationList" ];

function CParser (input) {
	antlr4.Parser.call(this, input);
    this._interp = new antlr4.atn.ParserATNSimulator(this, atn, decisionsToDFA, sharedContextCache);
    this.ruleNames = ruleNames;
    this.literalNames = literalNames;
    this.symbolicNames = symbolicNames;
    return this;
}

CParser.prototype = Object.create(antlr4.Parser.prototype);
CParser.prototype.constructor = CParser;

Object.defineProperty(CParser.prototype, "atn", {
	get : function() {
		return atn;
	}
});

CParser.EOF = antlr4.Token.EOF;
CParser.T__0 = 1;
CParser.T__1 = 2;
CParser.T__2 = 3;
CParser.T__3 = 4;
CParser.T__4 = 5;
CParser.T__5 = 6;
CParser.T__6 = 7;
CParser.T__7 = 8;
CParser.T__8 = 9;
CParser.T__9 = 10;
CParser.T__10 = 11;
CParser.T__11 = 12;
CParser.T__12 = 13;
CParser.T__13 = 14;
CParser.Auto = 15;
CParser.Break = 16;
CParser.Case = 17;
CParser.Char = 18;
CParser.Const = 19;
CParser.Continue = 20;
CParser.Default = 21;
CParser.Do = 22;
CParser.Double = 23;
CParser.Else = 24;
CParser.Enum = 25;
CParser.Extern = 26;
CParser.Float = 27;
CParser.For = 28;
CParser.Goto = 29;
CParser.If = 30;
CParser.Inline = 31;
CParser.Int = 32;
CParser.Long = 33;
CParser.Register = 34;
CParser.Restrict = 35;
CParser.Return = 36;
CParser.Short = 37;
CParser.Signed = 38;
CParser.Sizeof = 39;
CParser.Static = 40;
CParser.Struct = 41;
CParser.Switch = 42;
CParser.Typedef = 43;
CParser.Union = 44;
CParser.Unsigned = 45;
CParser.Void = 46;
CParser.Volatile = 47;
CParser.While = 48;
CParser.Alignas = 49;
CParser.Alignof = 50;
CParser.Atomic = 51;
CParser.Bool = 52;
CParser.Complex = 53;
CParser.Generic = 54;
CParser.Imaginary = 55;
CParser.Noreturn = 56;
CParser.StaticAssert = 57;
CParser.ThreadLocal = 58;
CParser.LeftParen = 59;
CParser.RightParen = 60;
CParser.LeftBracket = 61;
CParser.RightBracket = 62;
CParser.LeftBrace = 63;
CParser.RightBrace = 64;
CParser.Less = 65;
CParser.LessEqual = 66;
CParser.Greater = 67;
CParser.GreaterEqual = 68;
CParser.LeftShift = 69;
CParser.RightShift = 70;
CParser.Plus = 71;
CParser.PlusPlus = 72;
CParser.Minus = 73;
CParser.MinusMinus = 74;
CParser.Star = 75;
CParser.Div = 76;
CParser.Mod = 77;
CParser.And = 78;
CParser.Or = 79;
CParser.AndAnd = 80;
CParser.OrOr = 81;
CParser.Caret = 82;
CParser.Not = 83;
CParser.Tilde = 84;
CParser.Question = 85;
CParser.Colon = 86;
CParser.Semi = 87;
CParser.Comma = 88;
CParser.Assign = 89;
CParser.StarAssign = 90;
CParser.DivAssign = 91;
CParser.ModAssign = 92;
CParser.PlusAssign = 93;
CParser.MinusAssign = 94;
CParser.LeftShiftAssign = 95;
CParser.RightShiftAssign = 96;
CParser.AndAssign = 97;
CParser.XorAssign = 98;
CParser.OrAssign = 99;
CParser.Equal = 100;
CParser.NotEqual = 101;
CParser.Arrow = 102;
CParser.Dot = 103;
CParser.Ellipsis = 104;
CParser.Identifier = 105;
CParser.Constant = 106;
CParser.DigitSequence = 107;
CParser.StringLiteral = 108;
CParser.ComplexDefine = 109;
CParser.IncludeDirective = 110;
CParser.AsmBlock = 111;
CParser.LineAfterPreprocessing = 112;
CParser.LineDirective = 113;
CParser.PragmaDirective = 114;
CParser.Whitespace = 115;
CParser.Newline = 116;
CParser.BlockComment = 117;
CParser.LineComment = 118;

CParser.RULE_primaryExpression = 0;
CParser.RULE_genericSelection = 1;
CParser.RULE_genericAssocList = 2;
CParser.RULE_genericAssociation = 3;
CParser.RULE_postfixExpression = 4;
CParser.RULE_argumentExpressionList = 5;
CParser.RULE_unaryExpression = 6;
CParser.RULE_unaryOperator = 7;
CParser.RULE_castExpression = 8;
CParser.RULE_multiplicativeExpression = 9;
CParser.RULE_additiveExpression = 10;
CParser.RULE_shiftExpression = 11;
CParser.RULE_relationalExpression = 12;
CParser.RULE_equalityExpression = 13;
CParser.RULE_andExpression = 14;
CParser.RULE_exclusiveOrExpression = 15;
CParser.RULE_inclusiveOrExpression = 16;
CParser.RULE_logicalAndExpression = 17;
CParser.RULE_logicalOrExpression = 18;
CParser.RULE_conditionalExpression = 19;
CParser.RULE_assignmentExpression = 20;
CParser.RULE_assignmentOperator = 21;
CParser.RULE_expression = 22;
CParser.RULE_constantExpression = 23;
CParser.RULE_declaration = 24;
CParser.RULE_declarationSpecifiers = 25;
CParser.RULE_declarationSpecifiers2 = 26;
CParser.RULE_declarationSpecifier = 27;
CParser.RULE_initDeclaratorList = 28;
CParser.RULE_initDeclarator = 29;
CParser.RULE_storageClassSpecifier = 30;
CParser.RULE_typeSpecifier = 31;
CParser.RULE_structOrUnionSpecifier = 32;
CParser.RULE_structOrUnion = 33;
CParser.RULE_structDeclarationList = 34;
CParser.RULE_structDeclaration = 35;
CParser.RULE_specifierQualifierList = 36;
CParser.RULE_structDeclaratorList = 37;
CParser.RULE_structDeclarator = 38;
CParser.RULE_enumSpecifier = 39;
CParser.RULE_enumeratorList = 40;
CParser.RULE_enumerator = 41;
CParser.RULE_enumerationConstant = 42;
CParser.RULE_atomicTypeSpecifier = 43;
CParser.RULE_typeQualifier = 44;
CParser.RULE_functionSpecifier = 45;
CParser.RULE_alignmentSpecifier = 46;
CParser.RULE_declarator = 47;
CParser.RULE_directDeclarator = 48;
CParser.RULE_gccDeclaratorExtension = 49;
CParser.RULE_gccAttributeSpecifier = 50;
CParser.RULE_gccAttributeList = 51;
CParser.RULE_gccAttribute = 52;
CParser.RULE_nestedParenthesesBlock = 53;
CParser.RULE_pointer = 54;
CParser.RULE_typeQualifierList = 55;
CParser.RULE_parameterTypeList = 56;
CParser.RULE_parameterList = 57;
CParser.RULE_parameterDeclaration = 58;
CParser.RULE_identifierList = 59;
CParser.RULE_typeName = 60;
CParser.RULE_abstractDeclarator = 61;
CParser.RULE_directAbstractDeclarator = 62;
CParser.RULE_typedefName = 63;
CParser.RULE_initializer = 64;
CParser.RULE_initializerList = 65;
CParser.RULE_designation = 66;
CParser.RULE_designatorList = 67;
CParser.RULE_designator = 68;
CParser.RULE_staticAssertDeclaration = 69;
CParser.RULE_statement = 70;
CParser.RULE_labeledStatement = 71;
CParser.RULE_compoundStatement = 72;
CParser.RULE_blockItemList = 73;
CParser.RULE_blockItem = 74;
CParser.RULE_expressionStatement = 75;
CParser.RULE_selectionStatement = 76;
CParser.RULE_iterationStatement = 77;
CParser.RULE_forCondition = 78;
CParser.RULE_forDeclaration = 79;
CParser.RULE_forExpression = 80;
CParser.RULE_jumpStatement = 81;
CParser.RULE_compilationUnit = 82;
CParser.RULE_translationUnit = 83;
CParser.RULE_externalDeclaration = 84;
CParser.RULE_functionDefinition = 85;
CParser.RULE_declarationList = 86;


function PrimaryExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_primaryExpression;
    return this;
}

PrimaryExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
PrimaryExpressionContext.prototype.constructor = PrimaryExpressionContext;

PrimaryExpressionContext.prototype.Identifier = function() {
    return this.getToken(CParser.Identifier, 0);
};

PrimaryExpressionContext.prototype.Constant = function() {
    return this.getToken(CParser.Constant, 0);
};

PrimaryExpressionContext.prototype.StringLiteral = function(i) {
	if(i===undefined) {
		i = null;
	}
    if(i===null) {
        return this.getTokens(CParser.StringLiteral);
    } else {
        return this.getToken(CParser.StringLiteral, i);
    }
};


PrimaryExpressionContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

PrimaryExpressionContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

PrimaryExpressionContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

PrimaryExpressionContext.prototype.genericSelection = function() {
    return this.getTypedRuleContext(GenericSelectionContext,0);
};

PrimaryExpressionContext.prototype.compoundStatement = function() {
    return this.getTypedRuleContext(CompoundStatementContext,0);
};

PrimaryExpressionContext.prototype.unaryExpression = function() {
    return this.getTypedRuleContext(UnaryExpressionContext,0);
};

PrimaryExpressionContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

PrimaryExpressionContext.prototype.typeName = function() {
    return this.getTypedRuleContext(TypeNameContext,0);
};

PrimaryExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterPrimaryExpression(this);
	}
};

PrimaryExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitPrimaryExpression(this);
	}
};




CParser.PrimaryExpressionContext = PrimaryExpressionContext;

CParser.prototype.primaryExpression = function() {

    var localctx = new PrimaryExpressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 0, CParser.RULE_primaryExpression);
    var _la = 0; // Token type
    try {
        this.state = 207;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,2,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 174;
            this.match(CParser.Identifier);
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 175;
            this.match(CParser.Constant);
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 177; 
            this._errHandler.sync(this);
            var _alt = 1;
            do {
            	switch (_alt) {
            	case 1:
            		this.state = 176;
            		this.match(CParser.StringLiteral);
            		break;
            	default:
            		throw new antlr4.error.NoViableAltException(this);
            	}
            	this.state = 179; 
            	this._errHandler.sync(this);
            	_alt = this._interp.adaptivePredict(this._input,0, this._ctx);
            } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );
            break;

        case 4:
            this.enterOuterAlt(localctx, 4);
            this.state = 181;
            this.match(CParser.LeftParen);
            this.state = 182;
            this.expression(0);
            this.state = 183;
            this.match(CParser.RightParen);
            break;

        case 5:
            this.enterOuterAlt(localctx, 5);
            this.state = 185;
            this.genericSelection();
            break;

        case 6:
            this.enterOuterAlt(localctx, 6);
            this.state = 187;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if(_la===CParser.T__0) {
                this.state = 186;
                this.match(CParser.T__0);
            }

            this.state = 189;
            this.match(CParser.LeftParen);
            this.state = 190;
            this.compoundStatement();
            this.state = 191;
            this.match(CParser.RightParen);
            break;

        case 7:
            this.enterOuterAlt(localctx, 7);
            this.state = 193;
            this.match(CParser.T__1);
            this.state = 194;
            this.match(CParser.LeftParen);
            this.state = 195;
            this.unaryExpression();
            this.state = 196;
            this.match(CParser.Comma);
            this.state = 197;
            this.typeName();
            this.state = 198;
            this.match(CParser.RightParen);
            break;

        case 8:
            this.enterOuterAlt(localctx, 8);
            this.state = 200;
            this.match(CParser.T__2);
            this.state = 201;
            this.match(CParser.LeftParen);
            this.state = 202;
            this.typeName();
            this.state = 203;
            this.match(CParser.Comma);
            this.state = 204;
            this.unaryExpression();
            this.state = 205;
            this.match(CParser.RightParen);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function GenericSelectionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_genericSelection;
    return this;
}

GenericSelectionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
GenericSelectionContext.prototype.constructor = GenericSelectionContext;

GenericSelectionContext.prototype.Generic = function() {
    return this.getToken(CParser.Generic, 0);
};

GenericSelectionContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

GenericSelectionContext.prototype.assignmentExpression = function() {
    return this.getTypedRuleContext(AssignmentExpressionContext,0);
};

GenericSelectionContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

GenericSelectionContext.prototype.genericAssocList = function() {
    return this.getTypedRuleContext(GenericAssocListContext,0);
};

GenericSelectionContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

GenericSelectionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterGenericSelection(this);
	}
};

GenericSelectionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitGenericSelection(this);
	}
};




CParser.GenericSelectionContext = GenericSelectionContext;

CParser.prototype.genericSelection = function() {

    var localctx = new GenericSelectionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 2, CParser.RULE_genericSelection);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 209;
        this.match(CParser.Generic);
        this.state = 210;
        this.match(CParser.LeftParen);
        this.state = 211;
        this.assignmentExpression();
        this.state = 212;
        this.match(CParser.Comma);
        this.state = 213;
        this.genericAssocList(0);
        this.state = 214;
        this.match(CParser.RightParen);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function GenericAssocListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_genericAssocList;
    return this;
}

GenericAssocListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
GenericAssocListContext.prototype.constructor = GenericAssocListContext;

GenericAssocListContext.prototype.genericAssociation = function() {
    return this.getTypedRuleContext(GenericAssociationContext,0);
};

GenericAssocListContext.prototype.genericAssocList = function() {
    return this.getTypedRuleContext(GenericAssocListContext,0);
};

GenericAssocListContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

GenericAssocListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterGenericAssocList(this);
	}
};

GenericAssocListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitGenericAssocList(this);
	}
};



CParser.prototype.genericAssocList = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new GenericAssocListContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 4;
    this.enterRecursionRule(localctx, 4, CParser.RULE_genericAssocList, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 217;
        this.genericAssociation();
        this._ctx.stop = this._input.LT(-1);
        this.state = 224;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,3,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new GenericAssocListContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_genericAssocList);
                this.state = 219;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 220;
                this.match(CParser.Comma);
                this.state = 221;
                this.genericAssociation(); 
            }
            this.state = 226;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,3,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function GenericAssociationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_genericAssociation;
    return this;
}

GenericAssociationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
GenericAssociationContext.prototype.constructor = GenericAssociationContext;

GenericAssociationContext.prototype.typeName = function() {
    return this.getTypedRuleContext(TypeNameContext,0);
};

GenericAssociationContext.prototype.Colon = function() {
    return this.getToken(CParser.Colon, 0);
};

GenericAssociationContext.prototype.assignmentExpression = function() {
    return this.getTypedRuleContext(AssignmentExpressionContext,0);
};

GenericAssociationContext.prototype.Default = function() {
    return this.getToken(CParser.Default, 0);
};

GenericAssociationContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterGenericAssociation(this);
	}
};

GenericAssociationContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitGenericAssociation(this);
	}
};




CParser.GenericAssociationContext = GenericAssociationContext;

CParser.prototype.genericAssociation = function() {

    var localctx = new GenericAssociationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 6, CParser.RULE_genericAssociation);
    try {
        this.state = 234;
        this._errHandler.sync(this);
        switch(this._input.LA(1)) {
        case CParser.T__0:
        case CParser.T__3:
        case CParser.T__4:
        case CParser.T__5:
        case CParser.T__6:
        case CParser.Char:
        case CParser.Const:
        case CParser.Double:
        case CParser.Enum:
        case CParser.Float:
        case CParser.Int:
        case CParser.Long:
        case CParser.Restrict:
        case CParser.Short:
        case CParser.Signed:
        case CParser.Struct:
        case CParser.Union:
        case CParser.Unsigned:
        case CParser.Void:
        case CParser.Volatile:
        case CParser.Atomic:
        case CParser.Bool:
        case CParser.Complex:
        case CParser.Identifier:
            this.enterOuterAlt(localctx, 1);
            this.state = 227;
            this.typeName();
            this.state = 228;
            this.match(CParser.Colon);
            this.state = 229;
            this.assignmentExpression();
            break;
        case CParser.Default:
            this.enterOuterAlt(localctx, 2);
            this.state = 231;
            this.match(CParser.Default);
            this.state = 232;
            this.match(CParser.Colon);
            this.state = 233;
            this.assignmentExpression();
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function PostfixExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_postfixExpression;
    return this;
}

PostfixExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
PostfixExpressionContext.prototype.constructor = PostfixExpressionContext;

PostfixExpressionContext.prototype.primaryExpression = function() {
    return this.getTypedRuleContext(PrimaryExpressionContext,0);
};

PostfixExpressionContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

PostfixExpressionContext.prototype.typeName = function() {
    return this.getTypedRuleContext(TypeNameContext,0);
};

PostfixExpressionContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

PostfixExpressionContext.prototype.LeftBrace = function() {
    return this.getToken(CParser.LeftBrace, 0);
};

PostfixExpressionContext.prototype.initializerList = function() {
    return this.getTypedRuleContext(InitializerListContext,0);
};

PostfixExpressionContext.prototype.RightBrace = function() {
    return this.getToken(CParser.RightBrace, 0);
};

PostfixExpressionContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

PostfixExpressionContext.prototype.postfixExpression = function() {
    return this.getTypedRuleContext(PostfixExpressionContext,0);
};

PostfixExpressionContext.prototype.LeftBracket = function() {
    return this.getToken(CParser.LeftBracket, 0);
};

PostfixExpressionContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

PostfixExpressionContext.prototype.RightBracket = function() {
    return this.getToken(CParser.RightBracket, 0);
};

PostfixExpressionContext.prototype.argumentExpressionList = function() {
    return this.getTypedRuleContext(ArgumentExpressionListContext,0);
};

PostfixExpressionContext.prototype.Dot = function() {
    return this.getToken(CParser.Dot, 0);
};

PostfixExpressionContext.prototype.Identifier = function() {
    return this.getToken(CParser.Identifier, 0);
};

PostfixExpressionContext.prototype.Arrow = function() {
    return this.getToken(CParser.Arrow, 0);
};

PostfixExpressionContext.prototype.PlusPlus = function() {
    return this.getToken(CParser.PlusPlus, 0);
};

PostfixExpressionContext.prototype.MinusMinus = function() {
    return this.getToken(CParser.MinusMinus, 0);
};

PostfixExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterPostfixExpression(this);
	}
};

PostfixExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitPostfixExpression(this);
	}
};



CParser.prototype.postfixExpression = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new PostfixExpressionContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 8;
    this.enterRecursionRule(localctx, 8, CParser.RULE_postfixExpression, _p);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 270;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,5,this._ctx);
        switch(la_) {
        case 1:
            this.state = 237;
            this.primaryExpression();
            break;

        case 2:
            this.state = 238;
            this.match(CParser.LeftParen);
            this.state = 239;
            this.typeName();
            this.state = 240;
            this.match(CParser.RightParen);
            this.state = 241;
            this.match(CParser.LeftBrace);
            this.state = 242;
            this.initializerList(0);
            this.state = 243;
            this.match(CParser.RightBrace);
            break;

        case 3:
            this.state = 245;
            this.match(CParser.LeftParen);
            this.state = 246;
            this.typeName();
            this.state = 247;
            this.match(CParser.RightParen);
            this.state = 248;
            this.match(CParser.LeftBrace);
            this.state = 249;
            this.initializerList(0);
            this.state = 250;
            this.match(CParser.Comma);
            this.state = 251;
            this.match(CParser.RightBrace);
            break;

        case 4:
            this.state = 253;
            this.match(CParser.T__0);
            this.state = 254;
            this.match(CParser.LeftParen);
            this.state = 255;
            this.typeName();
            this.state = 256;
            this.match(CParser.RightParen);
            this.state = 257;
            this.match(CParser.LeftBrace);
            this.state = 258;
            this.initializerList(0);
            this.state = 259;
            this.match(CParser.RightBrace);
            break;

        case 5:
            this.state = 261;
            this.match(CParser.T__0);
            this.state = 262;
            this.match(CParser.LeftParen);
            this.state = 263;
            this.typeName();
            this.state = 264;
            this.match(CParser.RightParen);
            this.state = 265;
            this.match(CParser.LeftBrace);
            this.state = 266;
            this.initializerList(0);
            this.state = 267;
            this.match(CParser.Comma);
            this.state = 268;
            this.match(CParser.RightBrace);
            break;

        }
        this._ctx.stop = this._input.LT(-1);
        this.state = 295;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,8,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                this.state = 293;
                this._errHandler.sync(this);
                var la_ = this._interp.adaptivePredict(this._input,7,this._ctx);
                switch(la_) {
                case 1:
                    localctx = new PostfixExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression);
                    this.state = 272;
                    if (!( this.precpred(this._ctx, 10))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 10)");
                    }
                    this.state = 273;
                    this.match(CParser.LeftBracket);
                    this.state = 274;
                    this.expression(0);
                    this.state = 275;
                    this.match(CParser.RightBracket);
                    break;

                case 2:
                    localctx = new PostfixExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression);
                    this.state = 277;
                    if (!( this.precpred(this._ctx, 9))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 9)");
                    }
                    this.state = 278;
                    this.match(CParser.LeftParen);
                    this.state = 280;
                    this._errHandler.sync(this);
                    _la = this._input.LA(1);
                    if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.DigitSequence - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) {
                        this.state = 279;
                        this.argumentExpressionList(0);
                    }

                    this.state = 282;
                    this.match(CParser.RightParen);
                    break;

                case 3:
                    localctx = new PostfixExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression);
                    this.state = 283;
                    if (!( this.precpred(this._ctx, 8))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 8)");
                    }
                    this.state = 284;
                    this.match(CParser.Dot);
                    this.state = 285;
                    this.match(CParser.Identifier);
                    break;

                case 4:
                    localctx = new PostfixExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression);
                    this.state = 286;
                    if (!( this.precpred(this._ctx, 7))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 7)");
                    }
                    this.state = 287;
                    this.match(CParser.Arrow);
                    this.state = 288;
                    this.match(CParser.Identifier);
                    break;

                case 5:
                    localctx = new PostfixExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression);
                    this.state = 289;
                    if (!( this.precpred(this._ctx, 6))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 6)");
                    }
                    this.state = 290;
                    this.match(CParser.PlusPlus);
                    break;

                case 6:
                    localctx = new PostfixExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_postfixExpression);
                    this.state = 291;
                    if (!( this.precpred(this._ctx, 5))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)");
                    }
                    this.state = 292;
                    this.match(CParser.MinusMinus);
                    break;

                } 
            }
            this.state = 297;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,8,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function ArgumentExpressionListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_argumentExpressionList;
    return this;
}

ArgumentExpressionListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ArgumentExpressionListContext.prototype.constructor = ArgumentExpressionListContext;

ArgumentExpressionListContext.prototype.assignmentExpression = function() {
    return this.getTypedRuleContext(AssignmentExpressionContext,0);
};

ArgumentExpressionListContext.prototype.argumentExpressionList = function() {
    return this.getTypedRuleContext(ArgumentExpressionListContext,0);
};

ArgumentExpressionListContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

ArgumentExpressionListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterArgumentExpressionList(this);
	}
};

ArgumentExpressionListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitArgumentExpressionList(this);
	}
};



CParser.prototype.argumentExpressionList = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new ArgumentExpressionListContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 10;
    this.enterRecursionRule(localctx, 10, CParser.RULE_argumentExpressionList, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 299;
        this.assignmentExpression();
        this._ctx.stop = this._input.LT(-1);
        this.state = 306;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,9,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new ArgumentExpressionListContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_argumentExpressionList);
                this.state = 301;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 302;
                this.match(CParser.Comma);
                this.state = 303;
                this.assignmentExpression(); 
            }
            this.state = 308;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,9,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function UnaryExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_unaryExpression;
    return this;
}

UnaryExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
UnaryExpressionContext.prototype.constructor = UnaryExpressionContext;

UnaryExpressionContext.prototype.postfixExpression = function() {
    return this.getTypedRuleContext(PostfixExpressionContext,0);
};

UnaryExpressionContext.prototype.PlusPlus = function() {
    return this.getToken(CParser.PlusPlus, 0);
};

UnaryExpressionContext.prototype.unaryExpression = function() {
    return this.getTypedRuleContext(UnaryExpressionContext,0);
};

UnaryExpressionContext.prototype.MinusMinus = function() {
    return this.getToken(CParser.MinusMinus, 0);
};

UnaryExpressionContext.prototype.unaryOperator = function() {
    return this.getTypedRuleContext(UnaryOperatorContext,0);
};

UnaryExpressionContext.prototype.castExpression = function() {
    return this.getTypedRuleContext(CastExpressionContext,0);
};

UnaryExpressionContext.prototype.Sizeof = function() {
    return this.getToken(CParser.Sizeof, 0);
};

UnaryExpressionContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

UnaryExpressionContext.prototype.typeName = function() {
    return this.getTypedRuleContext(TypeNameContext,0);
};

UnaryExpressionContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

UnaryExpressionContext.prototype.Alignof = function() {
    return this.getToken(CParser.Alignof, 0);
};

UnaryExpressionContext.prototype.AndAnd = function() {
    return this.getToken(CParser.AndAnd, 0);
};

UnaryExpressionContext.prototype.Identifier = function() {
    return this.getToken(CParser.Identifier, 0);
};

UnaryExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterUnaryExpression(this);
	}
};

UnaryExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitUnaryExpression(this);
	}
};




CParser.UnaryExpressionContext = UnaryExpressionContext;

CParser.prototype.unaryExpression = function() {

    var localctx = new UnaryExpressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 12, CParser.RULE_unaryExpression);
    try {
        this.state = 331;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,10,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 309;
            this.postfixExpression(0);
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 310;
            this.match(CParser.PlusPlus);
            this.state = 311;
            this.unaryExpression();
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 312;
            this.match(CParser.MinusMinus);
            this.state = 313;
            this.unaryExpression();
            break;

        case 4:
            this.enterOuterAlt(localctx, 4);
            this.state = 314;
            this.unaryOperator();
            this.state = 315;
            this.castExpression();
            break;

        case 5:
            this.enterOuterAlt(localctx, 5);
            this.state = 317;
            this.match(CParser.Sizeof);
            this.state = 318;
            this.unaryExpression();
            break;

        case 6:
            this.enterOuterAlt(localctx, 6);
            this.state = 319;
            this.match(CParser.Sizeof);
            this.state = 320;
            this.match(CParser.LeftParen);
            this.state = 321;
            this.typeName();
            this.state = 322;
            this.match(CParser.RightParen);
            break;

        case 7:
            this.enterOuterAlt(localctx, 7);
            this.state = 324;
            this.match(CParser.Alignof);
            this.state = 325;
            this.match(CParser.LeftParen);
            this.state = 326;
            this.typeName();
            this.state = 327;
            this.match(CParser.RightParen);
            break;

        case 8:
            this.enterOuterAlt(localctx, 8);
            this.state = 329;
            this.match(CParser.AndAnd);
            this.state = 330;
            this.match(CParser.Identifier);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function UnaryOperatorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_unaryOperator;
    return this;
}

UnaryOperatorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
UnaryOperatorContext.prototype.constructor = UnaryOperatorContext;

UnaryOperatorContext.prototype.And = function() {
    return this.getToken(CParser.And, 0);
};

UnaryOperatorContext.prototype.Star = function() {
    return this.getToken(CParser.Star, 0);
};

UnaryOperatorContext.prototype.Plus = function() {
    return this.getToken(CParser.Plus, 0);
};

UnaryOperatorContext.prototype.Minus = function() {
    return this.getToken(CParser.Minus, 0);
};

UnaryOperatorContext.prototype.Tilde = function() {
    return this.getToken(CParser.Tilde, 0);
};

UnaryOperatorContext.prototype.Not = function() {
    return this.getToken(CParser.Not, 0);
};

UnaryOperatorContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterUnaryOperator(this);
	}
};

UnaryOperatorContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitUnaryOperator(this);
	}
};




CParser.UnaryOperatorContext = UnaryOperatorContext;

CParser.prototype.unaryOperator = function() {

    var localctx = new UnaryOperatorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 14, CParser.RULE_unaryOperator);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 333;
        _la = this._input.LA(1);
        if(!(((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0))) {
        this._errHandler.recoverInline(this);
        }
        else {
        	this._errHandler.reportMatch(this);
            this.consume();
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function CastExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_castExpression;
    return this;
}

CastExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
CastExpressionContext.prototype.constructor = CastExpressionContext;

CastExpressionContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

CastExpressionContext.prototype.typeName = function() {
    return this.getTypedRuleContext(TypeNameContext,0);
};

CastExpressionContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

CastExpressionContext.prototype.castExpression = function() {
    return this.getTypedRuleContext(CastExpressionContext,0);
};

CastExpressionContext.prototype.unaryExpression = function() {
    return this.getTypedRuleContext(UnaryExpressionContext,0);
};

CastExpressionContext.prototype.DigitSequence = function() {
    return this.getToken(CParser.DigitSequence, 0);
};

CastExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterCastExpression(this);
	}
};

CastExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitCastExpression(this);
	}
};




CParser.CastExpressionContext = CastExpressionContext;

CParser.prototype.castExpression = function() {

    var localctx = new CastExpressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 16, CParser.RULE_castExpression);
    try {
        this.state = 348;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,11,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 335;
            this.match(CParser.LeftParen);
            this.state = 336;
            this.typeName();
            this.state = 337;
            this.match(CParser.RightParen);
            this.state = 338;
            this.castExpression();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 340;
            this.match(CParser.T__0);
            this.state = 341;
            this.match(CParser.LeftParen);
            this.state = 342;
            this.typeName();
            this.state = 343;
            this.match(CParser.RightParen);
            this.state = 344;
            this.castExpression();
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 346;
            this.unaryExpression();
            break;

        case 4:
            this.enterOuterAlt(localctx, 4);
            this.state = 347;
            this.match(CParser.DigitSequence);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function MultiplicativeExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_multiplicativeExpression;
    return this;
}

MultiplicativeExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
MultiplicativeExpressionContext.prototype.constructor = MultiplicativeExpressionContext;

MultiplicativeExpressionContext.prototype.castExpression = function() {
    return this.getTypedRuleContext(CastExpressionContext,0);
};

MultiplicativeExpressionContext.prototype.multiplicativeExpression = function() {
    return this.getTypedRuleContext(MultiplicativeExpressionContext,0);
};

MultiplicativeExpressionContext.prototype.Star = function() {
    return this.getToken(CParser.Star, 0);
};

MultiplicativeExpressionContext.prototype.Div = function() {
    return this.getToken(CParser.Div, 0);
};

MultiplicativeExpressionContext.prototype.Mod = function() {
    return this.getToken(CParser.Mod, 0);
};

MultiplicativeExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterMultiplicativeExpression(this);
	}
};

MultiplicativeExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitMultiplicativeExpression(this);
	}
};



CParser.prototype.multiplicativeExpression = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new MultiplicativeExpressionContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 18;
    this.enterRecursionRule(localctx, 18, CParser.RULE_multiplicativeExpression, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 351;
        this.castExpression();
        this._ctx.stop = this._input.LT(-1);
        this.state = 364;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,13,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                this.state = 362;
                this._errHandler.sync(this);
                var la_ = this._interp.adaptivePredict(this._input,12,this._ctx);
                switch(la_) {
                case 1:
                    localctx = new MultiplicativeExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_multiplicativeExpression);
                    this.state = 353;
                    if (!( this.precpred(this._ctx, 3))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)");
                    }
                    this.state = 354;
                    this.match(CParser.Star);
                    this.state = 355;
                    this.castExpression();
                    break;

                case 2:
                    localctx = new MultiplicativeExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_multiplicativeExpression);
                    this.state = 356;
                    if (!( this.precpred(this._ctx, 2))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)");
                    }
                    this.state = 357;
                    this.match(CParser.Div);
                    this.state = 358;
                    this.castExpression();
                    break;

                case 3:
                    localctx = new MultiplicativeExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_multiplicativeExpression);
                    this.state = 359;
                    if (!( this.precpred(this._ctx, 1))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                    }
                    this.state = 360;
                    this.match(CParser.Mod);
                    this.state = 361;
                    this.castExpression();
                    break;

                } 
            }
            this.state = 366;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,13,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function AdditiveExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_additiveExpression;
    return this;
}

AdditiveExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
AdditiveExpressionContext.prototype.constructor = AdditiveExpressionContext;

AdditiveExpressionContext.prototype.multiplicativeExpression = function() {
    return this.getTypedRuleContext(MultiplicativeExpressionContext,0);
};

AdditiveExpressionContext.prototype.additiveExpression = function() {
    return this.getTypedRuleContext(AdditiveExpressionContext,0);
};

AdditiveExpressionContext.prototype.Plus = function() {
    return this.getToken(CParser.Plus, 0);
};

AdditiveExpressionContext.prototype.Minus = function() {
    return this.getToken(CParser.Minus, 0);
};

AdditiveExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterAdditiveExpression(this);
	}
};

AdditiveExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitAdditiveExpression(this);
	}
};



CParser.prototype.additiveExpression = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new AdditiveExpressionContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 20;
    this.enterRecursionRule(localctx, 20, CParser.RULE_additiveExpression, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 368;
        this.multiplicativeExpression(0);
        this._ctx.stop = this._input.LT(-1);
        this.state = 378;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,15,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                this.state = 376;
                this._errHandler.sync(this);
                var la_ = this._interp.adaptivePredict(this._input,14,this._ctx);
                switch(la_) {
                case 1:
                    localctx = new AdditiveExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_additiveExpression);
                    this.state = 370;
                    if (!( this.precpred(this._ctx, 2))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)");
                    }
                    this.state = 371;
                    this.match(CParser.Plus);
                    this.state = 372;
                    this.multiplicativeExpression(0);
                    break;

                case 2:
                    localctx = new AdditiveExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_additiveExpression);
                    this.state = 373;
                    if (!( this.precpred(this._ctx, 1))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                    }
                    this.state = 374;
                    this.match(CParser.Minus);
                    this.state = 375;
                    this.multiplicativeExpression(0);
                    break;

                } 
            }
            this.state = 380;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,15,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function ShiftExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_shiftExpression;
    return this;
}

ShiftExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ShiftExpressionContext.prototype.constructor = ShiftExpressionContext;

ShiftExpressionContext.prototype.additiveExpression = function() {
    return this.getTypedRuleContext(AdditiveExpressionContext,0);
};

ShiftExpressionContext.prototype.shiftExpression = function() {
    return this.getTypedRuleContext(ShiftExpressionContext,0);
};

ShiftExpressionContext.prototype.LeftShift = function() {
    return this.getToken(CParser.LeftShift, 0);
};

ShiftExpressionContext.prototype.RightShift = function() {
    return this.getToken(CParser.RightShift, 0);
};

ShiftExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterShiftExpression(this);
	}
};

ShiftExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitShiftExpression(this);
	}
};



CParser.prototype.shiftExpression = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new ShiftExpressionContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 22;
    this.enterRecursionRule(localctx, 22, CParser.RULE_shiftExpression, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 382;
        this.additiveExpression(0);
        this._ctx.stop = this._input.LT(-1);
        this.state = 392;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,17,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                this.state = 390;
                this._errHandler.sync(this);
                var la_ = this._interp.adaptivePredict(this._input,16,this._ctx);
                switch(la_) {
                case 1:
                    localctx = new ShiftExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_shiftExpression);
                    this.state = 384;
                    if (!( this.precpred(this._ctx, 2))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)");
                    }
                    this.state = 385;
                    this.match(CParser.LeftShift);
                    this.state = 386;
                    this.additiveExpression(0);
                    break;

                case 2:
                    localctx = new ShiftExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_shiftExpression);
                    this.state = 387;
                    if (!( this.precpred(this._ctx, 1))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                    }
                    this.state = 388;
                    this.match(CParser.RightShift);
                    this.state = 389;
                    this.additiveExpression(0);
                    break;

                } 
            }
            this.state = 394;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,17,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function RelationalExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_relationalExpression;
    return this;
}

RelationalExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
RelationalExpressionContext.prototype.constructor = RelationalExpressionContext;

RelationalExpressionContext.prototype.shiftExpression = function() {
    return this.getTypedRuleContext(ShiftExpressionContext,0);
};

RelationalExpressionContext.prototype.relationalExpression = function() {
    return this.getTypedRuleContext(RelationalExpressionContext,0);
};

RelationalExpressionContext.prototype.Less = function() {
    return this.getToken(CParser.Less, 0);
};

RelationalExpressionContext.prototype.Greater = function() {
    return this.getToken(CParser.Greater, 0);
};

RelationalExpressionContext.prototype.LessEqual = function() {
    return this.getToken(CParser.LessEqual, 0);
};

RelationalExpressionContext.prototype.GreaterEqual = function() {
    return this.getToken(CParser.GreaterEqual, 0);
};

RelationalExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterRelationalExpression(this);
	}
};

RelationalExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitRelationalExpression(this);
	}
};



CParser.prototype.relationalExpression = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new RelationalExpressionContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 24;
    this.enterRecursionRule(localctx, 24, CParser.RULE_relationalExpression, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 396;
        this.shiftExpression(0);
        this._ctx.stop = this._input.LT(-1);
        this.state = 412;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,19,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                this.state = 410;
                this._errHandler.sync(this);
                var la_ = this._interp.adaptivePredict(this._input,18,this._ctx);
                switch(la_) {
                case 1:
                    localctx = new RelationalExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression);
                    this.state = 398;
                    if (!( this.precpred(this._ctx, 4))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)");
                    }
                    this.state = 399;
                    this.match(CParser.Less);
                    this.state = 400;
                    this.shiftExpression(0);
                    break;

                case 2:
                    localctx = new RelationalExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression);
                    this.state = 401;
                    if (!( this.precpred(this._ctx, 3))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)");
                    }
                    this.state = 402;
                    this.match(CParser.Greater);
                    this.state = 403;
                    this.shiftExpression(0);
                    break;

                case 3:
                    localctx = new RelationalExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression);
                    this.state = 404;
                    if (!( this.precpred(this._ctx, 2))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)");
                    }
                    this.state = 405;
                    this.match(CParser.LessEqual);
                    this.state = 406;
                    this.shiftExpression(0);
                    break;

                case 4:
                    localctx = new RelationalExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_relationalExpression);
                    this.state = 407;
                    if (!( this.precpred(this._ctx, 1))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                    }
                    this.state = 408;
                    this.match(CParser.GreaterEqual);
                    this.state = 409;
                    this.shiftExpression(0);
                    break;

                } 
            }
            this.state = 414;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,19,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function EqualityExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_equalityExpression;
    return this;
}

EqualityExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
EqualityExpressionContext.prototype.constructor = EqualityExpressionContext;

EqualityExpressionContext.prototype.relationalExpression = function() {
    return this.getTypedRuleContext(RelationalExpressionContext,0);
};

EqualityExpressionContext.prototype.equalityExpression = function() {
    return this.getTypedRuleContext(EqualityExpressionContext,0);
};

EqualityExpressionContext.prototype.Equal = function() {
    return this.getToken(CParser.Equal, 0);
};

EqualityExpressionContext.prototype.NotEqual = function() {
    return this.getToken(CParser.NotEqual, 0);
};

EqualityExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterEqualityExpression(this);
	}
};

EqualityExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitEqualityExpression(this);
	}
};



CParser.prototype.equalityExpression = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new EqualityExpressionContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 26;
    this.enterRecursionRule(localctx, 26, CParser.RULE_equalityExpression, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 416;
        this.relationalExpression(0);
        this._ctx.stop = this._input.LT(-1);
        this.state = 426;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,21,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                this.state = 424;
                this._errHandler.sync(this);
                var la_ = this._interp.adaptivePredict(this._input,20,this._ctx);
                switch(la_) {
                case 1:
                    localctx = new EqualityExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_equalityExpression);
                    this.state = 418;
                    if (!( this.precpred(this._ctx, 2))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)");
                    }
                    this.state = 419;
                    this.match(CParser.Equal);
                    this.state = 420;
                    this.relationalExpression(0);
                    break;

                case 2:
                    localctx = new EqualityExpressionContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_equalityExpression);
                    this.state = 421;
                    if (!( this.precpred(this._ctx, 1))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                    }
                    this.state = 422;
                    this.match(CParser.NotEqual);
                    this.state = 423;
                    this.relationalExpression(0);
                    break;

                } 
            }
            this.state = 428;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,21,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function AndExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_andExpression;
    return this;
}

AndExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
AndExpressionContext.prototype.constructor = AndExpressionContext;

AndExpressionContext.prototype.equalityExpression = function() {
    return this.getTypedRuleContext(EqualityExpressionContext,0);
};

AndExpressionContext.prototype.andExpression = function() {
    return this.getTypedRuleContext(AndExpressionContext,0);
};

AndExpressionContext.prototype.And = function() {
    return this.getToken(CParser.And, 0);
};

AndExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterAndExpression(this);
	}
};

AndExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitAndExpression(this);
	}
};



CParser.prototype.andExpression = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new AndExpressionContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 28;
    this.enterRecursionRule(localctx, 28, CParser.RULE_andExpression, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 430;
        this.equalityExpression(0);
        this._ctx.stop = this._input.LT(-1);
        this.state = 437;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,22,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new AndExpressionContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_andExpression);
                this.state = 432;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 433;
                this.match(CParser.And);
                this.state = 434;
                this.equalityExpression(0); 
            }
            this.state = 439;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,22,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function ExclusiveOrExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_exclusiveOrExpression;
    return this;
}

ExclusiveOrExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ExclusiveOrExpressionContext.prototype.constructor = ExclusiveOrExpressionContext;

ExclusiveOrExpressionContext.prototype.andExpression = function() {
    return this.getTypedRuleContext(AndExpressionContext,0);
};

ExclusiveOrExpressionContext.prototype.exclusiveOrExpression = function() {
    return this.getTypedRuleContext(ExclusiveOrExpressionContext,0);
};

ExclusiveOrExpressionContext.prototype.Caret = function() {
    return this.getToken(CParser.Caret, 0);
};

ExclusiveOrExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterExclusiveOrExpression(this);
	}
};

ExclusiveOrExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitExclusiveOrExpression(this);
	}
};



CParser.prototype.exclusiveOrExpression = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new ExclusiveOrExpressionContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 30;
    this.enterRecursionRule(localctx, 30, CParser.RULE_exclusiveOrExpression, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 441;
        this.andExpression(0);
        this._ctx.stop = this._input.LT(-1);
        this.state = 448;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,23,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new ExclusiveOrExpressionContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_exclusiveOrExpression);
                this.state = 443;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 444;
                this.match(CParser.Caret);
                this.state = 445;
                this.andExpression(0); 
            }
            this.state = 450;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,23,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function InclusiveOrExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_inclusiveOrExpression;
    return this;
}

InclusiveOrExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
InclusiveOrExpressionContext.prototype.constructor = InclusiveOrExpressionContext;

InclusiveOrExpressionContext.prototype.exclusiveOrExpression = function() {
    return this.getTypedRuleContext(ExclusiveOrExpressionContext,0);
};

InclusiveOrExpressionContext.prototype.inclusiveOrExpression = function() {
    return this.getTypedRuleContext(InclusiveOrExpressionContext,0);
};

InclusiveOrExpressionContext.prototype.Or = function() {
    return this.getToken(CParser.Or, 0);
};

InclusiveOrExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterInclusiveOrExpression(this);
	}
};

InclusiveOrExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitInclusiveOrExpression(this);
	}
};



CParser.prototype.inclusiveOrExpression = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new InclusiveOrExpressionContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 32;
    this.enterRecursionRule(localctx, 32, CParser.RULE_inclusiveOrExpression, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 452;
        this.exclusiveOrExpression(0);
        this._ctx.stop = this._input.LT(-1);
        this.state = 459;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,24,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new InclusiveOrExpressionContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_inclusiveOrExpression);
                this.state = 454;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 455;
                this.match(CParser.Or);
                this.state = 456;
                this.exclusiveOrExpression(0); 
            }
            this.state = 461;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,24,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function LogicalAndExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_logicalAndExpression;
    return this;
}

LogicalAndExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
LogicalAndExpressionContext.prototype.constructor = LogicalAndExpressionContext;

LogicalAndExpressionContext.prototype.inclusiveOrExpression = function() {
    return this.getTypedRuleContext(InclusiveOrExpressionContext,0);
};

LogicalAndExpressionContext.prototype.logicalAndExpression = function() {
    return this.getTypedRuleContext(LogicalAndExpressionContext,0);
};

LogicalAndExpressionContext.prototype.AndAnd = function() {
    return this.getToken(CParser.AndAnd, 0);
};

LogicalAndExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterLogicalAndExpression(this);
	}
};

LogicalAndExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitLogicalAndExpression(this);
	}
};



CParser.prototype.logicalAndExpression = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new LogicalAndExpressionContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 34;
    this.enterRecursionRule(localctx, 34, CParser.RULE_logicalAndExpression, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 463;
        this.inclusiveOrExpression(0);
        this._ctx.stop = this._input.LT(-1);
        this.state = 470;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,25,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new LogicalAndExpressionContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_logicalAndExpression);
                this.state = 465;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 466;
                this.match(CParser.AndAnd);
                this.state = 467;
                this.inclusiveOrExpression(0); 
            }
            this.state = 472;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,25,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function LogicalOrExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_logicalOrExpression;
    return this;
}

LogicalOrExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
LogicalOrExpressionContext.prototype.constructor = LogicalOrExpressionContext;

LogicalOrExpressionContext.prototype.logicalAndExpression = function() {
    return this.getTypedRuleContext(LogicalAndExpressionContext,0);
};

LogicalOrExpressionContext.prototype.logicalOrExpression = function() {
    return this.getTypedRuleContext(LogicalOrExpressionContext,0);
};

LogicalOrExpressionContext.prototype.OrOr = function() {
    return this.getToken(CParser.OrOr, 0);
};

LogicalOrExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterLogicalOrExpression(this);
	}
};

LogicalOrExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitLogicalOrExpression(this);
	}
};



CParser.prototype.logicalOrExpression = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new LogicalOrExpressionContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 36;
    this.enterRecursionRule(localctx, 36, CParser.RULE_logicalOrExpression, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 474;
        this.logicalAndExpression(0);
        this._ctx.stop = this._input.LT(-1);
        this.state = 481;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,26,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new LogicalOrExpressionContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_logicalOrExpression);
                this.state = 476;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 477;
                this.match(CParser.OrOr);
                this.state = 478;
                this.logicalAndExpression(0); 
            }
            this.state = 483;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,26,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function ConditionalExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_conditionalExpression;
    return this;
}

ConditionalExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ConditionalExpressionContext.prototype.constructor = ConditionalExpressionContext;

ConditionalExpressionContext.prototype.logicalOrExpression = function() {
    return this.getTypedRuleContext(LogicalOrExpressionContext,0);
};

ConditionalExpressionContext.prototype.Question = function() {
    return this.getToken(CParser.Question, 0);
};

ConditionalExpressionContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

ConditionalExpressionContext.prototype.Colon = function() {
    return this.getToken(CParser.Colon, 0);
};

ConditionalExpressionContext.prototype.conditionalExpression = function() {
    return this.getTypedRuleContext(ConditionalExpressionContext,0);
};

ConditionalExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterConditionalExpression(this);
	}
};

ConditionalExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitConditionalExpression(this);
	}
};




CParser.ConditionalExpressionContext = ConditionalExpressionContext;

CParser.prototype.conditionalExpression = function() {

    var localctx = new ConditionalExpressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 38, CParser.RULE_conditionalExpression);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 484;
        this.logicalOrExpression(0);
        this.state = 490;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,27,this._ctx);
        if(la_===1) {
            this.state = 485;
            this.match(CParser.Question);
            this.state = 486;
            this.expression(0);
            this.state = 487;
            this.match(CParser.Colon);
            this.state = 488;
            this.conditionalExpression();

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function AssignmentExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_assignmentExpression;
    return this;
}

AssignmentExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
AssignmentExpressionContext.prototype.constructor = AssignmentExpressionContext;

AssignmentExpressionContext.prototype.conditionalExpression = function() {
    return this.getTypedRuleContext(ConditionalExpressionContext,0);
};

AssignmentExpressionContext.prototype.unaryExpression = function() {
    return this.getTypedRuleContext(UnaryExpressionContext,0);
};

AssignmentExpressionContext.prototype.assignmentOperator = function() {
    return this.getTypedRuleContext(AssignmentOperatorContext,0);
};

AssignmentExpressionContext.prototype.assignmentExpression = function() {
    return this.getTypedRuleContext(AssignmentExpressionContext,0);
};

AssignmentExpressionContext.prototype.DigitSequence = function() {
    return this.getToken(CParser.DigitSequence, 0);
};

AssignmentExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterAssignmentExpression(this);
	}
};

AssignmentExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitAssignmentExpression(this);
	}
};




CParser.AssignmentExpressionContext = AssignmentExpressionContext;

CParser.prototype.assignmentExpression = function() {

    var localctx = new AssignmentExpressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 40, CParser.RULE_assignmentExpression);
    try {
        this.state = 498;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,28,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 492;
            this.conditionalExpression();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 493;
            this.unaryExpression();
            this.state = 494;
            this.assignmentOperator();
            this.state = 495;
            this.assignmentExpression();
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 497;
            this.match(CParser.DigitSequence);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function AssignmentOperatorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_assignmentOperator;
    return this;
}

AssignmentOperatorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
AssignmentOperatorContext.prototype.constructor = AssignmentOperatorContext;

AssignmentOperatorContext.prototype.Assign = function() {
    return this.getToken(CParser.Assign, 0);
};

AssignmentOperatorContext.prototype.StarAssign = function() {
    return this.getToken(CParser.StarAssign, 0);
};

AssignmentOperatorContext.prototype.DivAssign = function() {
    return this.getToken(CParser.DivAssign, 0);
};

AssignmentOperatorContext.prototype.ModAssign = function() {
    return this.getToken(CParser.ModAssign, 0);
};

AssignmentOperatorContext.prototype.PlusAssign = function() {
    return this.getToken(CParser.PlusAssign, 0);
};

AssignmentOperatorContext.prototype.MinusAssign = function() {
    return this.getToken(CParser.MinusAssign, 0);
};

AssignmentOperatorContext.prototype.LeftShiftAssign = function() {
    return this.getToken(CParser.LeftShiftAssign, 0);
};

AssignmentOperatorContext.prototype.RightShiftAssign = function() {
    return this.getToken(CParser.RightShiftAssign, 0);
};

AssignmentOperatorContext.prototype.AndAssign = function() {
    return this.getToken(CParser.AndAssign, 0);
};

AssignmentOperatorContext.prototype.XorAssign = function() {
    return this.getToken(CParser.XorAssign, 0);
};

AssignmentOperatorContext.prototype.OrAssign = function() {
    return this.getToken(CParser.OrAssign, 0);
};

AssignmentOperatorContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterAssignmentOperator(this);
	}
};

AssignmentOperatorContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitAssignmentOperator(this);
	}
};




CParser.AssignmentOperatorContext = AssignmentOperatorContext;

CParser.prototype.assignmentOperator = function() {

    var localctx = new AssignmentOperatorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 42, CParser.RULE_assignmentOperator);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 500;
        _la = this._input.LA(1);
        if(!(((((_la - 89)) & ~0x1f) == 0 && ((1 << (_la - 89)) & ((1 << (CParser.Assign - 89)) | (1 << (CParser.StarAssign - 89)) | (1 << (CParser.DivAssign - 89)) | (1 << (CParser.ModAssign - 89)) | (1 << (CParser.PlusAssign - 89)) | (1 << (CParser.MinusAssign - 89)) | (1 << (CParser.LeftShiftAssign - 89)) | (1 << (CParser.RightShiftAssign - 89)) | (1 << (CParser.AndAssign - 89)) | (1 << (CParser.XorAssign - 89)) | (1 << (CParser.OrAssign - 89)))) !== 0))) {
        this._errHandler.recoverInline(this);
        }
        else {
        	this._errHandler.reportMatch(this);
            this.consume();
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function ExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_expression;
    return this;
}

ExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ExpressionContext.prototype.constructor = ExpressionContext;

ExpressionContext.prototype.assignmentExpression = function() {
    return this.getTypedRuleContext(AssignmentExpressionContext,0);
};

ExpressionContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

ExpressionContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

ExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterExpression(this);
	}
};

ExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitExpression(this);
	}
};



CParser.prototype.expression = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new ExpressionContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 44;
    this.enterRecursionRule(localctx, 44, CParser.RULE_expression, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 503;
        this.assignmentExpression();
        this._ctx.stop = this._input.LT(-1);
        this.state = 510;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,29,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new ExpressionContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_expression);
                this.state = 505;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 506;
                this.match(CParser.Comma);
                this.state = 507;
                this.assignmentExpression(); 
            }
            this.state = 512;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,29,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function ConstantExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_constantExpression;
    return this;
}

ConstantExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ConstantExpressionContext.prototype.constructor = ConstantExpressionContext;

ConstantExpressionContext.prototype.conditionalExpression = function() {
    return this.getTypedRuleContext(ConditionalExpressionContext,0);
};

ConstantExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterConstantExpression(this);
	}
};

ConstantExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitConstantExpression(this);
	}
};




CParser.ConstantExpressionContext = ConstantExpressionContext;

CParser.prototype.constantExpression = function() {

    var localctx = new ConstantExpressionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 46, CParser.RULE_constantExpression);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 513;
        this.conditionalExpression();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function DeclarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_declaration;
    return this;
}

DeclarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
DeclarationContext.prototype.constructor = DeclarationContext;

DeclarationContext.prototype.declarationSpecifiers = function() {
    return this.getTypedRuleContext(DeclarationSpecifiersContext,0);
};

DeclarationContext.prototype.initDeclaratorList = function() {
    return this.getTypedRuleContext(InitDeclaratorListContext,0);
};

DeclarationContext.prototype.Semi = function() {
    return this.getToken(CParser.Semi, 0);
};

DeclarationContext.prototype.staticAssertDeclaration = function() {
    return this.getTypedRuleContext(StaticAssertDeclarationContext,0);
};

DeclarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterDeclaration(this);
	}
};

DeclarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitDeclaration(this);
	}
};




CParser.DeclarationContext = DeclarationContext;

CParser.prototype.declaration = function() {

    var localctx = new DeclarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 48, CParser.RULE_declaration);
    try {
        this.state = 523;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,30,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 515;
            this.declarationSpecifiers();
            this.state = 516;
            this.initDeclaratorList(0);
            this.state = 517;
            this.match(CParser.Semi);
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 519;
            this.declarationSpecifiers();
            this.state = 520;
            this.match(CParser.Semi);
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 522;
            this.staticAssertDeclaration();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function DeclarationSpecifiersContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_declarationSpecifiers;
    return this;
}

DeclarationSpecifiersContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
DeclarationSpecifiersContext.prototype.constructor = DeclarationSpecifiersContext;

DeclarationSpecifiersContext.prototype.declarationSpecifier = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(DeclarationSpecifierContext);
    } else {
        return this.getTypedRuleContext(DeclarationSpecifierContext,i);
    }
};

DeclarationSpecifiersContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterDeclarationSpecifiers(this);
	}
};

DeclarationSpecifiersContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitDeclarationSpecifiers(this);
	}
};




CParser.DeclarationSpecifiersContext = DeclarationSpecifiersContext;

CParser.prototype.declarationSpecifiers = function() {

    var localctx = new DeclarationSpecifiersContext(this, this._ctx, this.state);
    this.enterRule(localctx, 50, CParser.RULE_declarationSpecifiers);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 526; 
        this._errHandler.sync(this);
        var _alt = 1;
        do {
        	switch (_alt) {
        	case 1:
        		this.state = 525;
        		this.declarationSpecifier();
        		break;
        	default:
        		throw new antlr4.error.NoViableAltException(this);
        	}
        	this.state = 528; 
        	this._errHandler.sync(this);
        	_alt = this._interp.adaptivePredict(this._input,31, this._ctx);
        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function DeclarationSpecifiers2Context(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_declarationSpecifiers2;
    return this;
}

DeclarationSpecifiers2Context.prototype = Object.create(antlr4.ParserRuleContext.prototype);
DeclarationSpecifiers2Context.prototype.constructor = DeclarationSpecifiers2Context;

DeclarationSpecifiers2Context.prototype.declarationSpecifier = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(DeclarationSpecifierContext);
    } else {
        return this.getTypedRuleContext(DeclarationSpecifierContext,i);
    }
};

DeclarationSpecifiers2Context.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterDeclarationSpecifiers2(this);
	}
};

DeclarationSpecifiers2Context.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitDeclarationSpecifiers2(this);
	}
};




CParser.DeclarationSpecifiers2Context = DeclarationSpecifiers2Context;

CParser.prototype.declarationSpecifiers2 = function() {

    var localctx = new DeclarationSpecifiers2Context(this, this._ctx, this.state);
    this.enterRule(localctx, 52, CParser.RULE_declarationSpecifiers2);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 531; 
        this._errHandler.sync(this);
        var _alt = 1;
        do {
        	switch (_alt) {
        	case 1:
        		this.state = 530;
        		this.declarationSpecifier();
        		break;
        	default:
        		throw new antlr4.error.NoViableAltException(this);
        	}
        	this.state = 533; 
        	this._errHandler.sync(this);
        	_alt = this._interp.adaptivePredict(this._input,32, this._ctx);
        } while ( _alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER );
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function DeclarationSpecifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_declarationSpecifier;
    return this;
}

DeclarationSpecifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
DeclarationSpecifierContext.prototype.constructor = DeclarationSpecifierContext;

DeclarationSpecifierContext.prototype.storageClassSpecifier = function() {
    return this.getTypedRuleContext(StorageClassSpecifierContext,0);
};

DeclarationSpecifierContext.prototype.typeSpecifier = function() {
    return this.getTypedRuleContext(TypeSpecifierContext,0);
};

DeclarationSpecifierContext.prototype.typeQualifier = function() {
    return this.getTypedRuleContext(TypeQualifierContext,0);
};

DeclarationSpecifierContext.prototype.functionSpecifier = function() {
    return this.getTypedRuleContext(FunctionSpecifierContext,0);
};

DeclarationSpecifierContext.prototype.alignmentSpecifier = function() {
    return this.getTypedRuleContext(AlignmentSpecifierContext,0);
};

DeclarationSpecifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterDeclarationSpecifier(this);
	}
};

DeclarationSpecifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitDeclarationSpecifier(this);
	}
};




CParser.DeclarationSpecifierContext = DeclarationSpecifierContext;

CParser.prototype.declarationSpecifier = function() {

    var localctx = new DeclarationSpecifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 54, CParser.RULE_declarationSpecifier);
    try {
        this.state = 540;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,33,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 535;
            this.storageClassSpecifier();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 536;
            this.typeSpecifier(0);
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 537;
            this.typeQualifier();
            break;

        case 4:
            this.enterOuterAlt(localctx, 4);
            this.state = 538;
            this.functionSpecifier();
            break;

        case 5:
            this.enterOuterAlt(localctx, 5);
            this.state = 539;
            this.alignmentSpecifier();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function InitDeclaratorListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_initDeclaratorList;
    return this;
}

InitDeclaratorListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
InitDeclaratorListContext.prototype.constructor = InitDeclaratorListContext;

InitDeclaratorListContext.prototype.initDeclarator = function() {
    return this.getTypedRuleContext(InitDeclaratorContext,0);
};

InitDeclaratorListContext.prototype.initDeclaratorList = function() {
    return this.getTypedRuleContext(InitDeclaratorListContext,0);
};

InitDeclaratorListContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

InitDeclaratorListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterInitDeclaratorList(this);
	}
};

InitDeclaratorListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitInitDeclaratorList(this);
	}
};



CParser.prototype.initDeclaratorList = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new InitDeclaratorListContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 56;
    this.enterRecursionRule(localctx, 56, CParser.RULE_initDeclaratorList, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 543;
        this.initDeclarator();
        this._ctx.stop = this._input.LT(-1);
        this.state = 550;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,34,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new InitDeclaratorListContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_initDeclaratorList);
                this.state = 545;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 546;
                this.match(CParser.Comma);
                this.state = 547;
                this.initDeclarator(); 
            }
            this.state = 552;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,34,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function InitDeclaratorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_initDeclarator;
    return this;
}

InitDeclaratorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
InitDeclaratorContext.prototype.constructor = InitDeclaratorContext;

InitDeclaratorContext.prototype.declarator = function() {
    return this.getTypedRuleContext(DeclaratorContext,0);
};

InitDeclaratorContext.prototype.Assign = function() {
    return this.getToken(CParser.Assign, 0);
};

InitDeclaratorContext.prototype.initializer = function() {
    return this.getTypedRuleContext(InitializerContext,0);
};

InitDeclaratorContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterInitDeclarator(this);
	}
};

InitDeclaratorContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitInitDeclarator(this);
	}
};




CParser.InitDeclaratorContext = InitDeclaratorContext;

CParser.prototype.initDeclarator = function() {

    var localctx = new InitDeclaratorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 58, CParser.RULE_initDeclarator);
    try {
        this.state = 558;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,35,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 553;
            this.declarator();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 554;
            this.declarator();
            this.state = 555;
            this.match(CParser.Assign);
            this.state = 556;
            this.initializer();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function StorageClassSpecifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_storageClassSpecifier;
    return this;
}

StorageClassSpecifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
StorageClassSpecifierContext.prototype.constructor = StorageClassSpecifierContext;

StorageClassSpecifierContext.prototype.Typedef = function() {
    return this.getToken(CParser.Typedef, 0);
};

StorageClassSpecifierContext.prototype.Extern = function() {
    return this.getToken(CParser.Extern, 0);
};

StorageClassSpecifierContext.prototype.Static = function() {
    return this.getToken(CParser.Static, 0);
};

StorageClassSpecifierContext.prototype.ThreadLocal = function() {
    return this.getToken(CParser.ThreadLocal, 0);
};

StorageClassSpecifierContext.prototype.Auto = function() {
    return this.getToken(CParser.Auto, 0);
};

StorageClassSpecifierContext.prototype.Register = function() {
    return this.getToken(CParser.Register, 0);
};

StorageClassSpecifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterStorageClassSpecifier(this);
	}
};

StorageClassSpecifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitStorageClassSpecifier(this);
	}
};




CParser.StorageClassSpecifierContext = StorageClassSpecifierContext;

CParser.prototype.storageClassSpecifier = function() {

    var localctx = new StorageClassSpecifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 60, CParser.RULE_storageClassSpecifier);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 560;
        _la = this._input.LA(1);
        if(!(_la===CParser.Auto || _la===CParser.Extern || ((((_la - 34)) & ~0x1f) == 0 && ((1 << (_la - 34)) & ((1 << (CParser.Register - 34)) | (1 << (CParser.Static - 34)) | (1 << (CParser.Typedef - 34)) | (1 << (CParser.ThreadLocal - 34)))) !== 0))) {
        this._errHandler.recoverInline(this);
        }
        else {
        	this._errHandler.reportMatch(this);
            this.consume();
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function TypeSpecifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_typeSpecifier;
    return this;
}

TypeSpecifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
TypeSpecifierContext.prototype.constructor = TypeSpecifierContext;

TypeSpecifierContext.prototype.Void = function() {
    return this.getToken(CParser.Void, 0);
};

TypeSpecifierContext.prototype.Char = function() {
    return this.getToken(CParser.Char, 0);
};

TypeSpecifierContext.prototype.Short = function() {
    return this.getToken(CParser.Short, 0);
};

TypeSpecifierContext.prototype.Int = function() {
    return this.getToken(CParser.Int, 0);
};

TypeSpecifierContext.prototype.Long = function() {
    return this.getToken(CParser.Long, 0);
};

TypeSpecifierContext.prototype.Float = function() {
    return this.getToken(CParser.Float, 0);
};

TypeSpecifierContext.prototype.Double = function() {
    return this.getToken(CParser.Double, 0);
};

TypeSpecifierContext.prototype.Signed = function() {
    return this.getToken(CParser.Signed, 0);
};

TypeSpecifierContext.prototype.Unsigned = function() {
    return this.getToken(CParser.Unsigned, 0);
};

TypeSpecifierContext.prototype.Bool = function() {
    return this.getToken(CParser.Bool, 0);
};

TypeSpecifierContext.prototype.Complex = function() {
    return this.getToken(CParser.Complex, 0);
};

TypeSpecifierContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

TypeSpecifierContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

TypeSpecifierContext.prototype.atomicTypeSpecifier = function() {
    return this.getTypedRuleContext(AtomicTypeSpecifierContext,0);
};

TypeSpecifierContext.prototype.structOrUnionSpecifier = function() {
    return this.getTypedRuleContext(StructOrUnionSpecifierContext,0);
};

TypeSpecifierContext.prototype.enumSpecifier = function() {
    return this.getTypedRuleContext(EnumSpecifierContext,0);
};

TypeSpecifierContext.prototype.typedefName = function() {
    return this.getTypedRuleContext(TypedefNameContext,0);
};

TypeSpecifierContext.prototype.constantExpression = function() {
    return this.getTypedRuleContext(ConstantExpressionContext,0);
};

TypeSpecifierContext.prototype.typeSpecifier = function() {
    return this.getTypedRuleContext(TypeSpecifierContext,0);
};

TypeSpecifierContext.prototype.pointer = function() {
    return this.getTypedRuleContext(PointerContext,0);
};

TypeSpecifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterTypeSpecifier(this);
	}
};

TypeSpecifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitTypeSpecifier(this);
	}
};



CParser.prototype.typeSpecifier = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new TypeSpecifierContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 62;
    this.enterRecursionRule(localctx, 62, CParser.RULE_typeSpecifier, _p);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 577;
        this._errHandler.sync(this);
        switch(this._input.LA(1)) {
        case CParser.T__3:
        case CParser.T__4:
        case CParser.T__5:
        case CParser.Char:
        case CParser.Double:
        case CParser.Float:
        case CParser.Int:
        case CParser.Long:
        case CParser.Short:
        case CParser.Signed:
        case CParser.Unsigned:
        case CParser.Void:
        case CParser.Bool:
        case CParser.Complex:
            this.state = 563;
            _la = this._input.LA(1);
            if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.Char) | (1 << CParser.Double) | (1 << CParser.Float))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)))) !== 0))) {
            this._errHandler.recoverInline(this);
            }
            else {
            	this._errHandler.reportMatch(this);
                this.consume();
            }
            break;
        case CParser.T__0:
            this.state = 564;
            this.match(CParser.T__0);
            this.state = 565;
            this.match(CParser.LeftParen);
            this.state = 566;
            _la = this._input.LA(1);
            if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5))) !== 0))) {
            this._errHandler.recoverInline(this);
            }
            else {
            	this._errHandler.reportMatch(this);
                this.consume();
            }
            this.state = 567;
            this.match(CParser.RightParen);
            break;
        case CParser.Atomic:
            this.state = 568;
            this.atomicTypeSpecifier();
            break;
        case CParser.Struct:
        case CParser.Union:
            this.state = 569;
            this.structOrUnionSpecifier();
            break;
        case CParser.Enum:
            this.state = 570;
            this.enumSpecifier();
            break;
        case CParser.Identifier:
            this.state = 571;
            this.typedefName();
            break;
        case CParser.T__6:
            this.state = 572;
            this.match(CParser.T__6);
            this.state = 573;
            this.match(CParser.LeftParen);
            this.state = 574;
            this.constantExpression();
            this.state = 575;
            this.match(CParser.RightParen);
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
        this._ctx.stop = this._input.LT(-1);
        this.state = 583;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,37,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new TypeSpecifierContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_typeSpecifier);
                this.state = 579;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 580;
                this.pointer(); 
            }
            this.state = 585;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,37,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function StructOrUnionSpecifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_structOrUnionSpecifier;
    return this;
}

StructOrUnionSpecifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
StructOrUnionSpecifierContext.prototype.constructor = StructOrUnionSpecifierContext;

StructOrUnionSpecifierContext.prototype.structOrUnion = function() {
    return this.getTypedRuleContext(StructOrUnionContext,0);
};

StructOrUnionSpecifierContext.prototype.LeftBrace = function() {
    return this.getToken(CParser.LeftBrace, 0);
};

StructOrUnionSpecifierContext.prototype.structDeclarationList = function() {
    return this.getTypedRuleContext(StructDeclarationListContext,0);
};

StructOrUnionSpecifierContext.prototype.RightBrace = function() {
    return this.getToken(CParser.RightBrace, 0);
};

StructOrUnionSpecifierContext.prototype.Identifier = function() {
    return this.getToken(CParser.Identifier, 0);
};

StructOrUnionSpecifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterStructOrUnionSpecifier(this);
	}
};

StructOrUnionSpecifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitStructOrUnionSpecifier(this);
	}
};




CParser.StructOrUnionSpecifierContext = StructOrUnionSpecifierContext;

CParser.prototype.structOrUnionSpecifier = function() {

    var localctx = new StructOrUnionSpecifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 64, CParser.RULE_structOrUnionSpecifier);
    var _la = 0; // Token type
    try {
        this.state = 597;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,39,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 586;
            this.structOrUnion();
            this.state = 588;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if(_la===CParser.Identifier) {
                this.state = 587;
                this.match(CParser.Identifier);
            }

            this.state = 590;
            this.match(CParser.LeftBrace);
            this.state = 591;
            this.structDeclarationList(0);
            this.state = 592;
            this.match(CParser.RightBrace);
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 594;
            this.structOrUnion();
            this.state = 595;
            this.match(CParser.Identifier);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function StructOrUnionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_structOrUnion;
    return this;
}

StructOrUnionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
StructOrUnionContext.prototype.constructor = StructOrUnionContext;

StructOrUnionContext.prototype.Struct = function() {
    return this.getToken(CParser.Struct, 0);
};

StructOrUnionContext.prototype.Union = function() {
    return this.getToken(CParser.Union, 0);
};

StructOrUnionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterStructOrUnion(this);
	}
};

StructOrUnionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitStructOrUnion(this);
	}
};




CParser.StructOrUnionContext = StructOrUnionContext;

CParser.prototype.structOrUnion = function() {

    var localctx = new StructOrUnionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 66, CParser.RULE_structOrUnion);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 599;
        _la = this._input.LA(1);
        if(!(_la===CParser.Struct || _la===CParser.Union)) {
        this._errHandler.recoverInline(this);
        }
        else {
        	this._errHandler.reportMatch(this);
            this.consume();
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function StructDeclarationListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_structDeclarationList;
    return this;
}

StructDeclarationListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
StructDeclarationListContext.prototype.constructor = StructDeclarationListContext;

StructDeclarationListContext.prototype.structDeclaration = function() {
    return this.getTypedRuleContext(StructDeclarationContext,0);
};

StructDeclarationListContext.prototype.structDeclarationList = function() {
    return this.getTypedRuleContext(StructDeclarationListContext,0);
};

StructDeclarationListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterStructDeclarationList(this);
	}
};

StructDeclarationListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitStructDeclarationList(this);
	}
};



CParser.prototype.structDeclarationList = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new StructDeclarationListContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 68;
    this.enterRecursionRule(localctx, 68, CParser.RULE_structDeclarationList, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 602;
        this.structDeclaration();
        this._ctx.stop = this._input.LT(-1);
        this.state = 608;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,40,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new StructDeclarationListContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_structDeclarationList);
                this.state = 604;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 605;
                this.structDeclaration(); 
            }
            this.state = 610;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,40,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function StructDeclarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_structDeclaration;
    return this;
}

StructDeclarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
StructDeclarationContext.prototype.constructor = StructDeclarationContext;

StructDeclarationContext.prototype.specifierQualifierList = function() {
    return this.getTypedRuleContext(SpecifierQualifierListContext,0);
};

StructDeclarationContext.prototype.Semi = function() {
    return this.getToken(CParser.Semi, 0);
};

StructDeclarationContext.prototype.structDeclaratorList = function() {
    return this.getTypedRuleContext(StructDeclaratorListContext,0);
};

StructDeclarationContext.prototype.staticAssertDeclaration = function() {
    return this.getTypedRuleContext(StaticAssertDeclarationContext,0);
};

StructDeclarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterStructDeclaration(this);
	}
};

StructDeclarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitStructDeclaration(this);
	}
};




CParser.StructDeclarationContext = StructDeclarationContext;

CParser.prototype.structDeclaration = function() {

    var localctx = new StructDeclarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 70, CParser.RULE_structDeclaration);
    var _la = 0; // Token type
    try {
        this.state = 618;
        this._errHandler.sync(this);
        switch(this._input.LA(1)) {
        case CParser.T__0:
        case CParser.T__3:
        case CParser.T__4:
        case CParser.T__5:
        case CParser.T__6:
        case CParser.Char:
        case CParser.Const:
        case CParser.Double:
        case CParser.Enum:
        case CParser.Float:
        case CParser.Int:
        case CParser.Long:
        case CParser.Restrict:
        case CParser.Short:
        case CParser.Signed:
        case CParser.Struct:
        case CParser.Union:
        case CParser.Unsigned:
        case CParser.Void:
        case CParser.Volatile:
        case CParser.Atomic:
        case CParser.Bool:
        case CParser.Complex:
        case CParser.Identifier:
            this.enterOuterAlt(localctx, 1);
            this.state = 611;
            this.specifierQualifierList();
            this.state = 613;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)) | (1 << (CParser.Colon - 59)))) !== 0) || _la===CParser.Identifier) {
                this.state = 612;
                this.structDeclaratorList(0);
            }

            this.state = 615;
            this.match(CParser.Semi);
            break;
        case CParser.StaticAssert:
            this.enterOuterAlt(localctx, 2);
            this.state = 617;
            this.staticAssertDeclaration();
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function SpecifierQualifierListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_specifierQualifierList;
    return this;
}

SpecifierQualifierListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
SpecifierQualifierListContext.prototype.constructor = SpecifierQualifierListContext;

SpecifierQualifierListContext.prototype.typeSpecifier = function() {
    return this.getTypedRuleContext(TypeSpecifierContext,0);
};

SpecifierQualifierListContext.prototype.specifierQualifierList = function() {
    return this.getTypedRuleContext(SpecifierQualifierListContext,0);
};

SpecifierQualifierListContext.prototype.typeQualifier = function() {
    return this.getTypedRuleContext(TypeQualifierContext,0);
};

SpecifierQualifierListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterSpecifierQualifierList(this);
	}
};

SpecifierQualifierListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitSpecifierQualifierList(this);
	}
};




CParser.SpecifierQualifierListContext = SpecifierQualifierListContext;

CParser.prototype.specifierQualifierList = function() {

    var localctx = new SpecifierQualifierListContext(this, this._ctx, this.state);
    this.enterRule(localctx, 72, CParser.RULE_specifierQualifierList);
    try {
        this.state = 628;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,45,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 620;
            this.typeSpecifier(0);
            this.state = 622;
            this._errHandler.sync(this);
            var la_ = this._interp.adaptivePredict(this._input,43,this._ctx);
            if(la_===1) {
                this.state = 621;
                this.specifierQualifierList();

            }
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 624;
            this.typeQualifier();
            this.state = 626;
            this._errHandler.sync(this);
            var la_ = this._interp.adaptivePredict(this._input,44,this._ctx);
            if(la_===1) {
                this.state = 625;
                this.specifierQualifierList();

            }
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function StructDeclaratorListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_structDeclaratorList;
    return this;
}

StructDeclaratorListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
StructDeclaratorListContext.prototype.constructor = StructDeclaratorListContext;

StructDeclaratorListContext.prototype.structDeclarator = function() {
    return this.getTypedRuleContext(StructDeclaratorContext,0);
};

StructDeclaratorListContext.prototype.structDeclaratorList = function() {
    return this.getTypedRuleContext(StructDeclaratorListContext,0);
};

StructDeclaratorListContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

StructDeclaratorListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterStructDeclaratorList(this);
	}
};

StructDeclaratorListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitStructDeclaratorList(this);
	}
};



CParser.prototype.structDeclaratorList = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new StructDeclaratorListContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 74;
    this.enterRecursionRule(localctx, 74, CParser.RULE_structDeclaratorList, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 631;
        this.structDeclarator();
        this._ctx.stop = this._input.LT(-1);
        this.state = 638;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,46,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new StructDeclaratorListContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_structDeclaratorList);
                this.state = 633;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 634;
                this.match(CParser.Comma);
                this.state = 635;
                this.structDeclarator(); 
            }
            this.state = 640;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,46,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function StructDeclaratorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_structDeclarator;
    return this;
}

StructDeclaratorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
StructDeclaratorContext.prototype.constructor = StructDeclaratorContext;

StructDeclaratorContext.prototype.declarator = function() {
    return this.getTypedRuleContext(DeclaratorContext,0);
};

StructDeclaratorContext.prototype.Colon = function() {
    return this.getToken(CParser.Colon, 0);
};

StructDeclaratorContext.prototype.constantExpression = function() {
    return this.getTypedRuleContext(ConstantExpressionContext,0);
};

StructDeclaratorContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterStructDeclarator(this);
	}
};

StructDeclaratorContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitStructDeclarator(this);
	}
};




CParser.StructDeclaratorContext = StructDeclaratorContext;

CParser.prototype.structDeclarator = function() {

    var localctx = new StructDeclaratorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 76, CParser.RULE_structDeclarator);
    var _la = 0; // Token type
    try {
        this.state = 647;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,48,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 641;
            this.declarator();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 643;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0) || _la===CParser.Identifier) {
                this.state = 642;
                this.declarator();
            }

            this.state = 645;
            this.match(CParser.Colon);
            this.state = 646;
            this.constantExpression();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function EnumSpecifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_enumSpecifier;
    return this;
}

EnumSpecifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
EnumSpecifierContext.prototype.constructor = EnumSpecifierContext;

EnumSpecifierContext.prototype.Enum = function() {
    return this.getToken(CParser.Enum, 0);
};

EnumSpecifierContext.prototype.LeftBrace = function() {
    return this.getToken(CParser.LeftBrace, 0);
};

EnumSpecifierContext.prototype.enumeratorList = function() {
    return this.getTypedRuleContext(EnumeratorListContext,0);
};

EnumSpecifierContext.prototype.RightBrace = function() {
    return this.getToken(CParser.RightBrace, 0);
};

EnumSpecifierContext.prototype.Identifier = function() {
    return this.getToken(CParser.Identifier, 0);
};

EnumSpecifierContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

EnumSpecifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterEnumSpecifier(this);
	}
};

EnumSpecifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitEnumSpecifier(this);
	}
};




CParser.EnumSpecifierContext = EnumSpecifierContext;

CParser.prototype.enumSpecifier = function() {

    var localctx = new EnumSpecifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 78, CParser.RULE_enumSpecifier);
    var _la = 0; // Token type
    try {
        this.state = 668;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,51,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 649;
            this.match(CParser.Enum);
            this.state = 651;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if(_la===CParser.Identifier) {
                this.state = 650;
                this.match(CParser.Identifier);
            }

            this.state = 653;
            this.match(CParser.LeftBrace);
            this.state = 654;
            this.enumeratorList(0);
            this.state = 655;
            this.match(CParser.RightBrace);
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 657;
            this.match(CParser.Enum);
            this.state = 659;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if(_la===CParser.Identifier) {
                this.state = 658;
                this.match(CParser.Identifier);
            }

            this.state = 661;
            this.match(CParser.LeftBrace);
            this.state = 662;
            this.enumeratorList(0);
            this.state = 663;
            this.match(CParser.Comma);
            this.state = 664;
            this.match(CParser.RightBrace);
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 666;
            this.match(CParser.Enum);
            this.state = 667;
            this.match(CParser.Identifier);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function EnumeratorListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_enumeratorList;
    return this;
}

EnumeratorListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
EnumeratorListContext.prototype.constructor = EnumeratorListContext;

EnumeratorListContext.prototype.enumerator = function() {
    return this.getTypedRuleContext(EnumeratorContext,0);
};

EnumeratorListContext.prototype.enumeratorList = function() {
    return this.getTypedRuleContext(EnumeratorListContext,0);
};

EnumeratorListContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

EnumeratorListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterEnumeratorList(this);
	}
};

EnumeratorListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitEnumeratorList(this);
	}
};



CParser.prototype.enumeratorList = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new EnumeratorListContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 80;
    this.enterRecursionRule(localctx, 80, CParser.RULE_enumeratorList, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 671;
        this.enumerator();
        this._ctx.stop = this._input.LT(-1);
        this.state = 678;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,52,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new EnumeratorListContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_enumeratorList);
                this.state = 673;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 674;
                this.match(CParser.Comma);
                this.state = 675;
                this.enumerator(); 
            }
            this.state = 680;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,52,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function EnumeratorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_enumerator;
    return this;
}

EnumeratorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
EnumeratorContext.prototype.constructor = EnumeratorContext;

EnumeratorContext.prototype.enumerationConstant = function() {
    return this.getTypedRuleContext(EnumerationConstantContext,0);
};

EnumeratorContext.prototype.Assign = function() {
    return this.getToken(CParser.Assign, 0);
};

EnumeratorContext.prototype.constantExpression = function() {
    return this.getTypedRuleContext(ConstantExpressionContext,0);
};

EnumeratorContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterEnumerator(this);
	}
};

EnumeratorContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitEnumerator(this);
	}
};




CParser.EnumeratorContext = EnumeratorContext;

CParser.prototype.enumerator = function() {

    var localctx = new EnumeratorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 82, CParser.RULE_enumerator);
    try {
        this.state = 686;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,53,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 681;
            this.enumerationConstant();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 682;
            this.enumerationConstant();
            this.state = 683;
            this.match(CParser.Assign);
            this.state = 684;
            this.constantExpression();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function EnumerationConstantContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_enumerationConstant;
    return this;
}

EnumerationConstantContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
EnumerationConstantContext.prototype.constructor = EnumerationConstantContext;

EnumerationConstantContext.prototype.Identifier = function() {
    return this.getToken(CParser.Identifier, 0);
};

EnumerationConstantContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterEnumerationConstant(this);
	}
};

EnumerationConstantContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitEnumerationConstant(this);
	}
};




CParser.EnumerationConstantContext = EnumerationConstantContext;

CParser.prototype.enumerationConstant = function() {

    var localctx = new EnumerationConstantContext(this, this._ctx, this.state);
    this.enterRule(localctx, 84, CParser.RULE_enumerationConstant);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 688;
        this.match(CParser.Identifier);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function AtomicTypeSpecifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_atomicTypeSpecifier;
    return this;
}

AtomicTypeSpecifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
AtomicTypeSpecifierContext.prototype.constructor = AtomicTypeSpecifierContext;

AtomicTypeSpecifierContext.prototype.Atomic = function() {
    return this.getToken(CParser.Atomic, 0);
};

AtomicTypeSpecifierContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

AtomicTypeSpecifierContext.prototype.typeName = function() {
    return this.getTypedRuleContext(TypeNameContext,0);
};

AtomicTypeSpecifierContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

AtomicTypeSpecifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterAtomicTypeSpecifier(this);
	}
};

AtomicTypeSpecifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitAtomicTypeSpecifier(this);
	}
};




CParser.AtomicTypeSpecifierContext = AtomicTypeSpecifierContext;

CParser.prototype.atomicTypeSpecifier = function() {

    var localctx = new AtomicTypeSpecifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 86, CParser.RULE_atomicTypeSpecifier);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 690;
        this.match(CParser.Atomic);
        this.state = 691;
        this.match(CParser.LeftParen);
        this.state = 692;
        this.typeName();
        this.state = 693;
        this.match(CParser.RightParen);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function TypeQualifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_typeQualifier;
    return this;
}

TypeQualifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
TypeQualifierContext.prototype.constructor = TypeQualifierContext;

TypeQualifierContext.prototype.Const = function() {
    return this.getToken(CParser.Const, 0);
};

TypeQualifierContext.prototype.Restrict = function() {
    return this.getToken(CParser.Restrict, 0);
};

TypeQualifierContext.prototype.Volatile = function() {
    return this.getToken(CParser.Volatile, 0);
};

TypeQualifierContext.prototype.Atomic = function() {
    return this.getToken(CParser.Atomic, 0);
};

TypeQualifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterTypeQualifier(this);
	}
};

TypeQualifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitTypeQualifier(this);
	}
};




CParser.TypeQualifierContext = TypeQualifierContext;

CParser.prototype.typeQualifier = function() {

    var localctx = new TypeQualifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 88, CParser.RULE_typeQualifier);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 695;
        _la = this._input.LA(1);
        if(!(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0))) {
        this._errHandler.recoverInline(this);
        }
        else {
        	this._errHandler.reportMatch(this);
            this.consume();
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function FunctionSpecifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_functionSpecifier;
    return this;
}

FunctionSpecifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
FunctionSpecifierContext.prototype.constructor = FunctionSpecifierContext;

FunctionSpecifierContext.prototype.Inline = function() {
    return this.getToken(CParser.Inline, 0);
};

FunctionSpecifierContext.prototype.Noreturn = function() {
    return this.getToken(CParser.Noreturn, 0);
};

FunctionSpecifierContext.prototype.gccAttributeSpecifier = function() {
    return this.getTypedRuleContext(GccAttributeSpecifierContext,0);
};

FunctionSpecifierContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

FunctionSpecifierContext.prototype.Identifier = function() {
    return this.getToken(CParser.Identifier, 0);
};

FunctionSpecifierContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

FunctionSpecifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterFunctionSpecifier(this);
	}
};

FunctionSpecifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitFunctionSpecifier(this);
	}
};




CParser.FunctionSpecifierContext = FunctionSpecifierContext;

CParser.prototype.functionSpecifier = function() {

    var localctx = new FunctionSpecifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 90, CParser.RULE_functionSpecifier);
    var _la = 0; // Token type
    try {
        this.state = 703;
        this._errHandler.sync(this);
        switch(this._input.LA(1)) {
        case CParser.T__7:
        case CParser.T__8:
        case CParser.Inline:
        case CParser.Noreturn:
            this.enterOuterAlt(localctx, 1);
            this.state = 697;
            _la = this._input.LA(1);
            if(!((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.Inline))) !== 0) || _la===CParser.Noreturn)) {
            this._errHandler.recoverInline(this);
            }
            else {
            	this._errHandler.reportMatch(this);
                this.consume();
            }
            break;
        case CParser.T__11:
            this.enterOuterAlt(localctx, 2);
            this.state = 698;
            this.gccAttributeSpecifier();
            break;
        case CParser.T__9:
            this.enterOuterAlt(localctx, 3);
            this.state = 699;
            this.match(CParser.T__9);
            this.state = 700;
            this.match(CParser.LeftParen);
            this.state = 701;
            this.match(CParser.Identifier);
            this.state = 702;
            this.match(CParser.RightParen);
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function AlignmentSpecifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_alignmentSpecifier;
    return this;
}

AlignmentSpecifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
AlignmentSpecifierContext.prototype.constructor = AlignmentSpecifierContext;

AlignmentSpecifierContext.prototype.Alignas = function() {
    return this.getToken(CParser.Alignas, 0);
};

AlignmentSpecifierContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

AlignmentSpecifierContext.prototype.typeName = function() {
    return this.getTypedRuleContext(TypeNameContext,0);
};

AlignmentSpecifierContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

AlignmentSpecifierContext.prototype.constantExpression = function() {
    return this.getTypedRuleContext(ConstantExpressionContext,0);
};

AlignmentSpecifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterAlignmentSpecifier(this);
	}
};

AlignmentSpecifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitAlignmentSpecifier(this);
	}
};




CParser.AlignmentSpecifierContext = AlignmentSpecifierContext;

CParser.prototype.alignmentSpecifier = function() {

    var localctx = new AlignmentSpecifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 92, CParser.RULE_alignmentSpecifier);
    try {
        this.state = 715;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,55,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 705;
            this.match(CParser.Alignas);
            this.state = 706;
            this.match(CParser.LeftParen);
            this.state = 707;
            this.typeName();
            this.state = 708;
            this.match(CParser.RightParen);
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 710;
            this.match(CParser.Alignas);
            this.state = 711;
            this.match(CParser.LeftParen);
            this.state = 712;
            this.constantExpression();
            this.state = 713;
            this.match(CParser.RightParen);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function DeclaratorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_declarator;
    return this;
}

DeclaratorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
DeclaratorContext.prototype.constructor = DeclaratorContext;

DeclaratorContext.prototype.directDeclarator = function() {
    return this.getTypedRuleContext(DirectDeclaratorContext,0);
};

DeclaratorContext.prototype.pointer = function() {
    return this.getTypedRuleContext(PointerContext,0);
};

DeclaratorContext.prototype.gccDeclaratorExtension = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(GccDeclaratorExtensionContext);
    } else {
        return this.getTypedRuleContext(GccDeclaratorExtensionContext,i);
    }
};

DeclaratorContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterDeclarator(this);
	}
};

DeclaratorContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitDeclarator(this);
	}
};




CParser.DeclaratorContext = DeclaratorContext;

CParser.prototype.declarator = function() {

    var localctx = new DeclaratorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 94, CParser.RULE_declarator);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 718;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        if(_la===CParser.Star || _la===CParser.Caret) {
            this.state = 717;
            this.pointer();
        }

        this.state = 720;
        this.directDeclarator(0);
        this.state = 724;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,57,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                this.state = 721;
                this.gccDeclaratorExtension(); 
            }
            this.state = 726;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,57,this._ctx);
        }

    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function DirectDeclaratorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_directDeclarator;
    return this;
}

DirectDeclaratorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
DirectDeclaratorContext.prototype.constructor = DirectDeclaratorContext;

DirectDeclaratorContext.prototype.Identifier = function() {
    return this.getToken(CParser.Identifier, 0);
};

DirectDeclaratorContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

DirectDeclaratorContext.prototype.declarator = function() {
    return this.getTypedRuleContext(DeclaratorContext,0);
};

DirectDeclaratorContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

DirectDeclaratorContext.prototype.Colon = function() {
    return this.getToken(CParser.Colon, 0);
};

DirectDeclaratorContext.prototype.DigitSequence = function() {
    return this.getToken(CParser.DigitSequence, 0);
};

DirectDeclaratorContext.prototype.pointer = function() {
    return this.getTypedRuleContext(PointerContext,0);
};

DirectDeclaratorContext.prototype.directDeclarator = function() {
    return this.getTypedRuleContext(DirectDeclaratorContext,0);
};

DirectDeclaratorContext.prototype.typeSpecifier = function() {
    return this.getTypedRuleContext(TypeSpecifierContext,0);
};

DirectDeclaratorContext.prototype.LeftBracket = function() {
    return this.getToken(CParser.LeftBracket, 0);
};

DirectDeclaratorContext.prototype.RightBracket = function() {
    return this.getToken(CParser.RightBracket, 0);
};

DirectDeclaratorContext.prototype.typeQualifierList = function() {
    return this.getTypedRuleContext(TypeQualifierListContext,0);
};

DirectDeclaratorContext.prototype.assignmentExpression = function() {
    return this.getTypedRuleContext(AssignmentExpressionContext,0);
};

DirectDeclaratorContext.prototype.Static = function() {
    return this.getToken(CParser.Static, 0);
};

DirectDeclaratorContext.prototype.Star = function() {
    return this.getToken(CParser.Star, 0);
};

DirectDeclaratorContext.prototype.parameterTypeList = function() {
    return this.getTypedRuleContext(ParameterTypeListContext,0);
};

DirectDeclaratorContext.prototype.identifierList = function() {
    return this.getTypedRuleContext(IdentifierListContext,0);
};

DirectDeclaratorContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterDirectDeclarator(this);
	}
};

DirectDeclaratorContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitDirectDeclarator(this);
	}
};



CParser.prototype.directDeclarator = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new DirectDeclaratorContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 96;
    this.enterRecursionRule(localctx, 96, CParser.RULE_directDeclarator, _p);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 744;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,59,this._ctx);
        switch(la_) {
        case 1:
            this.state = 728;
            this.match(CParser.Identifier);
            break;

        case 2:
            this.state = 729;
            this.match(CParser.LeftParen);
            this.state = 730;
            this.declarator();
            this.state = 731;
            this.match(CParser.RightParen);
            break;

        case 3:
            this.state = 733;
            this.match(CParser.Identifier);
            this.state = 734;
            this.match(CParser.Colon);
            this.state = 735;
            this.match(CParser.DigitSequence);
            break;

        case 4:
            this.state = 736;
            this.match(CParser.LeftParen);
            this.state = 738;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.Char) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Float))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)))) !== 0) || _la===CParser.Identifier) {
                this.state = 737;
                this.typeSpecifier(0);
            }

            this.state = 740;
            this.pointer();
            this.state = 741;
            this.directDeclarator(0);
            this.state = 742;
            this.match(CParser.RightParen);
            break;

        }
        this._ctx.stop = this._input.LT(-1);
        this.state = 791;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,66,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                this.state = 789;
                this._errHandler.sync(this);
                var la_ = this._interp.adaptivePredict(this._input,65,this._ctx);
                switch(la_) {
                case 1:
                    localctx = new DirectDeclaratorContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator);
                    this.state = 746;
                    if (!( this.precpred(this._ctx, 8))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 8)");
                    }
                    this.state = 747;
                    this.match(CParser.LeftBracket);
                    this.state = 749;
                    this._errHandler.sync(this);
                    _la = this._input.LA(1);
                    if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) {
                        this.state = 748;
                        this.typeQualifierList(0);
                    }

                    this.state = 752;
                    this._errHandler.sync(this);
                    _la = this._input.LA(1);
                    if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.DigitSequence - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) {
                        this.state = 751;
                        this.assignmentExpression();
                    }

                    this.state = 754;
                    this.match(CParser.RightBracket);
                    break;

                case 2:
                    localctx = new DirectDeclaratorContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator);
                    this.state = 755;
                    if (!( this.precpred(this._ctx, 7))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 7)");
                    }
                    this.state = 756;
                    this.match(CParser.LeftBracket);
                    this.state = 757;
                    this.match(CParser.Static);
                    this.state = 759;
                    this._errHandler.sync(this);
                    _la = this._input.LA(1);
                    if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) {
                        this.state = 758;
                        this.typeQualifierList(0);
                    }

                    this.state = 761;
                    this.assignmentExpression();
                    this.state = 762;
                    this.match(CParser.RightBracket);
                    break;

                case 3:
                    localctx = new DirectDeclaratorContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator);
                    this.state = 764;
                    if (!( this.precpred(this._ctx, 6))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 6)");
                    }
                    this.state = 765;
                    this.match(CParser.LeftBracket);
                    this.state = 766;
                    this.typeQualifierList(0);
                    this.state = 767;
                    this.match(CParser.Static);
                    this.state = 768;
                    this.assignmentExpression();
                    this.state = 769;
                    this.match(CParser.RightBracket);
                    break;

                case 4:
                    localctx = new DirectDeclaratorContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator);
                    this.state = 771;
                    if (!( this.precpred(this._ctx, 5))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)");
                    }
                    this.state = 772;
                    this.match(CParser.LeftBracket);
                    this.state = 774;
                    this._errHandler.sync(this);
                    _la = this._input.LA(1);
                    if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) {
                        this.state = 773;
                        this.typeQualifierList(0);
                    }

                    this.state = 776;
                    this.match(CParser.Star);
                    this.state = 777;
                    this.match(CParser.RightBracket);
                    break;

                case 5:
                    localctx = new DirectDeclaratorContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator);
                    this.state = 778;
                    if (!( this.precpred(this._ctx, 4))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)");
                    }
                    this.state = 779;
                    this.match(CParser.LeftParen);
                    this.state = 780;
                    this.parameterTypeList();
                    this.state = 781;
                    this.match(CParser.RightParen);
                    break;

                case 6:
                    localctx = new DirectDeclaratorContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directDeclarator);
                    this.state = 783;
                    if (!( this.precpred(this._ctx, 3))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)");
                    }
                    this.state = 784;
                    this.match(CParser.LeftParen);
                    this.state = 786;
                    this._errHandler.sync(this);
                    _la = this._input.LA(1);
                    if(_la===CParser.Identifier) {
                        this.state = 785;
                        this.identifierList(0);
                    }

                    this.state = 788;
                    this.match(CParser.RightParen);
                    break;

                } 
            }
            this.state = 793;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,66,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function GccDeclaratorExtensionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_gccDeclaratorExtension;
    return this;
}

GccDeclaratorExtensionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
GccDeclaratorExtensionContext.prototype.constructor = GccDeclaratorExtensionContext;

GccDeclaratorExtensionContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

GccDeclaratorExtensionContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

GccDeclaratorExtensionContext.prototype.StringLiteral = function(i) {
	if(i===undefined) {
		i = null;
	}
    if(i===null) {
        return this.getTokens(CParser.StringLiteral);
    } else {
        return this.getToken(CParser.StringLiteral, i);
    }
};


GccDeclaratorExtensionContext.prototype.gccAttributeSpecifier = function() {
    return this.getTypedRuleContext(GccAttributeSpecifierContext,0);
};

GccDeclaratorExtensionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterGccDeclaratorExtension(this);
	}
};

GccDeclaratorExtensionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitGccDeclaratorExtension(this);
	}
};




CParser.GccDeclaratorExtensionContext = GccDeclaratorExtensionContext;

CParser.prototype.gccDeclaratorExtension = function() {

    var localctx = new GccDeclaratorExtensionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 98, CParser.RULE_gccDeclaratorExtension);
    var _la = 0; // Token type
    try {
        this.state = 803;
        this._errHandler.sync(this);
        switch(this._input.LA(1)) {
        case CParser.T__10:
            this.enterOuterAlt(localctx, 1);
            this.state = 794;
            this.match(CParser.T__10);
            this.state = 795;
            this.match(CParser.LeftParen);
            this.state = 797; 
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            do {
                this.state = 796;
                this.match(CParser.StringLiteral);
                this.state = 799; 
                this._errHandler.sync(this);
                _la = this._input.LA(1);
            } while(_la===CParser.StringLiteral);
            this.state = 801;
            this.match(CParser.RightParen);
            break;
        case CParser.T__11:
            this.enterOuterAlt(localctx, 2);
            this.state = 802;
            this.gccAttributeSpecifier();
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function GccAttributeSpecifierContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_gccAttributeSpecifier;
    return this;
}

GccAttributeSpecifierContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
GccAttributeSpecifierContext.prototype.constructor = GccAttributeSpecifierContext;

GccAttributeSpecifierContext.prototype.LeftParen = function(i) {
	if(i===undefined) {
		i = null;
	}
    if(i===null) {
        return this.getTokens(CParser.LeftParen);
    } else {
        return this.getToken(CParser.LeftParen, i);
    }
};


GccAttributeSpecifierContext.prototype.gccAttributeList = function() {
    return this.getTypedRuleContext(GccAttributeListContext,0);
};

GccAttributeSpecifierContext.prototype.RightParen = function(i) {
	if(i===undefined) {
		i = null;
	}
    if(i===null) {
        return this.getTokens(CParser.RightParen);
    } else {
        return this.getToken(CParser.RightParen, i);
    }
};


GccAttributeSpecifierContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterGccAttributeSpecifier(this);
	}
};

GccAttributeSpecifierContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitGccAttributeSpecifier(this);
	}
};




CParser.GccAttributeSpecifierContext = GccAttributeSpecifierContext;

CParser.prototype.gccAttributeSpecifier = function() {

    var localctx = new GccAttributeSpecifierContext(this, this._ctx, this.state);
    this.enterRule(localctx, 100, CParser.RULE_gccAttributeSpecifier);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 805;
        this.match(CParser.T__11);
        this.state = 806;
        this.match(CParser.LeftParen);
        this.state = 807;
        this.match(CParser.LeftParen);
        this.state = 808;
        this.gccAttributeList();
        this.state = 809;
        this.match(CParser.RightParen);
        this.state = 810;
        this.match(CParser.RightParen);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function GccAttributeListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_gccAttributeList;
    return this;
}

GccAttributeListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
GccAttributeListContext.prototype.constructor = GccAttributeListContext;

GccAttributeListContext.prototype.gccAttribute = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(GccAttributeContext);
    } else {
        return this.getTypedRuleContext(GccAttributeContext,i);
    }
};

GccAttributeListContext.prototype.Comma = function(i) {
	if(i===undefined) {
		i = null;
	}
    if(i===null) {
        return this.getTokens(CParser.Comma);
    } else {
        return this.getToken(CParser.Comma, i);
    }
};


GccAttributeListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterGccAttributeList(this);
	}
};

GccAttributeListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitGccAttributeList(this);
	}
};




CParser.GccAttributeListContext = GccAttributeListContext;

CParser.prototype.gccAttributeList = function() {

    var localctx = new GccAttributeListContext(this, this._ctx, this.state);
    this.enterRule(localctx, 102, CParser.RULE_gccAttributeList);
    var _la = 0; // Token type
    try {
        this.state = 821;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,70,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 812;
            this.gccAttribute();
            this.state = 817;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            while(_la===CParser.Comma) {
                this.state = 813;
                this.match(CParser.Comma);
                this.state = 814;
                this.gccAttribute();
                this.state = 819;
                this._errHandler.sync(this);
                _la = this._input.LA(1);
            }
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);

            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function GccAttributeContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_gccAttribute;
    return this;
}

GccAttributeContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
GccAttributeContext.prototype.constructor = GccAttributeContext;

GccAttributeContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

GccAttributeContext.prototype.LeftParen = function(i) {
	if(i===undefined) {
		i = null;
	}
    if(i===null) {
        return this.getTokens(CParser.LeftParen);
    } else {
        return this.getToken(CParser.LeftParen, i);
    }
};


GccAttributeContext.prototype.RightParen = function(i) {
	if(i===undefined) {
		i = null;
	}
    if(i===null) {
        return this.getTokens(CParser.RightParen);
    } else {
        return this.getToken(CParser.RightParen, i);
    }
};


GccAttributeContext.prototype.argumentExpressionList = function() {
    return this.getTypedRuleContext(ArgumentExpressionListContext,0);
};

GccAttributeContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterGccAttribute(this);
	}
};

GccAttributeContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitGccAttribute(this);
	}
};




CParser.GccAttributeContext = GccAttributeContext;

CParser.prototype.gccAttribute = function() {

    var localctx = new GccAttributeContext(this, this._ctx, this.state);
    this.enterRule(localctx, 104, CParser.RULE_gccAttribute);
    var _la = 0; // Token type
    try {
        this.state = 832;
        this._errHandler.sync(this);
        switch(this._input.LA(1)) {
        case CParser.T__0:
        case CParser.T__1:
        case CParser.T__2:
        case CParser.T__3:
        case CParser.T__4:
        case CParser.T__5:
        case CParser.T__6:
        case CParser.T__7:
        case CParser.T__8:
        case CParser.T__9:
        case CParser.T__10:
        case CParser.T__11:
        case CParser.T__12:
        case CParser.T__13:
        case CParser.Auto:
        case CParser.Break:
        case CParser.Case:
        case CParser.Char:
        case CParser.Const:
        case CParser.Continue:
        case CParser.Default:
        case CParser.Do:
        case CParser.Double:
        case CParser.Else:
        case CParser.Enum:
        case CParser.Extern:
        case CParser.Float:
        case CParser.For:
        case CParser.Goto:
        case CParser.If:
        case CParser.Inline:
        case CParser.Int:
        case CParser.Long:
        case CParser.Register:
        case CParser.Restrict:
        case CParser.Return:
        case CParser.Short:
        case CParser.Signed:
        case CParser.Sizeof:
        case CParser.Static:
        case CParser.Struct:
        case CParser.Switch:
        case CParser.Typedef:
        case CParser.Union:
        case CParser.Unsigned:
        case CParser.Void:
        case CParser.Volatile:
        case CParser.While:
        case CParser.Alignas:
        case CParser.Alignof:
        case CParser.Atomic:
        case CParser.Bool:
        case CParser.Complex:
        case CParser.Generic:
        case CParser.Imaginary:
        case CParser.Noreturn:
        case CParser.StaticAssert:
        case CParser.ThreadLocal:
        case CParser.LeftBracket:
        case CParser.RightBracket:
        case CParser.LeftBrace:
        case CParser.RightBrace:
        case CParser.Less:
        case CParser.LessEqual:
        case CParser.Greater:
        case CParser.GreaterEqual:
        case CParser.LeftShift:
        case CParser.RightShift:
        case CParser.Plus:
        case CParser.PlusPlus:
        case CParser.Minus:
        case CParser.MinusMinus:
        case CParser.Star:
        case CParser.Div:
        case CParser.Mod:
        case CParser.And:
        case CParser.Or:
        case CParser.AndAnd:
        case CParser.OrOr:
        case CParser.Caret:
        case CParser.Not:
        case CParser.Tilde:
        case CParser.Question:
        case CParser.Colon:
        case CParser.Semi:
        case CParser.Assign:
        case CParser.StarAssign:
        case CParser.DivAssign:
        case CParser.ModAssign:
        case CParser.PlusAssign:
        case CParser.MinusAssign:
        case CParser.LeftShiftAssign:
        case CParser.RightShiftAssign:
        case CParser.AndAssign:
        case CParser.XorAssign:
        case CParser.OrAssign:
        case CParser.Equal:
        case CParser.NotEqual:
        case CParser.Arrow:
        case CParser.Dot:
        case CParser.Ellipsis:
        case CParser.Identifier:
        case CParser.Constant:
        case CParser.DigitSequence:
        case CParser.StringLiteral:
        case CParser.ComplexDefine:
        case CParser.IncludeDirective:
        case CParser.AsmBlock:
        case CParser.LineAfterPreprocessing:
        case CParser.LineDirective:
        case CParser.PragmaDirective:
        case CParser.Whitespace:
        case CParser.Newline:
        case CParser.BlockComment:
        case CParser.LineComment:
            this.enterOuterAlt(localctx, 1);
            this.state = 823;
            _la = this._input.LA(1);
            if(_la<=0 || ((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.RightParen - 59)) | (1 << (CParser.Comma - 59)))) !== 0)) {
            this._errHandler.recoverInline(this);
            }
            else {
            	this._errHandler.reportMatch(this);
                this.consume();
            }
            this.state = 829;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if(_la===CParser.LeftParen) {
                this.state = 824;
                this.match(CParser.LeftParen);
                this.state = 826;
                this._errHandler.sync(this);
                _la = this._input.LA(1);
                if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.DigitSequence - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) {
                    this.state = 825;
                    this.argumentExpressionList(0);
                }

                this.state = 828;
                this.match(CParser.RightParen);
            }

            break;
        case CParser.RightParen:
        case CParser.Comma:
            this.enterOuterAlt(localctx, 2);

            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function NestedParenthesesBlockContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_nestedParenthesesBlock;
    return this;
}

NestedParenthesesBlockContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
NestedParenthesesBlockContext.prototype.constructor = NestedParenthesesBlockContext;

NestedParenthesesBlockContext.prototype.LeftParen = function(i) {
	if(i===undefined) {
		i = null;
	}
    if(i===null) {
        return this.getTokens(CParser.LeftParen);
    } else {
        return this.getToken(CParser.LeftParen, i);
    }
};


NestedParenthesesBlockContext.prototype.nestedParenthesesBlock = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(NestedParenthesesBlockContext);
    } else {
        return this.getTypedRuleContext(NestedParenthesesBlockContext,i);
    }
};

NestedParenthesesBlockContext.prototype.RightParen = function(i) {
	if(i===undefined) {
		i = null;
	}
    if(i===null) {
        return this.getTokens(CParser.RightParen);
    } else {
        return this.getToken(CParser.RightParen, i);
    }
};


NestedParenthesesBlockContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterNestedParenthesesBlock(this);
	}
};

NestedParenthesesBlockContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitNestedParenthesesBlock(this);
	}
};




CParser.NestedParenthesesBlockContext = NestedParenthesesBlockContext;

CParser.prototype.nestedParenthesesBlock = function() {

    var localctx = new NestedParenthesesBlockContext(this, this._ctx, this.state);
    this.enterRule(localctx, 106, CParser.RULE_nestedParenthesesBlock);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 841;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        while((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.T__13) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Else) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Imaginary - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBracket - 32)) | (1 << (CParser.RightBracket - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 64)) & ~0x1f) == 0 && ((1 << (_la - 64)) & ((1 << (CParser.RightBrace - 64)) | (1 << (CParser.Less - 64)) | (1 << (CParser.LessEqual - 64)) | (1 << (CParser.Greater - 64)) | (1 << (CParser.GreaterEqual - 64)) | (1 << (CParser.LeftShift - 64)) | (1 << (CParser.RightShift - 64)) | (1 << (CParser.Plus - 64)) | (1 << (CParser.PlusPlus - 64)) | (1 << (CParser.Minus - 64)) | (1 << (CParser.MinusMinus - 64)) | (1 << (CParser.Star - 64)) | (1 << (CParser.Div - 64)) | (1 << (CParser.Mod - 64)) | (1 << (CParser.And - 64)) | (1 << (CParser.Or - 64)) | (1 << (CParser.AndAnd - 64)) | (1 << (CParser.OrOr - 64)) | (1 << (CParser.Caret - 64)) | (1 << (CParser.Not - 64)) | (1 << (CParser.Tilde - 64)) | (1 << (CParser.Question - 64)) | (1 << (CParser.Colon - 64)) | (1 << (CParser.Semi - 64)) | (1 << (CParser.Comma - 64)) | (1 << (CParser.Assign - 64)) | (1 << (CParser.StarAssign - 64)) | (1 << (CParser.DivAssign - 64)) | (1 << (CParser.ModAssign - 64)) | (1 << (CParser.PlusAssign - 64)) | (1 << (CParser.MinusAssign - 64)) | (1 << (CParser.LeftShiftAssign - 64)))) !== 0) || ((((_la - 96)) & ~0x1f) == 0 && ((1 << (_la - 96)) & ((1 << (CParser.RightShiftAssign - 96)) | (1 << (CParser.AndAssign - 96)) | (1 << (CParser.XorAssign - 96)) | (1 << (CParser.OrAssign - 96)) | (1 << (CParser.Equal - 96)) | (1 << (CParser.NotEqual - 96)) | (1 << (CParser.Arrow - 96)) | (1 << (CParser.Dot - 96)) | (1 << (CParser.Ellipsis - 96)) | (1 << (CParser.Identifier - 96)) | (1 << (CParser.Constant - 96)) | (1 << (CParser.DigitSequence - 96)) | (1 << (CParser.StringLiteral - 96)) | (1 << (CParser.ComplexDefine - 96)) | (1 << (CParser.IncludeDirective - 96)) | (1 << (CParser.AsmBlock - 96)) | (1 << (CParser.LineAfterPreprocessing - 96)) | (1 << (CParser.LineDirective - 96)) | (1 << (CParser.PragmaDirective - 96)) | (1 << (CParser.Whitespace - 96)) | (1 << (CParser.Newline - 96)) | (1 << (CParser.BlockComment - 96)) | (1 << (CParser.LineComment - 96)))) !== 0)) {
            this.state = 839;
            this._errHandler.sync(this);
            switch(this._input.LA(1)) {
            case CParser.T__0:
            case CParser.T__1:
            case CParser.T__2:
            case CParser.T__3:
            case CParser.T__4:
            case CParser.T__5:
            case CParser.T__6:
            case CParser.T__7:
            case CParser.T__8:
            case CParser.T__9:
            case CParser.T__10:
            case CParser.T__11:
            case CParser.T__12:
            case CParser.T__13:
            case CParser.Auto:
            case CParser.Break:
            case CParser.Case:
            case CParser.Char:
            case CParser.Const:
            case CParser.Continue:
            case CParser.Default:
            case CParser.Do:
            case CParser.Double:
            case CParser.Else:
            case CParser.Enum:
            case CParser.Extern:
            case CParser.Float:
            case CParser.For:
            case CParser.Goto:
            case CParser.If:
            case CParser.Inline:
            case CParser.Int:
            case CParser.Long:
            case CParser.Register:
            case CParser.Restrict:
            case CParser.Return:
            case CParser.Short:
            case CParser.Signed:
            case CParser.Sizeof:
            case CParser.Static:
            case CParser.Struct:
            case CParser.Switch:
            case CParser.Typedef:
            case CParser.Union:
            case CParser.Unsigned:
            case CParser.Void:
            case CParser.Volatile:
            case CParser.While:
            case CParser.Alignas:
            case CParser.Alignof:
            case CParser.Atomic:
            case CParser.Bool:
            case CParser.Complex:
            case CParser.Generic:
            case CParser.Imaginary:
            case CParser.Noreturn:
            case CParser.StaticAssert:
            case CParser.ThreadLocal:
            case CParser.LeftBracket:
            case CParser.RightBracket:
            case CParser.LeftBrace:
            case CParser.RightBrace:
            case CParser.Less:
            case CParser.LessEqual:
            case CParser.Greater:
            case CParser.GreaterEqual:
            case CParser.LeftShift:
            case CParser.RightShift:
            case CParser.Plus:
            case CParser.PlusPlus:
            case CParser.Minus:
            case CParser.MinusMinus:
            case CParser.Star:
            case CParser.Div:
            case CParser.Mod:
            case CParser.And:
            case CParser.Or:
            case CParser.AndAnd:
            case CParser.OrOr:
            case CParser.Caret:
            case CParser.Not:
            case CParser.Tilde:
            case CParser.Question:
            case CParser.Colon:
            case CParser.Semi:
            case CParser.Comma:
            case CParser.Assign:
            case CParser.StarAssign:
            case CParser.DivAssign:
            case CParser.ModAssign:
            case CParser.PlusAssign:
            case CParser.MinusAssign:
            case CParser.LeftShiftAssign:
            case CParser.RightShiftAssign:
            case CParser.AndAssign:
            case CParser.XorAssign:
            case CParser.OrAssign:
            case CParser.Equal:
            case CParser.NotEqual:
            case CParser.Arrow:
            case CParser.Dot:
            case CParser.Ellipsis:
            case CParser.Identifier:
            case CParser.Constant:
            case CParser.DigitSequence:
            case CParser.StringLiteral:
            case CParser.ComplexDefine:
            case CParser.IncludeDirective:
            case CParser.AsmBlock:
            case CParser.LineAfterPreprocessing:
            case CParser.LineDirective:
            case CParser.PragmaDirective:
            case CParser.Whitespace:
            case CParser.Newline:
            case CParser.BlockComment:
            case CParser.LineComment:
                this.state = 834;
                _la = this._input.LA(1);
                if(_la<=0 || _la===CParser.LeftParen || _la===CParser.RightParen) {
                this._errHandler.recoverInline(this);
                }
                else {
                	this._errHandler.reportMatch(this);
                    this.consume();
                }
                break;
            case CParser.LeftParen:
                this.state = 835;
                this.match(CParser.LeftParen);
                this.state = 836;
                this.nestedParenthesesBlock();
                this.state = 837;
                this.match(CParser.RightParen);
                break;
            default:
                throw new antlr4.error.NoViableAltException(this);
            }
            this.state = 843;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function PointerContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_pointer;
    return this;
}

PointerContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
PointerContext.prototype.constructor = PointerContext;

PointerContext.prototype.Star = function() {
    return this.getToken(CParser.Star, 0);
};

PointerContext.prototype.typeQualifierList = function() {
    return this.getTypedRuleContext(TypeQualifierListContext,0);
};

PointerContext.prototype.pointer = function() {
    return this.getTypedRuleContext(PointerContext,0);
};

PointerContext.prototype.Caret = function() {
    return this.getToken(CParser.Caret, 0);
};

PointerContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterPointer(this);
	}
};

PointerContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitPointer(this);
	}
};




CParser.PointerContext = PointerContext;

CParser.prototype.pointer = function() {

    var localctx = new PointerContext(this, this._ctx, this.state);
    this.enterRule(localctx, 108, CParser.RULE_pointer);
    var _la = 0; // Token type
    try {
        this.state = 862;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,80,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 844;
            this.match(CParser.Star);
            this.state = 846;
            this._errHandler.sync(this);
            var la_ = this._interp.adaptivePredict(this._input,76,this._ctx);
            if(la_===1) {
                this.state = 845;
                this.typeQualifierList(0);

            }
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 848;
            this.match(CParser.Star);
            this.state = 850;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) {
                this.state = 849;
                this.typeQualifierList(0);
            }

            this.state = 852;
            this.pointer();
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 853;
            this.match(CParser.Caret);
            this.state = 855;
            this._errHandler.sync(this);
            var la_ = this._interp.adaptivePredict(this._input,78,this._ctx);
            if(la_===1) {
                this.state = 854;
                this.typeQualifierList(0);

            }
            break;

        case 4:
            this.enterOuterAlt(localctx, 4);
            this.state = 857;
            this.match(CParser.Caret);
            this.state = 859;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) {
                this.state = 858;
                this.typeQualifierList(0);
            }

            this.state = 861;
            this.pointer();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function TypeQualifierListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_typeQualifierList;
    return this;
}

TypeQualifierListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
TypeQualifierListContext.prototype.constructor = TypeQualifierListContext;

TypeQualifierListContext.prototype.typeQualifier = function() {
    return this.getTypedRuleContext(TypeQualifierContext,0);
};

TypeQualifierListContext.prototype.typeQualifierList = function() {
    return this.getTypedRuleContext(TypeQualifierListContext,0);
};

TypeQualifierListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterTypeQualifierList(this);
	}
};

TypeQualifierListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitTypeQualifierList(this);
	}
};



CParser.prototype.typeQualifierList = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new TypeQualifierListContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 110;
    this.enterRecursionRule(localctx, 110, CParser.RULE_typeQualifierList, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 865;
        this.typeQualifier();
        this._ctx.stop = this._input.LT(-1);
        this.state = 871;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,81,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new TypeQualifierListContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_typeQualifierList);
                this.state = 867;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 868;
                this.typeQualifier(); 
            }
            this.state = 873;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,81,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function ParameterTypeListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_parameterTypeList;
    return this;
}

ParameterTypeListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ParameterTypeListContext.prototype.constructor = ParameterTypeListContext;

ParameterTypeListContext.prototype.parameterList = function() {
    return this.getTypedRuleContext(ParameterListContext,0);
};

ParameterTypeListContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

ParameterTypeListContext.prototype.Ellipsis = function() {
    return this.getToken(CParser.Ellipsis, 0);
};

ParameterTypeListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterParameterTypeList(this);
	}
};

ParameterTypeListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitParameterTypeList(this);
	}
};




CParser.ParameterTypeListContext = ParameterTypeListContext;

CParser.prototype.parameterTypeList = function() {

    var localctx = new ParameterTypeListContext(this, this._ctx, this.state);
    this.enterRule(localctx, 112, CParser.RULE_parameterTypeList);
    try {
        this.state = 879;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,82,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 874;
            this.parameterList(0);
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 875;
            this.parameterList(0);
            this.state = 876;
            this.match(CParser.Comma);
            this.state = 877;
            this.match(CParser.Ellipsis);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function ParameterListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_parameterList;
    return this;
}

ParameterListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ParameterListContext.prototype.constructor = ParameterListContext;

ParameterListContext.prototype.parameterDeclaration = function() {
    return this.getTypedRuleContext(ParameterDeclarationContext,0);
};

ParameterListContext.prototype.parameterList = function() {
    return this.getTypedRuleContext(ParameterListContext,0);
};

ParameterListContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

ParameterListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterParameterList(this);
	}
};

ParameterListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitParameterList(this);
	}
};



CParser.prototype.parameterList = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new ParameterListContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 114;
    this.enterRecursionRule(localctx, 114, CParser.RULE_parameterList, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 882;
        this.parameterDeclaration();
        this._ctx.stop = this._input.LT(-1);
        this.state = 889;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,83,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new ParameterListContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_parameterList);
                this.state = 884;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 885;
                this.match(CParser.Comma);
                this.state = 886;
                this.parameterDeclaration(); 
            }
            this.state = 891;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,83,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function ParameterDeclarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_parameterDeclaration;
    return this;
}

ParameterDeclarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ParameterDeclarationContext.prototype.constructor = ParameterDeclarationContext;

ParameterDeclarationContext.prototype.declarationSpecifiers = function() {
    return this.getTypedRuleContext(DeclarationSpecifiersContext,0);
};

ParameterDeclarationContext.prototype.declarator = function() {
    return this.getTypedRuleContext(DeclaratorContext,0);
};

ParameterDeclarationContext.prototype.declarationSpecifiers2 = function() {
    return this.getTypedRuleContext(DeclarationSpecifiers2Context,0);
};

ParameterDeclarationContext.prototype.abstractDeclarator = function() {
    return this.getTypedRuleContext(AbstractDeclaratorContext,0);
};

ParameterDeclarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterParameterDeclaration(this);
	}
};

ParameterDeclarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitParameterDeclaration(this);
	}
};




CParser.ParameterDeclarationContext = ParameterDeclarationContext;

CParser.prototype.parameterDeclaration = function() {

    var localctx = new ParameterDeclarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 116, CParser.RULE_parameterDeclaration);
    try {
        this.state = 899;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,85,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 892;
            this.declarationSpecifiers();
            this.state = 893;
            this.declarator();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 895;
            this.declarationSpecifiers2();
            this.state = 897;
            this._errHandler.sync(this);
            var la_ = this._interp.adaptivePredict(this._input,84,this._ctx);
            if(la_===1) {
                this.state = 896;
                this.abstractDeclarator();

            }
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function IdentifierListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_identifierList;
    return this;
}

IdentifierListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
IdentifierListContext.prototype.constructor = IdentifierListContext;

IdentifierListContext.prototype.Identifier = function() {
    return this.getToken(CParser.Identifier, 0);
};

IdentifierListContext.prototype.identifierList = function() {
    return this.getTypedRuleContext(IdentifierListContext,0);
};

IdentifierListContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

IdentifierListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterIdentifierList(this);
	}
};

IdentifierListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitIdentifierList(this);
	}
};



CParser.prototype.identifierList = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new IdentifierListContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 118;
    this.enterRecursionRule(localctx, 118, CParser.RULE_identifierList, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 902;
        this.match(CParser.Identifier);
        this._ctx.stop = this._input.LT(-1);
        this.state = 909;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,86,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new IdentifierListContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_identifierList);
                this.state = 904;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 905;
                this.match(CParser.Comma);
                this.state = 906;
                this.match(CParser.Identifier); 
            }
            this.state = 911;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,86,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function TypeNameContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_typeName;
    return this;
}

TypeNameContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
TypeNameContext.prototype.constructor = TypeNameContext;

TypeNameContext.prototype.specifierQualifierList = function() {
    return this.getTypedRuleContext(SpecifierQualifierListContext,0);
};

TypeNameContext.prototype.abstractDeclarator = function() {
    return this.getTypedRuleContext(AbstractDeclaratorContext,0);
};

TypeNameContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterTypeName(this);
	}
};

TypeNameContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitTypeName(this);
	}
};




CParser.TypeNameContext = TypeNameContext;

CParser.prototype.typeName = function() {

    var localctx = new TypeNameContext(this, this._ctx, this.state);
    this.enterRule(localctx, 120, CParser.RULE_typeName);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 912;
        this.specifierQualifierList();
        this.state = 914;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        if(((((_la - 59)) & ~0x1f) == 0 && ((1 << (_la - 59)) & ((1 << (CParser.LeftParen - 59)) | (1 << (CParser.LeftBracket - 59)) | (1 << (CParser.Star - 59)) | (1 << (CParser.Caret - 59)))) !== 0)) {
            this.state = 913;
            this.abstractDeclarator();
        }

    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function AbstractDeclaratorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_abstractDeclarator;
    return this;
}

AbstractDeclaratorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
AbstractDeclaratorContext.prototype.constructor = AbstractDeclaratorContext;

AbstractDeclaratorContext.prototype.pointer = function() {
    return this.getTypedRuleContext(PointerContext,0);
};

AbstractDeclaratorContext.prototype.directAbstractDeclarator = function() {
    return this.getTypedRuleContext(DirectAbstractDeclaratorContext,0);
};

AbstractDeclaratorContext.prototype.gccDeclaratorExtension = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(GccDeclaratorExtensionContext);
    } else {
        return this.getTypedRuleContext(GccDeclaratorExtensionContext,i);
    }
};

AbstractDeclaratorContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterAbstractDeclarator(this);
	}
};

AbstractDeclaratorContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitAbstractDeclarator(this);
	}
};




CParser.AbstractDeclaratorContext = AbstractDeclaratorContext;

CParser.prototype.abstractDeclarator = function() {

    var localctx = new AbstractDeclaratorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 122, CParser.RULE_abstractDeclarator);
    var _la = 0; // Token type
    try {
        this.state = 927;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,90,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 916;
            this.pointer();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 918;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if(_la===CParser.Star || _la===CParser.Caret) {
                this.state = 917;
                this.pointer();
            }

            this.state = 920;
            this.directAbstractDeclarator(0);
            this.state = 924;
            this._errHandler.sync(this);
            var _alt = this._interp.adaptivePredict(this._input,89,this._ctx)
            while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
                if(_alt===1) {
                    this.state = 921;
                    this.gccDeclaratorExtension(); 
                }
                this.state = 926;
                this._errHandler.sync(this);
                _alt = this._interp.adaptivePredict(this._input,89,this._ctx);
            }

            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function DirectAbstractDeclaratorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_directAbstractDeclarator;
    return this;
}

DirectAbstractDeclaratorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
DirectAbstractDeclaratorContext.prototype.constructor = DirectAbstractDeclaratorContext;

DirectAbstractDeclaratorContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

DirectAbstractDeclaratorContext.prototype.abstractDeclarator = function() {
    return this.getTypedRuleContext(AbstractDeclaratorContext,0);
};

DirectAbstractDeclaratorContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

DirectAbstractDeclaratorContext.prototype.gccDeclaratorExtension = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(GccDeclaratorExtensionContext);
    } else {
        return this.getTypedRuleContext(GccDeclaratorExtensionContext,i);
    }
};

DirectAbstractDeclaratorContext.prototype.LeftBracket = function() {
    return this.getToken(CParser.LeftBracket, 0);
};

DirectAbstractDeclaratorContext.prototype.RightBracket = function() {
    return this.getToken(CParser.RightBracket, 0);
};

DirectAbstractDeclaratorContext.prototype.typeQualifierList = function() {
    return this.getTypedRuleContext(TypeQualifierListContext,0);
};

DirectAbstractDeclaratorContext.prototype.assignmentExpression = function() {
    return this.getTypedRuleContext(AssignmentExpressionContext,0);
};

DirectAbstractDeclaratorContext.prototype.Static = function() {
    return this.getToken(CParser.Static, 0);
};

DirectAbstractDeclaratorContext.prototype.Star = function() {
    return this.getToken(CParser.Star, 0);
};

DirectAbstractDeclaratorContext.prototype.parameterTypeList = function() {
    return this.getTypedRuleContext(ParameterTypeListContext,0);
};

DirectAbstractDeclaratorContext.prototype.directAbstractDeclarator = function() {
    return this.getTypedRuleContext(DirectAbstractDeclaratorContext,0);
};

DirectAbstractDeclaratorContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterDirectAbstractDeclarator(this);
	}
};

DirectAbstractDeclaratorContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitDirectAbstractDeclarator(this);
	}
};



CParser.prototype.directAbstractDeclarator = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new DirectAbstractDeclaratorContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 124;
    this.enterRecursionRule(localctx, 124, CParser.RULE_directAbstractDeclarator, _p);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 975;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,97,this._ctx);
        switch(la_) {
        case 1:
            this.state = 930;
            this.match(CParser.LeftParen);
            this.state = 931;
            this.abstractDeclarator();
            this.state = 932;
            this.match(CParser.RightParen);
            this.state = 936;
            this._errHandler.sync(this);
            var _alt = this._interp.adaptivePredict(this._input,91,this._ctx)
            while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
                if(_alt===1) {
                    this.state = 933;
                    this.gccDeclaratorExtension(); 
                }
                this.state = 938;
                this._errHandler.sync(this);
                _alt = this._interp.adaptivePredict(this._input,91,this._ctx);
            }

            break;

        case 2:
            this.state = 939;
            this.match(CParser.LeftBracket);
            this.state = 941;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) {
                this.state = 940;
                this.typeQualifierList(0);
            }

            this.state = 944;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.DigitSequence - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) {
                this.state = 943;
                this.assignmentExpression();
            }

            this.state = 946;
            this.match(CParser.RightBracket);
            break;

        case 3:
            this.state = 947;
            this.match(CParser.LeftBracket);
            this.state = 948;
            this.match(CParser.Static);
            this.state = 950;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) {
                this.state = 949;
                this.typeQualifierList(0);
            }

            this.state = 952;
            this.assignmentExpression();
            this.state = 953;
            this.match(CParser.RightBracket);
            break;

        case 4:
            this.state = 955;
            this.match(CParser.LeftBracket);
            this.state = 956;
            this.typeQualifierList(0);
            this.state = 957;
            this.match(CParser.Static);
            this.state = 958;
            this.assignmentExpression();
            this.state = 959;
            this.match(CParser.RightBracket);
            break;

        case 5:
            this.state = 961;
            this.match(CParser.LeftBracket);
            this.state = 962;
            this.match(CParser.Star);
            this.state = 963;
            this.match(CParser.RightBracket);
            break;

        case 6:
            this.state = 964;
            this.match(CParser.LeftParen);
            this.state = 966;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) {
                this.state = 965;
                this.parameterTypeList();
            }

            this.state = 968;
            this.match(CParser.RightParen);
            this.state = 972;
            this._errHandler.sync(this);
            var _alt = this._interp.adaptivePredict(this._input,96,this._ctx)
            while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
                if(_alt===1) {
                    this.state = 969;
                    this.gccDeclaratorExtension(); 
                }
                this.state = 974;
                this._errHandler.sync(this);
                _alt = this._interp.adaptivePredict(this._input,96,this._ctx);
            }

            break;

        }
        this._ctx.stop = this._input.LT(-1);
        this.state = 1020;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,104,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                this.state = 1018;
                this._errHandler.sync(this);
                var la_ = this._interp.adaptivePredict(this._input,103,this._ctx);
                switch(la_) {
                case 1:
                    localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator);
                    this.state = 977;
                    if (!( this.precpred(this._ctx, 5))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 5)");
                    }
                    this.state = 978;
                    this.match(CParser.LeftBracket);
                    this.state = 980;
                    this._errHandler.sync(this);
                    _la = this._input.LA(1);
                    if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) {
                        this.state = 979;
                        this.typeQualifierList(0);
                    }

                    this.state = 983;
                    this._errHandler.sync(this);
                    _la = this._input.LA(1);
                    if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.DigitSequence - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) {
                        this.state = 982;
                        this.assignmentExpression();
                    }

                    this.state = 985;
                    this.match(CParser.RightBracket);
                    break;

                case 2:
                    localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator);
                    this.state = 986;
                    if (!( this.precpred(this._ctx, 4))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 4)");
                    }
                    this.state = 987;
                    this.match(CParser.LeftBracket);
                    this.state = 988;
                    this.match(CParser.Static);
                    this.state = 990;
                    this._errHandler.sync(this);
                    _la = this._input.LA(1);
                    if(_la===CParser.Const || ((((_la - 35)) & ~0x1f) == 0 && ((1 << (_la - 35)) & ((1 << (CParser.Restrict - 35)) | (1 << (CParser.Volatile - 35)) | (1 << (CParser.Atomic - 35)))) !== 0)) {
                        this.state = 989;
                        this.typeQualifierList(0);
                    }

                    this.state = 992;
                    this.assignmentExpression();
                    this.state = 993;
                    this.match(CParser.RightBracket);
                    break;

                case 3:
                    localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator);
                    this.state = 995;
                    if (!( this.precpred(this._ctx, 3))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 3)");
                    }
                    this.state = 996;
                    this.match(CParser.LeftBracket);
                    this.state = 997;
                    this.typeQualifierList(0);
                    this.state = 998;
                    this.match(CParser.Static);
                    this.state = 999;
                    this.assignmentExpression();
                    this.state = 1000;
                    this.match(CParser.RightBracket);
                    break;

                case 4:
                    localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator);
                    this.state = 1002;
                    if (!( this.precpred(this._ctx, 2))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 2)");
                    }
                    this.state = 1003;
                    this.match(CParser.LeftBracket);
                    this.state = 1004;
                    this.match(CParser.Star);
                    this.state = 1005;
                    this.match(CParser.RightBracket);
                    break;

                case 5:
                    localctx = new DirectAbstractDeclaratorContext(this, _parentctx, _parentState);
                    this.pushNewRecursionContext(localctx, _startState, CParser.RULE_directAbstractDeclarator);
                    this.state = 1006;
                    if (!( this.precpred(this._ctx, 1))) {
                        throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                    }
                    this.state = 1007;
                    this.match(CParser.LeftParen);
                    this.state = 1009;
                    this._errHandler.sync(this);
                    _la = this._input.LA(1);
                    if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) {
                        this.state = 1008;
                        this.parameterTypeList();
                    }

                    this.state = 1011;
                    this.match(CParser.RightParen);
                    this.state = 1015;
                    this._errHandler.sync(this);
                    var _alt = this._interp.adaptivePredict(this._input,102,this._ctx)
                    while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
                        if(_alt===1) {
                            this.state = 1012;
                            this.gccDeclaratorExtension(); 
                        }
                        this.state = 1017;
                        this._errHandler.sync(this);
                        _alt = this._interp.adaptivePredict(this._input,102,this._ctx);
                    }

                    break;

                } 
            }
            this.state = 1022;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,104,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function TypedefNameContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_typedefName;
    return this;
}

TypedefNameContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
TypedefNameContext.prototype.constructor = TypedefNameContext;

TypedefNameContext.prototype.Identifier = function() {
    return this.getToken(CParser.Identifier, 0);
};

TypedefNameContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterTypedefName(this);
	}
};

TypedefNameContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitTypedefName(this);
	}
};




CParser.TypedefNameContext = TypedefNameContext;

CParser.prototype.typedefName = function() {

    var localctx = new TypedefNameContext(this, this._ctx, this.state);
    this.enterRule(localctx, 126, CParser.RULE_typedefName);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1023;
        this.match(CParser.Identifier);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function InitializerContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_initializer;
    return this;
}

InitializerContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
InitializerContext.prototype.constructor = InitializerContext;

InitializerContext.prototype.assignmentExpression = function() {
    return this.getTypedRuleContext(AssignmentExpressionContext,0);
};

InitializerContext.prototype.LeftBrace = function() {
    return this.getToken(CParser.LeftBrace, 0);
};

InitializerContext.prototype.initializerList = function() {
    return this.getTypedRuleContext(InitializerListContext,0);
};

InitializerContext.prototype.RightBrace = function() {
    return this.getToken(CParser.RightBrace, 0);
};

InitializerContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

InitializerContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterInitializer(this);
	}
};

InitializerContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitInitializer(this);
	}
};




CParser.InitializerContext = InitializerContext;

CParser.prototype.initializer = function() {

    var localctx = new InitializerContext(this, this._ctx, this.state);
    this.enterRule(localctx, 128, CParser.RULE_initializer);
    try {
        this.state = 1035;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,105,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 1025;
            this.assignmentExpression();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 1026;
            this.match(CParser.LeftBrace);
            this.state = 1027;
            this.initializerList(0);
            this.state = 1028;
            this.match(CParser.RightBrace);
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 1030;
            this.match(CParser.LeftBrace);
            this.state = 1031;
            this.initializerList(0);
            this.state = 1032;
            this.match(CParser.Comma);
            this.state = 1033;
            this.match(CParser.RightBrace);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function InitializerListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_initializerList;
    return this;
}

InitializerListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
InitializerListContext.prototype.constructor = InitializerListContext;

InitializerListContext.prototype.initializer = function() {
    return this.getTypedRuleContext(InitializerContext,0);
};

InitializerListContext.prototype.designation = function() {
    return this.getTypedRuleContext(DesignationContext,0);
};

InitializerListContext.prototype.initializerList = function() {
    return this.getTypedRuleContext(InitializerListContext,0);
};

InitializerListContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

InitializerListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterInitializerList(this);
	}
};

InitializerListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitInitializerList(this);
	}
};



CParser.prototype.initializerList = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new InitializerListContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 130;
    this.enterRecursionRule(localctx, 130, CParser.RULE_initializerList, _p);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1039;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        if(_la===CParser.LeftBracket || _la===CParser.Dot) {
            this.state = 1038;
            this.designation();
        }

        this.state = 1041;
        this.initializer();
        this._ctx.stop = this._input.LT(-1);
        this.state = 1051;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,108,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new InitializerListContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_initializerList);
                this.state = 1043;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 1044;
                this.match(CParser.Comma);
                this.state = 1046;
                this._errHandler.sync(this);
                _la = this._input.LA(1);
                if(_la===CParser.LeftBracket || _la===CParser.Dot) {
                    this.state = 1045;
                    this.designation();
                }

                this.state = 1048;
                this.initializer(); 
            }
            this.state = 1053;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,108,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function DesignationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_designation;
    return this;
}

DesignationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
DesignationContext.prototype.constructor = DesignationContext;

DesignationContext.prototype.designatorList = function() {
    return this.getTypedRuleContext(DesignatorListContext,0);
};

DesignationContext.prototype.Assign = function() {
    return this.getToken(CParser.Assign, 0);
};

DesignationContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterDesignation(this);
	}
};

DesignationContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitDesignation(this);
	}
};




CParser.DesignationContext = DesignationContext;

CParser.prototype.designation = function() {

    var localctx = new DesignationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 132, CParser.RULE_designation);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1054;
        this.designatorList(0);
        this.state = 1055;
        this.match(CParser.Assign);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function DesignatorListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_designatorList;
    return this;
}

DesignatorListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
DesignatorListContext.prototype.constructor = DesignatorListContext;

DesignatorListContext.prototype.designator = function() {
    return this.getTypedRuleContext(DesignatorContext,0);
};

DesignatorListContext.prototype.designatorList = function() {
    return this.getTypedRuleContext(DesignatorListContext,0);
};

DesignatorListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterDesignatorList(this);
	}
};

DesignatorListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitDesignatorList(this);
	}
};



CParser.prototype.designatorList = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new DesignatorListContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 134;
    this.enterRecursionRule(localctx, 134, CParser.RULE_designatorList, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1058;
        this.designator();
        this._ctx.stop = this._input.LT(-1);
        this.state = 1064;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,109,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new DesignatorListContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_designatorList);
                this.state = 1060;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 1061;
                this.designator(); 
            }
            this.state = 1066;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,109,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function DesignatorContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_designator;
    return this;
}

DesignatorContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
DesignatorContext.prototype.constructor = DesignatorContext;

DesignatorContext.prototype.LeftBracket = function() {
    return this.getToken(CParser.LeftBracket, 0);
};

DesignatorContext.prototype.constantExpression = function() {
    return this.getTypedRuleContext(ConstantExpressionContext,0);
};

DesignatorContext.prototype.RightBracket = function() {
    return this.getToken(CParser.RightBracket, 0);
};

DesignatorContext.prototype.Dot = function() {
    return this.getToken(CParser.Dot, 0);
};

DesignatorContext.prototype.Identifier = function() {
    return this.getToken(CParser.Identifier, 0);
};

DesignatorContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterDesignator(this);
	}
};

DesignatorContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitDesignator(this);
	}
};




CParser.DesignatorContext = DesignatorContext;

CParser.prototype.designator = function() {

    var localctx = new DesignatorContext(this, this._ctx, this.state);
    this.enterRule(localctx, 136, CParser.RULE_designator);
    try {
        this.state = 1073;
        this._errHandler.sync(this);
        switch(this._input.LA(1)) {
        case CParser.LeftBracket:
            this.enterOuterAlt(localctx, 1);
            this.state = 1067;
            this.match(CParser.LeftBracket);
            this.state = 1068;
            this.constantExpression();
            this.state = 1069;
            this.match(CParser.RightBracket);
            break;
        case CParser.Dot:
            this.enterOuterAlt(localctx, 2);
            this.state = 1071;
            this.match(CParser.Dot);
            this.state = 1072;
            this.match(CParser.Identifier);
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function StaticAssertDeclarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_staticAssertDeclaration;
    return this;
}

StaticAssertDeclarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
StaticAssertDeclarationContext.prototype.constructor = StaticAssertDeclarationContext;

StaticAssertDeclarationContext.prototype.StaticAssert = function() {
    return this.getToken(CParser.StaticAssert, 0);
};

StaticAssertDeclarationContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

StaticAssertDeclarationContext.prototype.constantExpression = function() {
    return this.getTypedRuleContext(ConstantExpressionContext,0);
};

StaticAssertDeclarationContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

StaticAssertDeclarationContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

StaticAssertDeclarationContext.prototype.Semi = function() {
    return this.getToken(CParser.Semi, 0);
};

StaticAssertDeclarationContext.prototype.StringLiteral = function(i) {
	if(i===undefined) {
		i = null;
	}
    if(i===null) {
        return this.getTokens(CParser.StringLiteral);
    } else {
        return this.getToken(CParser.StringLiteral, i);
    }
};


StaticAssertDeclarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterStaticAssertDeclaration(this);
	}
};

StaticAssertDeclarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitStaticAssertDeclaration(this);
	}
};




CParser.StaticAssertDeclarationContext = StaticAssertDeclarationContext;

CParser.prototype.staticAssertDeclaration = function() {

    var localctx = new StaticAssertDeclarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 138, CParser.RULE_staticAssertDeclaration);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1075;
        this.match(CParser.StaticAssert);
        this.state = 1076;
        this.match(CParser.LeftParen);
        this.state = 1077;
        this.constantExpression();
        this.state = 1078;
        this.match(CParser.Comma);
        this.state = 1080; 
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        do {
            this.state = 1079;
            this.match(CParser.StringLiteral);
            this.state = 1082; 
            this._errHandler.sync(this);
            _la = this._input.LA(1);
        } while(_la===CParser.StringLiteral);
        this.state = 1084;
        this.match(CParser.RightParen);
        this.state = 1085;
        this.match(CParser.Semi);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function StatementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_statement;
    return this;
}

StatementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
StatementContext.prototype.constructor = StatementContext;

StatementContext.prototype.labeledStatement = function() {
    return this.getTypedRuleContext(LabeledStatementContext,0);
};

StatementContext.prototype.compoundStatement = function() {
    return this.getTypedRuleContext(CompoundStatementContext,0);
};

StatementContext.prototype.expressionStatement = function() {
    return this.getTypedRuleContext(ExpressionStatementContext,0);
};

StatementContext.prototype.selectionStatement = function() {
    return this.getTypedRuleContext(SelectionStatementContext,0);
};

StatementContext.prototype.iterationStatement = function() {
    return this.getTypedRuleContext(IterationStatementContext,0);
};

StatementContext.prototype.jumpStatement = function() {
    return this.getTypedRuleContext(JumpStatementContext,0);
};

StatementContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

StatementContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

StatementContext.prototype.Semi = function() {
    return this.getToken(CParser.Semi, 0);
};

StatementContext.prototype.Volatile = function() {
    return this.getToken(CParser.Volatile, 0);
};

StatementContext.prototype.logicalOrExpression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(LogicalOrExpressionContext);
    } else {
        return this.getTypedRuleContext(LogicalOrExpressionContext,i);
    }
};

StatementContext.prototype.Colon = function(i) {
	if(i===undefined) {
		i = null;
	}
    if(i===null) {
        return this.getTokens(CParser.Colon);
    } else {
        return this.getToken(CParser.Colon, i);
    }
};


StatementContext.prototype.Comma = function(i) {
	if(i===undefined) {
		i = null;
	}
    if(i===null) {
        return this.getTokens(CParser.Comma);
    } else {
        return this.getToken(CParser.Comma, i);
    }
};


StatementContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterStatement(this);
	}
};

StatementContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitStatement(this);
	}
};




CParser.StatementContext = StatementContext;

CParser.prototype.statement = function() {

    var localctx = new StatementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 140, CParser.RULE_statement);
    var _la = 0; // Token type
    try {
        this.state = 1124;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,117,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 1087;
            this.labeledStatement();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 1088;
            this.compoundStatement();
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 1089;
            this.expressionStatement();
            break;

        case 4:
            this.enterOuterAlt(localctx, 4);
            this.state = 1090;
            this.selectionStatement();
            break;

        case 5:
            this.enterOuterAlt(localctx, 5);
            this.state = 1091;
            this.iterationStatement();
            break;

        case 6:
            this.enterOuterAlt(localctx, 6);
            this.state = 1092;
            this.jumpStatement();
            break;

        case 7:
            this.enterOuterAlt(localctx, 7);
            this.state = 1093;
            _la = this._input.LA(1);
            if(!(_la===CParser.T__10 || _la===CParser.T__12)) {
            this._errHandler.recoverInline(this);
            }
            else {
            	this._errHandler.reportMatch(this);
                this.consume();
            }
            this.state = 1094;
            _la = this._input.LA(1);
            if(!(_la===CParser.T__13 || _la===CParser.Volatile)) {
            this._errHandler.recoverInline(this);
            }
            else {
            	this._errHandler.reportMatch(this);
                this.consume();
            }
            this.state = 1095;
            this.match(CParser.LeftParen);
            this.state = 1104;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.DigitSequence - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) {
                this.state = 1096;
                this.logicalOrExpression(0);
                this.state = 1101;
                this._errHandler.sync(this);
                _la = this._input.LA(1);
                while(_la===CParser.Comma) {
                    this.state = 1097;
                    this.match(CParser.Comma);
                    this.state = 1098;
                    this.logicalOrExpression(0);
                    this.state = 1103;
                    this._errHandler.sync(this);
                    _la = this._input.LA(1);
                }
            }

            this.state = 1119;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            while(_la===CParser.Colon) {
                this.state = 1106;
                this.match(CParser.Colon);
                this.state = 1115;
                this._errHandler.sync(this);
                _la = this._input.LA(1);
                if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.DigitSequence - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) {
                    this.state = 1107;
                    this.logicalOrExpression(0);
                    this.state = 1112;
                    this._errHandler.sync(this);
                    _la = this._input.LA(1);
                    while(_la===CParser.Comma) {
                        this.state = 1108;
                        this.match(CParser.Comma);
                        this.state = 1109;
                        this.logicalOrExpression(0);
                        this.state = 1114;
                        this._errHandler.sync(this);
                        _la = this._input.LA(1);
                    }
                }

                this.state = 1121;
                this._errHandler.sync(this);
                _la = this._input.LA(1);
            }
            this.state = 1122;
            this.match(CParser.RightParen);
            this.state = 1123;
            this.match(CParser.Semi);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function LabeledStatementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_labeledStatement;
    return this;
}

LabeledStatementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
LabeledStatementContext.prototype.constructor = LabeledStatementContext;

LabeledStatementContext.prototype.Identifier = function() {
    return this.getToken(CParser.Identifier, 0);
};

LabeledStatementContext.prototype.Colon = function() {
    return this.getToken(CParser.Colon, 0);
};

LabeledStatementContext.prototype.statement = function() {
    return this.getTypedRuleContext(StatementContext,0);
};

LabeledStatementContext.prototype.Case = function() {
    return this.getToken(CParser.Case, 0);
};

LabeledStatementContext.prototype.constantExpression = function() {
    return this.getTypedRuleContext(ConstantExpressionContext,0);
};

LabeledStatementContext.prototype.Default = function() {
    return this.getToken(CParser.Default, 0);
};

LabeledStatementContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterLabeledStatement(this);
	}
};

LabeledStatementContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitLabeledStatement(this);
	}
};




CParser.LabeledStatementContext = LabeledStatementContext;

CParser.prototype.labeledStatement = function() {

    var localctx = new LabeledStatementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 142, CParser.RULE_labeledStatement);
    try {
        this.state = 1137;
        this._errHandler.sync(this);
        switch(this._input.LA(1)) {
        case CParser.Identifier:
            this.enterOuterAlt(localctx, 1);
            this.state = 1126;
            this.match(CParser.Identifier);
            this.state = 1127;
            this.match(CParser.Colon);
            this.state = 1128;
            this.statement();
            break;
        case CParser.Case:
            this.enterOuterAlt(localctx, 2);
            this.state = 1129;
            this.match(CParser.Case);
            this.state = 1130;
            this.constantExpression();
            this.state = 1131;
            this.match(CParser.Colon);
            this.state = 1132;
            this.statement();
            break;
        case CParser.Default:
            this.enterOuterAlt(localctx, 3);
            this.state = 1134;
            this.match(CParser.Default);
            this.state = 1135;
            this.match(CParser.Colon);
            this.state = 1136;
            this.statement();
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function CompoundStatementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_compoundStatement;
    return this;
}

CompoundStatementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
CompoundStatementContext.prototype.constructor = CompoundStatementContext;

CompoundStatementContext.prototype.LeftBrace = function() {
    return this.getToken(CParser.LeftBrace, 0);
};

CompoundStatementContext.prototype.RightBrace = function() {
    return this.getToken(CParser.RightBrace, 0);
};

CompoundStatementContext.prototype.blockItemList = function() {
    return this.getTypedRuleContext(BlockItemListContext,0);
};

CompoundStatementContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterCompoundStatement(this);
	}
};

CompoundStatementContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitCompoundStatement(this);
	}
};




CParser.CompoundStatementContext = CompoundStatementContext;

CParser.prototype.compoundStatement = function() {

    var localctx = new CompoundStatementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 144, CParser.RULE_compoundStatement);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1139;
        this.match(CParser.LeftBrace);
        this.state = 1141;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__10) | (1 << CParser.T__11) | (1 << CParser.T__12) | (1 << CParser.Auto) | (1 << CParser.Break) | (1 << CParser.Case) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Continue) | (1 << CParser.Default) | (1 << CParser.Do) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.For) | (1 << CParser.Goto) | (1 << CParser.If) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Return - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Sizeof - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Switch - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.While - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Alignof - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Generic - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)) | (1 << (CParser.LeftBrace - 32)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)) | (1 << (CParser.Semi - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.DigitSequence - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) {
            this.state = 1140;
            this.blockItemList(0);
        }

        this.state = 1143;
        this.match(CParser.RightBrace);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function BlockItemListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_blockItemList;
    return this;
}

BlockItemListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
BlockItemListContext.prototype.constructor = BlockItemListContext;

BlockItemListContext.prototype.blockItem = function() {
    return this.getTypedRuleContext(BlockItemContext,0);
};

BlockItemListContext.prototype.blockItemList = function() {
    return this.getTypedRuleContext(BlockItemListContext,0);
};

BlockItemListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterBlockItemList(this);
	}
};

BlockItemListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitBlockItemList(this);
	}
};



CParser.prototype.blockItemList = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new BlockItemListContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 146;
    this.enterRecursionRule(localctx, 146, CParser.RULE_blockItemList, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1146;
        this.blockItem();
        this._ctx.stop = this._input.LT(-1);
        this.state = 1152;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,120,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new BlockItemListContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_blockItemList);
                this.state = 1148;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 1149;
                this.blockItem(); 
            }
            this.state = 1154;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,120,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function BlockItemContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_blockItem;
    return this;
}

BlockItemContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
BlockItemContext.prototype.constructor = BlockItemContext;

BlockItemContext.prototype.statement = function() {
    return this.getTypedRuleContext(StatementContext,0);
};

BlockItemContext.prototype.declaration = function() {
    return this.getTypedRuleContext(DeclarationContext,0);
};

BlockItemContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterBlockItem(this);
	}
};

BlockItemContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitBlockItem(this);
	}
};




CParser.BlockItemContext = BlockItemContext;

CParser.prototype.blockItem = function() {

    var localctx = new BlockItemContext(this, this._ctx, this.state);
    this.enterRule(localctx, 148, CParser.RULE_blockItem);
    try {
        this.state = 1157;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,121,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 1155;
            this.statement();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 1156;
            this.declaration();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function ExpressionStatementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_expressionStatement;
    return this;
}

ExpressionStatementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ExpressionStatementContext.prototype.constructor = ExpressionStatementContext;

ExpressionStatementContext.prototype.Semi = function() {
    return this.getToken(CParser.Semi, 0);
};

ExpressionStatementContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

ExpressionStatementContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterExpressionStatement(this);
	}
};

ExpressionStatementContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitExpressionStatement(this);
	}
};




CParser.ExpressionStatementContext = ExpressionStatementContext;

CParser.prototype.expressionStatement = function() {

    var localctx = new ExpressionStatementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 150, CParser.RULE_expressionStatement);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1160;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.DigitSequence - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) {
            this.state = 1159;
            this.expression(0);
        }

        this.state = 1162;
        this.match(CParser.Semi);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function SelectionStatementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_selectionStatement;
    return this;
}

SelectionStatementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
SelectionStatementContext.prototype.constructor = SelectionStatementContext;

SelectionStatementContext.prototype.If = function() {
    return this.getToken(CParser.If, 0);
};

SelectionStatementContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

SelectionStatementContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

SelectionStatementContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

SelectionStatementContext.prototype.statement = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(StatementContext);
    } else {
        return this.getTypedRuleContext(StatementContext,i);
    }
};

SelectionStatementContext.prototype.Else = function() {
    return this.getToken(CParser.Else, 0);
};

SelectionStatementContext.prototype.Switch = function() {
    return this.getToken(CParser.Switch, 0);
};

SelectionStatementContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterSelectionStatement(this);
	}
};

SelectionStatementContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitSelectionStatement(this);
	}
};




CParser.SelectionStatementContext = SelectionStatementContext;

CParser.prototype.selectionStatement = function() {

    var localctx = new SelectionStatementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 152, CParser.RULE_selectionStatement);
    try {
        this.state = 1179;
        this._errHandler.sync(this);
        switch(this._input.LA(1)) {
        case CParser.If:
            this.enterOuterAlt(localctx, 1);
            this.state = 1164;
            this.match(CParser.If);
            this.state = 1165;
            this.match(CParser.LeftParen);
            this.state = 1166;
            this.expression(0);
            this.state = 1167;
            this.match(CParser.RightParen);
            this.state = 1168;
            this.statement();
            this.state = 1171;
            this._errHandler.sync(this);
            var la_ = this._interp.adaptivePredict(this._input,123,this._ctx);
            if(la_===1) {
                this.state = 1169;
                this.match(CParser.Else);
                this.state = 1170;
                this.statement();

            }
            break;
        case CParser.Switch:
            this.enterOuterAlt(localctx, 2);
            this.state = 1173;
            this.match(CParser.Switch);
            this.state = 1174;
            this.match(CParser.LeftParen);
            this.state = 1175;
            this.expression(0);
            this.state = 1176;
            this.match(CParser.RightParen);
            this.state = 1177;
            this.statement();
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function IterationStatementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_iterationStatement;
    return this;
}

IterationStatementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
IterationStatementContext.prototype.constructor = IterationStatementContext;

IterationStatementContext.prototype.While = function() {
    return this.getToken(CParser.While, 0);
};

IterationStatementContext.prototype.LeftParen = function() {
    return this.getToken(CParser.LeftParen, 0);
};

IterationStatementContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

IterationStatementContext.prototype.RightParen = function() {
    return this.getToken(CParser.RightParen, 0);
};

IterationStatementContext.prototype.statement = function() {
    return this.getTypedRuleContext(StatementContext,0);
};

IterationStatementContext.prototype.Do = function() {
    return this.getToken(CParser.Do, 0);
};

IterationStatementContext.prototype.Semi = function() {
    return this.getToken(CParser.Semi, 0);
};

IterationStatementContext.prototype.For = function() {
    return this.getToken(CParser.For, 0);
};

IterationStatementContext.prototype.forCondition = function() {
    return this.getTypedRuleContext(ForConditionContext,0);
};

IterationStatementContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterIterationStatement(this);
	}
};

IterationStatementContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitIterationStatement(this);
	}
};




CParser.IterationStatementContext = IterationStatementContext;

CParser.prototype.iterationStatement = function() {

    var localctx = new IterationStatementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 154, CParser.RULE_iterationStatement);
    try {
        this.state = 1201;
        this._errHandler.sync(this);
        switch(this._input.LA(1)) {
        case CParser.While:
            this.enterOuterAlt(localctx, 1);
            this.state = 1181;
            this.match(CParser.While);
            this.state = 1182;
            this.match(CParser.LeftParen);
            this.state = 1183;
            this.expression(0);
            this.state = 1184;
            this.match(CParser.RightParen);
            this.state = 1185;
            this.statement();
            break;
        case CParser.Do:
            this.enterOuterAlt(localctx, 2);
            this.state = 1187;
            this.match(CParser.Do);
            this.state = 1188;
            this.statement();
            this.state = 1189;
            this.match(CParser.While);
            this.state = 1190;
            this.match(CParser.LeftParen);
            this.state = 1191;
            this.expression(0);
            this.state = 1192;
            this.match(CParser.RightParen);
            this.state = 1193;
            this.match(CParser.Semi);
            break;
        case CParser.For:
            this.enterOuterAlt(localctx, 3);
            this.state = 1195;
            this.match(CParser.For);
            this.state = 1196;
            this.match(CParser.LeftParen);
            this.state = 1197;
            this.forCondition();
            this.state = 1198;
            this.match(CParser.RightParen);
            this.state = 1199;
            this.statement();
            break;
        default:
            throw new antlr4.error.NoViableAltException(this);
        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function ForConditionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_forCondition;
    return this;
}

ForConditionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ForConditionContext.prototype.constructor = ForConditionContext;

ForConditionContext.prototype.forDeclaration = function() {
    return this.getTypedRuleContext(ForDeclarationContext,0);
};

ForConditionContext.prototype.Semi = function(i) {
	if(i===undefined) {
		i = null;
	}
    if(i===null) {
        return this.getTokens(CParser.Semi);
    } else {
        return this.getToken(CParser.Semi, i);
    }
};


ForConditionContext.prototype.forExpression = function(i) {
    if(i===undefined) {
        i = null;
    }
    if(i===null) {
        return this.getTypedRuleContexts(ForExpressionContext);
    } else {
        return this.getTypedRuleContext(ForExpressionContext,i);
    }
};

ForConditionContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

ForConditionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterForCondition(this);
	}
};

ForConditionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitForCondition(this);
	}
};




CParser.ForConditionContext = ForConditionContext;

CParser.prototype.forCondition = function() {

    var localctx = new ForConditionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 156, CParser.RULE_forCondition);
    var _la = 0; // Token type
    try {
        this.state = 1223;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,131,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 1203;
            this.forDeclaration();
            this.state = 1204;
            this.match(CParser.Semi);
            this.state = 1206;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.DigitSequence - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) {
                this.state = 1205;
                this.forExpression(0);
            }

            this.state = 1208;
            this.match(CParser.Semi);
            this.state = 1210;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.DigitSequence - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) {
                this.state = 1209;
                this.forExpression(0);
            }

            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 1213;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.DigitSequence - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) {
                this.state = 1212;
                this.expression(0);
            }

            this.state = 1215;
            this.match(CParser.Semi);
            this.state = 1217;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.DigitSequence - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) {
                this.state = 1216;
                this.forExpression(0);
            }

            this.state = 1219;
            this.match(CParser.Semi);
            this.state = 1221;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.DigitSequence - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) {
                this.state = 1220;
                this.forExpression(0);
            }

            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function ForDeclarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_forDeclaration;
    return this;
}

ForDeclarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ForDeclarationContext.prototype.constructor = ForDeclarationContext;

ForDeclarationContext.prototype.declarationSpecifiers = function() {
    return this.getTypedRuleContext(DeclarationSpecifiersContext,0);
};

ForDeclarationContext.prototype.initDeclaratorList = function() {
    return this.getTypedRuleContext(InitDeclaratorListContext,0);
};

ForDeclarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterForDeclaration(this);
	}
};

ForDeclarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitForDeclaration(this);
	}
};




CParser.ForDeclarationContext = ForDeclarationContext;

CParser.prototype.forDeclaration = function() {

    var localctx = new ForDeclarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 158, CParser.RULE_forDeclaration);
    try {
        this.state = 1229;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,132,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 1225;
            this.declarationSpecifiers();
            this.state = 1226;
            this.initDeclaratorList(0);
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 1228;
            this.declarationSpecifiers();
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function ForExpressionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_forExpression;
    return this;
}

ForExpressionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ForExpressionContext.prototype.constructor = ForExpressionContext;

ForExpressionContext.prototype.assignmentExpression = function() {
    return this.getTypedRuleContext(AssignmentExpressionContext,0);
};

ForExpressionContext.prototype.forExpression = function() {
    return this.getTypedRuleContext(ForExpressionContext,0);
};

ForExpressionContext.prototype.Comma = function() {
    return this.getToken(CParser.Comma, 0);
};

ForExpressionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterForExpression(this);
	}
};

ForExpressionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitForExpression(this);
	}
};



CParser.prototype.forExpression = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new ForExpressionContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 160;
    this.enterRecursionRule(localctx, 160, CParser.RULE_forExpression, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1232;
        this.assignmentExpression();
        this._ctx.stop = this._input.LT(-1);
        this.state = 1239;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,133,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new ForExpressionContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_forExpression);
                this.state = 1234;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 1235;
                this.match(CParser.Comma);
                this.state = 1236;
                this.assignmentExpression(); 
            }
            this.state = 1241;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,133,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function JumpStatementContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_jumpStatement;
    return this;
}

JumpStatementContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
JumpStatementContext.prototype.constructor = JumpStatementContext;

JumpStatementContext.prototype.Goto = function() {
    return this.getToken(CParser.Goto, 0);
};

JumpStatementContext.prototype.Identifier = function() {
    return this.getToken(CParser.Identifier, 0);
};

JumpStatementContext.prototype.Semi = function() {
    return this.getToken(CParser.Semi, 0);
};

JumpStatementContext.prototype.Continue = function() {
    return this.getToken(CParser.Continue, 0);
};

JumpStatementContext.prototype.Break = function() {
    return this.getToken(CParser.Break, 0);
};

JumpStatementContext.prototype.Return = function() {
    return this.getToken(CParser.Return, 0);
};

JumpStatementContext.prototype.expression = function() {
    return this.getTypedRuleContext(ExpressionContext,0);
};

JumpStatementContext.prototype.unaryExpression = function() {
    return this.getTypedRuleContext(UnaryExpressionContext,0);
};

JumpStatementContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterJumpStatement(this);
	}
};

JumpStatementContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitJumpStatement(this);
	}
};




CParser.JumpStatementContext = JumpStatementContext;

CParser.prototype.jumpStatement = function() {

    var localctx = new JumpStatementContext(this, this._ctx, this.state);
    this.enterRule(localctx, 162, CParser.RULE_jumpStatement);
    var _la = 0; // Token type
    try {
        this.state = 1258;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,135,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 1242;
            this.match(CParser.Goto);
            this.state = 1243;
            this.match(CParser.Identifier);
            this.state = 1244;
            this.match(CParser.Semi);
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 1245;
            this.match(CParser.Continue);
            this.state = 1246;
            this.match(CParser.Semi);
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 1247;
            this.match(CParser.Break);
            this.state = 1248;
            this.match(CParser.Semi);
            break;

        case 4:
            this.enterOuterAlt(localctx, 4);
            this.state = 1249;
            this.match(CParser.Return);
            this.state = 1251;
            this._errHandler.sync(this);
            _la = this._input.LA(1);
            if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__1) | (1 << CParser.T__2))) !== 0) || ((((_la - 39)) & ~0x1f) == 0 && ((1 << (_la - 39)) & ((1 << (CParser.Sizeof - 39)) | (1 << (CParser.Alignof - 39)) | (1 << (CParser.Generic - 39)) | (1 << (CParser.LeftParen - 39)))) !== 0) || ((((_la - 71)) & ~0x1f) == 0 && ((1 << (_la - 71)) & ((1 << (CParser.Plus - 71)) | (1 << (CParser.PlusPlus - 71)) | (1 << (CParser.Minus - 71)) | (1 << (CParser.MinusMinus - 71)) | (1 << (CParser.Star - 71)) | (1 << (CParser.And - 71)) | (1 << (CParser.AndAnd - 71)) | (1 << (CParser.Not - 71)) | (1 << (CParser.Tilde - 71)))) !== 0) || ((((_la - 105)) & ~0x1f) == 0 && ((1 << (_la - 105)) & ((1 << (CParser.Identifier - 105)) | (1 << (CParser.Constant - 105)) | (1 << (CParser.DigitSequence - 105)) | (1 << (CParser.StringLiteral - 105)))) !== 0)) {
                this.state = 1250;
                this.expression(0);
            }

            this.state = 1253;
            this.match(CParser.Semi);
            break;

        case 5:
            this.enterOuterAlt(localctx, 5);
            this.state = 1254;
            this.match(CParser.Goto);
            this.state = 1255;
            this.unaryExpression();
            this.state = 1256;
            this.match(CParser.Semi);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function CompilationUnitContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_compilationUnit;
    return this;
}

CompilationUnitContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
CompilationUnitContext.prototype.constructor = CompilationUnitContext;

CompilationUnitContext.prototype.EOF = function() {
    return this.getToken(CParser.EOF, 0);
};

CompilationUnitContext.prototype.translationUnit = function() {
    return this.getTypedRuleContext(TranslationUnitContext,0);
};

CompilationUnitContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterCompilationUnit(this);
	}
};

CompilationUnitContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitCompilationUnit(this);
	}
};




CParser.CompilationUnitContext = CompilationUnitContext;

CParser.prototype.compilationUnit = function() {

    var localctx = new CompilationUnitContext(this, this._ctx, this.state);
    this.enterRule(localctx, 164, CParser.RULE_compilationUnit);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1261;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)) | (1 << (CParser.LeftParen - 32)))) !== 0) || ((((_la - 75)) & ~0x1f) == 0 && ((1 << (_la - 75)) & ((1 << (CParser.Star - 75)) | (1 << (CParser.Caret - 75)) | (1 << (CParser.Semi - 75)) | (1 << (CParser.Identifier - 75)))) !== 0)) {
            this.state = 1260;
            this.translationUnit(0);
        }

        this.state = 1263;
        this.match(CParser.EOF);
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function TranslationUnitContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_translationUnit;
    return this;
}

TranslationUnitContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
TranslationUnitContext.prototype.constructor = TranslationUnitContext;

TranslationUnitContext.prototype.externalDeclaration = function() {
    return this.getTypedRuleContext(ExternalDeclarationContext,0);
};

TranslationUnitContext.prototype.translationUnit = function() {
    return this.getTypedRuleContext(TranslationUnitContext,0);
};

TranslationUnitContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterTranslationUnit(this);
	}
};

TranslationUnitContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitTranslationUnit(this);
	}
};



CParser.prototype.translationUnit = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new TranslationUnitContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 166;
    this.enterRecursionRule(localctx, 166, CParser.RULE_translationUnit, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1266;
        this.externalDeclaration();
        this._ctx.stop = this._input.LT(-1);
        this.state = 1272;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,137,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new TranslationUnitContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_translationUnit);
                this.state = 1268;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 1269;
                this.externalDeclaration(); 
            }
            this.state = 1274;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,137,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


function ExternalDeclarationContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_externalDeclaration;
    return this;
}

ExternalDeclarationContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
ExternalDeclarationContext.prototype.constructor = ExternalDeclarationContext;

ExternalDeclarationContext.prototype.functionDefinition = function() {
    return this.getTypedRuleContext(FunctionDefinitionContext,0);
};

ExternalDeclarationContext.prototype.declaration = function() {
    return this.getTypedRuleContext(DeclarationContext,0);
};

ExternalDeclarationContext.prototype.Semi = function() {
    return this.getToken(CParser.Semi, 0);
};

ExternalDeclarationContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterExternalDeclaration(this);
	}
};

ExternalDeclarationContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitExternalDeclaration(this);
	}
};




CParser.ExternalDeclarationContext = ExternalDeclarationContext;

CParser.prototype.externalDeclaration = function() {

    var localctx = new ExternalDeclarationContext(this, this._ctx, this.state);
    this.enterRule(localctx, 168, CParser.RULE_externalDeclaration);
    try {
        this.state = 1278;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,138,this._ctx);
        switch(la_) {
        case 1:
            this.enterOuterAlt(localctx, 1);
            this.state = 1275;
            this.functionDefinition();
            break;

        case 2:
            this.enterOuterAlt(localctx, 2);
            this.state = 1276;
            this.declaration();
            break;

        case 3:
            this.enterOuterAlt(localctx, 3);
            this.state = 1277;
            this.match(CParser.Semi);
            break;

        }
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function FunctionDefinitionContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_functionDefinition;
    return this;
}

FunctionDefinitionContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
FunctionDefinitionContext.prototype.constructor = FunctionDefinitionContext;

FunctionDefinitionContext.prototype.declarator = function() {
    return this.getTypedRuleContext(DeclaratorContext,0);
};

FunctionDefinitionContext.prototype.compoundStatement = function() {
    return this.getTypedRuleContext(CompoundStatementContext,0);
};

FunctionDefinitionContext.prototype.declarationSpecifiers = function() {
    return this.getTypedRuleContext(DeclarationSpecifiersContext,0);
};

FunctionDefinitionContext.prototype.declarationList = function() {
    return this.getTypedRuleContext(DeclarationListContext,0);
};

FunctionDefinitionContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterFunctionDefinition(this);
	}
};

FunctionDefinitionContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitFunctionDefinition(this);
	}
};




CParser.FunctionDefinitionContext = FunctionDefinitionContext;

CParser.prototype.functionDefinition = function() {

    var localctx = new FunctionDefinitionContext(this, this._ctx, this.state);
    this.enterRule(localctx, 170, CParser.RULE_functionDefinition);
    var _la = 0; // Token type
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1281;
        this._errHandler.sync(this);
        var la_ = this._interp.adaptivePredict(this._input,139,this._ctx);
        if(la_===1) {
            this.state = 1280;
            this.declarationSpecifiers();

        }
        this.state = 1283;
        this.declarator();
        this.state = 1285;
        this._errHandler.sync(this);
        _la = this._input.LA(1);
        if((((_la) & ~0x1f) == 0 && ((1 << _la) & ((1 << CParser.T__0) | (1 << CParser.T__3) | (1 << CParser.T__4) | (1 << CParser.T__5) | (1 << CParser.T__6) | (1 << CParser.T__7) | (1 << CParser.T__8) | (1 << CParser.T__9) | (1 << CParser.T__11) | (1 << CParser.Auto) | (1 << CParser.Char) | (1 << CParser.Const) | (1 << CParser.Double) | (1 << CParser.Enum) | (1 << CParser.Extern) | (1 << CParser.Float) | (1 << CParser.Inline))) !== 0) || ((((_la - 32)) & ~0x1f) == 0 && ((1 << (_la - 32)) & ((1 << (CParser.Int - 32)) | (1 << (CParser.Long - 32)) | (1 << (CParser.Register - 32)) | (1 << (CParser.Restrict - 32)) | (1 << (CParser.Short - 32)) | (1 << (CParser.Signed - 32)) | (1 << (CParser.Static - 32)) | (1 << (CParser.Struct - 32)) | (1 << (CParser.Typedef - 32)) | (1 << (CParser.Union - 32)) | (1 << (CParser.Unsigned - 32)) | (1 << (CParser.Void - 32)) | (1 << (CParser.Volatile - 32)) | (1 << (CParser.Alignas - 32)) | (1 << (CParser.Atomic - 32)) | (1 << (CParser.Bool - 32)) | (1 << (CParser.Complex - 32)) | (1 << (CParser.Noreturn - 32)) | (1 << (CParser.StaticAssert - 32)) | (1 << (CParser.ThreadLocal - 32)))) !== 0) || _la===CParser.Identifier) {
            this.state = 1284;
            this.declarationList(0);
        }

        this.state = 1287;
        this.compoundStatement();
    } catch (re) {
    	if(re instanceof antlr4.error.RecognitionException) {
	        localctx.exception = re;
	        this._errHandler.reportError(this, re);
	        this._errHandler.recover(this, re);
	    } else {
	    	throw re;
	    }
    } finally {
        this.exitRule();
    }
    return localctx;
};


function DeclarationListContext(parser, parent, invokingState) {
	if(parent===undefined) {
	    parent = null;
	}
	if(invokingState===undefined || invokingState===null) {
		invokingState = -1;
	}
	antlr4.ParserRuleContext.call(this, parent, invokingState);
    this.parser = parser;
    this.ruleIndex = CParser.RULE_declarationList;
    return this;
}

DeclarationListContext.prototype = Object.create(antlr4.ParserRuleContext.prototype);
DeclarationListContext.prototype.constructor = DeclarationListContext;

DeclarationListContext.prototype.declaration = function() {
    return this.getTypedRuleContext(DeclarationContext,0);
};

DeclarationListContext.prototype.declarationList = function() {
    return this.getTypedRuleContext(DeclarationListContext,0);
};

DeclarationListContext.prototype.enterRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.enterDeclarationList(this);
	}
};

DeclarationListContext.prototype.exitRule = function(listener) {
    if(listener instanceof CListener ) {
        listener.exitDeclarationList(this);
	}
};



CParser.prototype.declarationList = function(_p) {
	if(_p===undefined) {
	    _p = 0;
	}
    var _parentctx = this._ctx;
    var _parentState = this.state;
    var localctx = new DeclarationListContext(this, this._ctx, _parentState);
    var _prevctx = localctx;
    var _startState = 172;
    this.enterRecursionRule(localctx, 172, CParser.RULE_declarationList, _p);
    try {
        this.enterOuterAlt(localctx, 1);
        this.state = 1290;
        this.declaration();
        this._ctx.stop = this._input.LT(-1);
        this.state = 1296;
        this._errHandler.sync(this);
        var _alt = this._interp.adaptivePredict(this._input,141,this._ctx)
        while(_alt!=2 && _alt!=antlr4.atn.ATN.INVALID_ALT_NUMBER) {
            if(_alt===1) {
                if(this._parseListeners!==null) {
                    this.triggerExitRuleEvent();
                }
                _prevctx = localctx;
                localctx = new DeclarationListContext(this, _parentctx, _parentState);
                this.pushNewRecursionContext(localctx, _startState, CParser.RULE_declarationList);
                this.state = 1292;
                if (!( this.precpred(this._ctx, 1))) {
                    throw new antlr4.error.FailedPredicateException(this, "this.precpred(this._ctx, 1)");
                }
                this.state = 1293;
                this.declaration(); 
            }
            this.state = 1298;
            this._errHandler.sync(this);
            _alt = this._interp.adaptivePredict(this._input,141,this._ctx);
        }

    } catch( error) {
        if(error instanceof antlr4.error.RecognitionException) {
	        localctx.exception = error;
	        this._errHandler.reportError(this, error);
	        this._errHandler.recover(this, error);
	    } else {
	    	throw error;
	    }
    } finally {
        this.unrollRecursionContexts(_parentctx)
    }
    return localctx;
};


CParser.prototype.sempred = function(localctx, ruleIndex, predIndex) {
	switch(ruleIndex) {
	case 2:
			return this.genericAssocList_sempred(localctx, predIndex);
	case 4:
			return this.postfixExpression_sempred(localctx, predIndex);
	case 5:
			return this.argumentExpressionList_sempred(localctx, predIndex);
	case 9:
			return this.multiplicativeExpression_sempred(localctx, predIndex);
	case 10:
			return this.additiveExpression_sempred(localctx, predIndex);
	case 11:
			return this.shiftExpression_sempred(localctx, predIndex);
	case 12:
			return this.relationalExpression_sempred(localctx, predIndex);
	case 13:
			return this.equalityExpression_sempred(localctx, predIndex);
	case 14:
			return this.andExpression_sempred(localctx, predIndex);
	case 15:
			return this.exclusiveOrExpression_sempred(localctx, predIndex);
	case 16:
			return this.inclusiveOrExpression_sempred(localctx, predIndex);
	case 17:
			return this.logicalAndExpression_sempred(localctx, predIndex);
	case 18:
			return this.logicalOrExpression_sempred(localctx, predIndex);
	case 22:
			return this.expression_sempred(localctx, predIndex);
	case 28:
			return this.initDeclaratorList_sempred(localctx, predIndex);
	case 31:
			return this.typeSpecifier_sempred(localctx, predIndex);
	case 34:
			return this.structDeclarationList_sempred(localctx, predIndex);
	case 37:
			return this.structDeclaratorList_sempred(localctx, predIndex);
	case 40:
			return this.enumeratorList_sempred(localctx, predIndex);
	case 48:
			return this.directDeclarator_sempred(localctx, predIndex);
	case 55:
			return this.typeQualifierList_sempred(localctx, predIndex);
	case 57:
			return this.parameterList_sempred(localctx, predIndex);
	case 59:
			return this.identifierList_sempred(localctx, predIndex);
	case 62:
			return this.directAbstractDeclarator_sempred(localctx, predIndex);
	case 65:
			return this.initializerList_sempred(localctx, predIndex);
	case 67:
			return this.designatorList_sempred(localctx, predIndex);
	case 73:
			return this.blockItemList_sempred(localctx, predIndex);
	case 80:
			return this.forExpression_sempred(localctx, predIndex);
	case 83:
			return this.translationUnit_sempred(localctx, predIndex);
	case 86:
			return this.declarationList_sempred(localctx, predIndex);
    default:
        throw "No predicate with index:" + ruleIndex;
   }
};

CParser.prototype.genericAssocList_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 0:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.postfixExpression_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 1:
			return this.precpred(this._ctx, 10);
		case 2:
			return this.precpred(this._ctx, 9);
		case 3:
			return this.precpred(this._ctx, 8);
		case 4:
			return this.precpred(this._ctx, 7);
		case 5:
			return this.precpred(this._ctx, 6);
		case 6:
			return this.precpred(this._ctx, 5);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.argumentExpressionList_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 7:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.multiplicativeExpression_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 8:
			return this.precpred(this._ctx, 3);
		case 9:
			return this.precpred(this._ctx, 2);
		case 10:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.additiveExpression_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 11:
			return this.precpred(this._ctx, 2);
		case 12:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.shiftExpression_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 13:
			return this.precpred(this._ctx, 2);
		case 14:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.relationalExpression_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 15:
			return this.precpred(this._ctx, 4);
		case 16:
			return this.precpred(this._ctx, 3);
		case 17:
			return this.precpred(this._ctx, 2);
		case 18:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.equalityExpression_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 19:
			return this.precpred(this._ctx, 2);
		case 20:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.andExpression_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 21:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.exclusiveOrExpression_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 22:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.inclusiveOrExpression_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 23:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.logicalAndExpression_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 24:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.logicalOrExpression_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 25:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.expression_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 26:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.initDeclaratorList_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 27:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.typeSpecifier_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 28:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.structDeclarationList_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 29:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.structDeclaratorList_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 30:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.enumeratorList_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 31:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.directDeclarator_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 32:
			return this.precpred(this._ctx, 8);
		case 33:
			return this.precpred(this._ctx, 7);
		case 34:
			return this.precpred(this._ctx, 6);
		case 35:
			return this.precpred(this._ctx, 5);
		case 36:
			return this.precpred(this._ctx, 4);
		case 37:
			return this.precpred(this._ctx, 3);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.typeQualifierList_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 38:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.parameterList_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 39:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.identifierList_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 40:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.directAbstractDeclarator_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 41:
			return this.precpred(this._ctx, 5);
		case 42:
			return this.precpred(this._ctx, 4);
		case 43:
			return this.precpred(this._ctx, 3);
		case 44:
			return this.precpred(this._ctx, 2);
		case 45:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.initializerList_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 46:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.designatorList_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 47:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.blockItemList_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 48:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.forExpression_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 49:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.translationUnit_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 50:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};

CParser.prototype.declarationList_sempred = function(localctx, predIndex) {
	switch(predIndex) {
		case 51:
			return this.precpred(this._ctx, 1);
		default:
			throw "No predicate with index:" + predIndex;
	}
};


exports.CParser = CParser;