# Generated from C.g4 by ANTLR 4.13.2
# encoding: utf-8
from antlr4 import *
from io import StringIO
import sys
if sys.version_info[1] > 5:
    from typing import TextIO
else:
    from typing.io import TextIO


## @file
# The file defines the parser for C source files.
#
# THIS FILE IS AUTO-GENENERATED. PLEASE DON NOT MODIFY THIS FILE.
# This file is generated by running:
# java org.antlr.Tool C.g4
#
# Copyright (c) 2009 - 2010, Intel Corporation  All rights reserved.
# SPDX-License-Identifier: BSD-2-Clause-Patent
##

import Ecc.CodeFragment as CodeFragment
import Ecc.FileProfile as FileProfile

def serializedATN():
    return [
        4,1,105,894,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,
        7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,
        13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,
        20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,
        26,2,27,7,27,2,28,7,28,2,29,7,29,2,30,7,30,2,31,7,31,2,32,7,32,2,
        33,7,33,2,34,7,34,2,35,7,35,2,36,7,36,2,37,7,37,2,38,7,38,2,39,7,
        39,2,40,7,40,2,41,7,41,2,42,7,42,2,43,7,43,2,44,7,44,2,45,7,45,2,
        46,7,46,2,47,7,47,2,48,7,48,2,49,7,49,2,50,7,50,2,51,7,51,2,52,7,
        52,2,53,7,53,2,54,7,54,2,55,7,55,2,56,7,56,2,57,7,57,2,58,7,58,2,
        59,7,59,2,60,7,60,2,61,7,61,2,62,7,62,2,63,7,63,2,64,7,64,2,65,7,
        65,2,66,7,66,2,67,7,67,2,68,7,68,2,69,7,69,2,70,7,70,1,0,5,0,144,
        8,0,10,0,12,0,147,9,0,1,1,3,1,150,8,1,1,1,1,1,5,1,154,8,1,10,1,12,
        1,157,9,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,165,8,1,3,1,167,8,1,1,2,3,
        2,170,8,2,1,2,1,2,4,2,174,8,2,11,2,12,2,175,1,2,1,2,1,2,3,2,181,
        8,2,1,2,1,2,1,3,1,3,1,3,4,3,188,8,3,11,3,12,3,189,1,4,1,4,3,4,194,
        8,4,1,4,1,4,1,4,1,4,1,4,1,4,3,4,202,8,4,1,4,1,4,1,4,3,4,207,8,4,
        1,5,1,5,1,5,5,5,212,8,5,10,5,12,5,215,9,5,1,6,1,6,1,6,3,6,220,8,
        6,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,
        8,1,8,1,8,1,8,5,8,241,8,8,10,8,12,8,244,9,8,1,8,1,8,3,8,248,8,8,
        1,9,1,9,1,10,1,10,3,10,254,8,10,1,10,1,10,1,10,1,10,1,10,1,10,1,
        10,3,10,263,8,10,1,11,1,11,1,12,4,12,268,8,12,11,12,12,12,269,1,
        13,1,13,1,13,1,13,1,14,1,14,4,14,278,8,14,11,14,12,14,279,1,15,1,
        15,1,15,5,15,285,8,15,10,15,12,15,288,9,15,1,16,1,16,1,16,3,16,293,
        8,16,1,16,1,16,3,16,297,8,16,1,17,1,17,1,17,1,17,3,17,303,8,17,1,
        17,1,17,1,17,1,17,1,17,1,17,1,17,3,17,312,8,17,1,17,1,17,1,17,1,
        17,3,17,318,8,17,1,18,1,18,1,18,5,18,323,8,18,10,18,12,18,326,9,
        18,1,19,1,19,1,19,3,19,331,8,19,1,20,1,20,1,21,3,21,336,8,21,1,21,
        3,21,339,8,21,1,21,3,21,342,8,21,1,21,3,21,345,8,21,1,21,1,21,3,
        21,349,8,21,1,22,1,22,5,22,353,8,22,10,22,12,22,356,9,22,1,22,1,
        22,3,22,360,8,22,1,22,1,22,1,22,4,22,365,8,22,11,22,12,22,366,3,
        22,369,8,22,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,
        23,1,23,1,23,1,23,1,23,1,23,3,23,387,8,23,1,24,1,24,4,24,391,8,24,
        11,24,12,24,392,1,24,3,24,396,8,24,1,24,1,24,1,24,3,24,401,8,24,
        1,25,1,25,1,25,3,25,406,8,25,1,25,3,25,409,8,25,1,26,1,26,1,26,3,
        26,414,8,26,1,26,5,26,417,8,26,10,26,12,26,420,9,26,1,27,1,27,1,
        27,5,27,425,8,27,10,27,12,27,428,9,27,1,27,3,27,431,8,27,1,27,5,
        27,434,8,27,10,27,12,27,437,9,27,1,27,3,27,440,8,27,1,28,1,28,1,
        28,5,28,445,8,28,10,28,12,28,448,9,28,1,29,1,29,3,29,452,8,29,1,
        29,3,29,455,8,29,1,30,1,30,3,30,459,8,30,1,30,3,30,462,8,30,1,31,
        1,31,1,31,1,31,1,31,3,31,469,8,31,1,31,5,31,472,8,31,10,31,12,31,
        475,9,31,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,
        1,32,3,32,489,8,32,1,33,1,33,1,33,1,33,3,33,495,8,33,1,33,1,33,3,
        33,499,8,33,1,34,1,34,1,34,5,34,504,8,34,10,34,12,34,507,9,34,1,
        35,1,35,3,35,511,8,35,1,35,1,35,1,35,3,35,516,8,35,5,35,518,8,35,
        10,35,12,35,521,9,35,1,36,1,36,1,36,1,36,1,36,5,36,528,8,36,10,36,
        12,36,531,9,36,1,37,1,37,1,37,1,37,1,37,1,37,1,37,5,37,540,8,37,
        10,37,12,37,543,9,37,1,38,1,38,1,38,1,38,1,38,1,38,3,38,551,8,38,
        1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,1,39,
        1,39,1,39,3,39,568,8,39,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,
        1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,
        1,40,1,40,1,40,1,40,1,40,1,40,1,40,1,40,5,40,599,8,40,10,40,12,40,
        602,9,40,1,41,1,41,1,41,5,41,607,8,41,10,41,12,41,610,9,41,1,42,
        1,42,1,43,1,43,1,43,1,43,1,43,1,43,3,43,620,8,43,1,44,1,44,1,44,
        1,44,1,44,5,44,627,8,44,10,44,12,44,630,9,44,1,44,4,44,633,8,44,
        11,44,12,44,634,4,44,637,8,44,11,44,12,44,638,1,44,5,44,642,8,44,
        10,44,12,44,645,9,44,1,44,3,44,648,8,44,1,45,1,45,1,45,5,45,653,
        8,45,10,45,12,45,656,9,45,1,46,1,46,1,47,1,47,1,47,1,47,1,47,3,47,
        665,8,47,1,48,1,48,1,49,1,49,1,50,1,50,1,50,1,50,1,50,1,50,1,50,
        3,50,678,8,50,1,51,1,51,1,51,5,51,683,8,51,10,51,12,51,686,9,51,
        1,52,1,52,1,52,5,52,691,8,52,10,52,12,52,694,9,52,1,53,1,53,1,53,
        5,53,699,8,53,10,53,12,53,702,9,53,1,54,1,54,1,54,5,54,707,8,54,
        10,54,12,54,710,9,54,1,55,1,55,1,55,5,55,715,8,55,10,55,12,55,718,
        9,55,1,56,1,56,1,56,5,56,723,8,56,10,56,12,56,726,9,56,1,57,1,57,
        1,57,5,57,731,8,57,10,57,12,57,734,9,57,1,58,1,58,1,58,5,58,739,
        8,58,10,58,12,58,742,9,58,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,
        1,59,1,59,1,59,3,59,755,8,59,1,60,3,60,758,8,60,1,60,1,60,1,60,5,
        60,763,8,60,10,60,12,60,766,9,60,1,60,1,60,1,60,1,61,1,61,1,61,5,
        61,774,8,61,10,61,12,61,777,9,61,1,61,1,61,1,62,1,62,1,62,5,62,784,
        8,62,10,62,12,62,787,9,62,1,62,1,62,1,63,1,63,1,63,5,63,794,8,63,
        10,63,12,63,797,9,63,1,63,3,63,800,8,63,1,63,3,63,803,8,63,1,63,
        1,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,3,64,
        818,8,64,1,65,1,65,5,65,822,8,65,10,65,12,65,825,9,65,1,65,3,65,
        828,8,65,1,65,1,65,1,66,4,66,833,8,66,11,66,12,66,834,1,67,1,67,
        1,67,1,67,3,67,841,8,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,
        3,68,851,8,68,1,68,1,68,1,68,1,68,1,68,1,68,3,68,859,8,68,1,69,1,
        69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,
        69,1,69,3,69,877,8,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,
        70,1,70,1,70,1,70,1,70,3,70,892,8,70,1,70,0,0,71,0,2,4,6,8,10,12,
        14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,
        58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,
        102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,
        134,136,138,140,0,10,1,0,6,10,1,0,21,22,1,0,25,37,3,0,42,42,44,45,
        53,55,2,0,5,5,56,65,1,0,71,72,1,0,73,76,1,0,77,78,1,0,2,2,1,0,20,
        20,982,0,145,1,0,0,0,2,166,1,0,0,0,4,169,1,0,0,0,6,187,1,0,0,0,8,
        206,1,0,0,0,10,208,1,0,0,0,12,216,1,0,0,0,14,221,1,0,0,0,16,247,
        1,0,0,0,18,249,1,0,0,0,20,262,1,0,0,0,22,264,1,0,0,0,24,267,1,0,
        0,0,26,271,1,0,0,0,28,277,1,0,0,0,30,281,1,0,0,0,32,296,1,0,0,0,
        34,317,1,0,0,0,36,319,1,0,0,0,38,327,1,0,0,0,40,332,1,0,0,0,42,348,
        1,0,0,0,44,368,1,0,0,0,46,386,1,0,0,0,48,400,1,0,0,0,50,402,1,0,
        0,0,52,410,1,0,0,0,54,439,1,0,0,0,56,441,1,0,0,0,58,454,1,0,0,0,
        60,461,1,0,0,0,62,468,1,0,0,0,64,488,1,0,0,0,66,498,1,0,0,0,68,500,
        1,0,0,0,70,508,1,0,0,0,72,522,1,0,0,0,74,532,1,0,0,0,76,550,1,0,
        0,0,78,567,1,0,0,0,80,569,1,0,0,0,82,603,1,0,0,0,84,611,1,0,0,0,
        86,619,1,0,0,0,88,647,1,0,0,0,90,649,1,0,0,0,92,657,1,0,0,0,94,664,
        1,0,0,0,96,666,1,0,0,0,98,668,1,0,0,0,100,670,1,0,0,0,102,679,1,
        0,0,0,104,687,1,0,0,0,106,695,1,0,0,0,108,703,1,0,0,0,110,711,1,
        0,0,0,112,719,1,0,0,0,114,727,1,0,0,0,116,735,1,0,0,0,118,754,1,
        0,0,0,120,757,1,0,0,0,122,770,1,0,0,0,124,780,1,0,0,0,126,790,1,
        0,0,0,128,817,1,0,0,0,130,819,1,0,0,0,132,832,1,0,0,0,134,840,1,
        0,0,0,136,858,1,0,0,0,138,876,1,0,0,0,140,891,1,0,0,0,142,144,3,
        2,1,0,143,142,1,0,0,0,144,147,1,0,0,0,145,143,1,0,0,0,145,146,1,
        0,0,0,146,1,1,0,0,0,147,145,1,0,0,0,148,150,3,6,3,0,149,148,1,0,
        0,0,149,150,1,0,0,0,150,151,1,0,0,0,151,155,3,42,21,0,152,154,3,
        8,4,0,153,152,1,0,0,0,154,157,1,0,0,0,155,153,1,0,0,0,155,156,1,
        0,0,0,156,158,1,0,0,0,157,155,1,0,0,0,158,159,5,1,0,0,159,167,1,
        0,0,0,160,167,3,4,2,0,161,167,3,8,4,0,162,164,3,126,63,0,163,165,
        5,2,0,0,164,163,1,0,0,0,164,165,1,0,0,0,165,167,1,0,0,0,166,149,
        1,0,0,0,166,160,1,0,0,0,166,161,1,0,0,0,166,162,1,0,0,0,167,3,1,
        0,0,0,168,170,3,6,3,0,169,168,1,0,0,0,169,170,1,0,0,0,170,171,1,
        0,0,0,171,180,3,42,21,0,172,174,3,8,4,0,173,172,1,0,0,0,174,175,
        1,0,0,0,175,173,1,0,0,0,175,176,1,0,0,0,176,177,1,0,0,0,177,178,
        3,130,65,0,178,181,1,0,0,0,179,181,3,130,65,0,180,173,1,0,0,0,180,
        179,1,0,0,0,181,182,1,0,0,0,182,183,6,2,-1,0,183,5,1,0,0,0,184,188,
        3,14,7,0,185,188,3,16,8,0,186,188,3,40,20,0,187,184,1,0,0,0,187,
        185,1,0,0,0,187,186,1,0,0,0,188,189,1,0,0,0,189,187,1,0,0,0,189,
        190,1,0,0,0,190,7,1,0,0,0,191,193,5,3,0,0,192,194,3,6,3,0,193,192,
        1,0,0,0,193,194,1,0,0,0,194,195,1,0,0,0,195,196,3,10,5,0,196,197,
        5,2,0,0,197,198,6,4,-1,0,198,207,1,0,0,0,199,201,3,6,3,0,200,202,
        3,10,5,0,201,200,1,0,0,0,201,202,1,0,0,0,202,203,1,0,0,0,203,204,
        5,2,0,0,204,205,6,4,-1,0,205,207,1,0,0,0,206,191,1,0,0,0,206,199,
        1,0,0,0,207,9,1,0,0,0,208,213,3,12,6,0,209,210,5,4,0,0,210,212,3,
        12,6,0,211,209,1,0,0,0,212,215,1,0,0,0,213,211,1,0,0,0,213,214,1,
        0,0,0,214,11,1,0,0,0,215,213,1,0,0,0,216,219,3,42,21,0,217,218,5,
        5,0,0,218,220,3,66,33,0,219,217,1,0,0,0,219,220,1,0,0,0,220,13,1,
        0,0,0,221,222,7,0,0,0,222,15,1,0,0,0,223,248,5,11,0,0,224,248,5,
        12,0,0,225,248,5,13,0,0,226,248,5,14,0,0,227,248,5,15,0,0,228,248,
        5,16,0,0,229,248,5,17,0,0,230,248,5,18,0,0,231,248,5,19,0,0,232,
        233,3,20,10,0,233,234,6,8,-1,0,234,248,1,0,0,0,235,236,3,34,17,0,
        236,237,6,8,-1,0,237,248,1,0,0,0,238,242,5,93,0,0,239,241,3,40,20,
        0,240,239,1,0,0,0,241,244,1,0,0,0,242,240,1,0,0,0,242,243,1,0,0,
        0,243,245,1,0,0,0,244,242,1,0,0,0,245,248,3,42,21,0,246,248,3,18,
        9,0,247,223,1,0,0,0,247,224,1,0,0,0,247,225,1,0,0,0,247,226,1,0,
        0,0,247,227,1,0,0,0,247,228,1,0,0,0,247,229,1,0,0,0,247,230,1,0,
        0,0,247,231,1,0,0,0,247,232,1,0,0,0,247,235,1,0,0,0,247,238,1,0,
        0,0,247,246,1,0,0,0,248,17,1,0,0,0,249,250,5,93,0,0,250,19,1,0,0,
        0,251,253,3,22,11,0,252,254,5,93,0,0,253,252,1,0,0,0,253,254,1,0,
        0,0,254,255,1,0,0,0,255,256,5,1,0,0,256,257,3,24,12,0,257,258,5,
        20,0,0,258,263,1,0,0,0,259,260,3,22,11,0,260,261,5,93,0,0,261,263,
        1,0,0,0,262,251,1,0,0,0,262,259,1,0,0,0,263,21,1,0,0,0,264,265,7,
        1,0,0,265,23,1,0,0,0,266,268,3,26,13,0,267,266,1,0,0,0,268,269,1,
        0,0,0,269,267,1,0,0,0,269,270,1,0,0,0,270,25,1,0,0,0,271,272,3,28,
        14,0,272,273,3,30,15,0,273,274,5,2,0,0,274,27,1,0,0,0,275,278,3,
        40,20,0,276,278,3,16,8,0,277,275,1,0,0,0,277,276,1,0,0,0,278,279,
        1,0,0,0,279,277,1,0,0,0,279,280,1,0,0,0,280,29,1,0,0,0,281,286,3,
        32,16,0,282,283,5,4,0,0,283,285,3,32,16,0,284,282,1,0,0,0,285,288,
        1,0,0,0,286,284,1,0,0,0,286,287,1,0,0,0,287,31,1,0,0,0,288,286,1,
        0,0,0,289,292,3,42,21,0,290,291,5,23,0,0,291,293,3,92,46,0,292,290,
        1,0,0,0,292,293,1,0,0,0,293,297,1,0,0,0,294,295,5,23,0,0,295,297,
        3,92,46,0,296,289,1,0,0,0,296,294,1,0,0,0,297,33,1,0,0,0,298,299,
        5,24,0,0,299,300,5,1,0,0,300,302,3,36,18,0,301,303,5,4,0,0,302,301,
        1,0,0,0,302,303,1,0,0,0,303,304,1,0,0,0,304,305,5,20,0,0,305,318,
        1,0,0,0,306,307,5,24,0,0,307,308,5,93,0,0,308,309,5,1,0,0,309,311,
        3,36,18,0,310,312,5,4,0,0,311,310,1,0,0,0,311,312,1,0,0,0,312,313,
        1,0,0,0,313,314,5,20,0,0,314,318,1,0,0,0,315,316,5,24,0,0,316,318,
        5,93,0,0,317,298,1,0,0,0,317,306,1,0,0,0,317,315,1,0,0,0,318,35,
        1,0,0,0,319,324,3,38,19,0,320,321,5,4,0,0,321,323,3,38,19,0,322,
        320,1,0,0,0,323,326,1,0,0,0,324,322,1,0,0,0,324,325,1,0,0,0,325,
        37,1,0,0,0,326,324,1,0,0,0,327,330,5,93,0,0,328,329,5,5,0,0,329,
        331,3,92,46,0,330,328,1,0,0,0,330,331,1,0,0,0,331,39,1,0,0,0,332,
        333,7,2,0,0,333,41,1,0,0,0,334,336,3,48,24,0,335,334,1,0,0,0,335,
        336,1,0,0,0,336,338,1,0,0,0,337,339,5,34,0,0,338,337,1,0,0,0,338,
        339,1,0,0,0,339,341,1,0,0,0,340,342,5,35,0,0,341,340,1,0,0,0,341,
        342,1,0,0,0,342,344,1,0,0,0,343,345,5,36,0,0,344,343,1,0,0,0,344,
        345,1,0,0,0,345,346,1,0,0,0,346,349,3,44,22,0,347,349,3,48,24,0,
        348,335,1,0,0,0,348,347,1,0,0,0,349,43,1,0,0,0,350,354,5,93,0,0,
        351,353,3,46,23,0,352,351,1,0,0,0,353,356,1,0,0,0,354,352,1,0,0,
        0,354,355,1,0,0,0,355,369,1,0,0,0,356,354,1,0,0,0,357,359,5,38,0,
        0,358,360,5,34,0,0,359,358,1,0,0,0,359,360,1,0,0,0,360,361,1,0,0,
        0,361,362,3,42,21,0,362,364,5,39,0,0,363,365,3,46,23,0,364,363,1,
        0,0,0,365,366,1,0,0,0,366,364,1,0,0,0,366,367,1,0,0,0,367,369,1,
        0,0,0,368,350,1,0,0,0,368,357,1,0,0,0,369,45,1,0,0,0,370,371,5,40,
        0,0,371,372,3,92,46,0,372,373,5,41,0,0,373,387,1,0,0,0,374,375,5,
        40,0,0,375,387,5,41,0,0,376,377,5,38,0,0,377,378,3,50,25,0,378,379,
        5,39,0,0,379,387,1,0,0,0,380,381,5,38,0,0,381,382,3,56,28,0,382,
        383,5,39,0,0,383,387,1,0,0,0,384,385,5,38,0,0,385,387,5,39,0,0,386,
        370,1,0,0,0,386,374,1,0,0,0,386,376,1,0,0,0,386,380,1,0,0,0,386,
        384,1,0,0,0,387,47,1,0,0,0,388,390,5,42,0,0,389,391,3,40,20,0,390,
        389,1,0,0,0,391,392,1,0,0,0,392,390,1,0,0,0,392,393,1,0,0,0,393,
        395,1,0,0,0,394,396,3,48,24,0,395,394,1,0,0,0,395,396,1,0,0,0,396,
        401,1,0,0,0,397,398,5,42,0,0,398,401,3,48,24,0,399,401,5,42,0,0,
        400,388,1,0,0,0,400,397,1,0,0,0,400,399,1,0,0,0,401,49,1,0,0,0,402,
        408,3,52,26,0,403,405,5,4,0,0,404,406,5,29,0,0,405,404,1,0,0,0,405,
        406,1,0,0,0,406,407,1,0,0,0,407,409,5,43,0,0,408,403,1,0,0,0,408,
        409,1,0,0,0,409,51,1,0,0,0,410,418,3,54,27,0,411,413,5,4,0,0,412,
        414,5,29,0,0,413,412,1,0,0,0,413,414,1,0,0,0,414,415,1,0,0,0,415,
        417,3,54,27,0,416,411,1,0,0,0,417,420,1,0,0,0,418,416,1,0,0,0,418,
        419,1,0,0,0,419,53,1,0,0,0,420,418,1,0,0,0,421,426,3,6,3,0,422,425,
        3,42,21,0,423,425,3,60,30,0,424,422,1,0,0,0,424,423,1,0,0,0,425,
        428,1,0,0,0,426,424,1,0,0,0,426,427,1,0,0,0,427,430,1,0,0,0,428,
        426,1,0,0,0,429,431,5,29,0,0,430,429,1,0,0,0,430,431,1,0,0,0,431,
        440,1,0,0,0,432,434,3,48,24,0,433,432,1,0,0,0,434,437,1,0,0,0,435,
        433,1,0,0,0,435,436,1,0,0,0,436,438,1,0,0,0,437,435,1,0,0,0,438,
        440,5,93,0,0,439,421,1,0,0,0,439,435,1,0,0,0,440,55,1,0,0,0,441,
        446,5,93,0,0,442,443,5,4,0,0,443,445,5,93,0,0,444,442,1,0,0,0,445,
        448,1,0,0,0,446,444,1,0,0,0,446,447,1,0,0,0,447,57,1,0,0,0,448,446,
        1,0,0,0,449,451,3,28,14,0,450,452,3,60,30,0,451,450,1,0,0,0,451,
        452,1,0,0,0,452,455,1,0,0,0,453,455,3,18,9,0,454,449,1,0,0,0,454,
        453,1,0,0,0,455,59,1,0,0,0,456,458,3,48,24,0,457,459,3,62,31,0,458,
        457,1,0,0,0,458,459,1,0,0,0,459,462,1,0,0,0,460,462,3,62,31,0,461,
        456,1,0,0,0,461,460,1,0,0,0,462,61,1,0,0,0,463,464,5,38,0,0,464,
        465,3,60,30,0,465,466,5,39,0,0,466,469,1,0,0,0,467,469,3,64,32,0,
        468,463,1,0,0,0,468,467,1,0,0,0,469,473,1,0,0,0,470,472,3,64,32,
        0,471,470,1,0,0,0,472,475,1,0,0,0,473,471,1,0,0,0,473,474,1,0,0,
        0,474,63,1,0,0,0,475,473,1,0,0,0,476,477,5,40,0,0,477,489,5,41,0,
        0,478,479,5,40,0,0,479,480,3,92,46,0,480,481,5,41,0,0,481,489,1,
        0,0,0,482,483,5,38,0,0,483,489,5,39,0,0,484,485,5,38,0,0,485,486,
        3,50,25,0,486,487,5,39,0,0,487,489,1,0,0,0,488,476,1,0,0,0,488,478,
        1,0,0,0,488,482,1,0,0,0,488,484,1,0,0,0,489,65,1,0,0,0,490,499,3,
        94,47,0,491,492,5,1,0,0,492,494,3,68,34,0,493,495,5,4,0,0,494,493,
        1,0,0,0,494,495,1,0,0,0,495,496,1,0,0,0,496,497,5,20,0,0,497,499,
        1,0,0,0,498,490,1,0,0,0,498,491,1,0,0,0,499,67,1,0,0,0,500,505,3,
        66,33,0,501,502,5,4,0,0,502,504,3,66,33,0,503,501,1,0,0,0,504,507,
        1,0,0,0,505,503,1,0,0,0,505,506,1,0,0,0,506,69,1,0,0,0,507,505,1,
        0,0,0,508,510,3,94,47,0,509,511,5,29,0,0,510,509,1,0,0,0,510,511,
        1,0,0,0,511,519,1,0,0,0,512,513,5,4,0,0,513,515,3,94,47,0,514,516,
        5,29,0,0,515,514,1,0,0,0,515,516,1,0,0,0,516,518,1,0,0,0,517,512,
        1,0,0,0,518,521,1,0,0,0,519,517,1,0,0,0,519,520,1,0,0,0,520,71,1,
        0,0,0,521,519,1,0,0,0,522,529,3,74,37,0,523,524,5,44,0,0,524,528,
        3,74,37,0,525,526,5,45,0,0,526,528,3,74,37,0,527,523,1,0,0,0,527,
        525,1,0,0,0,528,531,1,0,0,0,529,527,1,0,0,0,529,530,1,0,0,0,530,
        73,1,0,0,0,531,529,1,0,0,0,532,541,3,76,38,0,533,534,5,42,0,0,534,
        540,3,76,38,0,535,536,5,46,0,0,536,540,3,76,38,0,537,538,5,47,0,
        0,538,540,3,76,38,0,539,533,1,0,0,0,539,535,1,0,0,0,539,537,1,0,
        0,0,540,543,1,0,0,0,541,539,1,0,0,0,541,542,1,0,0,0,542,75,1,0,0,
        0,543,541,1,0,0,0,544,545,5,38,0,0,545,546,3,58,29,0,546,547,5,39,
        0,0,547,548,3,76,38,0,548,551,1,0,0,0,549,551,3,78,39,0,550,544,
        1,0,0,0,550,549,1,0,0,0,551,77,1,0,0,0,552,568,3,80,40,0,553,554,
        5,48,0,0,554,568,3,78,39,0,555,556,5,49,0,0,556,568,3,78,39,0,557,
        558,3,84,42,0,558,559,3,76,38,0,559,568,1,0,0,0,560,561,5,50,0,0,
        561,568,3,78,39,0,562,563,5,50,0,0,563,564,5,38,0,0,564,565,3,58,
        29,0,565,566,5,39,0,0,566,568,1,0,0,0,567,552,1,0,0,0,567,553,1,
        0,0,0,567,555,1,0,0,0,567,557,1,0,0,0,567,560,1,0,0,0,567,562,1,
        0,0,0,568,79,1,0,0,0,569,570,3,86,43,0,570,600,6,40,-1,0,571,572,
        5,40,0,0,572,573,3,90,45,0,573,574,5,41,0,0,574,599,1,0,0,0,575,
        576,5,38,0,0,576,577,5,39,0,0,577,599,6,40,-1,0,578,579,5,38,0,0,
        579,580,3,70,35,0,580,581,5,39,0,0,581,582,6,40,-1,0,582,599,1,0,
        0,0,583,584,5,38,0,0,584,585,3,82,41,0,585,586,5,39,0,0,586,599,
        1,0,0,0,587,588,5,51,0,0,588,589,5,93,0,0,589,599,6,40,-1,0,590,
        591,5,42,0,0,591,592,5,93,0,0,592,599,6,40,-1,0,593,594,5,52,0,0,
        594,595,5,93,0,0,595,599,6,40,-1,0,596,599,5,48,0,0,597,599,5,49,
        0,0,598,571,1,0,0,0,598,575,1,0,0,0,598,578,1,0,0,0,598,583,1,0,
        0,0,598,587,1,0,0,0,598,590,1,0,0,0,598,593,1,0,0,0,598,596,1,0,
        0,0,598,597,1,0,0,0,599,602,1,0,0,0,600,598,1,0,0,0,600,601,1,0,
        0,0,601,81,1,0,0,0,602,600,1,0,0,0,603,608,3,54,27,0,604,605,5,4,
        0,0,605,607,3,54,27,0,606,604,1,0,0,0,607,610,1,0,0,0,608,606,1,
        0,0,0,608,609,1,0,0,0,609,83,1,0,0,0,610,608,1,0,0,0,611,612,7,3,
        0,0,612,85,1,0,0,0,613,620,5,93,0,0,614,620,3,88,44,0,615,616,5,
        38,0,0,616,617,3,90,45,0,617,618,5,39,0,0,618,620,1,0,0,0,619,613,
        1,0,0,0,619,614,1,0,0,0,619,615,1,0,0,0,620,87,1,0,0,0,621,648,5,
        96,0,0,622,648,5,98,0,0,623,648,5,97,0,0,624,648,5,94,0,0,625,627,
        5,93,0,0,626,625,1,0,0,0,627,630,1,0,0,0,628,626,1,0,0,0,628,629,
        1,0,0,0,629,632,1,0,0,0,630,628,1,0,0,0,631,633,5,95,0,0,632,631,
        1,0,0,0,633,634,1,0,0,0,634,632,1,0,0,0,634,635,1,0,0,0,635,637,
        1,0,0,0,636,628,1,0,0,0,637,638,1,0,0,0,638,636,1,0,0,0,638,639,
        1,0,0,0,639,643,1,0,0,0,640,642,5,93,0,0,641,640,1,0,0,0,642,645,
        1,0,0,0,643,641,1,0,0,0,643,644,1,0,0,0,644,648,1,0,0,0,645,643,
        1,0,0,0,646,648,5,99,0,0,647,621,1,0,0,0,647,622,1,0,0,0,647,623,
        1,0,0,0,647,624,1,0,0,0,647,636,1,0,0,0,647,646,1,0,0,0,648,89,1,
        0,0,0,649,654,3,94,47,0,650,651,5,4,0,0,651,653,3,94,47,0,652,650,
        1,0,0,0,653,656,1,0,0,0,654,652,1,0,0,0,654,655,1,0,0,0,655,91,1,
        0,0,0,656,654,1,0,0,0,657,658,3,100,50,0,658,93,1,0,0,0,659,660,
        3,96,48,0,660,661,3,98,49,0,661,662,3,94,47,0,662,665,1,0,0,0,663,
        665,3,100,50,0,664,659,1,0,0,0,664,663,1,0,0,0,665,95,1,0,0,0,666,
        667,3,78,39,0,667,97,1,0,0,0,668,669,7,4,0,0,669,99,1,0,0,0,670,
        677,3,102,51,0,671,672,5,66,0,0,672,673,3,90,45,0,673,674,5,23,0,
        0,674,675,3,100,50,0,675,676,6,50,-1,0,676,678,1,0,0,0,677,671,1,
        0,0,0,677,678,1,0,0,0,678,101,1,0,0,0,679,684,3,104,52,0,680,681,
        5,67,0,0,681,683,3,104,52,0,682,680,1,0,0,0,683,686,1,0,0,0,684,
        682,1,0,0,0,684,685,1,0,0,0,685,103,1,0,0,0,686,684,1,0,0,0,687,
        692,3,106,53,0,688,689,5,68,0,0,689,691,3,106,53,0,690,688,1,0,0,
        0,691,694,1,0,0,0,692,690,1,0,0,0,692,693,1,0,0,0,693,105,1,0,0,
        0,694,692,1,0,0,0,695,700,3,108,54,0,696,697,5,69,0,0,697,699,3,
        108,54,0,698,696,1,0,0,0,699,702,1,0,0,0,700,698,1,0,0,0,700,701,
        1,0,0,0,701,107,1,0,0,0,702,700,1,0,0,0,703,708,3,110,55,0,704,705,
        5,70,0,0,705,707,3,110,55,0,706,704,1,0,0,0,707,710,1,0,0,0,708,
        706,1,0,0,0,708,709,1,0,0,0,709,109,1,0,0,0,710,708,1,0,0,0,711,
        716,3,112,56,0,712,713,5,53,0,0,713,715,3,112,56,0,714,712,1,0,0,
        0,715,718,1,0,0,0,716,714,1,0,0,0,716,717,1,0,0,0,717,111,1,0,0,
        0,718,716,1,0,0,0,719,724,3,114,57,0,720,721,7,5,0,0,721,723,3,114,
        57,0,722,720,1,0,0,0,723,726,1,0,0,0,724,722,1,0,0,0,724,725,1,0,
        0,0,725,113,1,0,0,0,726,724,1,0,0,0,727,732,3,116,58,0,728,729,7,
        6,0,0,729,731,3,116,58,0,730,728,1,0,0,0,731,734,1,0,0,0,732,730,
        1,0,0,0,732,733,1,0,0,0,733,115,1,0,0,0,734,732,1,0,0,0,735,740,
        3,72,36,0,736,737,7,7,0,0,737,739,3,72,36,0,738,736,1,0,0,0,739,
        742,1,0,0,0,740,738,1,0,0,0,740,741,1,0,0,0,741,117,1,0,0,0,742,
        740,1,0,0,0,743,755,3,128,64,0,744,755,3,130,65,0,745,755,3,134,
        67,0,746,755,3,136,68,0,747,755,3,138,69,0,748,755,3,140,70,0,749,
        755,3,126,63,0,750,755,3,120,60,0,751,755,3,122,61,0,752,755,3,124,
        62,0,753,755,3,8,4,0,754,743,1,0,0,0,754,744,1,0,0,0,754,745,1,0,
        0,0,754,746,1,0,0,0,754,747,1,0,0,0,754,748,1,0,0,0,754,749,1,0,
        0,0,754,750,1,0,0,0,754,751,1,0,0,0,754,752,1,0,0,0,754,753,1,0,
        0,0,755,119,1,0,0,0,756,758,5,79,0,0,757,756,1,0,0,0,757,758,1,0,
        0,0,758,759,1,0,0,0,759,760,5,93,0,0,760,764,5,38,0,0,761,763,8,
        8,0,0,762,761,1,0,0,0,763,766,1,0,0,0,764,762,1,0,0,0,764,765,1,
        0,0,0,765,767,1,0,0,0,766,764,1,0,0,0,767,768,5,39,0,0,768,769,5,
        2,0,0,769,121,1,0,0,0,770,771,5,80,0,0,771,775,5,1,0,0,772,774,8,
        9,0,0,773,772,1,0,0,0,774,777,1,0,0,0,775,773,1,0,0,0,775,776,1,
        0,0,0,776,778,1,0,0,0,777,775,1,0,0,0,778,779,5,20,0,0,779,123,1,
        0,0,0,780,781,5,81,0,0,781,785,5,1,0,0,782,784,8,9,0,0,783,782,1,
        0,0,0,784,787,1,0,0,0,785,783,1,0,0,0,785,786,1,0,0,0,786,788,1,
        0,0,0,787,785,1,0,0,0,788,789,5,20,0,0,789,125,1,0,0,0,790,791,5,
        93,0,0,791,795,5,38,0,0,792,794,3,8,4,0,793,792,1,0,0,0,794,797,
        1,0,0,0,795,793,1,0,0,0,795,796,1,0,0,0,796,799,1,0,0,0,797,795,
        1,0,0,0,798,800,3,132,66,0,799,798,1,0,0,0,799,800,1,0,0,0,800,802,
        1,0,0,0,801,803,3,90,45,0,802,801,1,0,0,0,802,803,1,0,0,0,803,804,
        1,0,0,0,804,805,5,39,0,0,805,127,1,0,0,0,806,807,5,93,0,0,807,808,
        5,23,0,0,808,818,3,118,59,0,809,810,5,82,0,0,810,811,3,92,46,0,811,
        812,5,23,0,0,812,813,3,118,59,0,813,818,1,0,0,0,814,815,5,83,0,0,
        815,816,5,23,0,0,816,818,3,118,59,0,817,806,1,0,0,0,817,809,1,0,
        0,0,817,814,1,0,0,0,818,129,1,0,0,0,819,823,5,1,0,0,820,822,3,8,
        4,0,821,820,1,0,0,0,822,825,1,0,0,0,823,821,1,0,0,0,823,824,1,0,
        0,0,824,827,1,0,0,0,825,823,1,0,0,0,826,828,3,132,66,0,827,826,1,
        0,0,0,827,828,1,0,0,0,828,829,1,0,0,0,829,830,5,20,0,0,830,131,1,
        0,0,0,831,833,3,118,59,0,832,831,1,0,0,0,833,834,1,0,0,0,834,832,
        1,0,0,0,834,835,1,0,0,0,835,133,1,0,0,0,836,841,5,2,0,0,837,838,
        3,90,45,0,838,839,5,2,0,0,839,841,1,0,0,0,840,836,1,0,0,0,840,837,
        1,0,0,0,841,135,1,0,0,0,842,843,5,84,0,0,843,844,5,38,0,0,844,845,
        3,90,45,0,845,846,5,39,0,0,846,847,6,68,-1,0,847,850,3,118,59,0,
        848,849,5,85,0,0,849,851,3,118,59,0,850,848,1,0,0,0,850,851,1,0,
        0,0,851,859,1,0,0,0,852,853,5,86,0,0,853,854,5,38,0,0,854,855,3,
        90,45,0,855,856,5,39,0,0,856,857,3,118,59,0,857,859,1,0,0,0,858,
        842,1,0,0,0,858,852,1,0,0,0,859,137,1,0,0,0,860,861,5,87,0,0,861,
        862,5,38,0,0,862,863,3,90,45,0,863,864,5,39,0,0,864,865,3,118,59,
        0,865,866,6,69,-1,0,866,877,1,0,0,0,867,868,5,88,0,0,868,869,3,118,
        59,0,869,870,5,87,0,0,870,871,5,38,0,0,871,872,3,90,45,0,872,873,
        5,39,0,0,873,874,5,2,0,0,874,875,6,69,-1,0,875,877,1,0,0,0,876,860,
        1,0,0,0,876,867,1,0,0,0,877,139,1,0,0,0,878,879,5,89,0,0,879,880,
        5,93,0,0,880,892,5,2,0,0,881,882,5,90,0,0,882,892,5,2,0,0,883,884,
        5,91,0,0,884,892,5,2,0,0,885,886,5,92,0,0,886,892,5,2,0,0,887,888,
        5,92,0,0,888,889,3,90,45,0,889,890,5,2,0,0,890,892,1,0,0,0,891,878,
        1,0,0,0,891,881,1,0,0,0,891,883,1,0,0,0,891,885,1,0,0,0,891,887,
        1,0,0,0,892,141,1,0,0,0,109,145,149,155,164,166,169,175,180,187,
        189,193,201,206,213,219,242,247,253,262,269,277,279,286,292,296,
        302,311,317,324,330,335,338,341,344,348,354,359,366,368,386,392,
        395,400,405,408,413,418,424,426,430,435,439,446,451,454,458,461,
        468,473,488,494,498,505,510,515,519,527,529,539,541,550,567,598,
        600,608,619,628,634,638,643,647,654,664,677,684,692,700,708,716,
        724,732,740,754,757,764,775,785,795,799,802,817,823,827,834,840,
        850,858,876,891
    ]

class CParser ( Parser ):

    grammarFileName = "C.g4"

    atn = ATNDeserializer().deserialize(serializedATN())

    decisionsToDFA = [ DFA(ds, i) for i, ds in enumerate(atn.decisionToState) ]

    sharedContextCache = PredictionContextCache()

    literalNames = [ "<INVALID>", "'{'", "';'", "'typedef'", "','", "'='",
                     "'extern'", "'static'", "'auto'", "'register'", "'STATIC'",
                     "'void'", "'char'", "'short'", "'int'", "'long'", "'float'",
                     "'double'", "'signed'", "'unsigned'", "'}'", "'struct'",
                     "'union'", "':'", "'enum'", "'const'", "'volatile'",
                     "'IN'", "'OUT'", "'OPTIONAL'", "'CONST'", "'UNALIGNED'",
                     "'VOLATILE'", "'GLOBAL_REMOVE_IF_UNREFERENCED'", "'EFIAPI'",
                     "'EFI_BOOTSERVICE'", "'EFI_RUNTIMESERVICE'", "'PACKED'",
                     "'('", "')'", "'['", "']'", "'*'", "'...'", "'+'",
                     "'-'", "'/'", "'%'", "'++'", "'--'", "'sizeof'", "'.'",
                     "'->'", "'&'", "'~'", "'!'", "'*='", "'/='", "'%='",
                     "'+='", "'-='", "'<<='", "'>>='", "'&='", "'^='", "'|='",
                     "'?'", "'||'", "'&&'", "'|'", "'^'", "'=='", "'!='",
                     "'<'", "'>'", "'<='", "'>='", "'<<'", "'>>'", "'__asm__'",
                     "'_asm'", "'__asm'", "'case'", "'default'", "'if'",
                     "'else'", "'switch'", "'while'", "'do'", "'goto'",
                     "'continue'", "'break'", "'return'" ]

    symbolicNames = [ "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "<INVALID>", "<INVALID>", "<INVALID>",
                      "<INVALID>", "IDENTIFIER", "CHARACTER_LITERAL", "STRING_LITERAL",
                      "HEX_LITERAL", "DECIMAL_LITERAL", "OCTAL_LITERAL",
                      "FLOATING_POINT_LITERAL", "WS", "BS", "UnicodeVocabulary",
                      "COMMENT", "LINE_COMMENT", "LINE_COMMAND" ]

    RULE_translation_unit = 0
    RULE_external_declaration = 1
    RULE_function_definition = 2
    RULE_declaration_specifiers = 3
    RULE_declaration = 4
    RULE_init_declarator_list = 5
    RULE_init_declarator = 6
    RULE_storage_class_specifier = 7
    RULE_type_specifier = 8
    RULE_type_id = 9
    RULE_struct_or_union_specifier = 10
    RULE_struct_or_union = 11
    RULE_struct_declaration_list = 12
    RULE_struct_declaration = 13
    RULE_specifier_qualifier_list = 14
    RULE_struct_declarator_list = 15
    RULE_struct_declarator = 16
    RULE_enum_specifier = 17
    RULE_enumerator_list = 18
    RULE_enumerator = 19
    RULE_type_qualifier = 20
    RULE_declarator = 21
    RULE_direct_declarator = 22
    RULE_declarator_suffix = 23
    RULE_pointer = 24
    RULE_parameter_type_list = 25
    RULE_parameter_list = 26
    RULE_parameter_declaration = 27
    RULE_identifier_list = 28
    RULE_type_name = 29
    RULE_abstract_declarator = 30
    RULE_direct_abstract_declarator = 31
    RULE_abstract_declarator_suffix = 32
    RULE_initializer = 33
    RULE_initializer_list = 34
    RULE_argument_expression_list = 35
    RULE_additive_expression = 36
    RULE_multiplicative_expression = 37
    RULE_cast_expression = 38
    RULE_unary_expression = 39
    RULE_postfix_expression = 40
    RULE_macro_parameter_list = 41
    RULE_unary_operator = 42
    RULE_primary_expression = 43
    RULE_constant = 44
    RULE_expression = 45
    RULE_constant_expression = 46
    RULE_assignment_expression = 47
    RULE_lvalue = 48
    RULE_assignment_operator = 49
    RULE_conditional_expression = 50
    RULE_logical_or_expression = 51
    RULE_logical_and_expression = 52
    RULE_inclusive_or_expression = 53
    RULE_exclusive_or_expression = 54
    RULE_and_expression = 55
    RULE_equality_expression = 56
    RULE_relational_expression = 57
    RULE_shift_expression = 58
    RULE_statement = 59
    RULE_asm2_statement = 60
    RULE_asm1_statement = 61
    RULE_asm_statement = 62
    RULE_macro_statement = 63
    RULE_labeled_statement = 64
    RULE_compound_statement = 65
    RULE_statement_list = 66
    RULE_expression_statement = 67
    RULE_selection_statement = 68
    RULE_iteration_statement = 69
    RULE_jump_statement = 70

    ruleNames =  [ "translation_unit", "external_declaration", "function_definition",
                   "declaration_specifiers", "declaration", "init_declarator_list",
                   "init_declarator", "storage_class_specifier", "type_specifier",
                   "type_id", "struct_or_union_specifier", "struct_or_union",
                   "struct_declaration_list", "struct_declaration", "specifier_qualifier_list",
                   "struct_declarator_list", "struct_declarator", "enum_specifier",
                   "enumerator_list", "enumerator", "type_qualifier", "declarator",
                   "direct_declarator", "declarator_suffix", "pointer",
                   "parameter_type_list", "parameter_list", "parameter_declaration",
                   "identifier_list", "type_name", "abstract_declarator",
                   "direct_abstract_declarator", "abstract_declarator_suffix",
                   "initializer", "initializer_list", "argument_expression_list",
                   "additive_expression", "multiplicative_expression", "cast_expression",
                   "unary_expression", "postfix_expression", "macro_parameter_list",
                   "unary_operator", "primary_expression", "constant", "expression",
                   "constant_expression", "assignment_expression", "lvalue",
                   "assignment_operator", "conditional_expression", "logical_or_expression",
                   "logical_and_expression", "inclusive_or_expression",
                   "exclusive_or_expression", "and_expression", "equality_expression",
                   "relational_expression", "shift_expression", "statement",
                   "asm2_statement", "asm1_statement", "asm_statement",
                   "macro_statement", "labeled_statement", "compound_statement",
                   "statement_list", "expression_statement", "selection_statement",
                   "iteration_statement", "jump_statement" ]

    EOF = Token.EOF
    T__0=1
    T__1=2
    T__2=3
    T__3=4
    T__4=5
    T__5=6
    T__6=7
    T__7=8
    T__8=9
    T__9=10
    T__10=11
    T__11=12
    T__12=13
    T__13=14
    T__14=15
    T__15=16
    T__16=17
    T__17=18
    T__18=19
    T__19=20
    T__20=21
    T__21=22
    T__22=23
    T__23=24
    T__24=25
    T__25=26
    T__26=27
    T__27=28
    T__28=29
    T__29=30
    T__30=31
    T__31=32
    T__32=33
    T__33=34
    T__34=35
    T__35=36
    T__36=37
    T__37=38
    T__38=39
    T__39=40
    T__40=41
    T__41=42
    T__42=43
    T__43=44
    T__44=45
    T__45=46
    T__46=47
    T__47=48
    T__48=49
    T__49=50
    T__50=51
    T__51=52
    T__52=53
    T__53=54
    T__54=55
    T__55=56
    T__56=57
    T__57=58
    T__58=59
    T__59=60
    T__60=61
    T__61=62
    T__62=63
    T__63=64
    T__64=65
    T__65=66
    T__66=67
    T__67=68
    T__68=69
    T__69=70
    T__70=71
    T__71=72
    T__72=73
    T__73=74
    T__74=75
    T__75=76
    T__76=77
    T__77=78
    T__78=79
    T__79=80
    T__80=81
    T__81=82
    T__82=83
    T__83=84
    T__84=85
    T__85=86
    T__86=87
    T__87=88
    T__88=89
    T__89=90
    T__90=91
    T__91=92
    IDENTIFIER=93
    CHARACTER_LITERAL=94
    STRING_LITERAL=95
    HEX_LITERAL=96
    DECIMAL_LITERAL=97
    OCTAL_LITERAL=98
    FLOATING_POINT_LITERAL=99
    WS=100
    BS=101
    UnicodeVocabulary=102
    COMMENT=103
    LINE_COMMENT=104
    LINE_COMMAND=105

    def __init__(self, input:TokenStream, output:TextIO = sys.stdout):
        super().__init__(input, output)
        self.checkVersion("4.13.2")
        self._interp = ParserATNSimulator(self, self.atn, self.decisionsToDFA, self.sharedContextCache)
        self._predicates = None




    def printTokenInfo(self, line, offset, tokenText):
        print(str(line)+ ',' + str(offset) + ':' + str(tokenText))

    def StorePredicateExpression(self, StartLine, StartOffset, EndLine, EndOffset, Text):
        PredExp = CodeFragment.PredicateExpression(Text, (StartLine, StartOffset), (EndLine, EndOffset))
        FileProfile.PredicateExpressionList.append(PredExp)

    def StoreEnumerationDefinition(self, StartLine, StartOffset, EndLine, EndOffset, Text):
        EnumDef = CodeFragment.EnumerationDefinition(Text, (StartLine, StartOffset), (EndLine, EndOffset))
        FileProfile.EnumerationDefinitionList.append(EnumDef)

    def StoreStructUnionDefinition(self, StartLine, StartOffset, EndLine, EndOffset, Text):
        SUDef = CodeFragment.StructUnionDefinition(Text, (StartLine, StartOffset), (EndLine, EndOffset))
        FileProfile.StructUnionDefinitionList.append(SUDef)

    def StoreTypedefDefinition(self, StartLine, StartOffset, EndLine, EndOffset, FromText, ToText):
        Tdef = CodeFragment.TypedefDefinition(FromText, ToText, (StartLine, StartOffset), (EndLine, EndOffset))
        FileProfile.TypedefDefinitionList.append(Tdef)

    def StoreFunctionDefinition(self, StartLine, StartOffset, EndLine, EndOffset, ModifierText, DeclText, LeftBraceLine, LeftBraceOffset, DeclLine, DeclOffset):
        FuncDef = CodeFragment.FunctionDefinition(ModifierText, DeclText, (StartLine, StartOffset), (EndLine, EndOffset), (LeftBraceLine, LeftBraceOffset), (DeclLine, DeclOffset))
        FileProfile.FunctionDefinitionList.append(FuncDef)

    def StoreVariableDeclaration(self, StartLine, StartOffset, EndLine, EndOffset, ModifierText, DeclText):
        VarDecl = CodeFragment.VariableDeclaration(ModifierText, DeclText, (StartLine, StartOffset), (EndLine, EndOffset))
        FileProfile.VariableDeclarationList.append(VarDecl)

    def StoreFunctionCalling(self, StartLine, StartOffset, EndLine, EndOffset, FuncName, ParamList):
        FuncCall = CodeFragment.FunctionCalling(FuncName, ParamList, (StartLine, StartOffset), (EndLine, EndOffset))
        FileProfile.FunctionCallingList.append(FuncCall)




    class Translation_unitContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def external_declaration(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.External_declarationContext)
            else:
                return self.getTypedRuleContext(CParser.External_declarationContext,i)


        def getRuleIndex(self):
            return CParser.RULE_translation_unit

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterTranslation_unit" ):
                listener.enterTranslation_unit(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitTranslation_unit" ):
                listener.exitTranslation_unit(self)




    def translation_unit(self):

        localctx = CParser.Translation_unitContext(self, self._ctx, self.state)
        self.enterRule(localctx, 0, self.RULE_translation_unit)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 145
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while (((_la) & ~0x3f) == 0 and ((1 << _la) & 4947792887752) != 0) or _la==93:
                self.state = 142
                self.external_declaration()
                self.state = 147
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class External_declarationContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def declarator(self):
            return self.getTypedRuleContext(CParser.DeclaratorContext,0)


        def declaration_specifiers(self):
            return self.getTypedRuleContext(CParser.Declaration_specifiersContext,0)


        def declaration(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.DeclarationContext)
            else:
                return self.getTypedRuleContext(CParser.DeclarationContext,i)


        def function_definition(self):
            return self.getTypedRuleContext(CParser.Function_definitionContext,0)


        def macro_statement(self):
            return self.getTypedRuleContext(CParser.Macro_statementContext,0)


        def getRuleIndex(self):
            return CParser.RULE_external_declaration

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterExternal_declaration" ):
                listener.enterExternal_declaration(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitExternal_declaration" ):
                listener.exitExternal_declaration(self)




    def external_declaration(self):

        localctx = CParser.External_declarationContext(self, self._ctx, self.state)
        self.enterRule(localctx, 2, self.RULE_external_declaration)
        self._la = 0 # Token type
        try:
            self.state = 166
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,4,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 149
                self._errHandler.sync(self)
                la_ = self._interp.adaptivePredict(self._input,1,self._ctx)
                if la_ == 1:
                    self.state = 148
                    self.declaration_specifiers()


                self.state = 151
                self.declarator()
                self.state = 155
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                while (((_la) & ~0x3f) == 0 and ((1 << _la) & 274868469704) != 0) or _la==93:
                    self.state = 152
                    self.declaration()
                    self.state = 157
                    self._errHandler.sync(self)
                    _la = self._input.LA(1)

                self.state = 158
                self.match(CParser.T__0)
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 160
                self.function_definition()
                pass

            elif la_ == 3:
                self.enterOuterAlt(localctx, 3)
                self.state = 161
                self.declaration()
                pass

            elif la_ == 4:
                self.enterOuterAlt(localctx, 4)
                self.state = 162
                self.macro_statement()
                self.state = 164
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if _la==2:
                    self.state = 163
                    self.match(CParser.T__1)


                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Function_definitionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser
            self.ModifierText = ''
            self.DeclText = ''
            self.LBLine = 0
            self.LBOffset = 0
            self.DeclLine = 0
            self.DeclOffset = 0
            self.d = None # Declaration_specifiersContext
            self._declaration_specifiers = None # Declaration_specifiersContext
            self._declarator = None # DeclaratorContext
            self.a = None # Compound_statementContext
            self.b = None # Compound_statementContext

        def declarator(self):
            return self.getTypedRuleContext(CParser.DeclaratorContext,0)


        def compound_statement(self):
            return self.getTypedRuleContext(CParser.Compound_statementContext,0)


        def declaration_specifiers(self):
            return self.getTypedRuleContext(CParser.Declaration_specifiersContext,0)


        def declaration(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.DeclarationContext)
            else:
                return self.getTypedRuleContext(CParser.DeclarationContext,i)


        def getRuleIndex(self):
            return CParser.RULE_function_definition

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterFunction_definition" ):
                listener.enterFunction_definition(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitFunction_definition" ):
                listener.exitFunction_definition(self)




    def function_definition(self):

        localctx = CParser.Function_definitionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 4, self.RULE_function_definition)

        ModifierText = '';
        DeclText = '';
        LBLine = 0;
        LBOffset = 0;
        DeclLine = 0;
        DeclOffset = 0;

        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 169
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,5,self._ctx)
            if la_ == 1:
                self.state = 168
                localctx.d = localctx._declaration_specifiers = self.declaration_specifiers()


            self.state = 171
            localctx._declarator = self.declarator()
            self.state = 180
            self._errHandler.sync(self)
            token = self._input.LA(1)
            if token in [3, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 93]:
                self.state = 173
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                while True:
                    self.state = 172
                    self.declaration()
                    self.state = 175
                    self._errHandler.sync(self)
                    _la = self._input.LA(1)
                    if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & 274868469704) != 0) or _la==93):
                        break

                self.state = 177
                localctx.a = self.compound_statement()
                pass
            elif token in [1]:
                self.state = 179
                localctx.b = self.compound_statement()
                pass
            else:
                raise NoViableAltException(self)


            if localctx.d != None:
                ModifierText = (None if localctx._declaration_specifiers is None else self._input.getText(localctx._declaration_specifiers.start,localctx._declaration_specifiers.stop))
            else:
                ModifierText = ''
            DeclText = (None if localctx._declarator is None else self._input.getText(localctx._declarator.start,localctx._declarator.stop))
            DeclLine = (None if localctx._declarator is None else localctx._declarator.start).line
            DeclOffset = (None if localctx._declarator is None else localctx._declarator.start).column
            if localctx.a != None:
                LBLine = (None if localctx.a is None else localctx.a.start).line
                LBOffset = (None if localctx.a is None else localctx.a.start).column
            else:
                LBLine = (None if localctx.b is None else localctx.b.start).line
                LBOffset = (None if localctx.b is None else localctx.b.start).column

            self._ctx.stop = self._input.LT(-1)

            self.StoreFunctionDefinition(localctx.start.line, localctx.start.column, localctx.stop.line, localctx.stop.column, ModifierText, DeclText, LBLine, LBOffset, DeclLine, DeclOffset)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Declaration_specifiersContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def storage_class_specifier(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Storage_class_specifierContext)
            else:
                return self.getTypedRuleContext(CParser.Storage_class_specifierContext,i)


        def type_specifier(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Type_specifierContext)
            else:
                return self.getTypedRuleContext(CParser.Type_specifierContext,i)


        def type_qualifier(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Type_qualifierContext)
            else:
                return self.getTypedRuleContext(CParser.Type_qualifierContext,i)


        def getRuleIndex(self):
            return CParser.RULE_declaration_specifiers

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterDeclaration_specifiers" ):
                listener.enterDeclaration_specifiers(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitDeclaration_specifiers" ):
                listener.exitDeclaration_specifiers(self)




    def declaration_specifiers(self):

        localctx = CParser.Declaration_specifiersContext(self, self._ctx, self.state)
        self.enterRule(localctx, 6, self.RULE_declaration_specifiers)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 187
            self._errHandler.sync(self)
            _alt = 1
            while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                if _alt == 1:
                    self.state = 187
                    self._errHandler.sync(self)
                    token = self._input.LA(1)
                    if token in [6, 7, 8, 9, 10]:
                        self.state = 184
                        self.storage_class_specifier()
                        pass
                    elif token in [11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 24, 93]:
                        self.state = 185
                        self.type_specifier()
                        pass
                    elif token in [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37]:
                        self.state = 186
                        self.type_qualifier()
                        pass
                    else:
                        raise NoViableAltException(self)


                else:
                    raise NoViableAltException(self)
                self.state = 189
                self._errHandler.sync(self)
                _alt = self._interp.adaptivePredict(self._input,9,self._ctx)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class DeclarationContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser
            self.a = None # Token
            self.b = None # Declaration_specifiersContext
            self.c = None # Init_declarator_listContext
            self.d = None # Token
            self.s = None # Declaration_specifiersContext
            self.t = None # Init_declarator_listContext
            self.e = None # Token

        def init_declarator_list(self):
            return self.getTypedRuleContext(CParser.Init_declarator_listContext,0)


        def declaration_specifiers(self):
            return self.getTypedRuleContext(CParser.Declaration_specifiersContext,0)


        def getRuleIndex(self):
            return CParser.RULE_declaration

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterDeclaration" ):
                listener.enterDeclaration(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitDeclaration" ):
                listener.exitDeclaration(self)




    def declaration(self):

        localctx = CParser.DeclarationContext(self, self._ctx, self.state)
        self.enterRule(localctx, 8, self.RULE_declaration)
        self._la = 0 # Token type
        try:
            self.state = 206
            self._errHandler.sync(self)
            token = self._input.LA(1)
            if token in [3]:
                self.enterOuterAlt(localctx, 1)
                self.state = 191
                localctx.a = self.match(CParser.T__2)
                self.state = 193
                self._errHandler.sync(self)
                la_ = self._interp.adaptivePredict(self._input,10,self._ctx)
                if la_ == 1:
                    self.state = 192
                    localctx.b = self.declaration_specifiers()


                self.state = 195
                localctx.c = self.init_declarator_list()
                self.state = 196
                localctx.d = self.match(CParser.T__1)

                if localctx.b is not None:
                    self.StoreTypedefDefinition(localctx.a.line, localctx.a.column, (0 if localctx.d is None else localctx.d.line), localctx.d.column, (None if localctx.b is None else self._input.getText(localctx.b.start,localctx.b.stop)), (None if localctx.c is None else self._input.getText(localctx.c.start,localctx.c.stop)))
                else:
                    self.StoreTypedefDefinition(localctx.a.line, localctx.a.column, (0 if localctx.d is None else localctx.d.line), localctx.d.column, '', (None if localctx.c is None else self._input.getText(localctx.c.start,localctx.c.stop)))

                pass
            elif token in [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 93]:
                self.enterOuterAlt(localctx, 2)
                self.state = 199
                localctx.s = self.declaration_specifiers()
                self.state = 201
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if ((((_la - 34)) & ~0x3f) == 0 and ((1 << (_la - 34)) & 576460752303423767) != 0):
                    self.state = 200
                    localctx.t = self.init_declarator_list()


                self.state = 203
                localctx.e = self.match(CParser.T__1)

                if localctx.t is not None:
                    self.StoreVariableDeclaration((None if localctx.s is None else localctx.s.start).line, (None if localctx.s is None else localctx.s.start).column, (None if localctx.t is None else localctx.t.start).line, (None if localctx.t is None else localctx.t.start).column, (None if localctx.s is None else self._input.getText(localctx.s.start,localctx.s.stop)), (None if localctx.t is None else self._input.getText(localctx.t.start,localctx.t.stop)))

                pass
            else:
                raise NoViableAltException(self)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Init_declarator_listContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def init_declarator(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Init_declaratorContext)
            else:
                return self.getTypedRuleContext(CParser.Init_declaratorContext,i)


        def getRuleIndex(self):
            return CParser.RULE_init_declarator_list

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterInit_declarator_list" ):
                listener.enterInit_declarator_list(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitInit_declarator_list" ):
                listener.exitInit_declarator_list(self)




    def init_declarator_list(self):

        localctx = CParser.Init_declarator_listContext(self, self._ctx, self.state)
        self.enterRule(localctx, 10, self.RULE_init_declarator_list)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 208
            self.init_declarator()
            self.state = 213
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==4:
                self.state = 209
                self.match(CParser.T__3)
                self.state = 210
                self.init_declarator()
                self.state = 215
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Init_declaratorContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def declarator(self):
            return self.getTypedRuleContext(CParser.DeclaratorContext,0)


        def initializer(self):
            return self.getTypedRuleContext(CParser.InitializerContext,0)


        def getRuleIndex(self):
            return CParser.RULE_init_declarator

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterInit_declarator" ):
                listener.enterInit_declarator(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitInit_declarator" ):
                listener.exitInit_declarator(self)




    def init_declarator(self):

        localctx = CParser.Init_declaratorContext(self, self._ctx, self.state)
        self.enterRule(localctx, 12, self.RULE_init_declarator)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 216
            self.declarator()
            self.state = 219
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if _la==5:
                self.state = 217
                self.match(CParser.T__4)
                self.state = 218
                self.initializer()


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Storage_class_specifierContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser


        def getRuleIndex(self):
            return CParser.RULE_storage_class_specifier

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterStorage_class_specifier" ):
                listener.enterStorage_class_specifier(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitStorage_class_specifier" ):
                listener.exitStorage_class_specifier(self)




    def storage_class_specifier(self):

        localctx = CParser.Storage_class_specifierContext(self, self._ctx, self.state)
        self.enterRule(localctx, 14, self.RULE_storage_class_specifier)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 221
            _la = self._input.LA(1)
            if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 1984) != 0)):
                self._errHandler.recoverInline(self)
            else:
                self._errHandler.reportMatch(self)
                self.consume()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Type_specifierContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser
            self.s = None # Struct_or_union_specifierContext
            self.e = None # Enum_specifierContext

        def struct_or_union_specifier(self):
            return self.getTypedRuleContext(CParser.Struct_or_union_specifierContext,0)


        def enum_specifier(self):
            return self.getTypedRuleContext(CParser.Enum_specifierContext,0)


        def IDENTIFIER(self):
            return self.getToken(CParser.IDENTIFIER, 0)

        def declarator(self):
            return self.getTypedRuleContext(CParser.DeclaratorContext,0)


        def type_qualifier(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Type_qualifierContext)
            else:
                return self.getTypedRuleContext(CParser.Type_qualifierContext,i)


        def type_id(self):
            return self.getTypedRuleContext(CParser.Type_idContext,0)


        def getRuleIndex(self):
            return CParser.RULE_type_specifier

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterType_specifier" ):
                listener.enterType_specifier(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitType_specifier" ):
                listener.exitType_specifier(self)




    def type_specifier(self):

        localctx = CParser.Type_specifierContext(self, self._ctx, self.state)
        self.enterRule(localctx, 16, self.RULE_type_specifier)
        try:
            self.state = 247
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,16,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 223
                self.match(CParser.T__10)
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 224
                self.match(CParser.T__11)
                pass

            elif la_ == 3:
                self.enterOuterAlt(localctx, 3)
                self.state = 225
                self.match(CParser.T__12)
                pass

            elif la_ == 4:
                self.enterOuterAlt(localctx, 4)
                self.state = 226
                self.match(CParser.T__13)
                pass

            elif la_ == 5:
                self.enterOuterAlt(localctx, 5)
                self.state = 227
                self.match(CParser.T__14)
                pass

            elif la_ == 6:
                self.enterOuterAlt(localctx, 6)
                self.state = 228
                self.match(CParser.T__15)
                pass

            elif la_ == 7:
                self.enterOuterAlt(localctx, 7)
                self.state = 229
                self.match(CParser.T__16)
                pass

            elif la_ == 8:
                self.enterOuterAlt(localctx, 8)
                self.state = 230
                self.match(CParser.T__17)
                pass

            elif la_ == 9:
                self.enterOuterAlt(localctx, 9)
                self.state = 231
                self.match(CParser.T__18)
                pass

            elif la_ == 10:
                self.enterOuterAlt(localctx, 10)
                self.state = 232
                localctx.s = self.struct_or_union_specifier()

                if localctx.s.stop is not None:
                    self.StoreStructUnionDefinition((None if localctx.s is None else localctx.s.start).line, (None if localctx.s is None else localctx.s.start).column, (None if localctx.s is None else localctx.s.stop).line, (None if localctx.s is None else localctx.s.stop).column, (None if localctx.s is None else self._input.getText(localctx.s.start,localctx.s.stop)))

                pass

            elif la_ == 11:
                self.enterOuterAlt(localctx, 11)
                self.state = 235
                localctx.e = self.enum_specifier()

                if localctx.e.stop is not None:
                    self.StoreEnumerationDefinition((None if localctx.e is None else localctx.e.start).line, (None if localctx.e is None else localctx.e.start).column, (None if localctx.e is None else localctx.e.stop).line, (None if localctx.e is None else localctx.e.stop).column, (None if localctx.e is None else self._input.getText(localctx.e.start,localctx.e.stop)))

                pass

            elif la_ == 12:
                self.enterOuterAlt(localctx, 12)
                self.state = 238
                self.match(CParser.IDENTIFIER)
                self.state = 242
                self._errHandler.sync(self)
                _alt = self._interp.adaptivePredict(self._input,15,self._ctx)
                while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                    if _alt==1:
                        self.state = 239
                        self.type_qualifier()
                    self.state = 244
                    self._errHandler.sync(self)
                    _alt = self._interp.adaptivePredict(self._input,15,self._ctx)

                self.state = 245
                self.declarator()
                pass

            elif la_ == 13:
                self.enterOuterAlt(localctx, 13)
                self.state = 246
                self.type_id()
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Type_idContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def IDENTIFIER(self):
            return self.getToken(CParser.IDENTIFIER, 0)

        def getRuleIndex(self):
            return CParser.RULE_type_id

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterType_id" ):
                listener.enterType_id(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitType_id" ):
                listener.exitType_id(self)




    def type_id(self):

        localctx = CParser.Type_idContext(self, self._ctx, self.state)
        self.enterRule(localctx, 18, self.RULE_type_id)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 249
            self.match(CParser.IDENTIFIER)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Struct_or_union_specifierContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def struct_or_union(self):
            return self.getTypedRuleContext(CParser.Struct_or_unionContext,0)


        def struct_declaration_list(self):
            return self.getTypedRuleContext(CParser.Struct_declaration_listContext,0)


        def IDENTIFIER(self):
            return self.getToken(CParser.IDENTIFIER, 0)

        def getRuleIndex(self):
            return CParser.RULE_struct_or_union_specifier

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterStruct_or_union_specifier" ):
                listener.enterStruct_or_union_specifier(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitStruct_or_union_specifier" ):
                listener.exitStruct_or_union_specifier(self)




    def struct_or_union_specifier(self):

        localctx = CParser.Struct_or_union_specifierContext(self, self._ctx, self.state)
        self.enterRule(localctx, 20, self.RULE_struct_or_union_specifier)
        self._la = 0 # Token type
        try:
            self.state = 262
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,18,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 251
                self.struct_or_union()
                self.state = 253
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if _la==93:
                    self.state = 252
                    self.match(CParser.IDENTIFIER)


                self.state = 255
                self.match(CParser.T__0)
                self.state = 256
                self.struct_declaration_list()
                self.state = 257
                self.match(CParser.T__19)
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 259
                self.struct_or_union()
                self.state = 260
                self.match(CParser.IDENTIFIER)
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Struct_or_unionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser


        def getRuleIndex(self):
            return CParser.RULE_struct_or_union

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterStruct_or_union" ):
                listener.enterStruct_or_union(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitStruct_or_union" ):
                listener.exitStruct_or_union(self)




    def struct_or_union(self):

        localctx = CParser.Struct_or_unionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 22, self.RULE_struct_or_union)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 264
            _la = self._input.LA(1)
            if not(_la==21 or _la==22):
                self._errHandler.recoverInline(self)
            else:
                self._errHandler.reportMatch(self)
                self.consume()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Struct_declaration_listContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def struct_declaration(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Struct_declarationContext)
            else:
                return self.getTypedRuleContext(CParser.Struct_declarationContext,i)


        def getRuleIndex(self):
            return CParser.RULE_struct_declaration_list

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterStruct_declaration_list" ):
                listener.enterStruct_declaration_list(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitStruct_declaration_list" ):
                listener.exitStruct_declaration_list(self)




    def struct_declaration_list(self):

        localctx = CParser.Struct_declaration_listContext(self, self._ctx, self.state)
        self.enterRule(localctx, 24, self.RULE_struct_declaration_list)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 267
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while True:
                self.state = 266
                self.struct_declaration()
                self.state = 269
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if not ((((_la) & ~0x3f) == 0 and ((1 << _la) & 274868467712) != 0) or _la==93):
                    break

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Struct_declarationContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def specifier_qualifier_list(self):
            return self.getTypedRuleContext(CParser.Specifier_qualifier_listContext,0)


        def struct_declarator_list(self):
            return self.getTypedRuleContext(CParser.Struct_declarator_listContext,0)


        def getRuleIndex(self):
            return CParser.RULE_struct_declaration

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterStruct_declaration" ):
                listener.enterStruct_declaration(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitStruct_declaration" ):
                listener.exitStruct_declaration(self)




    def struct_declaration(self):

        localctx = CParser.Struct_declarationContext(self, self._ctx, self.state)
        self.enterRule(localctx, 26, self.RULE_struct_declaration)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 271
            self.specifier_qualifier_list()
            self.state = 272
            self.struct_declarator_list()
            self.state = 273
            self.match(CParser.T__1)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Specifier_qualifier_listContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def type_qualifier(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Type_qualifierContext)
            else:
                return self.getTypedRuleContext(CParser.Type_qualifierContext,i)


        def type_specifier(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Type_specifierContext)
            else:
                return self.getTypedRuleContext(CParser.Type_specifierContext,i)


        def getRuleIndex(self):
            return CParser.RULE_specifier_qualifier_list

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterSpecifier_qualifier_list" ):
                listener.enterSpecifier_qualifier_list(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitSpecifier_qualifier_list" ):
                listener.exitSpecifier_qualifier_list(self)




    def specifier_qualifier_list(self):

        localctx = CParser.Specifier_qualifier_listContext(self, self._ctx, self.state)
        self.enterRule(localctx, 28, self.RULE_specifier_qualifier_list)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 277
            self._errHandler.sync(self)
            _alt = 1
            while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                if _alt == 1:
                    self.state = 277
                    self._errHandler.sync(self)
                    token = self._input.LA(1)
                    if token in [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37]:
                        self.state = 275
                        self.type_qualifier()
                        pass
                    elif token in [11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 24, 93]:
                        self.state = 276
                        self.type_specifier()
                        pass
                    else:
                        raise NoViableAltException(self)


                else:
                    raise NoViableAltException(self)
                self.state = 279
                self._errHandler.sync(self)
                _alt = self._interp.adaptivePredict(self._input,21,self._ctx)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Struct_declarator_listContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def struct_declarator(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Struct_declaratorContext)
            else:
                return self.getTypedRuleContext(CParser.Struct_declaratorContext,i)


        def getRuleIndex(self):
            return CParser.RULE_struct_declarator_list

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterStruct_declarator_list" ):
                listener.enterStruct_declarator_list(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitStruct_declarator_list" ):
                listener.exitStruct_declarator_list(self)




    def struct_declarator_list(self):

        localctx = CParser.Struct_declarator_listContext(self, self._ctx, self.state)
        self.enterRule(localctx, 30, self.RULE_struct_declarator_list)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 281
            self.struct_declarator()
            self.state = 286
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==4:
                self.state = 282
                self.match(CParser.T__3)
                self.state = 283
                self.struct_declarator()
                self.state = 288
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Struct_declaratorContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def declarator(self):
            return self.getTypedRuleContext(CParser.DeclaratorContext,0)


        def constant_expression(self):
            return self.getTypedRuleContext(CParser.Constant_expressionContext,0)


        def getRuleIndex(self):
            return CParser.RULE_struct_declarator

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterStruct_declarator" ):
                listener.enterStruct_declarator(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitStruct_declarator" ):
                listener.exitStruct_declarator(self)




    def struct_declarator(self):

        localctx = CParser.Struct_declaratorContext(self, self._ctx, self.state)
        self.enterRule(localctx, 32, self.RULE_struct_declarator)
        self._la = 0 # Token type
        try:
            self.state = 296
            self._errHandler.sync(self)
            token = self._input.LA(1)
            if token in [34, 35, 36, 38, 42, 93]:
                self.enterOuterAlt(localctx, 1)
                self.state = 289
                self.declarator()
                self.state = 292
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if _la==23:
                    self.state = 290
                    self.match(CParser.T__22)
                    self.state = 291
                    self.constant_expression()


                pass
            elif token in [23]:
                self.enterOuterAlt(localctx, 2)
                self.state = 294
                self.match(CParser.T__22)
                self.state = 295
                self.constant_expression()
                pass
            else:
                raise NoViableAltException(self)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Enum_specifierContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def enumerator_list(self):
            return self.getTypedRuleContext(CParser.Enumerator_listContext,0)


        def IDENTIFIER(self):
            return self.getToken(CParser.IDENTIFIER, 0)

        def getRuleIndex(self):
            return CParser.RULE_enum_specifier

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterEnum_specifier" ):
                listener.enterEnum_specifier(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitEnum_specifier" ):
                listener.exitEnum_specifier(self)




    def enum_specifier(self):

        localctx = CParser.Enum_specifierContext(self, self._ctx, self.state)
        self.enterRule(localctx, 34, self.RULE_enum_specifier)
        self._la = 0 # Token type
        try:
            self.state = 317
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,27,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 298
                self.match(CParser.T__23)
                self.state = 299
                self.match(CParser.T__0)
                self.state = 300
                self.enumerator_list()
                self.state = 302
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if _la==4:
                    self.state = 301
                    self.match(CParser.T__3)


                self.state = 304
                self.match(CParser.T__19)
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 306
                self.match(CParser.T__23)
                self.state = 307
                self.match(CParser.IDENTIFIER)
                self.state = 308
                self.match(CParser.T__0)
                self.state = 309
                self.enumerator_list()
                self.state = 311
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if _la==4:
                    self.state = 310
                    self.match(CParser.T__3)


                self.state = 313
                self.match(CParser.T__19)
                pass

            elif la_ == 3:
                self.enterOuterAlt(localctx, 3)
                self.state = 315
                self.match(CParser.T__23)
                self.state = 316
                self.match(CParser.IDENTIFIER)
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Enumerator_listContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def enumerator(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.EnumeratorContext)
            else:
                return self.getTypedRuleContext(CParser.EnumeratorContext,i)


        def getRuleIndex(self):
            return CParser.RULE_enumerator_list

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterEnumerator_list" ):
                listener.enterEnumerator_list(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitEnumerator_list" ):
                listener.exitEnumerator_list(self)




    def enumerator_list(self):

        localctx = CParser.Enumerator_listContext(self, self._ctx, self.state)
        self.enterRule(localctx, 36, self.RULE_enumerator_list)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 319
            self.enumerator()
            self.state = 324
            self._errHandler.sync(self)
            _alt = self._interp.adaptivePredict(self._input,28,self._ctx)
            while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                if _alt==1:
                    self.state = 320
                    self.match(CParser.T__3)
                    self.state = 321
                    self.enumerator()
                self.state = 326
                self._errHandler.sync(self)
                _alt = self._interp.adaptivePredict(self._input,28,self._ctx)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class EnumeratorContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def IDENTIFIER(self):
            return self.getToken(CParser.IDENTIFIER, 0)

        def constant_expression(self):
            return self.getTypedRuleContext(CParser.Constant_expressionContext,0)


        def getRuleIndex(self):
            return CParser.RULE_enumerator

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterEnumerator" ):
                listener.enterEnumerator(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitEnumerator" ):
                listener.exitEnumerator(self)




    def enumerator(self):

        localctx = CParser.EnumeratorContext(self, self._ctx, self.state)
        self.enterRule(localctx, 38, self.RULE_enumerator)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 327
            self.match(CParser.IDENTIFIER)
            self.state = 330
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if _la==5:
                self.state = 328
                self.match(CParser.T__4)
                self.state = 329
                self.constant_expression()


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Type_qualifierContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser


        def getRuleIndex(self):
            return CParser.RULE_type_qualifier

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterType_qualifier" ):
                listener.enterType_qualifier(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitType_qualifier" ):
                listener.exitType_qualifier(self)




    def type_qualifier(self):

        localctx = CParser.Type_qualifierContext(self, self._ctx, self.state)
        self.enterRule(localctx, 40, self.RULE_type_qualifier)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 332
            _la = self._input.LA(1)
            if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 274844352512) != 0)):
                self._errHandler.recoverInline(self)
            else:
                self._errHandler.reportMatch(self)
                self.consume()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class DeclaratorContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def direct_declarator(self):
            return self.getTypedRuleContext(CParser.Direct_declaratorContext,0)


        def pointer(self):
            return self.getTypedRuleContext(CParser.PointerContext,0)


        def getRuleIndex(self):
            return CParser.RULE_declarator

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterDeclarator" ):
                listener.enterDeclarator(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitDeclarator" ):
                listener.exitDeclarator(self)




    def declarator(self):

        localctx = CParser.DeclaratorContext(self, self._ctx, self.state)
        self.enterRule(localctx, 42, self.RULE_declarator)
        self._la = 0 # Token type
        try:
            self.state = 348
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,34,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 335
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if _la==42:
                    self.state = 334
                    self.pointer()


                self.state = 338
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if _la==34:
                    self.state = 337
                    self.match(CParser.T__33)


                self.state = 341
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if _la==35:
                    self.state = 340
                    self.match(CParser.T__34)


                self.state = 344
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if _la==36:
                    self.state = 343
                    self.match(CParser.T__35)


                self.state = 346
                self.direct_declarator()
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 347
                self.pointer()
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Direct_declaratorContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def IDENTIFIER(self):
            return self.getToken(CParser.IDENTIFIER, 0)

        def declarator_suffix(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Declarator_suffixContext)
            else:
                return self.getTypedRuleContext(CParser.Declarator_suffixContext,i)


        def declarator(self):
            return self.getTypedRuleContext(CParser.DeclaratorContext,0)


        def getRuleIndex(self):
            return CParser.RULE_direct_declarator

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterDirect_declarator" ):
                listener.enterDirect_declarator(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitDirect_declarator" ):
                listener.exitDirect_declarator(self)




    def direct_declarator(self):

        localctx = CParser.Direct_declaratorContext(self, self._ctx, self.state)
        self.enterRule(localctx, 44, self.RULE_direct_declarator)
        try:
            self.state = 368
            self._errHandler.sync(self)
            token = self._input.LA(1)
            if token in [93]:
                self.enterOuterAlt(localctx, 1)
                self.state = 350
                self.match(CParser.IDENTIFIER)
                self.state = 354
                self._errHandler.sync(self)
                _alt = self._interp.adaptivePredict(self._input,35,self._ctx)
                while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                    if _alt==1:
                        self.state = 351
                        self.declarator_suffix()
                    self.state = 356
                    self._errHandler.sync(self)
                    _alt = self._interp.adaptivePredict(self._input,35,self._ctx)

                pass
            elif token in [38]:
                self.enterOuterAlt(localctx, 2)
                self.state = 357
                self.match(CParser.T__37)
                self.state = 359
                self._errHandler.sync(self)
                la_ = self._interp.adaptivePredict(self._input,36,self._ctx)
                if la_ == 1:
                    self.state = 358
                    self.match(CParser.T__33)


                self.state = 361
                self.declarator()
                self.state = 362
                self.match(CParser.T__38)
                self.state = 364
                self._errHandler.sync(self)
                _alt = 1
                while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                    if _alt == 1:
                        self.state = 363
                        self.declarator_suffix()

                    else:
                        raise NoViableAltException(self)
                    self.state = 366
                    self._errHandler.sync(self)
                    _alt = self._interp.adaptivePredict(self._input,37,self._ctx)

                pass
            else:
                raise NoViableAltException(self)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Declarator_suffixContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def constant_expression(self):
            return self.getTypedRuleContext(CParser.Constant_expressionContext,0)


        def parameter_type_list(self):
            return self.getTypedRuleContext(CParser.Parameter_type_listContext,0)


        def identifier_list(self):
            return self.getTypedRuleContext(CParser.Identifier_listContext,0)


        def getRuleIndex(self):
            return CParser.RULE_declarator_suffix

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterDeclarator_suffix" ):
                listener.enterDeclarator_suffix(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitDeclarator_suffix" ):
                listener.exitDeclarator_suffix(self)




    def declarator_suffix(self):

        localctx = CParser.Declarator_suffixContext(self, self._ctx, self.state)
        self.enterRule(localctx, 46, self.RULE_declarator_suffix)
        try:
            self.state = 386
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,39,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 370
                self.match(CParser.T__39)
                self.state = 371
                self.constant_expression()
                self.state = 372
                self.match(CParser.T__40)
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 374
                self.match(CParser.T__39)
                self.state = 375
                self.match(CParser.T__40)
                pass

            elif la_ == 3:
                self.enterOuterAlt(localctx, 3)
                self.state = 376
                self.match(CParser.T__37)
                self.state = 377
                self.parameter_type_list()
                self.state = 378
                self.match(CParser.T__38)
                pass

            elif la_ == 4:
                self.enterOuterAlt(localctx, 4)
                self.state = 380
                self.match(CParser.T__37)
                self.state = 381
                self.identifier_list()
                self.state = 382
                self.match(CParser.T__38)
                pass

            elif la_ == 5:
                self.enterOuterAlt(localctx, 5)
                self.state = 384
                self.match(CParser.T__37)
                self.state = 385
                self.match(CParser.T__38)
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class PointerContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def type_qualifier(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Type_qualifierContext)
            else:
                return self.getTypedRuleContext(CParser.Type_qualifierContext,i)


        def pointer(self):
            return self.getTypedRuleContext(CParser.PointerContext,0)


        def getRuleIndex(self):
            return CParser.RULE_pointer

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterPointer" ):
                listener.enterPointer(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitPointer" ):
                listener.exitPointer(self)




    def pointer(self):

        localctx = CParser.PointerContext(self, self._ctx, self.state)
        self.enterRule(localctx, 48, self.RULE_pointer)
        try:
            self.state = 400
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,42,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 388
                self.match(CParser.T__41)
                self.state = 390
                self._errHandler.sync(self)
                _alt = 1
                while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                    if _alt == 1:
                        self.state = 389
                        self.type_qualifier()

                    else:
                        raise NoViableAltException(self)
                    self.state = 392
                    self._errHandler.sync(self)
                    _alt = self._interp.adaptivePredict(self._input,40,self._ctx)

                self.state = 395
                self._errHandler.sync(self)
                la_ = self._interp.adaptivePredict(self._input,41,self._ctx)
                if la_ == 1:
                    self.state = 394
                    self.pointer()


                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 397
                self.match(CParser.T__41)
                self.state = 398
                self.pointer()
                pass

            elif la_ == 3:
                self.enterOuterAlt(localctx, 3)
                self.state = 399
                self.match(CParser.T__41)
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Parameter_type_listContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def parameter_list(self):
            return self.getTypedRuleContext(CParser.Parameter_listContext,0)


        def getRuleIndex(self):
            return CParser.RULE_parameter_type_list

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterParameter_type_list" ):
                listener.enterParameter_type_list(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitParameter_type_list" ):
                listener.exitParameter_type_list(self)




    def parameter_type_list(self):

        localctx = CParser.Parameter_type_listContext(self, self._ctx, self.state)
        self.enterRule(localctx, 50, self.RULE_parameter_type_list)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 402
            self.parameter_list()
            self.state = 408
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if _la==4:
                self.state = 403
                self.match(CParser.T__3)
                self.state = 405
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if _la==29:
                    self.state = 404
                    self.match(CParser.T__28)


                self.state = 407
                self.match(CParser.T__42)


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Parameter_listContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def parameter_declaration(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Parameter_declarationContext)
            else:
                return self.getTypedRuleContext(CParser.Parameter_declarationContext,i)


        def getRuleIndex(self):
            return CParser.RULE_parameter_list

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterParameter_list" ):
                listener.enterParameter_list(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitParameter_list" ):
                listener.exitParameter_list(self)




    def parameter_list(self):

        localctx = CParser.Parameter_listContext(self, self._ctx, self.state)
        self.enterRule(localctx, 52, self.RULE_parameter_list)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 410
            self.parameter_declaration()
            self.state = 418
            self._errHandler.sync(self)
            _alt = self._interp.adaptivePredict(self._input,46,self._ctx)
            while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                if _alt==1:
                    self.state = 411
                    self.match(CParser.T__3)
                    self.state = 413
                    self._errHandler.sync(self)
                    la_ = self._interp.adaptivePredict(self._input,45,self._ctx)
                    if la_ == 1:
                        self.state = 412
                        self.match(CParser.T__28)


                    self.state = 415
                    self.parameter_declaration()
                self.state = 420
                self._errHandler.sync(self)
                _alt = self._interp.adaptivePredict(self._input,46,self._ctx)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Parameter_declarationContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def declaration_specifiers(self):
            return self.getTypedRuleContext(CParser.Declaration_specifiersContext,0)


        def declarator(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.DeclaratorContext)
            else:
                return self.getTypedRuleContext(CParser.DeclaratorContext,i)


        def abstract_declarator(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Abstract_declaratorContext)
            else:
                return self.getTypedRuleContext(CParser.Abstract_declaratorContext,i)


        def IDENTIFIER(self):
            return self.getToken(CParser.IDENTIFIER, 0)

        def pointer(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.PointerContext)
            else:
                return self.getTypedRuleContext(CParser.PointerContext,i)


        def getRuleIndex(self):
            return CParser.RULE_parameter_declaration

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterParameter_declaration" ):
                listener.enterParameter_declaration(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitParameter_declaration" ):
                listener.exitParameter_declaration(self)




    def parameter_declaration(self):

        localctx = CParser.Parameter_declarationContext(self, self._ctx, self.state)
        self.enterRule(localctx, 54, self.RULE_parameter_declaration)
        self._la = 0 # Token type
        try:
            self.state = 439
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,51,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 421
                self.declaration_specifiers()
                self.state = 426
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                while ((((_la - 34)) & ~0x3f) == 0 and ((1 << (_la - 34)) & 576460752303423831) != 0):
                    self.state = 424
                    self._errHandler.sync(self)
                    la_ = self._interp.adaptivePredict(self._input,47,self._ctx)
                    if la_ == 1:
                        self.state = 422
                        self.declarator()
                        pass

                    elif la_ == 2:
                        self.state = 423
                        self.abstract_declarator()
                        pass


                    self.state = 428
                    self._errHandler.sync(self)
                    _la = self._input.LA(1)

                self.state = 430
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if _la==29:
                    self.state = 429
                    self.match(CParser.T__28)


                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 435
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                while _la==42:
                    self.state = 432
                    self.pointer()
                    self.state = 437
                    self._errHandler.sync(self)
                    _la = self._input.LA(1)

                self.state = 438
                self.match(CParser.IDENTIFIER)
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Identifier_listContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def IDENTIFIER(self, i:int=None):
            if i is None:
                return self.getTokens(CParser.IDENTIFIER)
            else:
                return self.getToken(CParser.IDENTIFIER, i)

        def getRuleIndex(self):
            return CParser.RULE_identifier_list

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterIdentifier_list" ):
                listener.enterIdentifier_list(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitIdentifier_list" ):
                listener.exitIdentifier_list(self)




    def identifier_list(self):

        localctx = CParser.Identifier_listContext(self, self._ctx, self.state)
        self.enterRule(localctx, 56, self.RULE_identifier_list)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 441
            self.match(CParser.IDENTIFIER)
            self.state = 446
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==4:
                self.state = 442
                self.match(CParser.T__3)
                self.state = 443
                self.match(CParser.IDENTIFIER)
                self.state = 448
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Type_nameContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def specifier_qualifier_list(self):
            return self.getTypedRuleContext(CParser.Specifier_qualifier_listContext,0)


        def abstract_declarator(self):
            return self.getTypedRuleContext(CParser.Abstract_declaratorContext,0)


        def type_id(self):
            return self.getTypedRuleContext(CParser.Type_idContext,0)


        def getRuleIndex(self):
            return CParser.RULE_type_name

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterType_name" ):
                listener.enterType_name(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitType_name" ):
                listener.exitType_name(self)




    def type_name(self):

        localctx = CParser.Type_nameContext(self, self._ctx, self.state)
        self.enterRule(localctx, 58, self.RULE_type_name)
        self._la = 0 # Token type
        try:
            self.state = 454
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,54,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 449
                self.specifier_qualifier_list()
                self.state = 451
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if (((_la) & ~0x3f) == 0 and ((1 << _la) & 5772436045824) != 0):
                    self.state = 450
                    self.abstract_declarator()


                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 453
                self.type_id()
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Abstract_declaratorContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def pointer(self):
            return self.getTypedRuleContext(CParser.PointerContext,0)


        def direct_abstract_declarator(self):
            return self.getTypedRuleContext(CParser.Direct_abstract_declaratorContext,0)


        def getRuleIndex(self):
            return CParser.RULE_abstract_declarator

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterAbstract_declarator" ):
                listener.enterAbstract_declarator(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitAbstract_declarator" ):
                listener.exitAbstract_declarator(self)




    def abstract_declarator(self):

        localctx = CParser.Abstract_declaratorContext(self, self._ctx, self.state)
        self.enterRule(localctx, 60, self.RULE_abstract_declarator)
        try:
            self.state = 461
            self._errHandler.sync(self)
            token = self._input.LA(1)
            if token in [42]:
                self.enterOuterAlt(localctx, 1)
                self.state = 456
                self.pointer()
                self.state = 458
                self._errHandler.sync(self)
                la_ = self._interp.adaptivePredict(self._input,55,self._ctx)
                if la_ == 1:
                    self.state = 457
                    self.direct_abstract_declarator()


                pass
            elif token in [38, 40]:
                self.enterOuterAlt(localctx, 2)
                self.state = 460
                self.direct_abstract_declarator()
                pass
            else:
                raise NoViableAltException(self)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Direct_abstract_declaratorContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def abstract_declarator(self):
            return self.getTypedRuleContext(CParser.Abstract_declaratorContext,0)


        def abstract_declarator_suffix(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Abstract_declarator_suffixContext)
            else:
                return self.getTypedRuleContext(CParser.Abstract_declarator_suffixContext,i)


        def getRuleIndex(self):
            return CParser.RULE_direct_abstract_declarator

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterDirect_abstract_declarator" ):
                listener.enterDirect_abstract_declarator(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitDirect_abstract_declarator" ):
                listener.exitDirect_abstract_declarator(self)




    def direct_abstract_declarator(self):

        localctx = CParser.Direct_abstract_declaratorContext(self, self._ctx, self.state)
        self.enterRule(localctx, 62, self.RULE_direct_abstract_declarator)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 468
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,57,self._ctx)
            if la_ == 1:
                self.state = 463
                self.match(CParser.T__37)
                self.state = 464
                self.abstract_declarator()
                self.state = 465
                self.match(CParser.T__38)
                pass

            elif la_ == 2:
                self.state = 467
                self.abstract_declarator_suffix()
                pass


            self.state = 473
            self._errHandler.sync(self)
            _alt = self._interp.adaptivePredict(self._input,58,self._ctx)
            while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                if _alt==1:
                    self.state = 470
                    self.abstract_declarator_suffix()
                self.state = 475
                self._errHandler.sync(self)
                _alt = self._interp.adaptivePredict(self._input,58,self._ctx)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Abstract_declarator_suffixContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def constant_expression(self):
            return self.getTypedRuleContext(CParser.Constant_expressionContext,0)


        def parameter_type_list(self):
            return self.getTypedRuleContext(CParser.Parameter_type_listContext,0)


        def getRuleIndex(self):
            return CParser.RULE_abstract_declarator_suffix

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterAbstract_declarator_suffix" ):
                listener.enterAbstract_declarator_suffix(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitAbstract_declarator_suffix" ):
                listener.exitAbstract_declarator_suffix(self)




    def abstract_declarator_suffix(self):

        localctx = CParser.Abstract_declarator_suffixContext(self, self._ctx, self.state)
        self.enterRule(localctx, 64, self.RULE_abstract_declarator_suffix)
        try:
            self.state = 488
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,59,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 476
                self.match(CParser.T__39)
                self.state = 477
                self.match(CParser.T__40)
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 478
                self.match(CParser.T__39)
                self.state = 479
                self.constant_expression()
                self.state = 480
                self.match(CParser.T__40)
                pass

            elif la_ == 3:
                self.enterOuterAlt(localctx, 3)
                self.state = 482
                self.match(CParser.T__37)
                self.state = 483
                self.match(CParser.T__38)
                pass

            elif la_ == 4:
                self.enterOuterAlt(localctx, 4)
                self.state = 484
                self.match(CParser.T__37)
                self.state = 485
                self.parameter_type_list()
                self.state = 486
                self.match(CParser.T__38)
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class InitializerContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def assignment_expression(self):
            return self.getTypedRuleContext(CParser.Assignment_expressionContext,0)


        def initializer_list(self):
            return self.getTypedRuleContext(CParser.Initializer_listContext,0)


        def getRuleIndex(self):
            return CParser.RULE_initializer

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterInitializer" ):
                listener.enterInitializer(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitInitializer" ):
                listener.exitInitializer(self)




    def initializer(self):

        localctx = CParser.InitializerContext(self, self._ctx, self.state)
        self.enterRule(localctx, 66, self.RULE_initializer)
        self._la = 0 # Token type
        try:
            self.state = 498
            self._errHandler.sync(self)
            token = self._input.LA(1)
            if token in [38, 42, 44, 45, 48, 49, 50, 53, 54, 55, 93, 94, 95, 96, 97, 98, 99]:
                self.enterOuterAlt(localctx, 1)
                self.state = 490
                self.assignment_expression()
                pass
            elif token in [1]:
                self.enterOuterAlt(localctx, 2)
                self.state = 491
                self.match(CParser.T__0)
                self.state = 492
                self.initializer_list()
                self.state = 494
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if _la==4:
                    self.state = 493
                    self.match(CParser.T__3)


                self.state = 496
                self.match(CParser.T__19)
                pass
            else:
                raise NoViableAltException(self)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Initializer_listContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def initializer(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.InitializerContext)
            else:
                return self.getTypedRuleContext(CParser.InitializerContext,i)


        def getRuleIndex(self):
            return CParser.RULE_initializer_list

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterInitializer_list" ):
                listener.enterInitializer_list(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitInitializer_list" ):
                listener.exitInitializer_list(self)




    def initializer_list(self):

        localctx = CParser.Initializer_listContext(self, self._ctx, self.state)
        self.enterRule(localctx, 68, self.RULE_initializer_list)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 500
            self.initializer()
            self.state = 505
            self._errHandler.sync(self)
            _alt = self._interp.adaptivePredict(self._input,62,self._ctx)
            while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                if _alt==1:
                    self.state = 501
                    self.match(CParser.T__3)
                    self.state = 502
                    self.initializer()
                self.state = 507
                self._errHandler.sync(self)
                _alt = self._interp.adaptivePredict(self._input,62,self._ctx)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Argument_expression_listContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def assignment_expression(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Assignment_expressionContext)
            else:
                return self.getTypedRuleContext(CParser.Assignment_expressionContext,i)


        def getRuleIndex(self):
            return CParser.RULE_argument_expression_list

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterArgument_expression_list" ):
                listener.enterArgument_expression_list(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitArgument_expression_list" ):
                listener.exitArgument_expression_list(self)




    def argument_expression_list(self):

        localctx = CParser.Argument_expression_listContext(self, self._ctx, self.state)
        self.enterRule(localctx, 70, self.RULE_argument_expression_list)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 508
            self.assignment_expression()
            self.state = 510
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if _la==29:
                self.state = 509
                self.match(CParser.T__28)


            self.state = 519
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==4:
                self.state = 512
                self.match(CParser.T__3)
                self.state = 513
                self.assignment_expression()
                self.state = 515
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                if _la==29:
                    self.state = 514
                    self.match(CParser.T__28)


                self.state = 521
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Additive_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def multiplicative_expression(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Multiplicative_expressionContext)
            else:
                return self.getTypedRuleContext(CParser.Multiplicative_expressionContext,i)


        def getRuleIndex(self):
            return CParser.RULE_additive_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterAdditive_expression" ):
                listener.enterAdditive_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitAdditive_expression" ):
                listener.exitAdditive_expression(self)




    def additive_expression(self):

        localctx = CParser.Additive_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 72, self.RULE_additive_expression)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 522
            self.multiplicative_expression()
            self.state = 529
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==44 or _la==45:
                self.state = 527
                self._errHandler.sync(self)
                token = self._input.LA(1)
                if token in [44]:
                    self.state = 523
                    self.match(CParser.T__43)
                    self.state = 524
                    self.multiplicative_expression()
                    pass
                elif token in [45]:
                    self.state = 525
                    self.match(CParser.T__44)
                    self.state = 526
                    self.multiplicative_expression()
                    pass
                else:
                    raise NoViableAltException(self)

                self.state = 531
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Multiplicative_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def cast_expression(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Cast_expressionContext)
            else:
                return self.getTypedRuleContext(CParser.Cast_expressionContext,i)


        def getRuleIndex(self):
            return CParser.RULE_multiplicative_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterMultiplicative_expression" ):
                listener.enterMultiplicative_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitMultiplicative_expression" ):
                listener.exitMultiplicative_expression(self)




    def multiplicative_expression(self):

        localctx = CParser.Multiplicative_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 74, self.RULE_multiplicative_expression)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 532
            self.cast_expression()
            self.state = 541
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while (((_la) & ~0x3f) == 0 and ((1 << _la) & 215504279044096) != 0):
                self.state = 539
                self._errHandler.sync(self)
                token = self._input.LA(1)
                if token in [42]:
                    self.state = 533
                    self.match(CParser.T__41)
                    self.state = 534
                    self.cast_expression()
                    pass
                elif token in [46]:
                    self.state = 535
                    self.match(CParser.T__45)
                    self.state = 536
                    self.cast_expression()
                    pass
                elif token in [47]:
                    self.state = 537
                    self.match(CParser.T__46)
                    self.state = 538
                    self.cast_expression()
                    pass
                else:
                    raise NoViableAltException(self)

                self.state = 543
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Cast_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def type_name(self):
            return self.getTypedRuleContext(CParser.Type_nameContext,0)


        def cast_expression(self):
            return self.getTypedRuleContext(CParser.Cast_expressionContext,0)


        def unary_expression(self):
            return self.getTypedRuleContext(CParser.Unary_expressionContext,0)


        def getRuleIndex(self):
            return CParser.RULE_cast_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterCast_expression" ):
                listener.enterCast_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitCast_expression" ):
                listener.exitCast_expression(self)




    def cast_expression(self):

        localctx = CParser.Cast_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 76, self.RULE_cast_expression)
        try:
            self.state = 550
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,70,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 544
                self.match(CParser.T__37)
                self.state = 545
                self.type_name()
                self.state = 546
                self.match(CParser.T__38)
                self.state = 547
                self.cast_expression()
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 549
                self.unary_expression()
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Unary_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def postfix_expression(self):
            return self.getTypedRuleContext(CParser.Postfix_expressionContext,0)


        def unary_expression(self):
            return self.getTypedRuleContext(CParser.Unary_expressionContext,0)


        def unary_operator(self):
            return self.getTypedRuleContext(CParser.Unary_operatorContext,0)


        def cast_expression(self):
            return self.getTypedRuleContext(CParser.Cast_expressionContext,0)


        def type_name(self):
            return self.getTypedRuleContext(CParser.Type_nameContext,0)


        def getRuleIndex(self):
            return CParser.RULE_unary_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterUnary_expression" ):
                listener.enterUnary_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitUnary_expression" ):
                listener.exitUnary_expression(self)




    def unary_expression(self):

        localctx = CParser.Unary_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 78, self.RULE_unary_expression)
        try:
            self.state = 567
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,71,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 552
                self.postfix_expression()
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 553
                self.match(CParser.T__47)
                self.state = 554
                self.unary_expression()
                pass

            elif la_ == 3:
                self.enterOuterAlt(localctx, 3)
                self.state = 555
                self.match(CParser.T__48)
                self.state = 556
                self.unary_expression()
                pass

            elif la_ == 4:
                self.enterOuterAlt(localctx, 4)
                self.state = 557
                self.unary_operator()
                self.state = 558
                self.cast_expression()
                pass

            elif la_ == 5:
                self.enterOuterAlt(localctx, 5)
                self.state = 560
                self.match(CParser.T__49)
                self.state = 561
                self.unary_expression()
                pass

            elif la_ == 6:
                self.enterOuterAlt(localctx, 6)
                self.state = 562
                self.match(CParser.T__49)
                self.state = 563
                self.match(CParser.T__37)
                self.state = 564
                self.type_name()
                self.state = 565
                self.match(CParser.T__38)
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Postfix_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser
            self.FuncCallText = ''
            self.p = None # Primary_expressionContext
            self.a = None # Token
            self.c = None # Argument_expression_listContext
            self.b = None # Token
            self.x = None # Token
            self.y = None # Token
            self.z = None # Token

        def primary_expression(self):
            return self.getTypedRuleContext(CParser.Primary_expressionContext,0)


        def expression(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.ExpressionContext)
            else:
                return self.getTypedRuleContext(CParser.ExpressionContext,i)


        def macro_parameter_list(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Macro_parameter_listContext)
            else:
                return self.getTypedRuleContext(CParser.Macro_parameter_listContext,i)


        def argument_expression_list(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Argument_expression_listContext)
            else:
                return self.getTypedRuleContext(CParser.Argument_expression_listContext,i)


        def IDENTIFIER(self, i:int=None):
            if i is None:
                return self.getTokens(CParser.IDENTIFIER)
            else:
                return self.getToken(CParser.IDENTIFIER, i)

        def getRuleIndex(self):
            return CParser.RULE_postfix_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterPostfix_expression" ):
                listener.enterPostfix_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitPostfix_expression" ):
                listener.exitPostfix_expression(self)




    def postfix_expression(self):

        localctx = CParser.Postfix_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 80, self.RULE_postfix_expression)

        self.FuncCallText=''

        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 569
            localctx.p = self.primary_expression()
            self.FuncCallText += (None if localctx.p is None else self._input.getText(localctx.p.start,localctx.p.stop))
            self.state = 600
            self._errHandler.sync(self)
            _alt = self._interp.adaptivePredict(self._input,73,self._ctx)
            while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                if _alt==1:
                    self.state = 598
                    self._errHandler.sync(self)
                    la_ = self._interp.adaptivePredict(self._input,72,self._ctx)
                    if la_ == 1:
                        self.state = 571
                        self.match(CParser.T__39)
                        self.state = 572
                        self.expression()
                        self.state = 573
                        self.match(CParser.T__40)
                        pass

                    elif la_ == 2:
                        self.state = 575
                        self.match(CParser.T__37)
                        self.state = 576
                        localctx.a = self.match(CParser.T__38)
                        self.StoreFunctionCalling((None if localctx.p is None else localctx.p.start).line, (None if localctx.p is None else localctx.p.start).column, (0 if localctx.a is None else localctx.a.line), localctx.a.column, self.FuncCallText, '')
                        pass

                    elif la_ == 3:
                        self.state = 578
                        self.match(CParser.T__37)
                        self.state = 579
                        localctx.c = self.argument_expression_list()
                        self.state = 580
                        localctx.b = self.match(CParser.T__38)
                        self.StoreFunctionCalling((None if localctx.p is None else localctx.p.start).line, (None if localctx.p is None else localctx.p.start).column, (0 if localctx.b is None else localctx.b.line), localctx.b.column, self.FuncCallText, (None if localctx.c is None else self._input.getText(localctx.c.start,localctx.c.stop)))
                        pass

                    elif la_ == 4:
                        self.state = 583
                        self.match(CParser.T__37)
                        self.state = 584
                        self.macro_parameter_list()
                        self.state = 585
                        self.match(CParser.T__38)
                        pass

                    elif la_ == 5:
                        self.state = 587
                        self.match(CParser.T__50)
                        self.state = 588
                        localctx.x = self.match(CParser.IDENTIFIER)
                        self.FuncCallText += '.' + (None if localctx.x is None else localctx.x.text)
                        pass

                    elif la_ == 6:
                        self.state = 590
                        self.match(CParser.T__41)
                        self.state = 591
                        localctx.y = self.match(CParser.IDENTIFIER)
                        self.FuncCallText = (None if localctx.y is None else localctx.y.text)
                        pass

                    elif la_ == 7:
                        self.state = 593
                        self.match(CParser.T__51)
                        self.state = 594
                        localctx.z = self.match(CParser.IDENTIFIER)
                        self.FuncCallText += '->' + (None if localctx.z is None else localctx.z.text)
                        pass

                    elif la_ == 8:
                        self.state = 596
                        self.match(CParser.T__47)
                        pass

                    elif la_ == 9:
                        self.state = 597
                        self.match(CParser.T__48)
                        pass


                self.state = 602
                self._errHandler.sync(self)
                _alt = self._interp.adaptivePredict(self._input,73,self._ctx)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Macro_parameter_listContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def parameter_declaration(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Parameter_declarationContext)
            else:
                return self.getTypedRuleContext(CParser.Parameter_declarationContext,i)


        def getRuleIndex(self):
            return CParser.RULE_macro_parameter_list

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterMacro_parameter_list" ):
                listener.enterMacro_parameter_list(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitMacro_parameter_list" ):
                listener.exitMacro_parameter_list(self)




    def macro_parameter_list(self):

        localctx = CParser.Macro_parameter_listContext(self, self._ctx, self.state)
        self.enterRule(localctx, 82, self.RULE_macro_parameter_list)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 603
            self.parameter_declaration()
            self.state = 608
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==4:
                self.state = 604
                self.match(CParser.T__3)
                self.state = 605
                self.parameter_declaration()
                self.state = 610
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Unary_operatorContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser


        def getRuleIndex(self):
            return CParser.RULE_unary_operator

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterUnary_operator" ):
                listener.enterUnary_operator(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitUnary_operator" ):
                listener.exitUnary_operator(self)




    def unary_operator(self):

        localctx = CParser.Unary_operatorContext(self, self._ctx, self.state)
        self.enterRule(localctx, 84, self.RULE_unary_operator)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 611
            _la = self._input.LA(1)
            if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 63107569387831296) != 0)):
                self._errHandler.recoverInline(self)
            else:
                self._errHandler.reportMatch(self)
                self.consume()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Primary_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def IDENTIFIER(self):
            return self.getToken(CParser.IDENTIFIER, 0)

        def constant(self):
            return self.getTypedRuleContext(CParser.ConstantContext,0)


        def expression(self):
            return self.getTypedRuleContext(CParser.ExpressionContext,0)


        def getRuleIndex(self):
            return CParser.RULE_primary_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterPrimary_expression" ):
                listener.enterPrimary_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitPrimary_expression" ):
                listener.exitPrimary_expression(self)




    def primary_expression(self):

        localctx = CParser.Primary_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 86, self.RULE_primary_expression)
        try:
            self.state = 619
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,75,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 613
                self.match(CParser.IDENTIFIER)
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 614
                self.constant()
                pass

            elif la_ == 3:
                self.enterOuterAlt(localctx, 3)
                self.state = 615
                self.match(CParser.T__37)
                self.state = 616
                self.expression()
                self.state = 617
                self.match(CParser.T__38)
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class ConstantContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def HEX_LITERAL(self):
            return self.getToken(CParser.HEX_LITERAL, 0)

        def OCTAL_LITERAL(self):
            return self.getToken(CParser.OCTAL_LITERAL, 0)

        def DECIMAL_LITERAL(self):
            return self.getToken(CParser.DECIMAL_LITERAL, 0)

        def CHARACTER_LITERAL(self):
            return self.getToken(CParser.CHARACTER_LITERAL, 0)

        def IDENTIFIER(self, i:int=None):
            if i is None:
                return self.getTokens(CParser.IDENTIFIER)
            else:
                return self.getToken(CParser.IDENTIFIER, i)

        def STRING_LITERAL(self, i:int=None):
            if i is None:
                return self.getTokens(CParser.STRING_LITERAL)
            else:
                return self.getToken(CParser.STRING_LITERAL, i)

        def FLOATING_POINT_LITERAL(self):
            return self.getToken(CParser.FLOATING_POINT_LITERAL, 0)

        def getRuleIndex(self):
            return CParser.RULE_constant

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterConstant" ):
                listener.enterConstant(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitConstant" ):
                listener.exitConstant(self)




    def constant(self):

        localctx = CParser.ConstantContext(self, self._ctx, self.state)
        self.enterRule(localctx, 88, self.RULE_constant)
        self._la = 0 # Token type
        try:
            self.state = 647
            self._errHandler.sync(self)
            token = self._input.LA(1)
            if token in [96]:
                self.enterOuterAlt(localctx, 1)
                self.state = 621
                self.match(CParser.HEX_LITERAL)
                pass
            elif token in [98]:
                self.enterOuterAlt(localctx, 2)
                self.state = 622
                self.match(CParser.OCTAL_LITERAL)
                pass
            elif token in [97]:
                self.enterOuterAlt(localctx, 3)
                self.state = 623
                self.match(CParser.DECIMAL_LITERAL)
                pass
            elif token in [94]:
                self.enterOuterAlt(localctx, 4)
                self.state = 624
                self.match(CParser.CHARACTER_LITERAL)
                pass
            elif token in [93, 95]:
                self.enterOuterAlt(localctx, 5)
                self.state = 636
                self._errHandler.sync(self)
                _alt = 1
                while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                    if _alt == 1:
                        self.state = 628
                        self._errHandler.sync(self)
                        _la = self._input.LA(1)
                        while _la==93:
                            self.state = 625
                            self.match(CParser.IDENTIFIER)
                            self.state = 630
                            self._errHandler.sync(self)
                            _la = self._input.LA(1)

                        self.state = 632
                        self._errHandler.sync(self)
                        _alt = 1
                        while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                            if _alt == 1:
                                self.state = 631
                                self.match(CParser.STRING_LITERAL)

                            else:
                                raise NoViableAltException(self)
                            self.state = 634
                            self._errHandler.sync(self)
                            _alt = self._interp.adaptivePredict(self._input,77,self._ctx)


                    else:
                        raise NoViableAltException(self)
                    self.state = 638
                    self._errHandler.sync(self)
                    _alt = self._interp.adaptivePredict(self._input,78,self._ctx)

                self.state = 643
                self._errHandler.sync(self)
                _la = self._input.LA(1)
                while _la==93:
                    self.state = 640
                    self.match(CParser.IDENTIFIER)
                    self.state = 645
                    self._errHandler.sync(self)
                    _la = self._input.LA(1)

                pass
            elif token in [99]:
                self.enterOuterAlt(localctx, 6)
                self.state = 646
                self.match(CParser.FLOATING_POINT_LITERAL)
                pass
            else:
                raise NoViableAltException(self)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class ExpressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def assignment_expression(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Assignment_expressionContext)
            else:
                return self.getTypedRuleContext(CParser.Assignment_expressionContext,i)


        def getRuleIndex(self):
            return CParser.RULE_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterExpression" ):
                listener.enterExpression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitExpression" ):
                listener.exitExpression(self)




    def expression(self):

        localctx = CParser.ExpressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 90, self.RULE_expression)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 649
            self.assignment_expression()
            self.state = 654
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==4:
                self.state = 650
                self.match(CParser.T__3)
                self.state = 651
                self.assignment_expression()
                self.state = 656
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Constant_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def conditional_expression(self):
            return self.getTypedRuleContext(CParser.Conditional_expressionContext,0)


        def getRuleIndex(self):
            return CParser.RULE_constant_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterConstant_expression" ):
                listener.enterConstant_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitConstant_expression" ):
                listener.exitConstant_expression(self)




    def constant_expression(self):

        localctx = CParser.Constant_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 92, self.RULE_constant_expression)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 657
            self.conditional_expression()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Assignment_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def lvalue(self):
            return self.getTypedRuleContext(CParser.LvalueContext,0)


        def assignment_operator(self):
            return self.getTypedRuleContext(CParser.Assignment_operatorContext,0)


        def assignment_expression(self):
            return self.getTypedRuleContext(CParser.Assignment_expressionContext,0)


        def conditional_expression(self):
            return self.getTypedRuleContext(CParser.Conditional_expressionContext,0)


        def getRuleIndex(self):
            return CParser.RULE_assignment_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterAssignment_expression" ):
                listener.enterAssignment_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitAssignment_expression" ):
                listener.exitAssignment_expression(self)




    def assignment_expression(self):

        localctx = CParser.Assignment_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 94, self.RULE_assignment_expression)
        try:
            self.state = 664
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,82,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 659
                self.lvalue()
                self.state = 660
                self.assignment_operator()
                self.state = 661
                self.assignment_expression()
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 663
                self.conditional_expression()
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class LvalueContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def unary_expression(self):
            return self.getTypedRuleContext(CParser.Unary_expressionContext,0)


        def getRuleIndex(self):
            return CParser.RULE_lvalue

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterLvalue" ):
                listener.enterLvalue(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitLvalue" ):
                listener.exitLvalue(self)




    def lvalue(self):

        localctx = CParser.LvalueContext(self, self._ctx, self.state)
        self.enterRule(localctx, 96, self.RULE_lvalue)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 666
            self.unary_expression()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Assignment_operatorContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser


        def getRuleIndex(self):
            return CParser.RULE_assignment_operator

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterAssignment_operator" ):
                listener.enterAssignment_operator(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitAssignment_operator" ):
                listener.exitAssignment_operator(self)




    def assignment_operator(self):

        localctx = CParser.Assignment_operatorContext(self, self._ctx, self.state)
        self.enterRule(localctx, 98, self.RULE_assignment_operator)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 668
            _la = self._input.LA(1)
            if not(((((_la - 5)) & ~0x3f) == 0 and ((1 << (_la - 5)) & 2303591209400008705) != 0)):
                self._errHandler.recoverInline(self)
            else:
                self._errHandler.reportMatch(self)
                self.consume()
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Conditional_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser
            self.e = None # Logical_or_expressionContext

        def logical_or_expression(self):
            return self.getTypedRuleContext(CParser.Logical_or_expressionContext,0)


        def expression(self):
            return self.getTypedRuleContext(CParser.ExpressionContext,0)


        def conditional_expression(self):
            return self.getTypedRuleContext(CParser.Conditional_expressionContext,0)


        def getRuleIndex(self):
            return CParser.RULE_conditional_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterConditional_expression" ):
                listener.enterConditional_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitConditional_expression" ):
                listener.exitConditional_expression(self)




    def conditional_expression(self):

        localctx = CParser.Conditional_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 100, self.RULE_conditional_expression)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 670
            localctx.e = self.logical_or_expression()
            self.state = 677
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if _la==66:
                self.state = 671
                self.match(CParser.T__65)
                self.state = 672
                self.expression()
                self.state = 673
                self.match(CParser.T__22)
                self.state = 674
                self.conditional_expression()
                self.StorePredicateExpression((None if localctx.e is None else localctx.e.start).line, (None if localctx.e is None else localctx.e.start).column, (None if localctx.e is None else localctx.e.stop).line, (None if localctx.e is None else localctx.e.stop).column, (None if localctx.e is None else self._input.getText(localctx.e.start,localctx.e.stop)))


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Logical_or_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def logical_and_expression(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Logical_and_expressionContext)
            else:
                return self.getTypedRuleContext(CParser.Logical_and_expressionContext,i)


        def getRuleIndex(self):
            return CParser.RULE_logical_or_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterLogical_or_expression" ):
                listener.enterLogical_or_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitLogical_or_expression" ):
                listener.exitLogical_or_expression(self)




    def logical_or_expression(self):

        localctx = CParser.Logical_or_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 102, self.RULE_logical_or_expression)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 679
            self.logical_and_expression()
            self.state = 684
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==67:
                self.state = 680
                self.match(CParser.T__66)
                self.state = 681
                self.logical_and_expression()
                self.state = 686
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Logical_and_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def inclusive_or_expression(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Inclusive_or_expressionContext)
            else:
                return self.getTypedRuleContext(CParser.Inclusive_or_expressionContext,i)


        def getRuleIndex(self):
            return CParser.RULE_logical_and_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterLogical_and_expression" ):
                listener.enterLogical_and_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitLogical_and_expression" ):
                listener.exitLogical_and_expression(self)




    def logical_and_expression(self):

        localctx = CParser.Logical_and_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 104, self.RULE_logical_and_expression)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 687
            self.inclusive_or_expression()
            self.state = 692
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==68:
                self.state = 688
                self.match(CParser.T__67)
                self.state = 689
                self.inclusive_or_expression()
                self.state = 694
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Inclusive_or_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def exclusive_or_expression(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Exclusive_or_expressionContext)
            else:
                return self.getTypedRuleContext(CParser.Exclusive_or_expressionContext,i)


        def getRuleIndex(self):
            return CParser.RULE_inclusive_or_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterInclusive_or_expression" ):
                listener.enterInclusive_or_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitInclusive_or_expression" ):
                listener.exitInclusive_or_expression(self)




    def inclusive_or_expression(self):

        localctx = CParser.Inclusive_or_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 106, self.RULE_inclusive_or_expression)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 695
            self.exclusive_or_expression()
            self.state = 700
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==69:
                self.state = 696
                self.match(CParser.T__68)
                self.state = 697
                self.exclusive_or_expression()
                self.state = 702
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Exclusive_or_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def and_expression(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.And_expressionContext)
            else:
                return self.getTypedRuleContext(CParser.And_expressionContext,i)


        def getRuleIndex(self):
            return CParser.RULE_exclusive_or_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterExclusive_or_expression" ):
                listener.enterExclusive_or_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitExclusive_or_expression" ):
                listener.exitExclusive_or_expression(self)




    def exclusive_or_expression(self):

        localctx = CParser.Exclusive_or_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 108, self.RULE_exclusive_or_expression)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 703
            self.and_expression()
            self.state = 708
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==70:
                self.state = 704
                self.match(CParser.T__69)
                self.state = 705
                self.and_expression()
                self.state = 710
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class And_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def equality_expression(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Equality_expressionContext)
            else:
                return self.getTypedRuleContext(CParser.Equality_expressionContext,i)


        def getRuleIndex(self):
            return CParser.RULE_and_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterAnd_expression" ):
                listener.enterAnd_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitAnd_expression" ):
                listener.exitAnd_expression(self)




    def and_expression(self):

        localctx = CParser.And_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 110, self.RULE_and_expression)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 711
            self.equality_expression()
            self.state = 716
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==53:
                self.state = 712
                self.match(CParser.T__52)
                self.state = 713
                self.equality_expression()
                self.state = 718
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Equality_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def relational_expression(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Relational_expressionContext)
            else:
                return self.getTypedRuleContext(CParser.Relational_expressionContext,i)


        def getRuleIndex(self):
            return CParser.RULE_equality_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterEquality_expression" ):
                listener.enterEquality_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitEquality_expression" ):
                listener.exitEquality_expression(self)




    def equality_expression(self):

        localctx = CParser.Equality_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 112, self.RULE_equality_expression)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 719
            self.relational_expression()
            self.state = 724
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==71 or _la==72:
                self.state = 720
                _la = self._input.LA(1)
                if not(_la==71 or _la==72):
                    self._errHandler.recoverInline(self)
                else:
                    self._errHandler.reportMatch(self)
                    self.consume()
                self.state = 721
                self.relational_expression()
                self.state = 726
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Relational_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def shift_expression(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Shift_expressionContext)
            else:
                return self.getTypedRuleContext(CParser.Shift_expressionContext,i)


        def getRuleIndex(self):
            return CParser.RULE_relational_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterRelational_expression" ):
                listener.enterRelational_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitRelational_expression" ):
                listener.exitRelational_expression(self)




    def relational_expression(self):

        localctx = CParser.Relational_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 114, self.RULE_relational_expression)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 727
            self.shift_expression()
            self.state = 732
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & 15) != 0):
                self.state = 728
                _la = self._input.LA(1)
                if not(((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & 15) != 0)):
                    self._errHandler.recoverInline(self)
                else:
                    self._errHandler.reportMatch(self)
                    self.consume()
                self.state = 729
                self.shift_expression()
                self.state = 734
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Shift_expressionContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def additive_expression(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.Additive_expressionContext)
            else:
                return self.getTypedRuleContext(CParser.Additive_expressionContext,i)


        def getRuleIndex(self):
            return CParser.RULE_shift_expression

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterShift_expression" ):
                listener.enterShift_expression(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitShift_expression" ):
                listener.exitShift_expression(self)




    def shift_expression(self):

        localctx = CParser.Shift_expressionContext(self, self._ctx, self.state)
        self.enterRule(localctx, 116, self.RULE_shift_expression)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 735
            self.additive_expression()
            self.state = 740
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while _la==77 or _la==78:
                self.state = 736
                _la = self._input.LA(1)
                if not(_la==77 or _la==78):
                    self._errHandler.recoverInline(self)
                else:
                    self._errHandler.reportMatch(self)
                    self.consume()
                self.state = 737
                self.additive_expression()
                self.state = 742
                self._errHandler.sync(self)
                _la = self._input.LA(1)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class StatementContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def labeled_statement(self):
            return self.getTypedRuleContext(CParser.Labeled_statementContext,0)


        def compound_statement(self):
            return self.getTypedRuleContext(CParser.Compound_statementContext,0)


        def expression_statement(self):
            return self.getTypedRuleContext(CParser.Expression_statementContext,0)


        def selection_statement(self):
            return self.getTypedRuleContext(CParser.Selection_statementContext,0)


        def iteration_statement(self):
            return self.getTypedRuleContext(CParser.Iteration_statementContext,0)


        def jump_statement(self):
            return self.getTypedRuleContext(CParser.Jump_statementContext,0)


        def macro_statement(self):
            return self.getTypedRuleContext(CParser.Macro_statementContext,0)


        def asm2_statement(self):
            return self.getTypedRuleContext(CParser.Asm2_statementContext,0)


        def asm1_statement(self):
            return self.getTypedRuleContext(CParser.Asm1_statementContext,0)


        def asm_statement(self):
            return self.getTypedRuleContext(CParser.Asm_statementContext,0)


        def declaration(self):
            return self.getTypedRuleContext(CParser.DeclarationContext,0)


        def getRuleIndex(self):
            return CParser.RULE_statement

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterStatement" ):
                listener.enterStatement(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitStatement" ):
                listener.exitStatement(self)




    def statement(self):

        localctx = CParser.StatementContext(self, self._ctx, self.state)
        self.enterRule(localctx, 118, self.RULE_statement)
        try:
            self.state = 754
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,92,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 743
                self.labeled_statement()
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 744
                self.compound_statement()
                pass

            elif la_ == 3:
                self.enterOuterAlt(localctx, 3)
                self.state = 745
                self.expression_statement()
                pass

            elif la_ == 4:
                self.enterOuterAlt(localctx, 4)
                self.state = 746
                self.selection_statement()
                pass

            elif la_ == 5:
                self.enterOuterAlt(localctx, 5)
                self.state = 747
                self.iteration_statement()
                pass

            elif la_ == 6:
                self.enterOuterAlt(localctx, 6)
                self.state = 748
                self.jump_statement()
                pass

            elif la_ == 7:
                self.enterOuterAlt(localctx, 7)
                self.state = 749
                self.macro_statement()
                pass

            elif la_ == 8:
                self.enterOuterAlt(localctx, 8)
                self.state = 750
                self.asm2_statement()
                pass

            elif la_ == 9:
                self.enterOuterAlt(localctx, 9)
                self.state = 751
                self.asm1_statement()
                pass

            elif la_ == 10:
                self.enterOuterAlt(localctx, 10)
                self.state = 752
                self.asm_statement()
                pass

            elif la_ == 11:
                self.enterOuterAlt(localctx, 11)
                self.state = 753
                self.declaration()
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Asm2_statementContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def IDENTIFIER(self):
            return self.getToken(CParser.IDENTIFIER, 0)

        def getRuleIndex(self):
            return CParser.RULE_asm2_statement

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterAsm2_statement" ):
                listener.enterAsm2_statement(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitAsm2_statement" ):
                listener.exitAsm2_statement(self)




    def asm2_statement(self):

        localctx = CParser.Asm2_statementContext(self, self._ctx, self.state)
        self.enterRule(localctx, 120, self.RULE_asm2_statement)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 757
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if _la==79:
                self.state = 756
                self.match(CParser.T__78)


            self.state = 759
            self.match(CParser.IDENTIFIER)
            self.state = 760
            self.match(CParser.T__37)
            self.state = 764
            self._errHandler.sync(self)
            _alt = self._interp.adaptivePredict(self._input,94,self._ctx)
            while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                if _alt==1:
                    self.state = 761
                    _la = self._input.LA(1)
                    if _la <= 0 or _la==2:
                        self._errHandler.recoverInline(self)
                    else:
                        self._errHandler.reportMatch(self)
                        self.consume()
                self.state = 766
                self._errHandler.sync(self)
                _alt = self._interp.adaptivePredict(self._input,94,self._ctx)

            self.state = 767
            self.match(CParser.T__38)
            self.state = 768
            self.match(CParser.T__1)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Asm1_statementContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser


        def getRuleIndex(self):
            return CParser.RULE_asm1_statement

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterAsm1_statement" ):
                listener.enterAsm1_statement(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitAsm1_statement" ):
                listener.exitAsm1_statement(self)




    def asm1_statement(self):

        localctx = CParser.Asm1_statementContext(self, self._ctx, self.state)
        self.enterRule(localctx, 122, self.RULE_asm1_statement)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 770
            self.match(CParser.T__79)
            self.state = 771
            self.match(CParser.T__0)
            self.state = 775
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while (((_la) & ~0x3f) == 0 and ((1 << _la) & -1048578) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 4398046511103) != 0):
                self.state = 772
                _la = self._input.LA(1)
                if _la <= 0 or _la==20:
                    self._errHandler.recoverInline(self)
                else:
                    self._errHandler.reportMatch(self)
                    self.consume()
                self.state = 777
                self._errHandler.sync(self)
                _la = self._input.LA(1)

            self.state = 778
            self.match(CParser.T__19)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Asm_statementContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser


        def getRuleIndex(self):
            return CParser.RULE_asm_statement

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterAsm_statement" ):
                listener.enterAsm_statement(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitAsm_statement" ):
                listener.exitAsm_statement(self)




    def asm_statement(self):

        localctx = CParser.Asm_statementContext(self, self._ctx, self.state)
        self.enterRule(localctx, 124, self.RULE_asm_statement)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 780
            self.match(CParser.T__80)
            self.state = 781
            self.match(CParser.T__0)
            self.state = 785
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            while (((_la) & ~0x3f) == 0 and ((1 << _la) & -1048578) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 4398046511103) != 0):
                self.state = 782
                _la = self._input.LA(1)
                if _la <= 0 or _la==20:
                    self._errHandler.recoverInline(self)
                else:
                    self._errHandler.reportMatch(self)
                    self.consume()
                self.state = 787
                self._errHandler.sync(self)
                _la = self._input.LA(1)

            self.state = 788
            self.match(CParser.T__19)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Macro_statementContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def IDENTIFIER(self):
            return self.getToken(CParser.IDENTIFIER, 0)

        def declaration(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.DeclarationContext)
            else:
                return self.getTypedRuleContext(CParser.DeclarationContext,i)


        def statement_list(self):
            return self.getTypedRuleContext(CParser.Statement_listContext,0)


        def expression(self):
            return self.getTypedRuleContext(CParser.ExpressionContext,0)


        def getRuleIndex(self):
            return CParser.RULE_macro_statement

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterMacro_statement" ):
                listener.enterMacro_statement(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitMacro_statement" ):
                listener.exitMacro_statement(self)




    def macro_statement(self):

        localctx = CParser.Macro_statementContext(self, self._ctx, self.state)
        self.enterRule(localctx, 126, self.RULE_macro_statement)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 790
            self.match(CParser.IDENTIFIER)
            self.state = 791
            self.match(CParser.T__37)
            self.state = 795
            self._errHandler.sync(self)
            _alt = self._interp.adaptivePredict(self._input,97,self._ctx)
            while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                if _alt==1:
                    self.state = 792
                    self.declaration()
                self.state = 797
                self._errHandler.sync(self)
                _alt = self._interp.adaptivePredict(self._input,97,self._ctx)

            self.state = 799
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,98,self._ctx)
            if la_ == 1:
                self.state = 798
                self.statement_list()


            self.state = 802
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if ((((_la - 38)) & ~0x3f) == 0 and ((1 << (_la - 38)) & 4575657221408660689) != 0):
                self.state = 801
                self.expression()


            self.state = 804
            self.match(CParser.T__38)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Labeled_statementContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def IDENTIFIER(self):
            return self.getToken(CParser.IDENTIFIER, 0)

        def statement(self):
            return self.getTypedRuleContext(CParser.StatementContext,0)


        def constant_expression(self):
            return self.getTypedRuleContext(CParser.Constant_expressionContext,0)


        def getRuleIndex(self):
            return CParser.RULE_labeled_statement

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterLabeled_statement" ):
                listener.enterLabeled_statement(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitLabeled_statement" ):
                listener.exitLabeled_statement(self)




    def labeled_statement(self):

        localctx = CParser.Labeled_statementContext(self, self._ctx, self.state)
        self.enterRule(localctx, 128, self.RULE_labeled_statement)
        try:
            self.state = 817
            self._errHandler.sync(self)
            token = self._input.LA(1)
            if token in [93]:
                self.enterOuterAlt(localctx, 1)
                self.state = 806
                self.match(CParser.IDENTIFIER)
                self.state = 807
                self.match(CParser.T__22)
                self.state = 808
                self.statement()
                pass
            elif token in [82]:
                self.enterOuterAlt(localctx, 2)
                self.state = 809
                self.match(CParser.T__81)
                self.state = 810
                self.constant_expression()
                self.state = 811
                self.match(CParser.T__22)
                self.state = 812
                self.statement()
                pass
            elif token in [83]:
                self.enterOuterAlt(localctx, 3)
                self.state = 814
                self.match(CParser.T__82)
                self.state = 815
                self.match(CParser.T__22)
                self.state = 816
                self.statement()
                pass
            else:
                raise NoViableAltException(self)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Compound_statementContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def declaration(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.DeclarationContext)
            else:
                return self.getTypedRuleContext(CParser.DeclarationContext,i)


        def statement_list(self):
            return self.getTypedRuleContext(CParser.Statement_listContext,0)


        def getRuleIndex(self):
            return CParser.RULE_compound_statement

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterCompound_statement" ):
                listener.enterCompound_statement(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitCompound_statement" ):
                listener.exitCompound_statement(self)




    def compound_statement(self):

        localctx = CParser.Compound_statementContext(self, self._ctx, self.state)
        self.enterRule(localctx, 130, self.RULE_compound_statement)
        self._la = 0 # Token type
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 819
            self.match(CParser.T__0)
            self.state = 823
            self._errHandler.sync(self)
            _alt = self._interp.adaptivePredict(self._input,101,self._ctx)
            while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                if _alt==1:
                    self.state = 820
                    self.declaration()
                self.state = 825
                self._errHandler.sync(self)
                _alt = self._interp.adaptivePredict(self._input,101,self._ctx)

            self.state = 827
            self._errHandler.sync(self)
            _la = self._input.LA(1)
            if (((_la) & ~0x3f) == 0 and ((1 << _la) & 65078443971182542) != 0) or ((((_la - 79)) & ~0x3f) == 0 and ((1 << (_la - 79)) & 2097087) != 0):
                self.state = 826
                self.statement_list()


            self.state = 829
            self.match(CParser.T__19)
        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Statement_listContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def statement(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.StatementContext)
            else:
                return self.getTypedRuleContext(CParser.StatementContext,i)


        def getRuleIndex(self):
            return CParser.RULE_statement_list

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterStatement_list" ):
                listener.enterStatement_list(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitStatement_list" ):
                listener.exitStatement_list(self)




    def statement_list(self):

        localctx = CParser.Statement_listContext(self, self._ctx, self.state)
        self.enterRule(localctx, 132, self.RULE_statement_list)
        try:
            self.enterOuterAlt(localctx, 1)
            self.state = 832
            self._errHandler.sync(self)
            _alt = 1
            while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER:
                if _alt == 1:
                    self.state = 831
                    self.statement()

                else:
                    raise NoViableAltException(self)
                self.state = 834
                self._errHandler.sync(self)
                _alt = self._interp.adaptivePredict(self._input,103,self._ctx)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Expression_statementContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def expression(self):
            return self.getTypedRuleContext(CParser.ExpressionContext,0)


        def getRuleIndex(self):
            return CParser.RULE_expression_statement

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterExpression_statement" ):
                listener.enterExpression_statement(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitExpression_statement" ):
                listener.exitExpression_statement(self)




    def expression_statement(self):

        localctx = CParser.Expression_statementContext(self, self._ctx, self.state)
        self.enterRule(localctx, 134, self.RULE_expression_statement)
        try:
            self.state = 840
            self._errHandler.sync(self)
            token = self._input.LA(1)
            if token in [2]:
                self.enterOuterAlt(localctx, 1)
                self.state = 836
                self.match(CParser.T__1)
                pass
            elif token in [38, 42, 44, 45, 48, 49, 50, 53, 54, 55, 93, 94, 95, 96, 97, 98, 99]:
                self.enterOuterAlt(localctx, 2)
                self.state = 837
                self.expression()
                self.state = 838
                self.match(CParser.T__1)
                pass
            else:
                raise NoViableAltException(self)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Selection_statementContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser
            self.e = None # ExpressionContext

        def statement(self, i:int=None):
            if i is None:
                return self.getTypedRuleContexts(CParser.StatementContext)
            else:
                return self.getTypedRuleContext(CParser.StatementContext,i)


        def expression(self):
            return self.getTypedRuleContext(CParser.ExpressionContext,0)


        def getRuleIndex(self):
            return CParser.RULE_selection_statement

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterSelection_statement" ):
                listener.enterSelection_statement(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitSelection_statement" ):
                listener.exitSelection_statement(self)




    def selection_statement(self):

        localctx = CParser.Selection_statementContext(self, self._ctx, self.state)
        self.enterRule(localctx, 136, self.RULE_selection_statement)
        try:
            self.state = 858
            self._errHandler.sync(self)
            token = self._input.LA(1)
            if token in [84]:
                self.enterOuterAlt(localctx, 1)
                self.state = 842
                self.match(CParser.T__83)
                self.state = 843
                self.match(CParser.T__37)
                self.state = 844
                localctx.e = self.expression()
                self.state = 845
                self.match(CParser.T__38)
                self.StorePredicateExpression((None if localctx.e is None else localctx.e.start).line, (None if localctx.e is None else localctx.e.start).column, (None if localctx.e is None else localctx.e.stop).line, (None if localctx.e is None else localctx.e.stop).column, (None if localctx.e is None else self._input.getText(localctx.e.start,localctx.e.stop)))
                self.state = 847
                self.statement()
                self.state = 850
                self._errHandler.sync(self)
                la_ = self._interp.adaptivePredict(self._input,105,self._ctx)
                if la_ == 1:
                    self.state = 848
                    self.match(CParser.T__84)
                    self.state = 849
                    self.statement()


                pass
            elif token in [86]:
                self.enterOuterAlt(localctx, 2)
                self.state = 852
                self.match(CParser.T__85)
                self.state = 853
                self.match(CParser.T__37)
                self.state = 854
                self.expression()
                self.state = 855
                self.match(CParser.T__38)
                self.state = 856
                self.statement()
                pass
            else:
                raise NoViableAltException(self)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Iteration_statementContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser
            self.e = None # ExpressionContext

        def statement(self):
            return self.getTypedRuleContext(CParser.StatementContext,0)


        def expression(self):
            return self.getTypedRuleContext(CParser.ExpressionContext,0)


        def getRuleIndex(self):
            return CParser.RULE_iteration_statement

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterIteration_statement" ):
                listener.enterIteration_statement(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitIteration_statement" ):
                listener.exitIteration_statement(self)




    def iteration_statement(self):

        localctx = CParser.Iteration_statementContext(self, self._ctx, self.state)
        self.enterRule(localctx, 138, self.RULE_iteration_statement)
        try:
            self.state = 876
            self._errHandler.sync(self)
            token = self._input.LA(1)
            if token in [87]:
                self.enterOuterAlt(localctx, 1)
                self.state = 860
                self.match(CParser.T__86)
                self.state = 861
                self.match(CParser.T__37)
                self.state = 862
                localctx.e = self.expression()
                self.state = 863
                self.match(CParser.T__38)
                self.state = 864
                self.statement()
                self.StorePredicateExpression((None if localctx.e is None else localctx.e.start).line, (None if localctx.e is None else localctx.e.start).column, (None if localctx.e is None else localctx.e.stop).line, (None if localctx.e is None else localctx.e.stop).column, (None if localctx.e is None else self._input.getText(localctx.e.start,localctx.e.stop)))
                pass
            elif token in [88]:
                self.enterOuterAlt(localctx, 2)
                self.state = 867
                self.match(CParser.T__87)
                self.state = 868
                self.statement()
                self.state = 869
                self.match(CParser.T__86)
                self.state = 870
                self.match(CParser.T__37)
                self.state = 871
                localctx.e = self.expression()
                self.state = 872
                self.match(CParser.T__38)
                self.state = 873
                self.match(CParser.T__1)
                self.StorePredicateExpression((None if localctx.e is None else localctx.e.start).line, (None if localctx.e is None else localctx.e.start).column, (None if localctx.e is None else localctx.e.stop).line, (None if localctx.e is None else localctx.e.stop).column, (None if localctx.e is None else self._input.getText(localctx.e.start,localctx.e.stop)))
                pass
            else:
                raise NoViableAltException(self)

        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx


    class Jump_statementContext(ParserRuleContext):
        __slots__ = 'parser'

        def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1):
            super().__init__(parent, invokingState)
            self.parser = parser

        def IDENTIFIER(self):
            return self.getToken(CParser.IDENTIFIER, 0)

        def expression(self):
            return self.getTypedRuleContext(CParser.ExpressionContext,0)


        def getRuleIndex(self):
            return CParser.RULE_jump_statement

        def enterRule(self, listener:ParseTreeListener):
            if hasattr( listener, "enterJump_statement" ):
                listener.enterJump_statement(self)

        def exitRule(self, listener:ParseTreeListener):
            if hasattr( listener, "exitJump_statement" ):
                listener.exitJump_statement(self)




    def jump_statement(self):

        localctx = CParser.Jump_statementContext(self, self._ctx, self.state)
        self.enterRule(localctx, 140, self.RULE_jump_statement)
        try:
            self.state = 891
            self._errHandler.sync(self)
            la_ = self._interp.adaptivePredict(self._input,108,self._ctx)
            if la_ == 1:
                self.enterOuterAlt(localctx, 1)
                self.state = 878
                self.match(CParser.T__88)
                self.state = 879
                self.match(CParser.IDENTIFIER)
                self.state = 880
                self.match(CParser.T__1)
                pass

            elif la_ == 2:
                self.enterOuterAlt(localctx, 2)
                self.state = 881
                self.match(CParser.T__89)
                self.state = 882
                self.match(CParser.T__1)
                pass

            elif la_ == 3:
                self.enterOuterAlt(localctx, 3)
                self.state = 883
                self.match(CParser.T__90)
                self.state = 884
                self.match(CParser.T__1)
                pass

            elif la_ == 4:
                self.enterOuterAlt(localctx, 4)
                self.state = 885
                self.match(CParser.T__91)
                self.state = 886
                self.match(CParser.T__1)
                pass

            elif la_ == 5:
                self.enterOuterAlt(localctx, 5)
                self.state = 887
                self.match(CParser.T__91)
                self.state = 888
                self.expression()
                self.state = 889
                self.match(CParser.T__1)
                pass


        except RecognitionException as re:
            localctx.exception = re
            self._errHandler.reportError(self, re)
            self._errHandler.recover(self, re)
        finally:
            self.exitRule()
        return localctx





