Your IP : 216.73.216.86


Current Path : /home/emeraadmin/www/4d695/
Upload File :
Current File : /home/emeraadmin/www/4d695/pycparser.zip

PK�t�\��v�ff__init__.pynu�[���#-----------------------------------------------------------------
# pycparser: __init__.py
#
# This package file exports some convenience functions for
# interacting with pycparser
#
# Eli Bendersky [https://eli.thegreenplace.net/]
# License: BSD
#-----------------------------------------------------------------
__all__ = ['c_lexer', 'c_parser', 'c_ast']
__version__ = '2.23'

import io
from subprocess import check_output
from .c_parser import CParser


def preprocess_file(filename, cpp_path='cpp', cpp_args=''):
    """ Preprocess a file using cpp.

        filename:
            Name of the file you want to preprocess.

        cpp_path:
        cpp_args:
            Refer to the documentation of parse_file for the meaning of these
            arguments.

        When successful, returns the preprocessed file's contents.
        Errors from cpp will be printed out.
    """
    path_list = [cpp_path]
    if isinstance(cpp_args, list):
        path_list += cpp_args
    elif cpp_args != '':
        path_list += [cpp_args]
    path_list += [filename]

    try:
        # Note the use of universal_newlines to treat all newlines
        # as \n for Python's purpose
        text = check_output(path_list, universal_newlines=True)
    except OSError as e:
        raise RuntimeError("Unable to invoke 'cpp'.  " +
            'Make sure its path was passed correctly\n' +
            ('Original error: %s' % e))

    return text


def parse_file(filename, use_cpp=False, cpp_path='cpp', cpp_args='',
               parser=None, encoding=None):
    """ Parse a C file using pycparser.

        filename:
            Name of the file you want to parse.

        use_cpp:
            Set to True if you want to execute the C pre-processor
            on the file prior to parsing it.

        cpp_path:
            If use_cpp is True, this is the path to 'cpp' on your
            system. If no path is provided, it attempts to just
            execute 'cpp', so it must be in your PATH.

        cpp_args:
            If use_cpp is True, set this to the command line arguments strings
            to cpp. Be careful with quotes - it's best to pass a raw string
            (r'') here. For example:
            r'-I../utils/fake_libc_include'
            If several arguments are required, pass a list of strings.

        encoding:
            Encoding to use for the file to parse

        parser:
            Optional parser object to be used instead of the default CParser

        When successful, an AST is returned. ParseError can be
        thrown if the file doesn't parse successfully.

        Errors from cpp will be printed out.
    """
    if use_cpp:
        text = preprocess_file(filename, cpp_path, cpp_args)
    else:
        with io.open(filename, encoding=encoding) as f:
            text = f.read()

    if parser is None:
        parser = CParser()
    return parser.parse(text, filename)
PK�t�\)�zx;);)_ast_gen.pynu�[���#-----------------------------------------------------------------
# _ast_gen.py
#
# Generates the AST Node classes from a specification given in
# a configuration file
#
# The design of this module was inspired by astgen.py from the
# Python 2.5 code-base.
#
# Eli Bendersky [https://eli.thegreenplace.net/]
# License: BSD
#-----------------------------------------------------------------
from string import Template


class ASTCodeGenerator(object):
    def __init__(self, cfg_filename='_c_ast.cfg'):
        """ Initialize the code generator from a configuration
            file.
        """
        self.cfg_filename = cfg_filename
        self.node_cfg = [NodeCfg(name, contents)
            for (name, contents) in self.parse_cfgfile(cfg_filename)]

    def generate(self, file=None):
        """ Generates the code into file, an open file buffer.
        """
        src = Template(_PROLOGUE_COMMENT).substitute(
            cfg_filename=self.cfg_filename)

        src += _PROLOGUE_CODE
        for node_cfg in self.node_cfg:
            src += node_cfg.generate_source() + '\n\n'

        file.write(src)

    def parse_cfgfile(self, filename):
        """ Parse the configuration file and yield pairs of
            (name, contents) for each node.
        """
        with open(filename, "r") as f:
            for line in f:
                line = line.strip()
                if not line or line.startswith('#'):
                    continue
                colon_i = line.find(':')
                lbracket_i = line.find('[')
                rbracket_i = line.find(']')
                if colon_i < 1 or lbracket_i <= colon_i or rbracket_i <= lbracket_i:
                    raise RuntimeError("Invalid line in %s:\n%s\n" % (filename, line))

                name = line[:colon_i]
                val = line[lbracket_i + 1:rbracket_i]
                vallist = [v.strip() for v in val.split(',')] if val else []
                yield name, vallist


class NodeCfg(object):
    """ Node configuration.

        name: node name
        contents: a list of contents - attributes and child nodes
        See comment at the top of the configuration file for details.
    """

    def __init__(self, name, contents):
        self.name = name
        self.all_entries = []
        self.attr = []
        self.child = []
        self.seq_child = []

        for entry in contents:
            clean_entry = entry.rstrip('*')
            self.all_entries.append(clean_entry)

            if entry.endswith('**'):
                self.seq_child.append(clean_entry)
            elif entry.endswith('*'):
                self.child.append(clean_entry)
            else:
                self.attr.append(entry)

    def generate_source(self):
        src = self._gen_init()
        src += '\n' + self._gen_children()
        src += '\n' + self._gen_iter()
        src += '\n' + self._gen_attr_names()
        return src

    def _gen_init(self):
        src = "class %s(Node):\n" % self.name

        if self.all_entries:
            args = ', '.join(self.all_entries)
            slots = ', '.join("'{0}'".format(e) for e in self.all_entries)
            slots += ", 'coord', '__weakref__'"
            arglist = '(self, %s, coord=None)' % args
        else:
            slots = "'coord', '__weakref__'"
            arglist = '(self, coord=None)'

        src += "    __slots__ = (%s)\n" % slots
        src += "    def __init__%s:\n" % arglist

        for name in self.all_entries + ['coord']:
            src += "        self.%s = %s\n" % (name, name)

        return src

    def _gen_children(self):
        src = '    def children(self):\n'

        if self.all_entries:
            src += '        nodelist = []\n'

            for child in self.child:
                src += (
                    '        if self.%(child)s is not None:' +
                    ' nodelist.append(("%(child)s", self.%(child)s))\n') % (
                        dict(child=child))

            for seq_child in self.seq_child:
                src += (
                    '        for i, child in enumerate(self.%(child)s or []):\n'
                    '            nodelist.append(("%(child)s[%%d]" %% i, child))\n') % (
                        dict(child=seq_child))

            src += '        return tuple(nodelist)\n'
        else:
            src += '        return ()\n'

        return src

    def _gen_iter(self):
        src = '    def __iter__(self):\n'

        if self.all_entries:
            for child in self.child:
                src += (
                    '        if self.%(child)s is not None:\n' +
                    '            yield self.%(child)s\n') % (dict(child=child))

            for seq_child in self.seq_child:
                src += (
                    '        for child in (self.%(child)s or []):\n'
                    '            yield child\n') % (dict(child=seq_child))

            if not (self.child or self.seq_child):
                # Empty generator
                src += (
                    '        return\n' +
                    '        yield\n')
        else:
            # Empty generator
            src += (
                '        return\n' +
                '        yield\n')

        return src

    def _gen_attr_names(self):
        src = "    attr_names = (" + ''.join("%r, " % nm for nm in self.attr) + ')'
        return src


_PROLOGUE_COMMENT = \
r'''#-----------------------------------------------------------------
# ** ATTENTION **
# This code was automatically generated from the file:
# $cfg_filename
#
# Do not modify it directly. Modify the configuration file and
# run the generator again.
# ** ** *** ** **
#
# pycparser: c_ast.py
#
# AST Node classes.
#
# Eli Bendersky [https://eli.thegreenplace.net/]
# License: BSD
#-----------------------------------------------------------------

'''

_PROLOGUE_CODE = r'''
import sys

def _repr(obj):
    """
    Get the representation of an object, with dedicated pprint-like format for lists.
    """
    if isinstance(obj, list):
        return '[' + (',\n '.join((_repr(e).replace('\n', '\n ') for e in obj))) + '\n]'
    else:
        return repr(obj)

class Node(object):
    __slots__ = ()
    """ Abstract base class for AST nodes.
    """
    def __repr__(self):
        """ Generates a python representation of the current node
        """
        result = self.__class__.__name__ + '('

        indent = ''
        separator = ''
        for name in self.__slots__[:-2]:
            result += separator
            result += indent
            result += name + '=' + (_repr(getattr(self, name)).replace('\n', '\n  ' + (' ' * (len(name) + len(self.__class__.__name__)))))

            separator = ','
            indent = '\n ' + (' ' * len(self.__class__.__name__))

        result += indent + ')'

        return result

    def children(self):
        """ A sequence of all children that are Nodes
        """
        pass

    def show(self, buf=sys.stdout, offset=0, attrnames=False, nodenames=False, showcoord=False, _my_node_name=None):
        """ Pretty print the Node and all its attributes and
            children (recursively) to a buffer.

            buf:
                Open IO buffer into which the Node is printed.

            offset:
                Initial offset (amount of leading spaces)

            attrnames:
                True if you want to see the attribute names in
                name=value pairs. False to only see the values.

            nodenames:
                True if you want to see the actual node names
                within their parents.

            showcoord:
                Do you want the coordinates of each Node to be
                displayed.
        """
        lead = ' ' * offset
        if nodenames and _my_node_name is not None:
            buf.write(lead + self.__class__.__name__+ ' <' + _my_node_name + '>: ')
        else:
            buf.write(lead + self.__class__.__name__+ ': ')

        if self.attr_names:
            if attrnames:
                nvlist = [(n, getattr(self,n)) for n in self.attr_names]
                attrstr = ', '.join('%s=%s' % nv for nv in nvlist)
            else:
                vlist = [getattr(self, n) for n in self.attr_names]
                attrstr = ', '.join('%s' % v for v in vlist)
            buf.write(attrstr)

        if showcoord:
            buf.write(' (at %s)' % self.coord)
        buf.write('\n')

        for (child_name, child) in self.children():
            child.show(
                buf,
                offset=offset + 2,
                attrnames=attrnames,
                nodenames=nodenames,
                showcoord=showcoord,
                _my_node_name=child_name)


class NodeVisitor(object):
    """ A base NodeVisitor class for visiting c_ast nodes.
        Subclass it and define your own visit_XXX methods, where
        XXX is the class name you want to visit with these
        methods.

        For example:

        class ConstantVisitor(NodeVisitor):
            def __init__(self):
                self.values = []

            def visit_Constant(self, node):
                self.values.append(node.value)

        Creates a list of values of all the constant nodes
        encountered below the given node. To use it:

        cv = ConstantVisitor()
        cv.visit(node)

        Notes:

        *   generic_visit() will be called for AST nodes for which
            no visit_XXX method was defined.
        *   The children of nodes for which a visit_XXX was
            defined will not be visited - if you need this, call
            generic_visit() on the node.
            You can use:
                NodeVisitor.generic_visit(self, node)
        *   Modeled after Python's own AST visiting facilities
            (the ast module of Python 3.0)
    """

    _method_cache = None

    def visit(self, node):
        """ Visit a node.
        """

        if self._method_cache is None:
            self._method_cache = {}

        visitor = self._method_cache.get(node.__class__.__name__, None)
        if visitor is None:
            method = 'visit_' + node.__class__.__name__
            visitor = getattr(self, method, self.generic_visit)
            self._method_cache[node.__class__.__name__] = visitor

        return visitor(node)

    def generic_visit(self, node):
        """ Called if no explicit visitor function exists for a
            node. Implements preorder visiting of the node.
        """
        for c in node:
            self.visit(c)

'''
PK�t�\NE�??_build_tables.pynu�[���#-----------------------------------------------------------------
# pycparser: _build_tables.py
#
# A dummy for generating the lexing/parsing tables and and
# compiling them into .pyc for faster execution in optimized mode.
# Also generates AST code from the configuration file.
# Should be called from the pycparser directory.
#
# Eli Bendersky [https://eli.thegreenplace.net/]
# License: BSD
#-----------------------------------------------------------------

# Insert '.' and '..' as first entries to the search path for modules.
# Restricted environments like embeddable python do not include the
# current working directory on startup.
import importlib
import sys
sys.path[0:0] = ['.', '..']

# Generate c_ast.py
from _ast_gen import ASTCodeGenerator
ast_gen = ASTCodeGenerator('_c_ast.cfg')
ast_gen.generate(open('c_ast.py', 'w'))

from pycparser import c_parser

# Generates the tables
#
c_parser.CParser(
    lex_optimize=True,
    yacc_debug=False,
    yacc_optimize=True)

# Load to compile into .pyc
#
importlib.invalidate_caches()

import lextab
import yacctab
import c_ast
PK�t�\4�T��
_c_ast.cfgnu�[���#-----------------------------------------------------------------
# pycparser: _c_ast.cfg
#
# Defines the AST Node classes used in pycparser.
#
# Each entry is a Node sub-class name, listing the attributes
# and child nodes of the class:
#   <name>*     - a child node
#   <name>**    - a sequence of child nodes
#   <name>      - an attribute
#
# Eli Bendersky [https://eli.thegreenplace.net/]
# License: BSD
#-----------------------------------------------------------------

# ArrayDecl is a nested declaration of an array with the given type.
# dim: the dimension (for example, constant 42)
# dim_quals: list of dimension qualifiers, to support C99's allowing 'const'
#            and 'static' within the array dimension in function declarations.
ArrayDecl: [type*, dim*, dim_quals]

ArrayRef: [name*, subscript*]

# op: =, +=, /= etc.
#
Assignment: [op, lvalue*, rvalue*]

Alignas: [alignment*]

BinaryOp: [op, left*, right*]

Break: []

Case: [expr*, stmts**]

Cast: [to_type*, expr*]

# Compound statement in C99 is a list of block items (declarations or
# statements).
#
Compound: [block_items**]

# Compound literal (anonymous aggregate) for C99.
# (type-name) {initializer_list}
# type: the typename
# init: InitList for the initializer list
#
CompoundLiteral: [type*, init*]

# type: int, char, float, string, etc.
#
Constant: [type, value]

Continue: []

# name: the variable being declared
# quals: list of qualifiers (const, volatile)
# funcspec: list function specifiers (i.e. inline in C99)
# storage: list of storage specifiers (extern, register, etc.)
# type: declaration type (probably nested with all the modifiers)
# init: initialization value, or None
# bitsize: bit field size, or None
#
Decl: [name, quals, align, storage, funcspec, type*, init*, bitsize*]

DeclList: [decls**]

Default: [stmts**]

DoWhile: [cond*, stmt*]

# Represents the ellipsis (...) parameter in a function
# declaration
#
EllipsisParam: []

# An empty statement (a semicolon ';' on its own)
#
EmptyStatement: []

# Enumeration type specifier
# name: an optional ID
# values: an EnumeratorList
#
Enum: [name, values*]

# A name/value pair for enumeration values
#
Enumerator: [name, value*]

# A list of enumerators
#
EnumeratorList: [enumerators**]

# A list of expressions separated by the comma operator.
#
ExprList: [exprs**]

# This is the top of the AST, representing a single C file (a
# translation unit in K&R jargon). It contains a list of
# "external-declaration"s, which is either declarations (Decl),
# Typedef or function definitions (FuncDef).
#
FileAST: [ext**]

# for (init; cond; next) stmt
#
For: [init*, cond*, next*, stmt*]

# name: Id
# args: ExprList
#
FuncCall: [name*, args*]

# type <decl>(args)
#
FuncDecl: [args*, type*]

# Function definition: a declarator for the function name and
# a body, which is a compound statement.
# There's an optional list of parameter declarations for old
# K&R-style definitions
#
FuncDef: [decl*, param_decls**, body*]

Goto: [name]

ID: [name]

# Holder for types that are a simple identifier (e.g. the built
# ins void, char etc. and typedef-defined types)
#
IdentifierType: [names]

If: [cond*, iftrue*, iffalse*]

# An initialization list used for compound literals.
#
InitList: [exprs**]

Label: [name, stmt*]

# A named initializer for C99.
# The name of a NamedInitializer is a sequence of Nodes, because
# names can be hierarchical and contain constant expressions.
#
NamedInitializer: [name**, expr*]

# a list of comma separated function parameter declarations
#
ParamList: [params**]

PtrDecl: [quals, type*]

Return: [expr*]

StaticAssert: [cond*, message*]

# name: struct tag name
# decls: declaration of members
#
Struct: [name, decls**]

# type: . or ->
# name.field or name->field
#
StructRef: [name*, type, field*]

Switch: [cond*, stmt*]

# cond ? iftrue : iffalse
#
TernaryOp: [cond*, iftrue*, iffalse*]

# A base type declaration
#
TypeDecl: [declname, quals, align, type*]

# A typedef declaration.
# Very similar to Decl, but without some attributes
#
Typedef: [name, quals, storage, type*]

Typename: [name, quals, align, type*]

UnaryOp: [op, expr*]

# name: union tag name
# decls: declaration of members
#
Union: [name, decls**]

While: [cond*, stmt*]

Pragma: [string]
PK�t�\`�;;ast_transforms.pynu�[���#------------------------------------------------------------------------------
# pycparser: ast_transforms.py
#
# Some utilities used by the parser to create a friendlier AST.
#
# Eli Bendersky [https://eli.thegreenplace.net/]
# License: BSD
#------------------------------------------------------------------------------

from . import c_ast


def fix_switch_cases(switch_node):
    """ The 'case' statements in a 'switch' come out of parsing with one
        child node, so subsequent statements are just tucked to the parent
        Compound. Additionally, consecutive (fall-through) case statements
        come out messy. This is a peculiarity of the C grammar. The following:

            switch (myvar) {
                case 10:
                    k = 10;
                    p = k + 1;
                    return 10;
                case 20:
                case 30:
                    return 20;
                default:
                    break;
            }

        Creates this tree (pseudo-dump):

            Switch
                ID: myvar
                Compound:
                    Case 10:
                        k = 10
                    p = k + 1
                    return 10
                    Case 20:
                        Case 30:
                            return 20
                    Default:
                        break

        The goal of this transform is to fix this mess, turning it into the
        following:

            Switch
                ID: myvar
                Compound:
                    Case 10:
                        k = 10
                        p = k + 1
                        return 10
                    Case 20:
                    Case 30:
                        return 20
                    Default:
                        break

        A fixed AST node is returned. The argument may be modified.
    """
    assert isinstance(switch_node, c_ast.Switch)
    if not isinstance(switch_node.stmt, c_ast.Compound):
        return switch_node

    # The new Compound child for the Switch, which will collect children in the
    # correct order
    new_compound = c_ast.Compound([], switch_node.stmt.coord)

    # The last Case/Default node
    last_case = None

    # Goes over the children of the Compound below the Switch, adding them
    # either directly below new_compound or below the last Case as appropriate
    # (for `switch(cond) {}`, block_items would have been None)
    for child in (switch_node.stmt.block_items or []):
        if isinstance(child, (c_ast.Case, c_ast.Default)):
            # If it's a Case/Default:
            # 1. Add it to the Compound and mark as "last case"
            # 2. If its immediate child is also a Case or Default, promote it
            #    to a sibling.
            new_compound.block_items.append(child)
            _extract_nested_case(child, new_compound.block_items)
            last_case = new_compound.block_items[-1]
        else:
            # Other statements are added as children to the last case, if it
            # exists.
            if last_case is None:
                new_compound.block_items.append(child)
            else:
                last_case.stmts.append(child)

    switch_node.stmt = new_compound
    return switch_node


def _extract_nested_case(case_node, stmts_list):
    """ Recursively extract consecutive Case statements that are made nested
        by the parser and add them to the stmts_list.
    """
    if isinstance(case_node.stmts[0], (c_ast.Case, c_ast.Default)):
        stmts_list.append(case_node.stmts.pop())
        _extract_nested_case(stmts_list[-1], stmts_list)


def fix_atomic_specifiers(decl):
    """ Atomic specifiers like _Atomic(type) are unusually structured,
        conferring a qualifier upon the contained type.

        This function fixes a decl with atomic specifiers to have a sane AST
        structure, by removing spurious Typename->TypeDecl pairs and attaching
        the _Atomic qualifier in the right place.
    """
    # There can be multiple levels of _Atomic in a decl; fix them until a
    # fixed point is reached.
    while True:
        decl, found = _fix_atomic_specifiers_once(decl)
        if not found:
            break

    # Make sure to add an _Atomic qual on the topmost decl if needed. Also
    # restore the declname on the innermost TypeDecl (it gets placed in the
    # wrong place during construction).
    typ = decl
    while not isinstance(typ, c_ast.TypeDecl):
        try:
            typ = typ.type
        except AttributeError:
            return decl
    if '_Atomic' in typ.quals and '_Atomic' not in decl.quals:
        decl.quals.append('_Atomic')
    if typ.declname is None:
        typ.declname = decl.name

    return decl


def _fix_atomic_specifiers_once(decl):
    """ Performs one 'fix' round of atomic specifiers.
        Returns (modified_decl, found) where found is True iff a fix was made.
    """
    parent = decl
    grandparent = None
    node = decl.type
    while node is not None:
        if isinstance(node, c_ast.Typename) and '_Atomic' in node.quals:
            break
        try:
            grandparent = parent
            parent = node
            node = node.type
        except AttributeError:
            # If we've reached a node without a `type` field, it means we won't
            # find what we're looking for at this point; give up the search
            # and return the original decl unmodified.
            return decl, False

    assert isinstance(parent, c_ast.TypeDecl)
    grandparent.type = node.type
    if '_Atomic' not in node.type.quals:
        node.type.quals.append('_Atomic')
    return decl, True
PK�t�\�e�#�z�zc_ast.pynu�[���#-----------------------------------------------------------------
# ** ATTENTION **
# This code was automatically generated from the file:
# _c_ast.cfg
#
# Do not modify it directly. Modify the configuration file and
# run the generator again.
# ** ** *** ** **
#
# pycparser: c_ast.py
#
# AST Node classes.
#
# Eli Bendersky [https://eli.thegreenplace.net/]
# License: BSD
#-----------------------------------------------------------------


import sys

def _repr(obj):
    """
    Get the representation of an object, with dedicated pprint-like format for lists.
    """
    if isinstance(obj, list):
        return '[' + (',\n '.join((_repr(e).replace('\n', '\n ') for e in obj))) + '\n]'
    else:
        return repr(obj)

class Node(object):
    __slots__ = ()
    """ Abstract base class for AST nodes.
    """
    def __repr__(self):
        """ Generates a python representation of the current node
        """
        result = self.__class__.__name__ + '('

        indent = ''
        separator = ''
        for name in self.__slots__[:-2]:
            result += separator
            result += indent
            result += name + '=' + (_repr(getattr(self, name)).replace('\n', '\n  ' + (' ' * (len(name) + len(self.__class__.__name__)))))

            separator = ','
            indent = '\n ' + (' ' * len(self.__class__.__name__))

        result += indent + ')'

        return result

    def children(self):
        """ A sequence of all children that are Nodes
        """
        pass

    def show(self, buf=sys.stdout, offset=0, attrnames=False, nodenames=False, showcoord=False, _my_node_name=None):
        """ Pretty print the Node and all its attributes and
            children (recursively) to a buffer.

            buf:
                Open IO buffer into which the Node is printed.

            offset:
                Initial offset (amount of leading spaces)

            attrnames:
                True if you want to see the attribute names in
                name=value pairs. False to only see the values.

            nodenames:
                True if you want to see the actual node names
                within their parents.

            showcoord:
                Do you want the coordinates of each Node to be
                displayed.
        """
        lead = ' ' * offset
        if nodenames and _my_node_name is not None:
            buf.write(lead + self.__class__.__name__+ ' <' + _my_node_name + '>: ')
        else:
            buf.write(lead + self.__class__.__name__+ ': ')

        if self.attr_names:
            if attrnames:
                nvlist = [(n, getattr(self,n)) for n in self.attr_names]
                attrstr = ', '.join('%s=%s' % nv for nv in nvlist)
            else:
                vlist = [getattr(self, n) for n in self.attr_names]
                attrstr = ', '.join('%s' % v for v in vlist)
            buf.write(attrstr)

        if showcoord:
            buf.write(' (at %s)' % self.coord)
        buf.write('\n')

        for (child_name, child) in self.children():
            child.show(
                buf,
                offset=offset + 2,
                attrnames=attrnames,
                nodenames=nodenames,
                showcoord=showcoord,
                _my_node_name=child_name)


class NodeVisitor(object):
    """ A base NodeVisitor class for visiting c_ast nodes.
        Subclass it and define your own visit_XXX methods, where
        XXX is the class name you want to visit with these
        methods.

        For example:

        class ConstantVisitor(NodeVisitor):
            def __init__(self):
                self.values = []

            def visit_Constant(self, node):
                self.values.append(node.value)

        Creates a list of values of all the constant nodes
        encountered below the given node. To use it:

        cv = ConstantVisitor()
        cv.visit(node)

        Notes:

        *   generic_visit() will be called for AST nodes for which
            no visit_XXX method was defined.
        *   The children of nodes for which a visit_XXX was
            defined will not be visited - if you need this, call
            generic_visit() on the node.
            You can use:
                NodeVisitor.generic_visit(self, node)
        *   Modeled after Python's own AST visiting facilities
            (the ast module of Python 3.0)
    """

    _method_cache = None

    def visit(self, node):
        """ Visit a node.
        """

        if self._method_cache is None:
            self._method_cache = {}

        visitor = self._method_cache.get(node.__class__.__name__, None)
        if visitor is None:
            method = 'visit_' + node.__class__.__name__
            visitor = getattr(self, method, self.generic_visit)
            self._method_cache[node.__class__.__name__] = visitor

        return visitor(node)

    def generic_visit(self, node):
        """ Called if no explicit visitor function exists for a
            node. Implements preorder visiting of the node.
        """
        for c in node:
            self.visit(c)

class ArrayDecl(Node):
    __slots__ = ('type', 'dim', 'dim_quals', 'coord', '__weakref__')
    def __init__(self, type, dim, dim_quals, coord=None):
        self.type = type
        self.dim = dim
        self.dim_quals = dim_quals
        self.coord = coord

    def children(self):
        nodelist = []
        if self.type is not None: nodelist.append(("type", self.type))
        if self.dim is not None: nodelist.append(("dim", self.dim))
        return tuple(nodelist)

    def __iter__(self):
        if self.type is not None:
            yield self.type
        if self.dim is not None:
            yield self.dim

    attr_names = ('dim_quals', )

class ArrayRef(Node):
    __slots__ = ('name', 'subscript', 'coord', '__weakref__')
    def __init__(self, name, subscript, coord=None):
        self.name = name
        self.subscript = subscript
        self.coord = coord

    def children(self):
        nodelist = []
        if self.name is not None: nodelist.append(("name", self.name))
        if self.subscript is not None: nodelist.append(("subscript", self.subscript))
        return tuple(nodelist)

    def __iter__(self):
        if self.name is not None:
            yield self.name
        if self.subscript is not None:
            yield self.subscript

    attr_names = ()

class Assignment(Node):
    __slots__ = ('op', 'lvalue', 'rvalue', 'coord', '__weakref__')
    def __init__(self, op, lvalue, rvalue, coord=None):
        self.op = op
        self.lvalue = lvalue
        self.rvalue = rvalue
        self.coord = coord

    def children(self):
        nodelist = []
        if self.lvalue is not None: nodelist.append(("lvalue", self.lvalue))
        if self.rvalue is not None: nodelist.append(("rvalue", self.rvalue))
        return tuple(nodelist)

    def __iter__(self):
        if self.lvalue is not None:
            yield self.lvalue
        if self.rvalue is not None:
            yield self.rvalue

    attr_names = ('op', )

class Alignas(Node):
    __slots__ = ('alignment', 'coord', '__weakref__')
    def __init__(self, alignment, coord=None):
        self.alignment = alignment
        self.coord = coord

    def children(self):
        nodelist = []
        if self.alignment is not None: nodelist.append(("alignment", self.alignment))
        return tuple(nodelist)

    def __iter__(self):
        if self.alignment is not None:
            yield self.alignment

    attr_names = ()

class BinaryOp(Node):
    __slots__ = ('op', 'left', 'right', 'coord', '__weakref__')
    def __init__(self, op, left, right, coord=None):
        self.op = op
        self.left = left
        self.right = right
        self.coord = coord

    def children(self):
        nodelist = []
        if self.left is not None: nodelist.append(("left", self.left))
        if self.right is not None: nodelist.append(("right", self.right))
        return tuple(nodelist)

    def __iter__(self):
        if self.left is not None:
            yield self.left
        if self.right is not None:
            yield self.right

    attr_names = ('op', )

class Break(Node):
    __slots__ = ('coord', '__weakref__')
    def __init__(self, coord=None):
        self.coord = coord

    def children(self):
        return ()

    def __iter__(self):
        return
        yield

    attr_names = ()

class Case(Node):
    __slots__ = ('expr', 'stmts', 'coord', '__weakref__')
    def __init__(self, expr, stmts, coord=None):
        self.expr = expr
        self.stmts = stmts
        self.coord = coord

    def children(self):
        nodelist = []
        if self.expr is not None: nodelist.append(("expr", self.expr))
        for i, child in enumerate(self.stmts or []):
            nodelist.append(("stmts[%d]" % i, child))
        return tuple(nodelist)

    def __iter__(self):
        if self.expr is not None:
            yield self.expr
        for child in (self.stmts or []):
            yield child

    attr_names = ()

class Cast(Node):
    __slots__ = ('to_type', 'expr', 'coord', '__weakref__')
    def __init__(self, to_type, expr, coord=None):
        self.to_type = to_type
        self.expr = expr
        self.coord = coord

    def children(self):
        nodelist = []
        if self.to_type is not None: nodelist.append(("to_type", self.to_type))
        if self.expr is not None: nodelist.append(("expr", self.expr))
        return tuple(nodelist)

    def __iter__(self):
        if self.to_type is not None:
            yield self.to_type
        if self.expr is not None:
            yield self.expr

    attr_names = ()

class Compound(Node):
    __slots__ = ('block_items', 'coord', '__weakref__')
    def __init__(self, block_items, coord=None):
        self.block_items = block_items
        self.coord = coord

    def children(self):
        nodelist = []
        for i, child in enumerate(self.block_items or []):
            nodelist.append(("block_items[%d]" % i, child))
        return tuple(nodelist)

    def __iter__(self):
        for child in (self.block_items or []):
            yield child

    attr_names = ()

class CompoundLiteral(Node):
    __slots__ = ('type', 'init', 'coord', '__weakref__')
    def __init__(self, type, init, coord=None):
        self.type = type
        self.init = init
        self.coord = coord

    def children(self):
        nodelist = []
        if self.type is not None: nodelist.append(("type", self.type))
        if self.init is not None: nodelist.append(("init", self.init))
        return tuple(nodelist)

    def __iter__(self):
        if self.type is not None:
            yield self.type
        if self.init is not None:
            yield self.init

    attr_names = ()

class Constant(Node):
    __slots__ = ('type', 'value', 'coord', '__weakref__')
    def __init__(self, type, value, coord=None):
        self.type = type
        self.value = value
        self.coord = coord

    def children(self):
        nodelist = []
        return tuple(nodelist)

    def __iter__(self):
        return
        yield

    attr_names = ('type', 'value', )

class Continue(Node):
    __slots__ = ('coord', '__weakref__')
    def __init__(self, coord=None):
        self.coord = coord

    def children(self):
        return ()

    def __iter__(self):
        return
        yield

    attr_names = ()

class Decl(Node):
    __slots__ = ('name', 'quals', 'align', 'storage', 'funcspec', 'type', 'init', 'bitsize', 'coord', '__weakref__')
    def __init__(self, name, quals, align, storage, funcspec, type, init, bitsize, coord=None):
        self.name = name
        self.quals = quals
        self.align = align
        self.storage = storage
        self.funcspec = funcspec
        self.type = type
        self.init = init
        self.bitsize = bitsize
        self.coord = coord

    def children(self):
        nodelist = []
        if self.type is not None: nodelist.append(("type", self.type))
        if self.init is not None: nodelist.append(("init", self.init))
        if self.bitsize is not None: nodelist.append(("bitsize", self.bitsize))
        return tuple(nodelist)

    def __iter__(self):
        if self.type is not None:
            yield self.type
        if self.init is not None:
            yield self.init
        if self.bitsize is not None:
            yield self.bitsize

    attr_names = ('name', 'quals', 'align', 'storage', 'funcspec', )

class DeclList(Node):
    __slots__ = ('decls', 'coord', '__weakref__')
    def __init__(self, decls, coord=None):
        self.decls = decls
        self.coord = coord

    def children(self):
        nodelist = []
        for i, child in enumerate(self.decls or []):
            nodelist.append(("decls[%d]" % i, child))
        return tuple(nodelist)

    def __iter__(self):
        for child in (self.decls or []):
            yield child

    attr_names = ()

class Default(Node):
    __slots__ = ('stmts', 'coord', '__weakref__')
    def __init__(self, stmts, coord=None):
        self.stmts = stmts
        self.coord = coord

    def children(self):
        nodelist = []
        for i, child in enumerate(self.stmts or []):
            nodelist.append(("stmts[%d]" % i, child))
        return tuple(nodelist)

    def __iter__(self):
        for child in (self.stmts or []):
            yield child

    attr_names = ()

class DoWhile(Node):
    __slots__ = ('cond', 'stmt', 'coord', '__weakref__')
    def __init__(self, cond, stmt, coord=None):
        self.cond = cond
        self.stmt = stmt
        self.coord = coord

    def children(self):
        nodelist = []
        if self.cond is not None: nodelist.append(("cond", self.cond))
        if self.stmt is not None: nodelist.append(("stmt", self.stmt))
        return tuple(nodelist)

    def __iter__(self):
        if self.cond is not None:
            yield self.cond
        if self.stmt is not None:
            yield self.stmt

    attr_names = ()

class EllipsisParam(Node):
    __slots__ = ('coord', '__weakref__')
    def __init__(self, coord=None):
        self.coord = coord

    def children(self):
        return ()

    def __iter__(self):
        return
        yield

    attr_names = ()

class EmptyStatement(Node):
    __slots__ = ('coord', '__weakref__')
    def __init__(self, coord=None):
        self.coord = coord

    def children(self):
        return ()

    def __iter__(self):
        return
        yield

    attr_names = ()

class Enum(Node):
    __slots__ = ('name', 'values', 'coord', '__weakref__')
    def __init__(self, name, values, coord=None):
        self.name = name
        self.values = values
        self.coord = coord

    def children(self):
        nodelist = []
        if self.values is not None: nodelist.append(("values", self.values))
        return tuple(nodelist)

    def __iter__(self):
        if self.values is not None:
            yield self.values

    attr_names = ('name', )

class Enumerator(Node):
    __slots__ = ('name', 'value', 'coord', '__weakref__')
    def __init__(self, name, value, coord=None):
        self.name = name
        self.value = value
        self.coord = coord

    def children(self):
        nodelist = []
        if self.value is not None: nodelist.append(("value", self.value))
        return tuple(nodelist)

    def __iter__(self):
        if self.value is not None:
            yield self.value

    attr_names = ('name', )

class EnumeratorList(Node):
    __slots__ = ('enumerators', 'coord', '__weakref__')
    def __init__(self, enumerators, coord=None):
        self.enumerators = enumerators
        self.coord = coord

    def children(self):
        nodelist = []
        for i, child in enumerate(self.enumerators or []):
            nodelist.append(("enumerators[%d]" % i, child))
        return tuple(nodelist)

    def __iter__(self):
        for child in (self.enumerators or []):
            yield child

    attr_names = ()

class ExprList(Node):
    __slots__ = ('exprs', 'coord', '__weakref__')
    def __init__(self, exprs, coord=None):
        self.exprs = exprs
        self.coord = coord

    def children(self):
        nodelist = []
        for i, child in enumerate(self.exprs or []):
            nodelist.append(("exprs[%d]" % i, child))
        return tuple(nodelist)

    def __iter__(self):
        for child in (self.exprs or []):
            yield child

    attr_names = ()

class FileAST(Node):
    __slots__ = ('ext', 'coord', '__weakref__')
    def __init__(self, ext, coord=None):
        self.ext = ext
        self.coord = coord

    def children(self):
        nodelist = []
        for i, child in enumerate(self.ext or []):
            nodelist.append(("ext[%d]" % i, child))
        return tuple(nodelist)

    def __iter__(self):
        for child in (self.ext or []):
            yield child

    attr_names = ()

class For(Node):
    __slots__ = ('init', 'cond', 'next', 'stmt', 'coord', '__weakref__')
    def __init__(self, init, cond, next, stmt, coord=None):
        self.init = init
        self.cond = cond
        self.next = next
        self.stmt = stmt
        self.coord = coord

    def children(self):
        nodelist = []
        if self.init is not None: nodelist.append(("init", self.init))
        if self.cond is not None: nodelist.append(("cond", self.cond))
        if self.next is not None: nodelist.append(("next", self.next))
        if self.stmt is not None: nodelist.append(("stmt", self.stmt))
        return tuple(nodelist)

    def __iter__(self):
        if self.init is not None:
            yield self.init
        if self.cond is not None:
            yield self.cond
        if self.next is not None:
            yield self.next
        if self.stmt is not None:
            yield self.stmt

    attr_names = ()

class FuncCall(Node):
    __slots__ = ('name', 'args', 'coord', '__weakref__')
    def __init__(self, name, args, coord=None):
        self.name = name
        self.args = args
        self.coord = coord

    def children(self):
        nodelist = []
        if self.name is not None: nodelist.append(("name", self.name))
        if self.args is not None: nodelist.append(("args", self.args))
        return tuple(nodelist)

    def __iter__(self):
        if self.name is not None:
            yield self.name
        if self.args is not None:
            yield self.args

    attr_names = ()

class FuncDecl(Node):
    __slots__ = ('args', 'type', 'coord', '__weakref__')
    def __init__(self, args, type, coord=None):
        self.args = args
        self.type = type
        self.coord = coord

    def children(self):
        nodelist = []
        if self.args is not None: nodelist.append(("args", self.args))
        if self.type is not None: nodelist.append(("type", self.type))
        return tuple(nodelist)

    def __iter__(self):
        if self.args is not None:
            yield self.args
        if self.type is not None:
            yield self.type

    attr_names = ()

class FuncDef(Node):
    __slots__ = ('decl', 'param_decls', 'body', 'coord', '__weakref__')
    def __init__(self, decl, param_decls, body, coord=None):
        self.decl = decl
        self.param_decls = param_decls
        self.body = body
        self.coord = coord

    def children(self):
        nodelist = []
        if self.decl is not None: nodelist.append(("decl", self.decl))
        if self.body is not None: nodelist.append(("body", self.body))
        for i, child in enumerate(self.param_decls or []):
            nodelist.append(("param_decls[%d]" % i, child))
        return tuple(nodelist)

    def __iter__(self):
        if self.decl is not None:
            yield self.decl
        if self.body is not None:
            yield self.body
        for child in (self.param_decls or []):
            yield child

    attr_names = ()

class Goto(Node):
    __slots__ = ('name', 'coord', '__weakref__')
    def __init__(self, name, coord=None):
        self.name = name
        self.coord = coord

    def children(self):
        nodelist = []
        return tuple(nodelist)

    def __iter__(self):
        return
        yield

    attr_names = ('name', )

class ID(Node):
    __slots__ = ('name', 'coord', '__weakref__')
    def __init__(self, name, coord=None):
        self.name = name
        self.coord = coord

    def children(self):
        nodelist = []
        return tuple(nodelist)

    def __iter__(self):
        return
        yield

    attr_names = ('name', )

class IdentifierType(Node):
    __slots__ = ('names', 'coord', '__weakref__')
    def __init__(self, names, coord=None):
        self.names = names
        self.coord = coord

    def children(self):
        nodelist = []
        return tuple(nodelist)

    def __iter__(self):
        return
        yield

    attr_names = ('names', )

class If(Node):
    __slots__ = ('cond', 'iftrue', 'iffalse', 'coord', '__weakref__')
    def __init__(self, cond, iftrue, iffalse, coord=None):
        self.cond = cond
        self.iftrue = iftrue
        self.iffalse = iffalse
        self.coord = coord

    def children(self):
        nodelist = []
        if self.cond is not None: nodelist.append(("cond", self.cond))
        if self.iftrue is not None: nodelist.append(("iftrue", self.iftrue))
        if self.iffalse is not None: nodelist.append(("iffalse", self.iffalse))
        return tuple(nodelist)

    def __iter__(self):
        if self.cond is not None:
            yield self.cond
        if self.iftrue is not None:
            yield self.iftrue
        if self.iffalse is not None:
            yield self.iffalse

    attr_names = ()

class InitList(Node):
    __slots__ = ('exprs', 'coord', '__weakref__')
    def __init__(self, exprs, coord=None):
        self.exprs = exprs
        self.coord = coord

    def children(self):
        nodelist = []
        for i, child in enumerate(self.exprs or []):
            nodelist.append(("exprs[%d]" % i, child))
        return tuple(nodelist)

    def __iter__(self):
        for child in (self.exprs or []):
            yield child

    attr_names = ()

class Label(Node):
    __slots__ = ('name', 'stmt', 'coord', '__weakref__')
    def __init__(self, name, stmt, coord=None):
        self.name = name
        self.stmt = stmt
        self.coord = coord

    def children(self):
        nodelist = []
        if self.stmt is not None: nodelist.append(("stmt", self.stmt))
        return tuple(nodelist)

    def __iter__(self):
        if self.stmt is not None:
            yield self.stmt

    attr_names = ('name', )

class NamedInitializer(Node):
    __slots__ = ('name', 'expr', 'coord', '__weakref__')
    def __init__(self, name, expr, coord=None):
        self.name = name
        self.expr = expr
        self.coord = coord

    def children(self):
        nodelist = []
        if self.expr is not None: nodelist.append(("expr", self.expr))
        for i, child in enumerate(self.name or []):
            nodelist.append(("name[%d]" % i, child))
        return tuple(nodelist)

    def __iter__(self):
        if self.expr is not None:
            yield self.expr
        for child in (self.name or []):
            yield child

    attr_names = ()

class ParamList(Node):
    __slots__ = ('params', 'coord', '__weakref__')
    def __init__(self, params, coord=None):
        self.params = params
        self.coord = coord

    def children(self):
        nodelist = []
        for i, child in enumerate(self.params or []):
            nodelist.append(("params[%d]" % i, child))
        return tuple(nodelist)

    def __iter__(self):
        for child in (self.params or []):
            yield child

    attr_names = ()

class PtrDecl(Node):
    __slots__ = ('quals', 'type', 'coord', '__weakref__')
    def __init__(self, quals, type, coord=None):
        self.quals = quals
        self.type = type
        self.coord = coord

    def children(self):
        nodelist = []
        if self.type is not None: nodelist.append(("type", self.type))
        return tuple(nodelist)

    def __iter__(self):
        if self.type is not None:
            yield self.type

    attr_names = ('quals', )

class Return(Node):
    __slots__ = ('expr', 'coord', '__weakref__')
    def __init__(self, expr, coord=None):
        self.expr = expr
        self.coord = coord

    def children(self):
        nodelist = []
        if self.expr is not None: nodelist.append(("expr", self.expr))
        return tuple(nodelist)

    def __iter__(self):
        if self.expr is not None:
            yield self.expr

    attr_names = ()

class StaticAssert(Node):
    __slots__ = ('cond', 'message', 'coord', '__weakref__')
    def __init__(self, cond, message, coord=None):
        self.cond = cond
        self.message = message
        self.coord = coord

    def children(self):
        nodelist = []
        if self.cond is not None: nodelist.append(("cond", self.cond))
        if self.message is not None: nodelist.append(("message", self.message))
        return tuple(nodelist)

    def __iter__(self):
        if self.cond is not None:
            yield self.cond
        if self.message is not None:
            yield self.message

    attr_names = ()

class Struct(Node):
    __slots__ = ('name', 'decls', 'coord', '__weakref__')
    def __init__(self, name, decls, coord=None):
        self.name = name
        self.decls = decls
        self.coord = coord

    def children(self):
        nodelist = []
        for i, child in enumerate(self.decls or []):
            nodelist.append(("decls[%d]" % i, child))
        return tuple(nodelist)

    def __iter__(self):
        for child in (self.decls or []):
            yield child

    attr_names = ('name', )

class StructRef(Node):
    __slots__ = ('name', 'type', 'field', 'coord', '__weakref__')
    def __init__(self, name, type, field, coord=None):
        self.name = name
        self.type = type
        self.field = field
        self.coord = coord

    def children(self):
        nodelist = []
        if self.name is not None: nodelist.append(("name", self.name))
        if self.field is not None: nodelist.append(("field", self.field))
        return tuple(nodelist)

    def __iter__(self):
        if self.name is not None:
            yield self.name
        if self.field is not None:
            yield self.field

    attr_names = ('type', )

class Switch(Node):
    __slots__ = ('cond', 'stmt', 'coord', '__weakref__')
    def __init__(self, cond, stmt, coord=None):
        self.cond = cond
        self.stmt = stmt
        self.coord = coord

    def children(self):
        nodelist = []
        if self.cond is not None: nodelist.append(("cond", self.cond))
        if self.stmt is not None: nodelist.append(("stmt", self.stmt))
        return tuple(nodelist)

    def __iter__(self):
        if self.cond is not None:
            yield self.cond
        if self.stmt is not None:
            yield self.stmt

    attr_names = ()

class TernaryOp(Node):
    __slots__ = ('cond', 'iftrue', 'iffalse', 'coord', '__weakref__')
    def __init__(self, cond, iftrue, iffalse, coord=None):
        self.cond = cond
        self.iftrue = iftrue
        self.iffalse = iffalse
        self.coord = coord

    def children(self):
        nodelist = []
        if self.cond is not None: nodelist.append(("cond", self.cond))
        if self.iftrue is not None: nodelist.append(("iftrue", self.iftrue))
        if self.iffalse is not None: nodelist.append(("iffalse", self.iffalse))
        return tuple(nodelist)

    def __iter__(self):
        if self.cond is not None:
            yield self.cond
        if self.iftrue is not None:
            yield self.iftrue
        if self.iffalse is not None:
            yield self.iffalse

    attr_names = ()

class TypeDecl(Node):
    __slots__ = ('declname', 'quals', 'align', 'type', 'coord', '__weakref__')
    def __init__(self, declname, quals, align, type, coord=None):
        self.declname = declname
        self.quals = quals
        self.align = align
        self.type = type
        self.coord = coord

    def children(self):
        nodelist = []
        if self.type is not None: nodelist.append(("type", self.type))
        return tuple(nodelist)

    def __iter__(self):
        if self.type is not None:
            yield self.type

    attr_names = ('declname', 'quals', 'align', )

class Typedef(Node):
    __slots__ = ('name', 'quals', 'storage', 'type', 'coord', '__weakref__')
    def __init__(self, name, quals, storage, type, coord=None):
        self.name = name
        self.quals = quals
        self.storage = storage
        self.type = type
        self.coord = coord

    def children(self):
        nodelist = []
        if self.type is not None: nodelist.append(("type", self.type))
        return tuple(nodelist)

    def __iter__(self):
        if self.type is not None:
            yield self.type

    attr_names = ('name', 'quals', 'storage', )

class Typename(Node):
    __slots__ = ('name', 'quals', 'align', 'type', 'coord', '__weakref__')
    def __init__(self, name, quals, align, type, coord=None):
        self.name = name
        self.quals = quals
        self.align = align
        self.type = type
        self.coord = coord

    def children(self):
        nodelist = []
        if self.type is not None: nodelist.append(("type", self.type))
        return tuple(nodelist)

    def __iter__(self):
        if self.type is not None:
            yield self.type

    attr_names = ('name', 'quals', 'align', )

class UnaryOp(Node):
    __slots__ = ('op', 'expr', 'coord', '__weakref__')
    def __init__(self, op, expr, coord=None):
        self.op = op
        self.expr = expr
        self.coord = coord

    def children(self):
        nodelist = []
        if self.expr is not None: nodelist.append(("expr", self.expr))
        return tuple(nodelist)

    def __iter__(self):
        if self.expr is not None:
            yield self.expr

    attr_names = ('op', )

class Union(Node):
    __slots__ = ('name', 'decls', 'coord', '__weakref__')
    def __init__(self, name, decls, coord=None):
        self.name = name
        self.decls = decls
        self.coord = coord

    def children(self):
        nodelist = []
        for i, child in enumerate(self.decls or []):
            nodelist.append(("decls[%d]" % i, child))
        return tuple(nodelist)

    def __iter__(self):
        for child in (self.decls or []):
            yield child

    attr_names = ('name', )

class While(Node):
    __slots__ = ('cond', 'stmt', 'coord', '__weakref__')
    def __init__(self, cond, stmt, coord=None):
        self.cond = cond
        self.stmt = stmt
        self.coord = coord

    def children(self):
        nodelist = []
        if self.cond is not None: nodelist.append(("cond", self.cond))
        if self.stmt is not None: nodelist.append(("stmt", self.stmt))
        return tuple(nodelist)

    def __iter__(self):
        if self.cond is not None:
            yield self.cond
        if self.stmt is not None:
            yield self.stmt

    attr_names = ()

class Pragma(Node):
    __slots__ = ('string', 'coord', '__weakref__')
    def __init__(self, string, coord=None):
        self.string = string
        self.coord = coord

    def children(self):
        nodelist = []
        return tuple(nodelist)

    def __iter__(self):
        return
        yield

    attr_names = ('string', )

PK�t�\"���~E~Ec_generator.pynu�[���#------------------------------------------------------------------------------
# pycparser: c_generator.py
#
# C code generator from pycparser AST nodes.
#
# Eli Bendersky [https://eli.thegreenplace.net/]
# License: BSD
#------------------------------------------------------------------------------
from . import c_ast


class CGenerator(object):
    """ Uses the same visitor pattern as c_ast.NodeVisitor, but modified to
        return a value from each visit method, using string accumulation in
        generic_visit.
    """
    def __init__(self, reduce_parentheses=False):
        """ Constructs C-code generator

            reduce_parentheses:
                if True, eliminates needless parentheses on binary operators
        """
        # Statements start with indentation of self.indent_level spaces, using
        # the _make_indent method.
        self.indent_level = 0
        self.reduce_parentheses = reduce_parentheses

    def _make_indent(self):
        return ' ' * self.indent_level

    def visit(self, node):
        method = 'visit_' + node.__class__.__name__
        return getattr(self, method, self.generic_visit)(node)

    def generic_visit(self, node):
        if node is None:
            return ''
        else:
            return ''.join(self.visit(c) for c_name, c in node.children())

    def visit_Constant(self, n):
        return n.value

    def visit_ID(self, n):
        return n.name

    def visit_Pragma(self, n):
        ret = '#pragma'
        if n.string:
            ret += ' ' + n.string
        return ret

    def visit_ArrayRef(self, n):
        arrref = self._parenthesize_unless_simple(n.name)
        return arrref + '[' + self.visit(n.subscript) + ']'

    def visit_StructRef(self, n):
        sref = self._parenthesize_unless_simple(n.name)
        return sref + n.type + self.visit(n.field)

    def visit_FuncCall(self, n):
        fref = self._parenthesize_unless_simple(n.name)
        return fref + '(' + self.visit(n.args) + ')'

    def visit_UnaryOp(self, n):
        if n.op == 'sizeof':
            # Always parenthesize the argument of sizeof since it can be
            # a name.
            return 'sizeof(%s)' % self.visit(n.expr)
        else:
            operand = self._parenthesize_unless_simple(n.expr)
            if n.op == 'p++':
                return '%s++' % operand
            elif n.op == 'p--':
                return '%s--' % operand
            else:
                return '%s%s' % (n.op, operand)

    # Precedence map of binary operators:
    precedence_map = {
        # Should be in sync with c_parser.CParser.precedence
        # Higher numbers are stronger binding
        '||': 0,  # weakest binding
        '&&': 1,
        '|': 2,
        '^': 3,
        '&': 4,
        '==': 5, '!=': 5,
        '>': 6, '>=': 6, '<': 6, '<=': 6,
        '>>': 7, '<<': 7,
        '+': 8, '-': 8,
        '*': 9, '/': 9, '%': 9  # strongest binding
    }

    def visit_BinaryOp(self, n):
        # Note: all binary operators are left-to-right associative
        #
        # If `n.left.op` has a stronger or equally binding precedence in
        # comparison to `n.op`, no parenthesis are needed for the left:
        # e.g., `(a*b) + c` is equivalent to `a*b + c`, as well as
        #       `(a+b) - c` is equivalent to `a+b - c` (same precedence).
        # If the left operator is weaker binding than the current, then
        # parentheses are necessary:
        # e.g., `(a+b) * c` is NOT equivalent to `a+b * c`.
        lval_str = self._parenthesize_if(
            n.left,
            lambda d: not (self._is_simple_node(d) or
                      self.reduce_parentheses and isinstance(d, c_ast.BinaryOp) and
                      self.precedence_map[d.op] >= self.precedence_map[n.op]))
        # If `n.right.op` has a stronger -but not equal- binding precedence,
        # parenthesis can be omitted on the right:
        # e.g., `a + (b*c)` is equivalent to `a + b*c`.
        # If the right operator is weaker or equally binding, then parentheses
        # are necessary:
        # e.g., `a * (b+c)` is NOT equivalent to `a * b+c` and
        #       `a - (b+c)` is NOT equivalent to `a - b+c` (same precedence).
        rval_str = self._parenthesize_if(
            n.right,
            lambda d: not (self._is_simple_node(d) or
                      self.reduce_parentheses and isinstance(d, c_ast.BinaryOp) and
                      self.precedence_map[d.op] > self.precedence_map[n.op]))
        return '%s %s %s' % (lval_str, n.op, rval_str)

    def visit_Assignment(self, n):
        rval_str = self._parenthesize_if(
                            n.rvalue,
                            lambda n: isinstance(n, c_ast.Assignment))
        return '%s %s %s' % (self.visit(n.lvalue), n.op, rval_str)

    def visit_IdentifierType(self, n):
        return ' '.join(n.names)

    def _visit_expr(self, n):
        if isinstance(n, c_ast.InitList):
            return '{' + self.visit(n) + '}'
        elif isinstance(n, (c_ast.ExprList, c_ast.Compound)):
            return '(' + self.visit(n) + ')'
        else:
            return self.visit(n)

    def visit_Decl(self, n, no_type=False):
        # no_type is used when a Decl is part of a DeclList, where the type is
        # explicitly only for the first declaration in a list.
        #
        s = n.name if no_type else self._generate_decl(n)
        if n.bitsize: s += ' : ' + self.visit(n.bitsize)
        if n.init:
            s += ' = ' + self._visit_expr(n.init)
        return s

    def visit_DeclList(self, n):
        s = self.visit(n.decls[0])
        if len(n.decls) > 1:
            s += ', ' + ', '.join(self.visit_Decl(decl, no_type=True)
                                    for decl in n.decls[1:])
        return s

    def visit_Typedef(self, n):
        s = ''
        if n.storage: s += ' '.join(n.storage) + ' '
        s += self._generate_type(n.type)
        return s

    def visit_Cast(self, n):
        s = '(' + self._generate_type(n.to_type, emit_declname=False) + ')'
        return s + ' ' + self._parenthesize_unless_simple(n.expr)

    def visit_ExprList(self, n):
        visited_subexprs = []
        for expr in n.exprs:
            visited_subexprs.append(self._visit_expr(expr))
        return ', '.join(visited_subexprs)

    def visit_InitList(self, n):
        visited_subexprs = []
        for expr in n.exprs:
            visited_subexprs.append(self._visit_expr(expr))
        return ', '.join(visited_subexprs)

    def visit_Enum(self, n):
        return self._generate_struct_union_enum(n, name='enum')

    def visit_Alignas(self, n):
        return '_Alignas({})'.format(self.visit(n.alignment))

    def visit_Enumerator(self, n):
        if not n.value:
            return '{indent}{name},\n'.format(
                indent=self._make_indent(),
                name=n.name,
            )
        else:
            return '{indent}{name} = {value},\n'.format(
                indent=self._make_indent(),
                name=n.name,
                value=self.visit(n.value),
            )

    def visit_FuncDef(self, n):
        decl = self.visit(n.decl)
        self.indent_level = 0
        body = self.visit(n.body)
        if n.param_decls:
            knrdecls = ';\n'.join(self.visit(p) for p in n.param_decls)
            return decl + '\n' + knrdecls + ';\n' + body + '\n'
        else:
            return decl + '\n' + body + '\n'

    def visit_FileAST(self, n):
        s = ''
        for ext in n.ext:
            if isinstance(ext, c_ast.FuncDef):
                s += self.visit(ext)
            elif isinstance(ext, c_ast.Pragma):
                s += self.visit(ext) + '\n'
            else:
                s += self.visit(ext) + ';\n'
        return s

    def visit_Compound(self, n):
        s = self._make_indent() + '{\n'
        self.indent_level += 2
        if n.block_items:
            s += ''.join(self._generate_stmt(stmt) for stmt in n.block_items)
        self.indent_level -= 2
        s += self._make_indent() + '}\n'
        return s

    def visit_CompoundLiteral(self, n):
        return '(' + self.visit(n.type) + '){' + self.visit(n.init) + '}'


    def visit_EmptyStatement(self, n):
        return ';'

    def visit_ParamList(self, n):
        return ', '.join(self.visit(param) for param in n.params)

    def visit_Return(self, n):
        s = 'return'
        if n.expr: s += ' ' + self.visit(n.expr)
        return s + ';'

    def visit_Break(self, n):
        return 'break;'

    def visit_Continue(self, n):
        return 'continue;'

    def visit_TernaryOp(self, n):
        s  = '(' + self._visit_expr(n.cond) + ') ? '
        s += '(' + self._visit_expr(n.iftrue) + ') : '
        s += '(' + self._visit_expr(n.iffalse) + ')'
        return s

    def visit_If(self, n):
        s = 'if ('
        if n.cond: s += self.visit(n.cond)
        s += ')\n'
        s += self._generate_stmt(n.iftrue, add_indent=True)
        if n.iffalse:
            s += self._make_indent() + 'else\n'
            s += self._generate_stmt(n.iffalse, add_indent=True)
        return s

    def visit_For(self, n):
        s = 'for ('
        if n.init: s += self.visit(n.init)
        s += ';'
        if n.cond: s += ' ' + self.visit(n.cond)
        s += ';'
        if n.next: s += ' ' + self.visit(n.next)
        s += ')\n'
        s += self._generate_stmt(n.stmt, add_indent=True)
        return s

    def visit_While(self, n):
        s = 'while ('
        if n.cond: s += self.visit(n.cond)
        s += ')\n'
        s += self._generate_stmt(n.stmt, add_indent=True)
        return s

    def visit_DoWhile(self, n):
        s = 'do\n'
        s += self._generate_stmt(n.stmt, add_indent=True)
        s += self._make_indent() + 'while ('
        if n.cond: s += self.visit(n.cond)
        s += ');'
        return s

    def visit_StaticAssert(self, n):
        s = '_Static_assert('
        s += self.visit(n.cond)
        if n.message:
            s += ','
            s += self.visit(n.message)
        s += ')'
        return s

    def visit_Switch(self, n):
        s = 'switch (' + self.visit(n.cond) + ')\n'
        s += self._generate_stmt(n.stmt, add_indent=True)
        return s

    def visit_Case(self, n):
        s = 'case ' + self.visit(n.expr) + ':\n'
        for stmt in n.stmts:
            s += self._generate_stmt(stmt, add_indent=True)
        return s

    def visit_Default(self, n):
        s = 'default:\n'
        for stmt in n.stmts:
            s += self._generate_stmt(stmt, add_indent=True)
        return s

    def visit_Label(self, n):
        return n.name + ':\n' + self._generate_stmt(n.stmt)

    def visit_Goto(self, n):
        return 'goto ' + n.name + ';'

    def visit_EllipsisParam(self, n):
        return '...'

    def visit_Struct(self, n):
        return self._generate_struct_union_enum(n, 'struct')

    def visit_Typename(self, n):
        return self._generate_type(n.type)

    def visit_Union(self, n):
        return self._generate_struct_union_enum(n, 'union')

    def visit_NamedInitializer(self, n):
        s = ''
        for name in n.name:
            if isinstance(name, c_ast.ID):
                s += '.' + name.name
            else:
                s += '[' + self.visit(name) + ']'
        s += ' = ' + self._visit_expr(n.expr)
        return s

    def visit_FuncDecl(self, n):
        return self._generate_type(n)

    def visit_ArrayDecl(self, n):
        return self._generate_type(n, emit_declname=False)

    def visit_TypeDecl(self, n):
        return self._generate_type(n, emit_declname=False)

    def visit_PtrDecl(self, n):
        return self._generate_type(n, emit_declname=False)

    def _generate_struct_union_enum(self, n, name):
        """ Generates code for structs, unions, and enums. name should be
            'struct', 'union', or 'enum'.
        """
        if name in ('struct', 'union'):
            members = n.decls
            body_function = self._generate_struct_union_body
        else:
            assert name == 'enum'
            members = None if n.values is None else n.values.enumerators
            body_function = self._generate_enum_body
        s = name + ' ' + (n.name or '')
        if members is not None:
            # None means no members
            # Empty sequence means an empty list of members
            s += '\n'
            s += self._make_indent()
            self.indent_level += 2
            s += '{\n'
            s += body_function(members)
            self.indent_level -= 2
            s += self._make_indent() + '}'
        return s

    def _generate_struct_union_body(self, members):
        return ''.join(self._generate_stmt(decl) for decl in members)

    def _generate_enum_body(self, members):
        # `[:-2] + '\n'` removes the final `,` from the enumerator list
        return ''.join(self.visit(value) for value in members)[:-2] + '\n'

    def _generate_stmt(self, n, add_indent=False):
        """ Generation from a statement node. This method exists as a wrapper
            for individual visit_* methods to handle different treatment of
            some statements in this context.
        """
        typ = type(n)
        if add_indent: self.indent_level += 2
        indent = self._make_indent()
        if add_indent: self.indent_level -= 2

        if typ in (
                c_ast.Decl, c_ast.Assignment, c_ast.Cast, c_ast.UnaryOp,
                c_ast.BinaryOp, c_ast.TernaryOp, c_ast.FuncCall, c_ast.ArrayRef,
                c_ast.StructRef, c_ast.Constant, c_ast.ID, c_ast.Typedef,
                c_ast.ExprList):
            # These can also appear in an expression context so no semicolon
            # is added to them automatically
            #
            return indent + self.visit(n) + ';\n'
        elif typ in (c_ast.Compound,):
            # No extra indentation required before the opening brace of a
            # compound - because it consists of multiple lines it has to
            # compute its own indentation.
            #
            return self.visit(n)
        elif typ in (c_ast.If,):
            return indent + self.visit(n)
        else:
            return indent + self.visit(n) + '\n'

    def _generate_decl(self, n):
        """ Generation from a Decl node.
        """
        s = ''
        if n.funcspec: s = ' '.join(n.funcspec) + ' '
        if n.storage: s += ' '.join(n.storage) + ' '
        if n.align: s += self.visit(n.align[0]) + ' '
        s += self._generate_type(n.type)
        return s

    def _generate_type(self, n, modifiers=[], emit_declname = True):
        """ Recursive generation from a type node. n is the type node.
            modifiers collects the PtrDecl, ArrayDecl and FuncDecl modifiers
            encountered on the way down to a TypeDecl, to allow proper
            generation from it.
        """
        typ = type(n)
        #~ print(n, modifiers)

        if typ == c_ast.TypeDecl:
            s = ''
            if n.quals: s += ' '.join(n.quals) + ' '
            s += self.visit(n.type)

            nstr = n.declname if n.declname and emit_declname else ''
            # Resolve modifiers.
            # Wrap in parens to distinguish pointer to array and pointer to
            # function syntax.
            #
            for i, modifier in enumerate(modifiers):
                if isinstance(modifier, c_ast.ArrayDecl):
                    if (i != 0 and
                        isinstance(modifiers[i - 1], c_ast.PtrDecl)):
                            nstr = '(' + nstr + ')'
                    nstr += '['
                    if modifier.dim_quals:
                        nstr += ' '.join(modifier.dim_quals) + ' '
                    nstr += self.visit(modifier.dim) + ']'
                elif isinstance(modifier, c_ast.FuncDecl):
                    if (i != 0 and
                        isinstance(modifiers[i - 1], c_ast.PtrDecl)):
                            nstr = '(' + nstr + ')'
                    nstr += '(' + self.visit(modifier.args) + ')'
                elif isinstance(modifier, c_ast.PtrDecl):
                    if modifier.quals:
                        nstr = '* %s%s' % (' '.join(modifier.quals),
                                           ' ' + nstr if nstr else '')
                    else:
                        nstr = '*' + nstr
            if nstr: s += ' ' + nstr
            return s
        elif typ == c_ast.Decl:
            return self._generate_decl(n.type)
        elif typ == c_ast.Typename:
            return self._generate_type(n.type, emit_declname = emit_declname)
        elif typ == c_ast.IdentifierType:
            return ' '.join(n.names) + ' '
        elif typ in (c_ast.ArrayDecl, c_ast.PtrDecl, c_ast.FuncDecl):
            return self._generate_type(n.type, modifiers + [n],
                                       emit_declname = emit_declname)
        else:
            return self.visit(n)

    def _parenthesize_if(self, n, condition):
        """ Visits 'n' and returns its string representation, parenthesized
            if the condition function applied to the node returns True.
        """
        s = self._visit_expr(n)
        if condition(n):
            return '(' + s + ')'
        else:
            return s

    def _parenthesize_unless_simple(self, n):
        """ Common use case for _parenthesize_if
        """
        return self._parenthesize_if(n, lambda d: not self._is_simple_node(d))

    def _is_simple_node(self, n):
        """ Returns True for nodes that are "simple" - i.e. nodes that always
            have higher precedence than operators.
        """
        return isinstance(n, (c_ast.Constant, c_ast.ID, c_ast.ArrayRef,
                              c_ast.StructRef, c_ast.FuncCall))
PK�t�\��@E@E
c_lexer.pynu�[���#------------------------------------------------------------------------------
# pycparser: c_lexer.py
#
# CLexer class: lexer for the C language
#
# Eli Bendersky [https://eli.thegreenplace.net/]
# License: BSD
#------------------------------------------------------------------------------
import re

from .ply import lex
from .ply.lex import TOKEN


class CLexer(object):
    """ A lexer for the C language. After building it, set the
        input text with input(), and call token() to get new
        tokens.

        The public attribute filename can be set to an initial
        filename, but the lexer will update it upon #line
        directives.
    """
    def __init__(self, error_func, on_lbrace_func, on_rbrace_func,
                 type_lookup_func):
        """ Create a new Lexer.

            error_func:
                An error function. Will be called with an error
                message, line and column as arguments, in case of
                an error during lexing.

            on_lbrace_func, on_rbrace_func:
                Called when an LBRACE or RBRACE is encountered
                (likely to push/pop type_lookup_func's scope)

            type_lookup_func:
                A type lookup function. Given a string, it must
                return True IFF this string is a name of a type
                that was defined with a typedef earlier.
        """
        self.error_func = error_func
        self.on_lbrace_func = on_lbrace_func
        self.on_rbrace_func = on_rbrace_func
        self.type_lookup_func = type_lookup_func
        self.filename = ''

        # Keeps track of the last token returned from self.token()
        self.last_token = None

        # Allow either "# line" or "# <num>" to support GCC's
        # cpp output
        #
        self.line_pattern = re.compile(r'([ \t]*line\W)|([ \t]*\d+)')
        self.pragma_pattern = re.compile(r'[ \t]*pragma\W')

    def build(self, **kwargs):
        """ Builds the lexer from the specification. Must be
            called after the lexer object is created.

            This method exists separately, because the PLY
            manual warns against calling lex.lex inside
            __init__
        """
        self.lexer = lex.lex(object=self, **kwargs)

    def reset_lineno(self):
        """ Resets the internal line number counter of the lexer.
        """
        self.lexer.lineno = 1

    def input(self, text):
        self.lexer.input(text)

    def token(self):
        self.last_token = self.lexer.token()
        return self.last_token

    def find_tok_column(self, token):
        """ Find the column of the token in its line.
        """
        last_cr = self.lexer.lexdata.rfind('\n', 0, token.lexpos)
        return token.lexpos - last_cr

    ######################--   PRIVATE   --######################

    ##
    ## Internal auxiliary methods
    ##
    def _error(self, msg, token):
        location = self._make_tok_location(token)
        self.error_func(msg, location[0], location[1])
        self.lexer.skip(1)

    def _make_tok_location(self, token):
        return (token.lineno, self.find_tok_column(token))

    ##
    ## Reserved keywords
    ##
    keywords = (
        'AUTO', 'BREAK', 'CASE', 'CHAR', 'CONST',
        'CONTINUE', 'DEFAULT', 'DO', 'DOUBLE', 'ELSE', 'ENUM', 'EXTERN',
        'FLOAT', 'FOR', 'GOTO', 'IF', 'INLINE', 'INT', 'LONG',
        'REGISTER', 'OFFSETOF',
        'RESTRICT', 'RETURN', 'SHORT', 'SIGNED', 'SIZEOF', 'STATIC', 'STRUCT',
        'SWITCH', 'TYPEDEF', 'UNION', 'UNSIGNED', 'VOID',
        'VOLATILE', 'WHILE', '__INT128',
    )

    keywords_new = (
        '_BOOL', '_COMPLEX',
        '_NORETURN', '_THREAD_LOCAL', '_STATIC_ASSERT',
        '_ATOMIC', '_ALIGNOF', '_ALIGNAS',
        '_PRAGMA',
        )

    keyword_map = {}

    for keyword in keywords:
        keyword_map[keyword.lower()] = keyword

    for keyword in keywords_new:
        keyword_map[keyword[:2].upper() + keyword[2:].lower()] = keyword

    ##
    ## All the tokens recognized by the lexer
    ##
    tokens = keywords + keywords_new + (
        # Identifiers
        'ID',

        # Type identifiers (identifiers previously defined as
        # types with typedef)
        'TYPEID',

        # constants
        'INT_CONST_DEC', 'INT_CONST_OCT', 'INT_CONST_HEX', 'INT_CONST_BIN', 'INT_CONST_CHAR',
        'FLOAT_CONST', 'HEX_FLOAT_CONST',
        'CHAR_CONST',
        'WCHAR_CONST',
        'U8CHAR_CONST',
        'U16CHAR_CONST',
        'U32CHAR_CONST',

        # String literals
        'STRING_LITERAL',
        'WSTRING_LITERAL',
        'U8STRING_LITERAL',
        'U16STRING_LITERAL',
        'U32STRING_LITERAL',

        # Operators
        'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'MOD',
        'OR', 'AND', 'NOT', 'XOR', 'LSHIFT', 'RSHIFT',
        'LOR', 'LAND', 'LNOT',
        'LT', 'LE', 'GT', 'GE', 'EQ', 'NE',

        # Assignment
        'EQUALS', 'TIMESEQUAL', 'DIVEQUAL', 'MODEQUAL',
        'PLUSEQUAL', 'MINUSEQUAL',
        'LSHIFTEQUAL','RSHIFTEQUAL', 'ANDEQUAL', 'XOREQUAL',
        'OREQUAL',

        # Increment/decrement
        'PLUSPLUS', 'MINUSMINUS',

        # Structure dereference (->)
        'ARROW',

        # Conditional operator (?)
        'CONDOP',

        # Delimiters
        'LPAREN', 'RPAREN',         # ( )
        'LBRACKET', 'RBRACKET',     # [ ]
        'LBRACE', 'RBRACE',         # { }
        'COMMA', 'PERIOD',          # . ,
        'SEMI', 'COLON',            # ; :

        # Ellipsis (...)
        'ELLIPSIS',

        # pre-processor
        'PPHASH',       # '#'
        'PPPRAGMA',     # 'pragma'
        'PPPRAGMASTR',
    )

    ##
    ## Regexes for use in tokens
    ##
    ##

    # valid C identifiers (K&R2: A.2.3), plus '$' (supported by some compilers)
    identifier = r'[a-zA-Z_$][0-9a-zA-Z_$]*'

    hex_prefix = '0[xX]'
    hex_digits = '[0-9a-fA-F]+'
    bin_prefix = '0[bB]'
    bin_digits = '[01]+'

    # integer constants (K&R2: A.2.5.1)
    integer_suffix_opt = r'(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?'
    decimal_constant = '(0'+integer_suffix_opt+')|([1-9][0-9]*'+integer_suffix_opt+')'
    octal_constant = '0[0-7]*'+integer_suffix_opt
    hex_constant = hex_prefix+hex_digits+integer_suffix_opt
    bin_constant = bin_prefix+bin_digits+integer_suffix_opt

    bad_octal_constant = '0[0-7]*[89]'

    # comments are not supported
    unsupported_c_style_comment = r'\/\*'
    unsupported_cxx_style_comment = r'\/\/'

    # character constants (K&R2: A.2.5.2)
    # Note: a-zA-Z and '.-~^_!=&;,' are allowed as escape chars to support #line
    # directives with Windows paths as filenames (..\..\dir\file)
    # For the same reason, decimal_escape allows all digit sequences. We want to
    # parse all correct code, even if it means to sometimes parse incorrect
    # code.
    #
    # The original regexes were taken verbatim from the C syntax definition,
    # and were later modified to avoid worst-case exponential running time.
    #
    #   simple_escape = r"""([a-zA-Z._~!=&\^\-\\?'"])"""
    #   decimal_escape = r"""(\d+)"""
    #   hex_escape = r"""(x[0-9a-fA-F]+)"""
    #   bad_escape = r"""([\\][^a-zA-Z._~^!=&\^\-\\?'"x0-7])"""
    #
    # The following modifications were made to avoid the ambiguity that allowed backtracking:
    # (https://github.com/eliben/pycparser/issues/61)
    #
    # - \x was removed from simple_escape, unless it was not followed by a hex digit, to avoid ambiguity with hex_escape.
    # - hex_escape allows one or more hex characters, but requires that the next character(if any) is not hex
    # - decimal_escape allows one or more decimal characters, but requires that the next character(if any) is not a decimal
    # - bad_escape does not allow any decimals (8-9), to avoid conflicting with the permissive decimal_escape.
    #
    # Without this change, python's `re` module would recursively try parsing each ambiguous escape sequence in multiple ways.
    # e.g. `\123` could be parsed as `\1`+`23`, `\12`+`3`, and `\123`.

    simple_escape = r"""([a-wyzA-Z._~!=&\^\-\\?'"]|x(?![0-9a-fA-F]))"""
    decimal_escape = r"""(\d+)(?!\d)"""
    hex_escape = r"""(x[0-9a-fA-F]+)(?![0-9a-fA-F])"""
    bad_escape = r"""([\\][^a-zA-Z._~^!=&\^\-\\?'"x0-9])"""

    escape_sequence = r"""(\\("""+simple_escape+'|'+decimal_escape+'|'+hex_escape+'))'

    # This complicated regex with lookahead might be slow for strings, so because all of the valid escapes (including \x) allowed
    # 0 or more non-escaped characters after the first character, simple_escape+decimal_escape+hex_escape got simplified to

    escape_sequence_start_in_string = r"""(\\[0-9a-zA-Z._~!=&\^\-\\?'"])"""

    cconst_char = r"""([^'\\\n]|"""+escape_sequence+')'
    char_const = "'"+cconst_char+"'"
    wchar_const = 'L'+char_const
    u8char_const = 'u8'+char_const
    u16char_const = 'u'+char_const
    u32char_const = 'U'+char_const
    multicharacter_constant = "'"+cconst_char+"{2,4}'"
    unmatched_quote = "('"+cconst_char+"*\\n)|('"+cconst_char+"*$)"
    bad_char_const = r"""('"""+cconst_char+"""[^'\n]+')|('')|('"""+bad_escape+r"""[^'\n]*')"""

    # string literals (K&R2: A.2.6)
    string_char = r"""([^"\\\n]|"""+escape_sequence_start_in_string+')'
    string_literal = '"'+string_char+'*"'
    wstring_literal = 'L'+string_literal
    u8string_literal = 'u8'+string_literal
    u16string_literal = 'u'+string_literal
    u32string_literal = 'U'+string_literal
    bad_string_literal = '"'+string_char+'*'+bad_escape+string_char+'*"'

    # floating constants (K&R2: A.2.5.3)
    exponent_part = r"""([eE][-+]?[0-9]+)"""
    fractional_constant = r"""([0-9]*\.[0-9]+)|([0-9]+\.)"""
    floating_constant = '(((('+fractional_constant+')'+exponent_part+'?)|([0-9]+'+exponent_part+'))[FfLl]?)'
    binary_exponent_part = r'''([pP][+-]?[0-9]+)'''
    hex_fractional_constant = '((('+hex_digits+r""")?\."""+hex_digits+')|('+hex_digits+r"""\.))"""
    hex_floating_constant = '('+hex_prefix+'('+hex_digits+'|'+hex_fractional_constant+')'+binary_exponent_part+'[FfLl]?)'

    ##
    ## Lexer states: used for preprocessor \n-terminated directives
    ##
    states = (
        # ppline: preprocessor line directives
        #
        ('ppline', 'exclusive'),

        # pppragma: pragma
        #
        ('pppragma', 'exclusive'),
    )

    def t_PPHASH(self, t):
        r'[ \t]*\#'
        if self.line_pattern.match(t.lexer.lexdata, pos=t.lexer.lexpos):
            t.lexer.begin('ppline')
            self.pp_line = self.pp_filename = None
        elif self.pragma_pattern.match(t.lexer.lexdata, pos=t.lexer.lexpos):
            t.lexer.begin('pppragma')
        else:
            t.type = 'PPHASH'
            return t

    ##
    ## Rules for the ppline state
    ##
    @TOKEN(string_literal)
    def t_ppline_FILENAME(self, t):
        if self.pp_line is None:
            self._error('filename before line number in #line', t)
        else:
            self.pp_filename = t.value.lstrip('"').rstrip('"')

    @TOKEN(decimal_constant)
    def t_ppline_LINE_NUMBER(self, t):
        if self.pp_line is None:
            self.pp_line = t.value
        else:
            # Ignore: GCC's cpp sometimes inserts a numeric flag
            # after the file name
            pass

    def t_ppline_NEWLINE(self, t):
        r'\n'
        if self.pp_line is None:
            self._error('line number missing in #line', t)
        else:
            self.lexer.lineno = int(self.pp_line)

            if self.pp_filename is not None:
                self.filename = self.pp_filename

        t.lexer.begin('INITIAL')

    def t_ppline_PPLINE(self, t):
        r'line'
        pass

    t_ppline_ignore = ' \t'

    def t_ppline_error(self, t):
        self._error('invalid #line directive', t)

    ##
    ## Rules for the pppragma state
    ##
    def t_pppragma_NEWLINE(self, t):
        r'\n'
        t.lexer.lineno += 1
        t.lexer.begin('INITIAL')

    def t_pppragma_PPPRAGMA(self, t):
        r'pragma'
        return t

    t_pppragma_ignore = ' \t'

    def t_pppragma_STR(self, t):
        '.+'
        t.type = 'PPPRAGMASTR'
        return t

    def t_pppragma_error(self, t):
        self._error('invalid #pragma directive', t)

    ##
    ## Rules for the normal state
    ##
    t_ignore = ' \t'

    # Newlines
    def t_NEWLINE(self, t):
        r'\n+'
        t.lexer.lineno += t.value.count("\n")

    # Operators
    t_PLUS              = r'\+'
    t_MINUS             = r'-'
    t_TIMES             = r'\*'
    t_DIVIDE            = r'/'
    t_MOD               = r'%'
    t_OR                = r'\|'
    t_AND               = r'&'
    t_NOT               = r'~'
    t_XOR               = r'\^'
    t_LSHIFT            = r'<<'
    t_RSHIFT            = r'>>'
    t_LOR               = r'\|\|'
    t_LAND              = r'&&'
    t_LNOT              = r'!'
    t_LT                = r'<'
    t_GT                = r'>'
    t_LE                = r'<='
    t_GE                = r'>='
    t_EQ                = r'=='
    t_NE                = r'!='

    # Assignment operators
    t_EQUALS            = r'='
    t_TIMESEQUAL        = r'\*='
    t_DIVEQUAL          = r'/='
    t_MODEQUAL          = r'%='
    t_PLUSEQUAL         = r'\+='
    t_MINUSEQUAL        = r'-='
    t_LSHIFTEQUAL       = r'<<='
    t_RSHIFTEQUAL       = r'>>='
    t_ANDEQUAL          = r'&='
    t_OREQUAL           = r'\|='
    t_XOREQUAL          = r'\^='

    # Increment/decrement
    t_PLUSPLUS          = r'\+\+'
    t_MINUSMINUS        = r'--'

    # ->
    t_ARROW             = r'->'

    # ?
    t_CONDOP            = r'\?'

    # Delimiters
    t_LPAREN            = r'\('
    t_RPAREN            = r'\)'
    t_LBRACKET          = r'\['
    t_RBRACKET          = r'\]'
    t_COMMA             = r','
    t_PERIOD            = r'\.'
    t_SEMI              = r';'
    t_COLON             = r':'
    t_ELLIPSIS          = r'\.\.\.'

    # Scope delimiters
    # To see why on_lbrace_func is needed, consider:
    #   typedef char TT;
    #   void foo(int TT) { TT = 10; }
    #   TT x = 5;
    # Outside the function, TT is a typedef, but inside (starting and ending
    # with the braces) it's a parameter.  The trouble begins with yacc's
    # lookahead token.  If we open a new scope in brace_open, then TT has
    # already been read and incorrectly interpreted as TYPEID.  So, we need
    # to open and close scopes from within the lexer.
    # Similar for the TT immediately outside the end of the function.
    #
    @TOKEN(r'\{')
    def t_LBRACE(self, t):
        self.on_lbrace_func()
        return t
    @TOKEN(r'\}')
    def t_RBRACE(self, t):
        self.on_rbrace_func()
        return t

    t_STRING_LITERAL = string_literal

    # The following floating and integer constants are defined as
    # functions to impose a strict order (otherwise, decimal
    # is placed before the others because its regex is longer,
    # and this is bad)
    #
    @TOKEN(floating_constant)
    def t_FLOAT_CONST(self, t):
        return t

    @TOKEN(hex_floating_constant)
    def t_HEX_FLOAT_CONST(self, t):
        return t

    @TOKEN(hex_constant)
    def t_INT_CONST_HEX(self, t):
        return t

    @TOKEN(bin_constant)
    def t_INT_CONST_BIN(self, t):
        return t

    @TOKEN(bad_octal_constant)
    def t_BAD_CONST_OCT(self, t):
        msg = "Invalid octal constant"
        self._error(msg, t)

    @TOKEN(unsupported_c_style_comment)
    def t_UNSUPPORTED_C_STYLE_COMMENT(self, t):
        msg = "Comments are not supported, see https://github.com/eliben/pycparser#3using."
        self._error(msg, t)

    @TOKEN(unsupported_cxx_style_comment)
    def t_UNSUPPORTED_CXX_STYLE_COMMENT(self, t):
        msg = "Comments are not supported, see https://github.com/eliben/pycparser#3using."
        self._error(msg, t)

    @TOKEN(octal_constant)
    def t_INT_CONST_OCT(self, t):
        return t

    @TOKEN(decimal_constant)
    def t_INT_CONST_DEC(self, t):
        return t

    # Must come before bad_char_const, to prevent it from
    # catching valid char constants as invalid
    #
    @TOKEN(multicharacter_constant)
    def t_INT_CONST_CHAR(self, t):
        return t

    @TOKEN(char_const)
    def t_CHAR_CONST(self, t):
        return t

    @TOKEN(wchar_const)
    def t_WCHAR_CONST(self, t):
        return t

    @TOKEN(u8char_const)
    def t_U8CHAR_CONST(self, t):
        return t

    @TOKEN(u16char_const)
    def t_U16CHAR_CONST(self, t):
        return t

    @TOKEN(u32char_const)
    def t_U32CHAR_CONST(self, t):
        return t

    @TOKEN(unmatched_quote)
    def t_UNMATCHED_QUOTE(self, t):
        msg = "Unmatched '"
        self._error(msg, t)

    @TOKEN(bad_char_const)
    def t_BAD_CHAR_CONST(self, t):
        msg = "Invalid char constant %s" % t.value
        self._error(msg, t)

    @TOKEN(wstring_literal)
    def t_WSTRING_LITERAL(self, t):
        return t

    @TOKEN(u8string_literal)
    def t_U8STRING_LITERAL(self, t):
        return t

    @TOKEN(u16string_literal)
    def t_U16STRING_LITERAL(self, t):
        return t

    @TOKEN(u32string_literal)
    def t_U32STRING_LITERAL(self, t):
        return t

    # unmatched string literals are caught by the preprocessor

    @TOKEN(bad_string_literal)
    def t_BAD_STRING_LITERAL(self, t):
        msg = "String contains invalid escape code"
        self._error(msg, t)

    @TOKEN(identifier)
    def t_ID(self, t):
        t.type = self.keyword_map.get(t.value, "ID")
        if t.type == 'ID' and self.type_lookup_func(t.value):
            t.type = "TYPEID"
        return t

    def t_error(self, t):
        msg = 'Illegal character %s' % repr(t.value[0])
        self._error(msg, t)
PK�t�\
x�L�&�&c_parser.pynu�[���#------------------------------------------------------------------------------
# pycparser: c_parser.py
#
# CParser class: Parser and AST builder for the C language
#
# Eli Bendersky [https://eli.thegreenplace.net/]
# License: BSD
#------------------------------------------------------------------------------
from .ply import yacc

from . import c_ast
from .c_lexer import CLexer
from .plyparser import PLYParser, ParseError, parameterized, template
from .ast_transforms import fix_switch_cases, fix_atomic_specifiers


@template
class CParser(PLYParser):
    def __init__(
            self,
            lex_optimize=True,
            lexer=CLexer,
            lextab='pycparser.lextab',
            yacc_optimize=True,
            yacctab='pycparser.yacctab',
            yacc_debug=False,
            taboutputdir=''):
        """ Create a new CParser.

            Some arguments for controlling the debug/optimization
            level of the parser are provided. The defaults are
            tuned for release/performance mode.
            The simple rules for using them are:
            *) When tweaking CParser/CLexer, set these to False
            *) When releasing a stable parser, set to True

            lex_optimize:
                Set to False when you're modifying the lexer.
                Otherwise, changes in the lexer won't be used, if
                some lextab.py file exists.
                When releasing with a stable lexer, set to True
                to save the re-generation of the lexer table on
                each run.

            lexer:
                Set this parameter to define the lexer to use if
                you're not using the default CLexer.

            lextab:
                Points to the lex table that's used for optimized
                mode. Only if you're modifying the lexer and want
                some tests to avoid re-generating the table, make
                this point to a local lex table file (that's been
                earlier generated with lex_optimize=True)

            yacc_optimize:
                Set to False when you're modifying the parser.
                Otherwise, changes in the parser won't be used, if
                some parsetab.py file exists.
                When releasing with a stable parser, set to True
                to save the re-generation of the parser table on
                each run.

            yacctab:
                Points to the yacc table that's used for optimized
                mode. Only if you're modifying the parser, make
                this point to a local yacc table file

            yacc_debug:
                Generate a parser.out file that explains how yacc
                built the parsing table from the grammar.

            taboutputdir:
                Set this parameter to control the location of generated
                lextab and yacctab files.
        """
        self.clex = lexer(
            error_func=self._lex_error_func,
            on_lbrace_func=self._lex_on_lbrace_func,
            on_rbrace_func=self._lex_on_rbrace_func,
            type_lookup_func=self._lex_type_lookup_func)

        self.clex.build(
            optimize=lex_optimize,
            lextab=lextab,
            outputdir=taboutputdir)
        self.tokens = self.clex.tokens

        rules_with_opt = [
            'abstract_declarator',
            'assignment_expression',
            'declaration_list',
            'declaration_specifiers_no_type',
            'designation',
            'expression',
            'identifier_list',
            'init_declarator_list',
            'id_init_declarator_list',
            'initializer_list',
            'parameter_type_list',
            'block_item_list',
            'type_qualifier_list',
            'struct_declarator_list'
        ]

        for rule in rules_with_opt:
            self._create_opt_rule(rule)

        self.cparser = yacc.yacc(
            module=self,
            start='translation_unit_or_empty',
            debug=yacc_debug,
            optimize=yacc_optimize,
            tabmodule=yacctab,
            outputdir=taboutputdir)

        # Stack of scopes for keeping track of symbols. _scope_stack[-1] is
        # the current (topmost) scope. Each scope is a dictionary that
        # specifies whether a name is a type. If _scope_stack[n][name] is
        # True, 'name' is currently a type in the scope. If it's False,
        # 'name' is used in the scope but not as a type (for instance, if we
        # saw: int name;
        # If 'name' is not a key in _scope_stack[n] then 'name' was not defined
        # in this scope at all.
        self._scope_stack = [dict()]

        # Keeps track of the last token given to yacc (the lookahead token)
        self._last_yielded_token = None

    def parse(self, text, filename='', debug=False):
        """ Parses C code and returns an AST.

            text:
                A string containing the C source code

            filename:
                Name of the file being parsed (for meaningful
                error messages)

            debug:
                Debug flag to YACC
        """
        self.clex.filename = filename
        self.clex.reset_lineno()
        self._scope_stack = [dict()]
        self._last_yielded_token = None
        return self.cparser.parse(
                input=text,
                lexer=self.clex,
                debug=debug)

    ######################--   PRIVATE   --######################

    def _push_scope(self):
        self._scope_stack.append(dict())

    def _pop_scope(self):
        assert len(self._scope_stack) > 1
        self._scope_stack.pop()

    def _add_typedef_name(self, name, coord):
        """ Add a new typedef name (ie a TYPEID) to the current scope
        """
        if not self._scope_stack[-1].get(name, True):
            self._parse_error(
                "Typedef %r previously declared as non-typedef "
                "in this scope" % name, coord)
        self._scope_stack[-1][name] = True

    def _add_identifier(self, name, coord):
        """ Add a new object, function, or enum member name (ie an ID) to the
            current scope
        """
        if self._scope_stack[-1].get(name, False):
            self._parse_error(
                "Non-typedef %r previously declared as typedef "
                "in this scope" % name, coord)
        self._scope_stack[-1][name] = False

    def _is_type_in_scope(self, name):
        """ Is *name* a typedef-name in the current scope?
        """
        for scope in reversed(self._scope_stack):
            # If name is an identifier in this scope it shadows typedefs in
            # higher scopes.
            in_scope = scope.get(name)
            if in_scope is not None: return in_scope
        return False

    def _lex_error_func(self, msg, line, column):
        self._parse_error(msg, self._coord(line, column))

    def _lex_on_lbrace_func(self):
        self._push_scope()

    def _lex_on_rbrace_func(self):
        self._pop_scope()

    def _lex_type_lookup_func(self, name):
        """ Looks up types that were previously defined with
            typedef.
            Passed to the lexer for recognizing identifiers that
            are types.
        """
        is_type = self._is_type_in_scope(name)
        return is_type

    def _get_yacc_lookahead_token(self):
        """ We need access to yacc's lookahead token in certain cases.
            This is the last token yacc requested from the lexer, so we
            ask the lexer.
        """
        return self.clex.last_token

    # To understand what's going on here, read sections A.8.5 and
    # A.8.6 of K&R2 very carefully.
    #
    # A C type consists of a basic type declaration, with a list
    # of modifiers. For example:
    #
    # int *c[5];
    #
    # The basic declaration here is 'int c', and the pointer and
    # the array are the modifiers.
    #
    # Basic declarations are represented by TypeDecl (from module c_ast) and the
    # modifiers are FuncDecl, PtrDecl and ArrayDecl.
    #
    # The standard states that whenever a new modifier is parsed, it should be
    # added to the end of the list of modifiers. For example:
    #
    # K&R2 A.8.6.2: Array Declarators
    #
    # In a declaration T D where D has the form
    #   D1 [constant-expression-opt]
    # and the type of the identifier in the declaration T D1 is
    # "type-modifier T", the type of the
    # identifier of D is "type-modifier array of T"
    #
    # This is what this method does. The declarator it receives
    # can be a list of declarators ending with TypeDecl. It
    # tacks the modifier to the end of this list, just before
    # the TypeDecl.
    #
    # Additionally, the modifier may be a list itself. This is
    # useful for pointers, that can come as a chain from the rule
    # p_pointer. In this case, the whole modifier list is spliced
    # into the new location.
    def _type_modify_decl(self, decl, modifier):
        """ Tacks a type modifier on a declarator, and returns
            the modified declarator.

            Note: the declarator and modifier may be modified
        """
        #~ print '****'
        #~ decl.show(offset=3)
        #~ modifier.show(offset=3)
        #~ print '****'

        modifier_head = modifier
        modifier_tail = modifier

        # The modifier may be a nested list. Reach its tail.
        while modifier_tail.type:
            modifier_tail = modifier_tail.type

        # If the decl is a basic type, just tack the modifier onto it.
        if isinstance(decl, c_ast.TypeDecl):
            modifier_tail.type = decl
            return modifier
        else:
            # Otherwise, the decl is a list of modifiers. Reach
            # its tail and splice the modifier onto the tail,
            # pointing to the underlying basic type.
            decl_tail = decl

            while not isinstance(decl_tail.type, c_ast.TypeDecl):
                decl_tail = decl_tail.type

            modifier_tail.type = decl_tail.type
            decl_tail.type = modifier_head
            return decl

    # Due to the order in which declarators are constructed,
    # they have to be fixed in order to look like a normal AST.
    #
    # When a declaration arrives from syntax construction, it has
    # these problems:
    # * The innermost TypeDecl has no type (because the basic
    #   type is only known at the uppermost declaration level)
    # * The declaration has no variable name, since that is saved
    #   in the innermost TypeDecl
    # * The typename of the declaration is a list of type
    #   specifiers, and not a node. Here, basic identifier types
    #   should be separated from more complex types like enums
    #   and structs.
    #
    # This method fixes these problems.
    def _fix_decl_name_type(self, decl, typename):
        """ Fixes a declaration. Modifies decl.
        """
        # Reach the underlying basic type
        #
        type = decl
        while not isinstance(type, c_ast.TypeDecl):
            type = type.type

        decl.name = type.declname
        type.quals = decl.quals[:]

        # The typename is a list of types. If any type in this
        # list isn't an IdentifierType, it must be the only
        # type in the list (it's illegal to declare "int enum ..")
        # If all the types are basic, they're collected in the
        # IdentifierType holder.
        for tn in typename:
            if not isinstance(tn, c_ast.IdentifierType):
                if len(typename) > 1:
                    self._parse_error(
                        "Invalid multiple types specified", tn.coord)
                else:
                    type.type = tn
                    return decl

        if not typename:
            # Functions default to returning int
            #
            if not isinstance(decl.type, c_ast.FuncDecl):
                self._parse_error(
                        "Missing type in declaration", decl.coord)
            type.type = c_ast.IdentifierType(
                    ['int'],
                    coord=decl.coord)
        else:
            # At this point, we know that typename is a list of IdentifierType
            # nodes. Concatenate all the names into a single list.
            #
            type.type = c_ast.IdentifierType(
                [name for id in typename for name in id.names],
                coord=typename[0].coord)
        return decl

    def _add_declaration_specifier(self, declspec, newspec, kind, append=False):
        """ Declaration specifiers are represented by a dictionary
            with the entries:
            * qual: a list of type qualifiers
            * storage: a list of storage type qualifiers
            * type: a list of type specifiers
            * function: a list of function specifiers
            * alignment: a list of alignment specifiers

            This method is given a declaration specifier, and a
            new specifier of a given kind.
            If `append` is True, the new specifier is added to the end of
            the specifiers list, otherwise it's added at the beginning.
            Returns the declaration specifier, with the new
            specifier incorporated.
        """
        spec = declspec or dict(qual=[], storage=[], type=[], function=[], alignment=[])

        if append:
            spec[kind].append(newspec)
        else:
            spec[kind].insert(0, newspec)

        return spec

    def _build_declarations(self, spec, decls, typedef_namespace=False):
        """ Builds a list of declarations all sharing the given specifiers.
            If typedef_namespace is true, each declared name is added
            to the "typedef namespace", which also includes objects,
            functions, and enum constants.
        """
        is_typedef = 'typedef' in spec['storage']
        declarations = []

        # Bit-fields are allowed to be unnamed.
        if decls[0].get('bitsize') is not None:
            pass

        # When redeclaring typedef names as identifiers in inner scopes, a
        # problem can occur where the identifier gets grouped into
        # spec['type'], leaving decl as None.  This can only occur for the
        # first declarator.
        elif decls[0]['decl'] is None:
            if len(spec['type']) < 2 or len(spec['type'][-1].names) != 1 or \
                    not self._is_type_in_scope(spec['type'][-1].names[0]):
                coord = '?'
                for t in spec['type']:
                    if hasattr(t, 'coord'):
                        coord = t.coord
                        break
                self._parse_error('Invalid declaration', coord)

            # Make this look as if it came from "direct_declarator:ID"
            decls[0]['decl'] = c_ast.TypeDecl(
                declname=spec['type'][-1].names[0],
                type=None,
                quals=None,
                align=spec['alignment'],
                coord=spec['type'][-1].coord)
            # Remove the "new" type's name from the end of spec['type']
            del spec['type'][-1]

        # A similar problem can occur where the declaration ends up looking
        # like an abstract declarator.  Give it a name if this is the case.
        elif not isinstance(decls[0]['decl'], (
                c_ast.Enum, c_ast.Struct, c_ast.Union, c_ast.IdentifierType)):
            decls_0_tail = decls[0]['decl']
            while not isinstance(decls_0_tail, c_ast.TypeDecl):
                decls_0_tail = decls_0_tail.type
            if decls_0_tail.declname is None:
                decls_0_tail.declname = spec['type'][-1].names[0]
                del spec['type'][-1]

        for decl in decls:
            assert decl['decl'] is not None
            if is_typedef:
                declaration = c_ast.Typedef(
                    name=None,
                    quals=spec['qual'],
                    storage=spec['storage'],
                    type=decl['decl'],
                    coord=decl['decl'].coord)
            else:
                declaration = c_ast.Decl(
                    name=None,
                    quals=spec['qual'],
                    align=spec['alignment'],
                    storage=spec['storage'],
                    funcspec=spec['function'],
                    type=decl['decl'],
                    init=decl.get('init'),
                    bitsize=decl.get('bitsize'),
                    coord=decl['decl'].coord)

            if isinstance(declaration.type, (
                    c_ast.Enum, c_ast.Struct, c_ast.Union,
                    c_ast.IdentifierType)):
                fixed_decl = declaration
            else:
                fixed_decl = self._fix_decl_name_type(declaration, spec['type'])

            # Add the type name defined by typedef to a
            # symbol table (for usage in the lexer)
            if typedef_namespace:
                if is_typedef:
                    self._add_typedef_name(fixed_decl.name, fixed_decl.coord)
                else:
                    self._add_identifier(fixed_decl.name, fixed_decl.coord)

            fixed_decl = fix_atomic_specifiers(fixed_decl)
            declarations.append(fixed_decl)

        return declarations

    def _build_function_definition(self, spec, decl, param_decls, body):
        """ Builds a function definition.
        """
        if 'typedef' in spec['storage']:
            self._parse_error("Invalid typedef", decl.coord)

        declaration = self._build_declarations(
            spec=spec,
            decls=[dict(decl=decl, init=None)],
            typedef_namespace=True)[0]

        return c_ast.FuncDef(
            decl=declaration,
            param_decls=param_decls,
            body=body,
            coord=decl.coord)

    def _select_struct_union_class(self, token):
        """ Given a token (either STRUCT or UNION), selects the
            appropriate AST class.
        """
        if token == 'struct':
            return c_ast.Struct
        else:
            return c_ast.Union

    ##
    ## Precedence and associativity of operators
    ##
    # If this changes, c_generator.CGenerator.precedence_map needs to change as
    # well
    precedence = (
        ('left', 'LOR'),
        ('left', 'LAND'),
        ('left', 'OR'),
        ('left', 'XOR'),
        ('left', 'AND'),
        ('left', 'EQ', 'NE'),
        ('left', 'GT', 'GE', 'LT', 'LE'),
        ('left', 'RSHIFT', 'LSHIFT'),
        ('left', 'PLUS', 'MINUS'),
        ('left', 'TIMES', 'DIVIDE', 'MOD')
    )

    ##
    ## Grammar productions
    ## Implementation of the BNF defined in K&R2 A.13
    ##

    # Wrapper around a translation unit, to allow for empty input.
    # Not strictly part of the C99 Grammar, but useful in practice.
    def p_translation_unit_or_empty(self, p):
        """ translation_unit_or_empty   : translation_unit
                                        | empty
        """
        if p[1] is None:
            p[0] = c_ast.FileAST([])
        else:
            p[0] = c_ast.FileAST(p[1])

    def p_translation_unit_1(self, p):
        """ translation_unit    : external_declaration
        """
        # Note: external_declaration is already a list
        p[0] = p[1]

    def p_translation_unit_2(self, p):
        """ translation_unit    : translation_unit external_declaration
        """
        p[1].extend(p[2])
        p[0] = p[1]

    # Declarations always come as lists (because they can be
    # several in one line), so we wrap the function definition
    # into a list as well, to make the return value of
    # external_declaration homogeneous.
    def p_external_declaration_1(self, p):
        """ external_declaration    : function_definition
        """
        p[0] = [p[1]]

    def p_external_declaration_2(self, p):
        """ external_declaration    : declaration
        """
        p[0] = p[1]

    def p_external_declaration_3(self, p):
        """ external_declaration    : pp_directive
                                    | pppragma_directive
        """
        p[0] = [p[1]]

    def p_external_declaration_4(self, p):
        """ external_declaration    : SEMI
        """
        p[0] = []

    def p_external_declaration_5(self, p):
        """ external_declaration    : static_assert
        """
        p[0] = p[1]

    def p_static_assert_declaration(self, p):
        """ static_assert           : _STATIC_ASSERT LPAREN constant_expression COMMA unified_string_literal RPAREN
                                    | _STATIC_ASSERT LPAREN constant_expression RPAREN
        """
        if len(p) == 5:
            p[0] = [c_ast.StaticAssert(p[3], None, self._token_coord(p, 1))]
        else:
            p[0] = [c_ast.StaticAssert(p[3], p[5], self._token_coord(p, 1))]

    def p_pp_directive(self, p):
        """ pp_directive  : PPHASH
        """
        self._parse_error('Directives not supported yet',
                          self._token_coord(p, 1))

    # This encompasses two types of C99-compatible pragmas:
    # - The #pragma directive:
    #       # pragma character_sequence
    # - The _Pragma unary operator:
    #       _Pragma ( " string_literal " )
    def p_pppragma_directive(self, p):
        """ pppragma_directive      : PPPRAGMA
                                    | PPPRAGMA PPPRAGMASTR
                                    | _PRAGMA LPAREN unified_string_literal RPAREN
        """
        if len(p) == 5:
            p[0] = c_ast.Pragma(p[3], self._token_coord(p, 2))
        elif len(p) == 3:
            p[0] = c_ast.Pragma(p[2], self._token_coord(p, 2))
        else:
            p[0] = c_ast.Pragma("", self._token_coord(p, 1))

    def p_pppragma_directive_list(self, p):
        """ pppragma_directive_list : pppragma_directive
                                    | pppragma_directive_list pppragma_directive
        """
        p[0] = [p[1]] if len(p) == 2 else p[1] + [p[2]]

    # In function definitions, the declarator can be followed by
    # a declaration list, for old "K&R style" function definitios.
    def p_function_definition_1(self, p):
        """ function_definition : id_declarator declaration_list_opt compound_statement
        """
        # no declaration specifiers - 'int' becomes the default type
        spec = dict(
            qual=[],
            alignment=[],
            storage=[],
            type=[c_ast.IdentifierType(['int'],
                                       coord=self._token_coord(p, 1))],
            function=[])

        p[0] = self._build_function_definition(
            spec=spec,
            decl=p[1],
            param_decls=p[2],
            body=p[3])

    def p_function_definition_2(self, p):
        """ function_definition : declaration_specifiers id_declarator declaration_list_opt compound_statement
        """
        spec = p[1]

        p[0] = self._build_function_definition(
            spec=spec,
            decl=p[2],
            param_decls=p[3],
            body=p[4])

    # Note, according to C18 A.2.2 6.7.10 static_assert-declaration _Static_assert
    # is a declaration, not a statement. We additionally recognise it as a statement
    # to fix parsing of _Static_assert inside the functions.
    #
    def p_statement(self, p):
        """ statement   : labeled_statement
                        | expression_statement
                        | compound_statement
                        | selection_statement
                        | iteration_statement
                        | jump_statement
                        | pppragma_directive
                        | static_assert
        """
        p[0] = p[1]

    # A pragma is generally considered a decorator rather than an actual
    # statement. Still, for the purposes of analyzing an abstract syntax tree of
    # C code, pragma's should not be ignored and were previously treated as a
    # statement. This presents a problem for constructs that take a statement
    # such as labeled_statements, selection_statements, and
    # iteration_statements, causing a misleading structure in the AST. For
    # example, consider the following C code.
    #
    #   for (int i = 0; i < 3; i++)
    #       #pragma omp critical
    #       sum += 1;
    #
    # This code will compile and execute "sum += 1;" as the body of the for
    # loop. Previous implementations of PyCParser would render the AST for this
    # block of code as follows:
    #
    #   For:
    #     DeclList:
    #       Decl: i, [], [], []
    #         TypeDecl: i, []
    #           IdentifierType: ['int']
    #         Constant: int, 0
    #     BinaryOp: <
    #       ID: i
    #       Constant: int, 3
    #     UnaryOp: p++
    #       ID: i
    #     Pragma: omp critical
    #   Assignment: +=
    #     ID: sum
    #     Constant: int, 1
    #
    # This AST misleadingly takes the Pragma as the body of the loop and the
    # assignment then becomes a sibling of the loop.
    #
    # To solve edge cases like these, the pragmacomp_or_statement rule groups
    # a pragma and its following statement (which would otherwise be orphaned)
    # using a compound block, effectively turning the above code into:
    #
    #   for (int i = 0; i < 3; i++) {
    #       #pragma omp critical
    #       sum += 1;
    #   }
    def p_pragmacomp_or_statement(self, p):
        """ pragmacomp_or_statement     : pppragma_directive_list statement
                                        | statement
        """
        if len(p) == 3:
            p[0] = c_ast.Compound(
                block_items=p[1]+[p[2]],
                coord=self._token_coord(p, 1))
        else:
            p[0] = p[1]

    # In C, declarations can come several in a line:
    #   int x, *px, romulo = 5;
    #
    # However, for the AST, we will split them to separate Decl
    # nodes.
    #
    # This rule splits its declarations and always returns a list
    # of Decl nodes, even if it's one element long.
    #
    def p_decl_body(self, p):
        """ decl_body : declaration_specifiers init_declarator_list_opt
                      | declaration_specifiers_no_type id_init_declarator_list_opt
        """
        spec = p[1]

        # p[2] (init_declarator_list_opt) is either a list or None
        #
        if p[2] is None:
            # By the standard, you must have at least one declarator unless
            # declaring a structure tag, a union tag, or the members of an
            # enumeration.
            #
            ty = spec['type']
            s_u_or_e = (c_ast.Struct, c_ast.Union, c_ast.Enum)
            if len(ty) == 1 and isinstance(ty[0], s_u_or_e):
                decls = [c_ast.Decl(
                    name=None,
                    quals=spec['qual'],
                    align=spec['alignment'],
                    storage=spec['storage'],
                    funcspec=spec['function'],
                    type=ty[0],
                    init=None,
                    bitsize=None,
                    coord=ty[0].coord)]

            # However, this case can also occur on redeclared identifiers in
            # an inner scope.  The trouble is that the redeclared type's name
            # gets grouped into declaration_specifiers; _build_declarations
            # compensates for this.
            #
            else:
                decls = self._build_declarations(
                    spec=spec,
                    decls=[dict(decl=None, init=None)],
                    typedef_namespace=True)

        else:
            decls = self._build_declarations(
                spec=spec,
                decls=p[2],
                typedef_namespace=True)

        p[0] = decls

    # The declaration has been split to a decl_body sub-rule and
    # SEMI, because having them in a single rule created a problem
    # for defining typedefs.
    #
    # If a typedef line was directly followed by a line using the
    # type defined with the typedef, the type would not be
    # recognized. This is because to reduce the declaration rule,
    # the parser's lookahead asked for the token after SEMI, which
    # was the type from the next line, and the lexer had no chance
    # to see the updated type symbol table.
    #
    # Splitting solves this problem, because after seeing SEMI,
    # the parser reduces decl_body, which actually adds the new
    # type into the table to be seen by the lexer before the next
    # line is reached.
    def p_declaration(self, p):
        """ declaration : decl_body SEMI
        """
        p[0] = p[1]

    # Since each declaration is a list of declarations, this
    # rule will combine all the declarations and return a single
    # list
    #
    def p_declaration_list(self, p):
        """ declaration_list    : declaration
                                | declaration_list declaration
        """
        p[0] = p[1] if len(p) == 2 else p[1] + p[2]

    # To know when declaration-specifiers end and declarators begin,
    # we require declaration-specifiers to have at least one
    # type-specifier, and disallow typedef-names after we've seen any
    # type-specifier. These are both required by the spec.
    #
    def p_declaration_specifiers_no_type_1(self, p):
        """ declaration_specifiers_no_type  : type_qualifier declaration_specifiers_no_type_opt
        """
        p[0] = self._add_declaration_specifier(p[2], p[1], 'qual')

    def p_declaration_specifiers_no_type_2(self, p):
        """ declaration_specifiers_no_type  : storage_class_specifier declaration_specifiers_no_type_opt
        """
        p[0] = self._add_declaration_specifier(p[2], p[1], 'storage')

    def p_declaration_specifiers_no_type_3(self, p):
        """ declaration_specifiers_no_type  : function_specifier declaration_specifiers_no_type_opt
        """
        p[0] = self._add_declaration_specifier(p[2], p[1], 'function')

    # Without this, `typedef _Atomic(T) U` will parse incorrectly because the
    # _Atomic qualifier will match, instead of the specifier.
    def p_declaration_specifiers_no_type_4(self, p):
        """ declaration_specifiers_no_type  : atomic_specifier declaration_specifiers_no_type_opt
        """
        p[0] = self._add_declaration_specifier(p[2], p[1], 'type')

    def p_declaration_specifiers_no_type_5(self, p):
        """ declaration_specifiers_no_type  : alignment_specifier declaration_specifiers_no_type_opt
        """
        p[0] = self._add_declaration_specifier(p[2], p[1], 'alignment')

    def p_declaration_specifiers_1(self, p):
        """ declaration_specifiers  : declaration_specifiers type_qualifier
        """
        p[0] = self._add_declaration_specifier(p[1], p[2], 'qual', append=True)

    def p_declaration_specifiers_2(self, p):
        """ declaration_specifiers  : declaration_specifiers storage_class_specifier
        """
        p[0] = self._add_declaration_specifier(p[1], p[2], 'storage', append=True)

    def p_declaration_specifiers_3(self, p):
        """ declaration_specifiers  : declaration_specifiers function_specifier
        """
        p[0] = self._add_declaration_specifier(p[1], p[2], 'function', append=True)

    def p_declaration_specifiers_4(self, p):
        """ declaration_specifiers  : declaration_specifiers type_specifier_no_typeid
        """
        p[0] = self._add_declaration_specifier(p[1], p[2], 'type', append=True)

    def p_declaration_specifiers_5(self, p):
        """ declaration_specifiers  : type_specifier
        """
        p[0] = self._add_declaration_specifier(None, p[1], 'type')

    def p_declaration_specifiers_6(self, p):
        """ declaration_specifiers  : declaration_specifiers_no_type type_specifier
        """
        p[0] = self._add_declaration_specifier(p[1], p[2], 'type', append=True)

    def p_declaration_specifiers_7(self, p):
        """ declaration_specifiers  : declaration_specifiers alignment_specifier
        """
        p[0] = self._add_declaration_specifier(p[1], p[2], 'alignment', append=True)

    def p_storage_class_specifier(self, p):
        """ storage_class_specifier : AUTO
                                    | REGISTER
                                    | STATIC
                                    | EXTERN
                                    | TYPEDEF
                                    | _THREAD_LOCAL
        """
        p[0] = p[1]

    def p_function_specifier(self, p):
        """ function_specifier  : INLINE
                                | _NORETURN
        """
        p[0] = p[1]

    def p_type_specifier_no_typeid(self, p):
        """ type_specifier_no_typeid  : VOID
                                      | _BOOL
                                      | CHAR
                                      | SHORT
                                      | INT
                                      | LONG
                                      | FLOAT
                                      | DOUBLE
                                      | _COMPLEX
                                      | SIGNED
                                      | UNSIGNED
                                      | __INT128
        """
        p[0] = c_ast.IdentifierType([p[1]], coord=self._token_coord(p, 1))

    def p_type_specifier(self, p):
        """ type_specifier  : typedef_name
                            | enum_specifier
                            | struct_or_union_specifier
                            | type_specifier_no_typeid
                            | atomic_specifier
        """
        p[0] = p[1]

    # See section 6.7.2.4 of the C11 standard.
    def p_atomic_specifier(self, p):
        """ atomic_specifier  : _ATOMIC LPAREN type_name RPAREN
        """
        typ = p[3]
        typ.quals.append('_Atomic')
        p[0] = typ

    def p_type_qualifier(self, p):
        """ type_qualifier  : CONST
                            | RESTRICT
                            | VOLATILE
                            | _ATOMIC
        """
        p[0] = p[1]

    def p_init_declarator_list(self, p):
        """ init_declarator_list    : init_declarator
                                    | init_declarator_list COMMA init_declarator
        """
        p[0] = p[1] + [p[3]] if len(p) == 4 else [p[1]]

    # Returns a {decl=<declarator> : init=<initializer>} dictionary
    # If there's no initializer, uses None
    #
    def p_init_declarator(self, p):
        """ init_declarator : declarator
                            | declarator EQUALS initializer
        """
        p[0] = dict(decl=p[1], init=(p[3] if len(p) > 2 else None))

    def p_id_init_declarator_list(self, p):
        """ id_init_declarator_list    : id_init_declarator
                                       | id_init_declarator_list COMMA init_declarator
        """
        p[0] = p[1] + [p[3]] if len(p) == 4 else [p[1]]

    def p_id_init_declarator(self, p):
        """ id_init_declarator : id_declarator
                               | id_declarator EQUALS initializer
        """
        p[0] = dict(decl=p[1], init=(p[3] if len(p) > 2 else None))

    # Require at least one type specifier in a specifier-qualifier-list
    #
    def p_specifier_qualifier_list_1(self, p):
        """ specifier_qualifier_list    : specifier_qualifier_list type_specifier_no_typeid
        """
        p[0] = self._add_declaration_specifier(p[1], p[2], 'type', append=True)

    def p_specifier_qualifier_list_2(self, p):
        """ specifier_qualifier_list    : specifier_qualifier_list type_qualifier
        """
        p[0] = self._add_declaration_specifier(p[1], p[2], 'qual', append=True)

    def p_specifier_qualifier_list_3(self, p):
        """ specifier_qualifier_list  : type_specifier
        """
        p[0] = self._add_declaration_specifier(None, p[1], 'type')

    def p_specifier_qualifier_list_4(self, p):
        """ specifier_qualifier_list  : type_qualifier_list type_specifier
        """
        p[0] = dict(qual=p[1], alignment=[], storage=[], type=[p[2]], function=[])

    def p_specifier_qualifier_list_5(self, p):
        """ specifier_qualifier_list  : alignment_specifier
        """
        p[0] = dict(qual=[], alignment=[p[1]], storage=[], type=[], function=[])

    def p_specifier_qualifier_list_6(self, p):
        """ specifier_qualifier_list  : specifier_qualifier_list alignment_specifier
        """
        p[0] = self._add_declaration_specifier(p[1], p[2], 'alignment')

    # TYPEID is allowed here (and in other struct/enum related tag names), because
    # struct/enum tags reside in their own namespace and can be named the same as types
    #
    def p_struct_or_union_specifier_1(self, p):
        """ struct_or_union_specifier   : struct_or_union ID
                                        | struct_or_union TYPEID
        """
        klass = self._select_struct_union_class(p[1])
        # None means no list of members
        p[0] = klass(
            name=p[2],
            decls=None,
            coord=self._token_coord(p, 2))

    def p_struct_or_union_specifier_2(self, p):
        """ struct_or_union_specifier : struct_or_union brace_open struct_declaration_list brace_close
                                      | struct_or_union brace_open brace_close
        """
        klass = self._select_struct_union_class(p[1])
        if len(p) == 4:
            # Empty sequence means an empty list of members
            p[0] = klass(
                name=None,
                decls=[],
                coord=self._token_coord(p, 2))
        else:
            p[0] = klass(
                name=None,
                decls=p[3],
                coord=self._token_coord(p, 2))


    def p_struct_or_union_specifier_3(self, p):
        """ struct_or_union_specifier   : struct_or_union ID brace_open struct_declaration_list brace_close
                                        | struct_or_union ID brace_open brace_close
                                        | struct_or_union TYPEID brace_open struct_declaration_list brace_close
                                        | struct_or_union TYPEID brace_open brace_close
        """
        klass = self._select_struct_union_class(p[1])
        if len(p) == 5:
            # Empty sequence means an empty list of members
            p[0] = klass(
                name=p[2],
                decls=[],
                coord=self._token_coord(p, 2))
        else:
            p[0] = klass(
                name=p[2],
                decls=p[4],
                coord=self._token_coord(p, 2))

    def p_struct_or_union(self, p):
        """ struct_or_union : STRUCT
                            | UNION
        """
        p[0] = p[1]

    # Combine all declarations into a single list
    #
    def p_struct_declaration_list(self, p):
        """ struct_declaration_list     : struct_declaration
                                        | struct_declaration_list struct_declaration
        """
        if len(p) == 2:
            p[0] = p[1] or []
        else:
            p[0] = p[1] + (p[2] or [])

    def p_struct_declaration_1(self, p):
        """ struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI
        """
        spec = p[1]
        assert 'typedef' not in spec['storage']

        if p[2] is not None:
            decls = self._build_declarations(
                spec=spec,
                decls=p[2])

        elif len(spec['type']) == 1:
            # Anonymous struct/union, gcc extension, C1x feature.
            # Although the standard only allows structs/unions here, I see no
            # reason to disallow other types since some compilers have typedefs
            # here, and pycparser isn't about rejecting all invalid code.
            #
            node = spec['type'][0]
            if isinstance(node, c_ast.Node):
                decl_type = node
            else:
                decl_type = c_ast.IdentifierType(node)

            decls = self._build_declarations(
                spec=spec,
                decls=[dict(decl=decl_type)])

        else:
            # Structure/union members can have the same names as typedefs.
            # The trouble is that the member's name gets grouped into
            # specifier_qualifier_list; _build_declarations compensates.
            #
            decls = self._build_declarations(
                spec=spec,
                decls=[dict(decl=None, init=None)])

        p[0] = decls

    def p_struct_declaration_2(self, p):
        """ struct_declaration : SEMI
        """
        p[0] = None

    def p_struct_declaration_3(self, p):
        """ struct_declaration : pppragma_directive
        """
        p[0] = [p[1]]

    def p_struct_declarator_list(self, p):
        """ struct_declarator_list  : struct_declarator
                                    | struct_declarator_list COMMA struct_declarator
        """
        p[0] = p[1] + [p[3]] if len(p) == 4 else [p[1]]

    # struct_declarator passes up a dict with the keys: decl (for
    # the underlying declarator) and bitsize (for the bitsize)
    #
    def p_struct_declarator_1(self, p):
        """ struct_declarator : declarator
        """
        p[0] = {'decl': p[1], 'bitsize': None}

    def p_struct_declarator_2(self, p):
        """ struct_declarator   : declarator COLON constant_expression
                                | COLON constant_expression
        """
        if len(p) > 3:
            p[0] = {'decl': p[1], 'bitsize': p[3]}
        else:
            p[0] = {'decl': c_ast.TypeDecl(None, None, None, None), 'bitsize': p[2]}

    def p_enum_specifier_1(self, p):
        """ enum_specifier  : ENUM ID
                            | ENUM TYPEID
        """
        p[0] = c_ast.Enum(p[2], None, self._token_coord(p, 1))

    def p_enum_specifier_2(self, p):
        """ enum_specifier  : ENUM brace_open enumerator_list brace_close
        """
        p[0] = c_ast.Enum(None, p[3], self._token_coord(p, 1))

    def p_enum_specifier_3(self, p):
        """ enum_specifier  : ENUM ID brace_open enumerator_list brace_close
                            | ENUM TYPEID brace_open enumerator_list brace_close
        """
        p[0] = c_ast.Enum(p[2], p[4], self._token_coord(p, 1))

    def p_enumerator_list(self, p):
        """ enumerator_list : enumerator
                            | enumerator_list COMMA
                            | enumerator_list COMMA enumerator
        """
        if len(p) == 2:
            p[0] = c_ast.EnumeratorList([p[1]], p[1].coord)
        elif len(p) == 3:
            p[0] = p[1]
        else:
            p[1].enumerators.append(p[3])
            p[0] = p[1]

    def p_alignment_specifier(self, p):
        """ alignment_specifier  : _ALIGNAS LPAREN type_name RPAREN
                                 | _ALIGNAS LPAREN constant_expression RPAREN
        """
        p[0] = c_ast.Alignas(p[3], self._token_coord(p, 1))

    def p_enumerator(self, p):
        """ enumerator  : ID
                        | ID EQUALS constant_expression
        """
        if len(p) == 2:
            enumerator = c_ast.Enumerator(
                        p[1], None,
                        self._token_coord(p, 1))
        else:
            enumerator = c_ast.Enumerator(
                        p[1], p[3],
                        self._token_coord(p, 1))
        self._add_identifier(enumerator.name, enumerator.coord)

        p[0] = enumerator

    def p_declarator(self, p):
        """ declarator  : id_declarator
                        | typeid_declarator
        """
        p[0] = p[1]

    @parameterized(('id', 'ID'), ('typeid', 'TYPEID'), ('typeid_noparen', 'TYPEID'))
    def p_xxx_declarator_1(self, p):
        """ xxx_declarator  : direct_xxx_declarator
        """
        p[0] = p[1]

    @parameterized(('id', 'ID'), ('typeid', 'TYPEID'), ('typeid_noparen', 'TYPEID'))
    def p_xxx_declarator_2(self, p):
        """ xxx_declarator  : pointer direct_xxx_declarator
        """
        p[0] = self._type_modify_decl(p[2], p[1])

    @parameterized(('id', 'ID'), ('typeid', 'TYPEID'), ('typeid_noparen', 'TYPEID'))
    def p_direct_xxx_declarator_1(self, p):
        """ direct_xxx_declarator   : yyy
        """
        p[0] = c_ast.TypeDecl(
            declname=p[1],
            type=None,
            quals=None,
            align=None,
            coord=self._token_coord(p, 1))

    @parameterized(('id', 'ID'), ('typeid', 'TYPEID'))
    def p_direct_xxx_declarator_2(self, p):
        """ direct_xxx_declarator   : LPAREN xxx_declarator RPAREN
        """
        p[0] = p[2]

    @parameterized(('id', 'ID'), ('typeid', 'TYPEID'), ('typeid_noparen', 'TYPEID'))
    def p_direct_xxx_declarator_3(self, p):
        """ direct_xxx_declarator   : direct_xxx_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        """
        quals = (p[3] if len(p) > 5 else []) or []
        # Accept dimension qualifiers
        # Per C99 6.7.5.3 p7
        arr = c_ast.ArrayDecl(
            type=None,
            dim=p[4] if len(p) > 5 else p[3],
            dim_quals=quals,
            coord=p[1].coord)

        p[0] = self._type_modify_decl(decl=p[1], modifier=arr)

    @parameterized(('id', 'ID'), ('typeid', 'TYPEID'), ('typeid_noparen', 'TYPEID'))
    def p_direct_xxx_declarator_4(self, p):
        """ direct_xxx_declarator   : direct_xxx_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET
                                    | direct_xxx_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET
        """
        # Using slice notation for PLY objects doesn't work in Python 3 for the
        # version of PLY embedded with pycparser; see PLY Google Code issue 30.
        # Work around that here by listing the two elements separately.
        listed_quals = [item if isinstance(item, list) else [item]
            for item in [p[3],p[4]]]
        dim_quals = [qual for sublist in listed_quals for qual in sublist
            if qual is not None]
        arr = c_ast.ArrayDecl(
            type=None,
            dim=p[5],
            dim_quals=dim_quals,
            coord=p[1].coord)

        p[0] = self._type_modify_decl(decl=p[1], modifier=arr)

    # Special for VLAs
    #
    @parameterized(('id', 'ID'), ('typeid', 'TYPEID'), ('typeid_noparen', 'TYPEID'))
    def p_direct_xxx_declarator_5(self, p):
        """ direct_xxx_declarator   : direct_xxx_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET
        """
        arr = c_ast.ArrayDecl(
            type=None,
            dim=c_ast.ID(p[4], self._token_coord(p, 4)),
            dim_quals=p[3] if p[3] is not None else [],
            coord=p[1].coord)

        p[0] = self._type_modify_decl(decl=p[1], modifier=arr)

    @parameterized(('id', 'ID'), ('typeid', 'TYPEID'), ('typeid_noparen', 'TYPEID'))
    def p_direct_xxx_declarator_6(self, p):
        """ direct_xxx_declarator   : direct_xxx_declarator LPAREN parameter_type_list RPAREN
                                    | direct_xxx_declarator LPAREN identifier_list_opt RPAREN
        """
        func = c_ast.FuncDecl(
            args=p[3],
            type=None,
            coord=p[1].coord)

        # To see why _get_yacc_lookahead_token is needed, consider:
        #   typedef char TT;
        #   void foo(int TT) { TT = 10; }
        # Outside the function, TT is a typedef, but inside (starting and
        # ending with the braces) it's a parameter.  The trouble begins with
        # yacc's lookahead token.  We don't know if we're declaring or
        # defining a function until we see LBRACE, but if we wait for yacc to
        # trigger a rule on that token, then TT will have already been read
        # and incorrectly interpreted as TYPEID.  We need to add the
        # parameters to the scope the moment the lexer sees LBRACE.
        #
        if self._get_yacc_lookahead_token().type == "LBRACE":
            if func.args is not None:
                for param in func.args.params:
                    if isinstance(param, c_ast.EllipsisParam): break
                    self._add_identifier(param.name, param.coord)

        p[0] = self._type_modify_decl(decl=p[1], modifier=func)

    def p_pointer(self, p):
        """ pointer : TIMES type_qualifier_list_opt
                    | TIMES type_qualifier_list_opt pointer
        """
        coord = self._token_coord(p, 1)
        # Pointer decls nest from inside out. This is important when different
        # levels have different qualifiers. For example:
        #
        #  char * const * p;
        #
        # Means "pointer to const pointer to char"
        #
        # While:
        #
        #  char ** const p;
        #
        # Means "const pointer to pointer to char"
        #
        # So when we construct PtrDecl nestings, the leftmost pointer goes in
        # as the most nested type.
        nested_type = c_ast.PtrDecl(quals=p[2] or [], type=None, coord=coord)
        if len(p) > 3:
            tail_type = p[3]
            while tail_type.type is not None:
                tail_type = tail_type.type
            tail_type.type = nested_type
            p[0] = p[3]
        else:
            p[0] = nested_type

    def p_type_qualifier_list(self, p):
        """ type_qualifier_list : type_qualifier
                                | type_qualifier_list type_qualifier
        """
        p[0] = [p[1]] if len(p) == 2 else p[1] + [p[2]]

    def p_parameter_type_list(self, p):
        """ parameter_type_list : parameter_list
                                | parameter_list COMMA ELLIPSIS
        """
        if len(p) > 2:
            p[1].params.append(c_ast.EllipsisParam(self._token_coord(p, 3)))

        p[0] = p[1]

    def p_parameter_list(self, p):
        """ parameter_list  : parameter_declaration
                            | parameter_list COMMA parameter_declaration
        """
        if len(p) == 2: # single parameter
            p[0] = c_ast.ParamList([p[1]], p[1].coord)
        else:
            p[1].params.append(p[3])
            p[0] = p[1]

    # From ISO/IEC 9899:TC2, 6.7.5.3.11:
    # "If, in a parameter declaration, an identifier can be treated either
    #  as a typedef name or as a parameter name, it shall be taken as a
    #  typedef name."
    #
    # Inside a parameter declaration, once we've reduced declaration specifiers,
    # if we shift in an LPAREN and see a TYPEID, it could be either an abstract
    # declarator or a declarator nested inside parens. This rule tells us to
    # always treat it as an abstract declarator. Therefore, we only accept
    # `id_declarator`s and `typeid_noparen_declarator`s.
    def p_parameter_declaration_1(self, p):
        """ parameter_declaration   : declaration_specifiers id_declarator
                                    | declaration_specifiers typeid_noparen_declarator
        """
        spec = p[1]
        if not spec['type']:
            spec['type'] = [c_ast.IdentifierType(['int'],
                coord=self._token_coord(p, 1))]
        p[0] = self._build_declarations(
            spec=spec,
            decls=[dict(decl=p[2])])[0]

    def p_parameter_declaration_2(self, p):
        """ parameter_declaration   : declaration_specifiers abstract_declarator_opt
        """
        spec = p[1]
        if not spec['type']:
            spec['type'] = [c_ast.IdentifierType(['int'],
                coord=self._token_coord(p, 1))]

        # Parameters can have the same names as typedefs.  The trouble is that
        # the parameter's name gets grouped into declaration_specifiers, making
        # it look like an old-style declaration; compensate.
        #
        if len(spec['type']) > 1 and len(spec['type'][-1].names) == 1 and \
                self._is_type_in_scope(spec['type'][-1].names[0]):
            decl = self._build_declarations(
                    spec=spec,
                    decls=[dict(decl=p[2], init=None)])[0]

        # This truly is an old-style parameter declaration
        #
        else:
            decl = c_ast.Typename(
                name='',
                quals=spec['qual'],
                align=None,
                type=p[2] or c_ast.TypeDecl(None, None, None, None),
                coord=self._token_coord(p, 2))
            typename = spec['type']
            decl = self._fix_decl_name_type(decl, typename)

        p[0] = decl

    def p_identifier_list(self, p):
        """ identifier_list : identifier
                            | identifier_list COMMA identifier
        """
        if len(p) == 2: # single parameter
            p[0] = c_ast.ParamList([p[1]], p[1].coord)
        else:
            p[1].params.append(p[3])
            p[0] = p[1]

    def p_initializer_1(self, p):
        """ initializer : assignment_expression
        """
        p[0] = p[1]

    def p_initializer_2(self, p):
        """ initializer : brace_open initializer_list_opt brace_close
                        | brace_open initializer_list COMMA brace_close
        """
        if p[2] is None:
            p[0] = c_ast.InitList([], self._token_coord(p, 1))
        else:
            p[0] = p[2]

    def p_initializer_list(self, p):
        """ initializer_list    : designation_opt initializer
                                | initializer_list COMMA designation_opt initializer
        """
        if len(p) == 3: # single initializer
            init = p[2] if p[1] is None else c_ast.NamedInitializer(p[1], p[2])
            p[0] = c_ast.InitList([init], p[2].coord)
        else:
            init = p[4] if p[3] is None else c_ast.NamedInitializer(p[3], p[4])
            p[1].exprs.append(init)
            p[0] = p[1]

    def p_designation(self, p):
        """ designation : designator_list EQUALS
        """
        p[0] = p[1]

    # Designators are represented as a list of nodes, in the order in which
    # they're written in the code.
    #
    def p_designator_list(self, p):
        """ designator_list : designator
                            | designator_list designator
        """
        p[0] = [p[1]] if len(p) == 2 else p[1] + [p[2]]

    def p_designator(self, p):
        """ designator  : LBRACKET constant_expression RBRACKET
                        | PERIOD identifier
        """
        p[0] = p[2]

    def p_type_name(self, p):
        """ type_name   : specifier_qualifier_list abstract_declarator_opt
        """
        typename = c_ast.Typename(
            name='',
            quals=p[1]['qual'][:],
            align=None,
            type=p[2] or c_ast.TypeDecl(None, None, None, None),
            coord=self._token_coord(p, 2))

        p[0] = self._fix_decl_name_type(typename, p[1]['type'])

    def p_abstract_declarator_1(self, p):
        """ abstract_declarator     : pointer
        """
        dummytype = c_ast.TypeDecl(None, None, None, None)
        p[0] = self._type_modify_decl(
            decl=dummytype,
            modifier=p[1])

    def p_abstract_declarator_2(self, p):
        """ abstract_declarator     : pointer direct_abstract_declarator
        """
        p[0] = self._type_modify_decl(p[2], p[1])

    def p_abstract_declarator_3(self, p):
        """ abstract_declarator     : direct_abstract_declarator
        """
        p[0] = p[1]

    # Creating and using direct_abstract_declarator_opt here
    # instead of listing both direct_abstract_declarator and the
    # lack of it in the beginning of _1 and _2 caused two
    # shift/reduce errors.
    #
    def p_direct_abstract_declarator_1(self, p):
        """ direct_abstract_declarator  : LPAREN abstract_declarator RPAREN """
        p[0] = p[2]

    def p_direct_abstract_declarator_2(self, p):
        """ direct_abstract_declarator  : direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET
        """
        arr = c_ast.ArrayDecl(
            type=None,
            dim=p[3],
            dim_quals=[],
            coord=p[1].coord)

        p[0] = self._type_modify_decl(decl=p[1], modifier=arr)

    def p_direct_abstract_declarator_3(self, p):
        """ direct_abstract_declarator  : LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        """
        quals = (p[2] if len(p) > 4 else []) or []
        p[0] = c_ast.ArrayDecl(
            type=c_ast.TypeDecl(None, None, None, None),
            dim=p[3] if len(p) > 4 else p[2],
            dim_quals=quals,
            coord=self._token_coord(p, 1))

    def p_direct_abstract_declarator_4(self, p):
        """ direct_abstract_declarator  : direct_abstract_declarator LBRACKET TIMES RBRACKET
        """
        arr = c_ast.ArrayDecl(
            type=None,
            dim=c_ast.ID(p[3], self._token_coord(p, 3)),
            dim_quals=[],
            coord=p[1].coord)

        p[0] = self._type_modify_decl(decl=p[1], modifier=arr)

    def p_direct_abstract_declarator_5(self, p):
        """ direct_abstract_declarator  : LBRACKET TIMES RBRACKET
        """
        p[0] = c_ast.ArrayDecl(
            type=c_ast.TypeDecl(None, None, None, None),
            dim=c_ast.ID(p[3], self._token_coord(p, 3)),
            dim_quals=[],
            coord=self._token_coord(p, 1))

    def p_direct_abstract_declarator_6(self, p):
        """ direct_abstract_declarator  : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN
        """
        func = c_ast.FuncDecl(
            args=p[3],
            type=None,
            coord=p[1].coord)

        p[0] = self._type_modify_decl(decl=p[1], modifier=func)

    def p_direct_abstract_declarator_7(self, p):
        """ direct_abstract_declarator  : LPAREN parameter_type_list_opt RPAREN
        """
        p[0] = c_ast.FuncDecl(
            args=p[2],
            type=c_ast.TypeDecl(None, None, None, None),
            coord=self._token_coord(p, 1))

    def p_direct_abstract_declarator_8(self, p):
        """ direct_abstract_declarator  : LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET
                                         | LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET
        """
        listed_quals = [item if isinstance(item, list) else [item]
            for item in [p[2],p[3]]]
        quals = [qual for sublist in listed_quals for qual in sublist
            if qual is not None]
        p[0] = c_ast.ArrayDecl(
            type=c_ast.TypeDecl(None, None, None, None),
            dim=p[4],
            dim_quals=quals,
            coord=self._token_coord(p, 1))

    # declaration is a list, statement isn't. To make it consistent, block_item
    # will always be a list
    #
    def p_block_item(self, p):
        """ block_item  : declaration
                        | statement
        """
        p[0] = p[1] if isinstance(p[1], list) else [p[1]]

    # Since we made block_item a list, this just combines lists
    #
    def p_block_item_list(self, p):
        """ block_item_list : block_item
                            | block_item_list block_item
        """
        # Empty block items (plain ';') produce [None], so ignore them
        p[0] = p[1] if (len(p) == 2 or p[2] == [None]) else p[1] + p[2]

    def p_compound_statement_1(self, p):
        """ compound_statement : brace_open block_item_list_opt brace_close """
        p[0] = c_ast.Compound(
            block_items=p[2],
            coord=self._token_coord(p, 1))

    def p_labeled_statement_1(self, p):
        """ labeled_statement : ID COLON pragmacomp_or_statement """
        p[0] = c_ast.Label(p[1], p[3], self._token_coord(p, 1))

    def p_labeled_statement_2(self, p):
        """ labeled_statement : CASE constant_expression COLON pragmacomp_or_statement """
        p[0] = c_ast.Case(p[2], [p[4]], self._token_coord(p, 1))

    def p_labeled_statement_3(self, p):
        """ labeled_statement : DEFAULT COLON pragmacomp_or_statement """
        p[0] = c_ast.Default([p[3]], self._token_coord(p, 1))

    def p_labeled_statement_4(self, p):
        """ labeled_statement : ID COLON """
        p[0] = c_ast.Label(p[1], c_ast.EmptyStatement(self._token_coord(p, 1)), self._token_coord(p, 1))

    def p_labeled_statement_5(self, p):
        """ labeled_statement : CASE constant_expression COLON """
        p[0] = c_ast.Case(p[2], [c_ast.EmptyStatement(self._token_coord(p, 2))], self._token_coord(p, 1))

    def p_labeled_statement_6(self, p):
        """ labeled_statement : DEFAULT COLON """
        p[0] = c_ast.Default([c_ast.EmptyStatement(self._token_coord(p, 1))], self._token_coord(p, 1))

    def p_selection_statement_1(self, p):
        """ selection_statement : IF LPAREN expression RPAREN pragmacomp_or_statement """
        p[0] = c_ast.If(p[3], p[5], None, self._token_coord(p, 1))

    def p_selection_statement_2(self, p):
        """ selection_statement : IF LPAREN expression RPAREN statement ELSE pragmacomp_or_statement """
        p[0] = c_ast.If(p[3], p[5], p[7], self._token_coord(p, 1))

    def p_selection_statement_3(self, p):
        """ selection_statement : SWITCH LPAREN expression RPAREN pragmacomp_or_statement """
        p[0] = fix_switch_cases(
                c_ast.Switch(p[3], p[5], self._token_coord(p, 1)))

    def p_iteration_statement_1(self, p):
        """ iteration_statement : WHILE LPAREN expression RPAREN pragmacomp_or_statement """
        p[0] = c_ast.While(p[3], p[5], self._token_coord(p, 1))

    def p_iteration_statement_2(self, p):
        """ iteration_statement : DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI """
        p[0] = c_ast.DoWhile(p[5], p[2], self._token_coord(p, 1))

    def p_iteration_statement_3(self, p):
        """ iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement """
        p[0] = c_ast.For(p[3], p[5], p[7], p[9], self._token_coord(p, 1))

    def p_iteration_statement_4(self, p):
        """ iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement """
        p[0] = c_ast.For(c_ast.DeclList(p[3], self._token_coord(p, 1)),
                         p[4], p[6], p[8], self._token_coord(p, 1))

    def p_jump_statement_1(self, p):
        """ jump_statement  : GOTO ID SEMI """
        p[0] = c_ast.Goto(p[2], self._token_coord(p, 1))

    def p_jump_statement_2(self, p):
        """ jump_statement  : BREAK SEMI """
        p[0] = c_ast.Break(self._token_coord(p, 1))

    def p_jump_statement_3(self, p):
        """ jump_statement  : CONTINUE SEMI """
        p[0] = c_ast.Continue(self._token_coord(p, 1))

    def p_jump_statement_4(self, p):
        """ jump_statement  : RETURN expression SEMI
                            | RETURN SEMI
        """
        p[0] = c_ast.Return(p[2] if len(p) == 4 else None, self._token_coord(p, 1))

    def p_expression_statement(self, p):
        """ expression_statement : expression_opt SEMI """
        if p[1] is None:
            p[0] = c_ast.EmptyStatement(self._token_coord(p, 2))
        else:
            p[0] = p[1]

    def p_expression(self, p):
        """ expression  : assignment_expression
                        | expression COMMA assignment_expression
        """
        if len(p) == 2:
            p[0] = p[1]
        else:
            if not isinstance(p[1], c_ast.ExprList):
                p[1] = c_ast.ExprList([p[1]], p[1].coord)

            p[1].exprs.append(p[3])
            p[0] = p[1]

    def p_parenthesized_compound_expression(self, p):
        """ assignment_expression : LPAREN compound_statement RPAREN """
        p[0] = p[2]

    def p_typedef_name(self, p):
        """ typedef_name : TYPEID """
        p[0] = c_ast.IdentifierType([p[1]], coord=self._token_coord(p, 1))

    def p_assignment_expression(self, p):
        """ assignment_expression   : conditional_expression
                                    | unary_expression assignment_operator assignment_expression
        """
        if len(p) == 2:
            p[0] = p[1]
        else:
            p[0] = c_ast.Assignment(p[2], p[1], p[3], p[1].coord)

    # K&R2 defines these as many separate rules, to encode
    # precedence and associativity. Why work hard ? I'll just use
    # the built in precedence/associativity specification feature
    # of PLY. (see precedence declaration above)
    #
    def p_assignment_operator(self, p):
        """ assignment_operator : EQUALS
                                | XOREQUAL
                                | TIMESEQUAL
                                | DIVEQUAL
                                | MODEQUAL
                                | PLUSEQUAL
                                | MINUSEQUAL
                                | LSHIFTEQUAL
                                | RSHIFTEQUAL
                                | ANDEQUAL
                                | OREQUAL
        """
        p[0] = p[1]

    def p_constant_expression(self, p):
        """ constant_expression : conditional_expression """
        p[0] = p[1]

    def p_conditional_expression(self, p):
        """ conditional_expression  : binary_expression
                                    | binary_expression CONDOP expression COLON conditional_expression
        """
        if len(p) == 2:
            p[0] = p[1]
        else:
            p[0] = c_ast.TernaryOp(p[1], p[3], p[5], p[1].coord)

    def p_binary_expression(self, p):
        """ binary_expression   : cast_expression
                                | binary_expression TIMES binary_expression
                                | binary_expression DIVIDE binary_expression
                                | binary_expression MOD binary_expression
                                | binary_expression PLUS binary_expression
                                | binary_expression MINUS binary_expression
                                | binary_expression RSHIFT binary_expression
                                | binary_expression LSHIFT binary_expression
                                | binary_expression LT binary_expression
                                | binary_expression LE binary_expression
                                | binary_expression GE binary_expression
                                | binary_expression GT binary_expression
                                | binary_expression EQ binary_expression
                                | binary_expression NE binary_expression
                                | binary_expression AND binary_expression
                                | binary_expression OR binary_expression
                                | binary_expression XOR binary_expression
                                | binary_expression LAND binary_expression
                                | binary_expression LOR binary_expression
        """
        if len(p) == 2:
            p[0] = p[1]
        else:
            p[0] = c_ast.BinaryOp(p[2], p[1], p[3], p[1].coord)

    def p_cast_expression_1(self, p):
        """ cast_expression : unary_expression """
        p[0] = p[1]

    def p_cast_expression_2(self, p):
        """ cast_expression : LPAREN type_name RPAREN cast_expression """
        p[0] = c_ast.Cast(p[2], p[4], self._token_coord(p, 1))

    def p_unary_expression_1(self, p):
        """ unary_expression    : postfix_expression """
        p[0] = p[1]

    def p_unary_expression_2(self, p):
        """ unary_expression    : PLUSPLUS unary_expression
                                | MINUSMINUS unary_expression
                                | unary_operator cast_expression
        """
        p[0] = c_ast.UnaryOp(p[1], p[2], p[2].coord)

    def p_unary_expression_3(self, p):
        """ unary_expression    : SIZEOF unary_expression
                                | SIZEOF LPAREN type_name RPAREN
                                | _ALIGNOF LPAREN type_name RPAREN
        """
        p[0] = c_ast.UnaryOp(
            p[1],
            p[2] if len(p) == 3 else p[3],
            self._token_coord(p, 1))

    def p_unary_operator(self, p):
        """ unary_operator  : AND
                            | TIMES
                            | PLUS
                            | MINUS
                            | NOT
                            | LNOT
        """
        p[0] = p[1]

    def p_postfix_expression_1(self, p):
        """ postfix_expression  : primary_expression """
        p[0] = p[1]

    def p_postfix_expression_2(self, p):
        """ postfix_expression  : postfix_expression LBRACKET expression RBRACKET """
        p[0] = c_ast.ArrayRef(p[1], p[3], p[1].coord)

    def p_postfix_expression_3(self, p):
        """ postfix_expression  : postfix_expression LPAREN argument_expression_list RPAREN
                                | postfix_expression LPAREN RPAREN
        """
        p[0] = c_ast.FuncCall(p[1], p[3] if len(p) == 5 else None, p[1].coord)

    def p_postfix_expression_4(self, p):
        """ postfix_expression  : postfix_expression PERIOD ID
                                | postfix_expression PERIOD TYPEID
                                | postfix_expression ARROW ID
                                | postfix_expression ARROW TYPEID
        """
        field = c_ast.ID(p[3], self._token_coord(p, 3))
        p[0] = c_ast.StructRef(p[1], p[2], field, p[1].coord)

    def p_postfix_expression_5(self, p):
        """ postfix_expression  : postfix_expression PLUSPLUS
                                | postfix_expression MINUSMINUS
        """
        p[0] = c_ast.UnaryOp('p' + p[2], p[1], p[1].coord)

    def p_postfix_expression_6(self, p):
        """ postfix_expression  : LPAREN type_name RPAREN brace_open initializer_list brace_close
                                | LPAREN type_name RPAREN brace_open initializer_list COMMA brace_close
        """
        p[0] = c_ast.CompoundLiteral(p[2], p[5])

    def p_primary_expression_1(self, p):
        """ primary_expression  : identifier """
        p[0] = p[1]

    def p_primary_expression_2(self, p):
        """ primary_expression  : constant """
        p[0] = p[1]

    def p_primary_expression_3(self, p):
        """ primary_expression  : unified_string_literal
                                | unified_wstring_literal
        """
        p[0] = p[1]

    def p_primary_expression_4(self, p):
        """ primary_expression  : LPAREN expression RPAREN """
        p[0] = p[2]

    def p_primary_expression_5(self, p):
        """ primary_expression  : OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPAREN
        """
        coord = self._token_coord(p, 1)
        p[0] = c_ast.FuncCall(c_ast.ID(p[1], coord),
                              c_ast.ExprList([p[3], p[5]], coord),
                              coord)

    def p_offsetof_member_designator(self, p):
        """ offsetof_member_designator : identifier
                                         | offsetof_member_designator PERIOD identifier
                                         | offsetof_member_designator LBRACKET expression RBRACKET
        """
        if len(p) == 2:
            p[0] = p[1]
        elif len(p) == 4:
            p[0] = c_ast.StructRef(p[1], p[2], p[3], p[1].coord)
        elif len(p) == 5:
            p[0] = c_ast.ArrayRef(p[1], p[3], p[1].coord)
        else:
            raise NotImplementedError("Unexpected parsing state. len(p): %u" % len(p))

    def p_argument_expression_list(self, p):
        """ argument_expression_list    : assignment_expression
                                        | argument_expression_list COMMA assignment_expression
        """
        if len(p) == 2: # single expr
            p[0] = c_ast.ExprList([p[1]], p[1].coord)
        else:
            p[1].exprs.append(p[3])
            p[0] = p[1]

    def p_identifier(self, p):
        """ identifier  : ID """
        p[0] = c_ast.ID(p[1], self._token_coord(p, 1))

    def p_constant_1(self, p):
        """ constant    : INT_CONST_DEC
                        | INT_CONST_OCT
                        | INT_CONST_HEX
                        | INT_CONST_BIN
                        | INT_CONST_CHAR
        """
        uCount = 0
        lCount = 0
        for x in p[1][-3:]:
            if x in ('l', 'L'):
                lCount += 1
            elif x in ('u', 'U'):
                uCount += 1
        t = ''
        if uCount > 1:
             raise ValueError('Constant cannot have more than one u/U suffix.')
        elif lCount > 2:
             raise ValueError('Constant cannot have more than two l/L suffix.')
        prefix = 'unsigned ' * uCount + 'long ' * lCount
        p[0] = c_ast.Constant(
            prefix + 'int', p[1], self._token_coord(p, 1))

    def p_constant_2(self, p):
        """ constant    : FLOAT_CONST
                        | HEX_FLOAT_CONST
        """
        if p[1][-1] in ('f', 'F'):
            t = 'float'
        elif p[1][-1] in ('l', 'L'):
            t = 'long double'
        else:
            t = 'double'

        p[0] = c_ast.Constant(
            t, p[1], self._token_coord(p, 1))

    def p_constant_3(self, p):
        """ constant    : CHAR_CONST
                        | WCHAR_CONST
                        | U8CHAR_CONST
                        | U16CHAR_CONST
                        | U32CHAR_CONST
        """
        p[0] = c_ast.Constant(
            'char', p[1], self._token_coord(p, 1))

    # The "unified" string and wstring literal rules are for supporting
    # concatenation of adjacent string literals.
    # I.e. "hello " "world" is seen by the C compiler as a single string literal
    # with the value "hello world"
    #
    def p_unified_string_literal(self, p):
        """ unified_string_literal  : STRING_LITERAL
                                    | unified_string_literal STRING_LITERAL
        """
        if len(p) == 2: # single literal
            p[0] = c_ast.Constant(
                'string', p[1], self._token_coord(p, 1))
        else:
            p[1].value = p[1].value[:-1] + p[2][1:]
            p[0] = p[1]

    def p_unified_wstring_literal(self, p):
        """ unified_wstring_literal : WSTRING_LITERAL
                                    | U8STRING_LITERAL
                                    | U16STRING_LITERAL
                                    | U32STRING_LITERAL
                                    | unified_wstring_literal WSTRING_LITERAL
                                    | unified_wstring_literal U8STRING_LITERAL
                                    | unified_wstring_literal U16STRING_LITERAL
                                    | unified_wstring_literal U32STRING_LITERAL
        """
        if len(p) == 2: # single literal
            p[0] = c_ast.Constant(
                'string', p[1], self._token_coord(p, 1))
        else:
            p[1].value = p[1].value.rstrip()[:-1] + p[2][2:]
            p[0] = p[1]

    def p_brace_open(self, p):
        """ brace_open  :   LBRACE
        """
        p[0] = p[1]
        p.set_lineno(0, p.lineno(1))

    def p_brace_close(self, p):
        """ brace_close :   RBRACE
        """
        p[0] = p[1]
        p.set_lineno(0, p.lineno(1))

    def p_empty(self, p):
        'empty : '
        p[0] = None

    def p_error(self, p):
        # If error recovery is added here in the future, make sure
        # _get_yacc_lookahead_token still works!
        #
        if p:
            self._parse_error(
                'before: %s' % p.value,
                self._coord(lineno=p.lineno,
                            column=self.clex.find_tok_column(p)))
        else:
            self._parse_error('At end of input', self.clex.filename)
PK�t�\��@H"H"	lextab.pynu�[���# lextab.py. This file automatically created by PLY (version 3.10). Don't edit!
_tabversion   = '3.10'
_lextokens    = set(('AND', 'ANDEQUAL', 'ARROW', 'AUTO', 'BREAK', 'CASE', 'CHAR', 'CHAR_CONST', 'COLON', 'COMMA', 'CONDOP', 'CONST', 'CONTINUE', 'DEFAULT', 'DIVEQUAL', 'DIVIDE', 'DO', 'DOUBLE', 'ELLIPSIS', 'ELSE', 'ENUM', 'EQ', 'EQUALS', 'EXTERN', 'FLOAT', 'FLOAT_CONST', 'FOR', 'GE', 'GOTO', 'GT', 'HEX_FLOAT_CONST', 'ID', 'IF', 'INLINE', 'INT', 'INT_CONST_BIN', 'INT_CONST_CHAR', 'INT_CONST_DEC', 'INT_CONST_HEX', 'INT_CONST_OCT', 'LAND', 'LBRACE', 'LBRACKET', 'LE', 'LNOT', 'LONG', 'LOR', 'LPAREN', 'LSHIFT', 'LSHIFTEQUAL', 'LT', 'MINUS', 'MINUSEQUAL', 'MINUSMINUS', 'MOD', 'MODEQUAL', 'NE', 'NOT', 'OFFSETOF', 'OR', 'OREQUAL', 'PERIOD', 'PLUS', 'PLUSEQUAL', 'PLUSPLUS', 'PPHASH', 'PPPRAGMA', 'PPPRAGMASTR', 'RBRACE', 'RBRACKET', 'REGISTER', 'RESTRICT', 'RETURN', 'RPAREN', 'RSHIFT', 'RSHIFTEQUAL', 'SEMI', 'SHORT', 'SIGNED', 'SIZEOF', 'STATIC', 'STRING_LITERAL', 'STRUCT', 'SWITCH', 'TIMES', 'TIMESEQUAL', 'TYPEDEF', 'TYPEID', 'U16CHAR_CONST', 'U16STRING_LITERAL', 'U32CHAR_CONST', 'U32STRING_LITERAL', 'U8CHAR_CONST', 'U8STRING_LITERAL', 'UNION', 'UNSIGNED', 'VOID', 'VOLATILE', 'WCHAR_CONST', 'WHILE', 'WSTRING_LITERAL', 'XOR', 'XOREQUAL', '_ALIGNAS', '_ALIGNOF', '_ATOMIC', '_BOOL', '_COMPLEX', '_NORETURN', '_PRAGMA', '_STATIC_ASSERT', '_THREAD_LOCAL', '__INT128'))
_lexreflags   = 64
_lexliterals  = ''
_lexstateinfo = {'INITIAL': 'inclusive', 'ppline': 'exclusive', 'pppragma': 'exclusive'}
_lexstatere   = {'INITIAL': [('(?P<t_PPHASH>[ \\t]*\\#)|(?P<t_NEWLINE>\\n+)|(?P<t_LBRACE>\\{)|(?P<t_RBRACE>\\})|(?P<t_FLOAT_CONST>((((([0-9]*\\.[0-9]+)|([0-9]+\\.))([eE][-+]?[0-9]+)?)|([0-9]+([eE][-+]?[0-9]+)))[FfLl]?))|(?P<t_HEX_FLOAT_CONST>(0[xX]([0-9a-fA-F]+|((([0-9a-fA-F]+)?\\.[0-9a-fA-F]+)|([0-9a-fA-F]+\\.)))([pP][+-]?[0-9]+)[FfLl]?))|(?P<t_INT_CONST_HEX>0[xX][0-9a-fA-F]+(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|(?P<t_INT_CONST_BIN>0[bB][01]+(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|(?P<t_BAD_CONST_OCT>0[0-7]*[89])|(?P<t_UNSUPPORTED_C_STYLE_COMMENT>\\/\\*)|(?P<t_UNSUPPORTED_CXX_STYLE_COMMENT>\\/\\/)|(?P<t_INT_CONST_OCT>0[0-7]*(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|(?P<t_INT_CONST_DEC>(0(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|([1-9][0-9]*(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?))|(?P<t_INT_CONST_CHAR>\'([^\'\\\\\\n]|(\\\\(([a-wyzA-Z._~!=&\\^\\-\\\\?\'"]|x(?![0-9a-fA-F]))|(\\d+)(?!\\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F])))){2,4}\')|(?P<t_CHAR_CONST>\'([^\'\\\\\\n]|(\\\\(([a-wyzA-Z._~!=&\\^\\-\\\\?\'"]|x(?![0-9a-fA-F]))|(\\d+)(?!\\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))\')|(?P<t_WCHAR_CONST>L\'([^\'\\\\\\n]|(\\\\(([a-wyzA-Z._~!=&\\^\\-\\\\?\'"]|x(?![0-9a-fA-F]))|(\\d+)(?!\\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))\')|(?P<t_U8CHAR_CONST>u8\'([^\'\\\\\\n]|(\\\\(([a-wyzA-Z._~!=&\\^\\-\\\\?\'"]|x(?![0-9a-fA-F]))|(\\d+)(?!\\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))\')|(?P<t_U16CHAR_CONST>u\'([^\'\\\\\\n]|(\\\\(([a-wyzA-Z._~!=&\\^\\-\\\\?\'"]|x(?![0-9a-fA-F]))|(\\d+)(?!\\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))\')|(?P<t_U32CHAR_CONST>U\'([^\'\\\\\\n]|(\\\\(([a-wyzA-Z._~!=&\\^\\-\\\\?\'"]|x(?![0-9a-fA-F]))|(\\d+)(?!\\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))\')|(?P<t_UNMATCHED_QUOTE>(\'([^\'\\\\\\n]|(\\\\(([a-wyzA-Z._~!=&\\^\\-\\\\?\'"]|x(?![0-9a-fA-F]))|(\\d+)(?!\\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))*\\n)|(\'([^\'\\\\\\n]|(\\\\(([a-wyzA-Z._~!=&\\^\\-\\\\?\'"]|x(?![0-9a-fA-F]))|(\\d+)(?!\\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))*$))|(?P<t_BAD_CHAR_CONST>(\'([^\'\\\\\\n]|(\\\\(([a-wyzA-Z._~!=&\\^\\-\\\\?\'"]|x(?![0-9a-fA-F]))|(\\d+)(?!\\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))[^\'\n]+\')|(\'\')|(\'([\\\\][^a-zA-Z._~^!=&\\^\\-\\\\?\'"x0-9])[^\'\\n]*\'))|(?P<t_WSTRING_LITERAL>L"([^"\\\\\\n]|(\\\\[0-9a-zA-Z._~!=&\\^\\-\\\\?\'"]))*")|(?P<t_U8STRING_LITERAL>u8"([^"\\\\\\n]|(\\\\[0-9a-zA-Z._~!=&\\^\\-\\\\?\'"]))*")|(?P<t_U16STRING_LITERAL>u"([^"\\\\\\n]|(\\\\[0-9a-zA-Z._~!=&\\^\\-\\\\?\'"]))*")|(?P<t_U32STRING_LITERAL>U"([^"\\\\\\n]|(\\\\[0-9a-zA-Z._~!=&\\^\\-\\\\?\'"]))*")|(?P<t_BAD_STRING_LITERAL>"([^"\\\\\\n]|(\\\\[0-9a-zA-Z._~!=&\\^\\-\\\\?\'"]))*([\\\\][^a-zA-Z._~^!=&\\^\\-\\\\?\'"x0-9])([^"\\\\\\n]|(\\\\[0-9a-zA-Z._~!=&\\^\\-\\\\?\'"]))*")|(?P<t_ID>[a-zA-Z_$][0-9a-zA-Z_$]*)|(?P<t_STRING_LITERAL>"([^"\\\\\\n]|(\\\\[0-9a-zA-Z._~!=&\\^\\-\\\\?\'"]))*")|(?P<t_ELLIPSIS>\\.\\.\\.)|(?P<t_LOR>\\|\\|)|(?P<t_PLUSPLUS>\\+\\+)|(?P<t_LSHIFTEQUAL><<=)|(?P<t_OREQUAL>\\|=)|(?P<t_PLUSEQUAL>\\+=)|(?P<t_RSHIFTEQUAL>>>=)|(?P<t_TIMESEQUAL>\\*=)|(?P<t_XOREQUAL>\\^=)|(?P<t_ANDEQUAL>&=)|(?P<t_ARROW>->)|(?P<t_CONDOP>\\?)|(?P<t_DIVEQUAL>/=)|(?P<t_EQ>==)|(?P<t_GE>>=)|(?P<t_LAND>&&)|(?P<t_LBRACKET>\\[)|(?P<t_LE><=)|(?P<t_LPAREN>\\()|(?P<t_LSHIFT><<)|(?P<t_MINUSEQUAL>-=)|(?P<t_MINUSMINUS>--)|(?P<t_MODEQUAL>%=)|(?P<t_NE>!=)|(?P<t_OR>\\|)|(?P<t_PERIOD>\\.)|(?P<t_PLUS>\\+)|(?P<t_RBRACKET>\\])|(?P<t_RPAREN>\\))|(?P<t_RSHIFT>>>)|(?P<t_TIMES>\\*)|(?P<t_XOR>\\^)|(?P<t_AND>&)|(?P<t_COLON>:)|(?P<t_COMMA>,)|(?P<t_DIVIDE>/)|(?P<t_EQUALS>=)|(?P<t_GT>>)|(?P<t_LNOT>!)|(?P<t_LT><)|(?P<t_MINUS>-)|(?P<t_MOD>%)|(?P<t_NOT>~)|(?P<t_SEMI>;)', [None, ('t_PPHASH', 'PPHASH'), ('t_NEWLINE', 'NEWLINE'), ('t_LBRACE', 'LBRACE'), ('t_RBRACE', 'RBRACE'), ('t_FLOAT_CONST', 'FLOAT_CONST'), None, None, None, None, None, None, None, None, None, ('t_HEX_FLOAT_CONST', 'HEX_FLOAT_CONST'), None, None, None, None, None, None, None, ('t_INT_CONST_HEX', 'INT_CONST_HEX'), None, None, None, None, None, None, None, ('t_INT_CONST_BIN', 'INT_CONST_BIN'), None, None, None, None, None, None, None, ('t_BAD_CONST_OCT', 'BAD_CONST_OCT'), ('t_UNSUPPORTED_C_STYLE_COMMENT', 'UNSUPPORTED_C_STYLE_COMMENT'), ('t_UNSUPPORTED_CXX_STYLE_COMMENT', 'UNSUPPORTED_CXX_STYLE_COMMENT'), ('t_INT_CONST_OCT', 'INT_CONST_OCT'), None, None, None, None, None, None, None, ('t_INT_CONST_DEC', 'INT_CONST_DEC'), None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, ('t_INT_CONST_CHAR', 'INT_CONST_CHAR'), None, None, None, None, None, None, ('t_CHAR_CONST', 'CHAR_CONST'), None, None, None, None, None, None, ('t_WCHAR_CONST', 'WCHAR_CONST'), None, None, None, None, None, None, ('t_U8CHAR_CONST', 'U8CHAR_CONST'), None, None, None, None, None, None, ('t_U16CHAR_CONST', 'U16CHAR_CONST'), None, None, None, None, None, None, ('t_U32CHAR_CONST', 'U32CHAR_CONST'), None, None, None, None, None, None, ('t_UNMATCHED_QUOTE', 'UNMATCHED_QUOTE'), None, None, None, None, None, None, None, None, None, None, None, None, None, None, ('t_BAD_CHAR_CONST', 'BAD_CHAR_CONST'), None, None, None, None, None, None, None, None, None, None, ('t_WSTRING_LITERAL', 'WSTRING_LITERAL'), None, None, ('t_U8STRING_LITERAL', 'U8STRING_LITERAL'), None, None, ('t_U16STRING_LITERAL', 'U16STRING_LITERAL'), None, None, ('t_U32STRING_LITERAL', 'U32STRING_LITERAL'), None, None, ('t_BAD_STRING_LITERAL', 'BAD_STRING_LITERAL'), None, None, None, None, None, ('t_ID', 'ID'), (None, 'STRING_LITERAL'), None, None, (None, 'ELLIPSIS'), (None, 'LOR'), (None, 'PLUSPLUS'), (None, 'LSHIFTEQUAL'), (None, 'OREQUAL'), (None, 'PLUSEQUAL'), (None, 'RSHIFTEQUAL'), (None, 'TIMESEQUAL'), (None, 'XOREQUAL'), (None, 'ANDEQUAL'), (None, 'ARROW'), (None, 'CONDOP'), (None, 'DIVEQUAL'), (None, 'EQ'), (None, 'GE'), (None, 'LAND'), (None, 'LBRACKET'), (None, 'LE'), (None, 'LPAREN'), (None, 'LSHIFT'), (None, 'MINUSEQUAL'), (None, 'MINUSMINUS'), (None, 'MODEQUAL'), (None, 'NE'), (None, 'OR'), (None, 'PERIOD'), (None, 'PLUS'), (None, 'RBRACKET'), (None, 'RPAREN'), (None, 'RSHIFT'), (None, 'TIMES'), (None, 'XOR'), (None, 'AND'), (None, 'COLON'), (None, 'COMMA'), (None, 'DIVIDE'), (None, 'EQUALS'), (None, 'GT'), (None, 'LNOT'), (None, 'LT'), (None, 'MINUS'), (None, 'MOD'), (None, 'NOT'), (None, 'SEMI')])], 'ppline': [('(?P<t_ppline_FILENAME>"([^"\\\\\\n]|(\\\\[0-9a-zA-Z._~!=&\\^\\-\\\\?\'"]))*")|(?P<t_ppline_LINE_NUMBER>(0(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|([1-9][0-9]*(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?))|(?P<t_ppline_NEWLINE>\\n)|(?P<t_ppline_PPLINE>line)', [None, ('t_ppline_FILENAME', 'FILENAME'), None, None, ('t_ppline_LINE_NUMBER', 'LINE_NUMBER'), None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, ('t_ppline_NEWLINE', 'NEWLINE'), ('t_ppline_PPLINE', 'PPLINE')])], 'pppragma': [('(?P<t_pppragma_NEWLINE>\\n)|(?P<t_pppragma_PPPRAGMA>pragma)|(?P<t_pppragma_STR>.+)', [None, ('t_pppragma_NEWLINE', 'NEWLINE'), ('t_pppragma_PPPRAGMA', 'PPPRAGMA'), ('t_pppragma_STR', 'STR')])]}
_lexstateignore = {'INITIAL': ' \t', 'ppline': ' \t', 'pppragma': ' \t'}
_lexstateerrorf = {'INITIAL': 't_error', 'ppline': 't_ppline_error', 'pppragma': 't_pppragma_error'}
_lexstateeoff = {}
PK�t�\7x�:plyparser.pynu�[���#-----------------------------------------------------------------
# plyparser.py
#
# PLYParser class and other utilities for simplifying programming
# parsers with PLY
#
# Eli Bendersky [https://eli.thegreenplace.net/]
# License: BSD
#-----------------------------------------------------------------

import warnings

class Coord(object):
    """ Coordinates of a syntactic element. Consists of:
            - File name
            - Line number
            - (optional) column number, for the Lexer
    """
    __slots__ = ('file', 'line', 'column', '__weakref__')
    def __init__(self, file, line, column=None):
        self.file = file
        self.line = line
        self.column = column

    def __str__(self):
        str = "%s:%s" % (self.file, self.line)
        if self.column: str += ":%s" % self.column
        return str


class ParseError(Exception): pass


class PLYParser(object):
    def _create_opt_rule(self, rulename):
        """ Given a rule name, creates an optional ply.yacc rule
            for it. The name of the optional rule is
            <rulename>_opt
        """
        optname = rulename + '_opt'

        def optrule(self, p):
            p[0] = p[1]

        optrule.__doc__ = '%s : empty\n| %s' % (optname, rulename)
        optrule.__name__ = 'p_%s' % optname
        setattr(self.__class__, optrule.__name__, optrule)

    def _coord(self, lineno, column=None):
        return Coord(
                file=self.clex.filename,
                line=lineno,
                column=column)

    def _token_coord(self, p, token_idx):
        """ Returns the coordinates for the YaccProduction object 'p' indexed
            with 'token_idx'. The coordinate includes the 'lineno' and
            'column'. Both follow the lex semantic, starting from 1.
        """
        last_cr = p.lexer.lexer.lexdata.rfind('\n', 0, p.lexpos(token_idx))
        if last_cr < 0:
            last_cr = -1
        column = (p.lexpos(token_idx) - (last_cr))
        return self._coord(p.lineno(token_idx), column)

    def _parse_error(self, msg, coord):
        raise ParseError("%s: %s" % (coord, msg))


def parameterized(*params):
    """ Decorator to create parameterized rules.

    Parameterized rule methods must be named starting with 'p_' and contain
    'xxx', and their docstrings may contain 'xxx' and 'yyy'. These will be
    replaced by the given parameter tuples. For example, ``p_xxx_rule()`` with
    docstring 'xxx_rule  : yyy' when decorated with
    ``@parameterized(('id', 'ID'))`` produces ``p_id_rule()`` with the docstring
    'id_rule  : ID'. Using multiple tuples produces multiple rules.
    """
    def decorate(rule_func):
        rule_func._params = params
        return rule_func
    return decorate


def template(cls):
    """ Class decorator to generate rules from parameterized rule templates.

    See `parameterized` for more information on parameterized rules.
    """
    issued_nodoc_warning = False
    for attr_name in dir(cls):
        if attr_name.startswith('p_'):
            method = getattr(cls, attr_name)
            if hasattr(method, '_params'):
                # Remove the template method
                delattr(cls, attr_name)
                # Create parameterized rules from this method; only run this if
                # the method has a docstring. This is to address an issue when
                # pycparser's users are installed in -OO mode which strips
                # docstrings away.
                # See: https://github.com/eliben/pycparser/pull/198/ and
                #      https://github.com/eliben/pycparser/issues/197
                # for discussion.
                if method.__doc__ is not None:
                    _create_param_rules(cls, method)
                elif not issued_nodoc_warning:
                    warnings.warn(
                        'parsing methods must have __doc__ for pycparser to work properly',
                        RuntimeWarning,
                        stacklevel=2)
                    issued_nodoc_warning = True
    return cls


def _create_param_rules(cls, func):
    """ Create ply.yacc rules based on a parameterized rule function

    Generates new methods (one per each pair of parameters) based on the
    template rule function `func`, and attaches them to `cls`. The rule
    function's parameters must be accessible via its `_params` attribute.
    """
    for xxx, yyy in func._params:
        # Use the template method's body for each new method
        def param_rule(self, p):
            func(self, p)

        # Substitute in the params for the grammar rule and function name
        param_rule.__doc__ = func.__doc__.replace('xxx', xxx).replace('yyy', yyy)
        param_rule.__name__ = func.__name__.replace('xxx', xxx)

        # Attach the new method to the class
        setattr(cls, param_rule.__name__, param_rule)
PK�t�\D(�4@@
yacctab.pynu�[���
# yacctab.py
# This file is automatically generated. Do not edit.
_tabversion = '3.10'

_lr_method = 'LALR'

_lr_signature = 'translation_unit_or_emptyleftLORleftLANDleftORleftXORleftANDleftEQNEleftGTGELTLEleftRSHIFTLSHIFTleftPLUSMINUSleftTIMESDIVIDEMODAUTO BREAK CASE CHAR CONST CONTINUE DEFAULT DO DOUBLE ELSE ENUM EXTERN FLOAT FOR GOTO IF INLINE INT LONG REGISTER OFFSETOF RESTRICT RETURN SHORT SIGNED SIZEOF STATIC STRUCT SWITCH TYPEDEF UNION UNSIGNED VOID VOLATILE WHILE __INT128 _BOOL _COMPLEX _NORETURN _THREAD_LOCAL _STATIC_ASSERT _ATOMIC _ALIGNOF _ALIGNAS _PRAGMA ID TYPEID INT_CONST_DEC INT_CONST_OCT INT_CONST_HEX INT_CONST_BIN INT_CONST_CHAR FLOAT_CONST HEX_FLOAT_CONST CHAR_CONST WCHAR_CONST U8CHAR_CONST U16CHAR_CONST U32CHAR_CONST STRING_LITERAL WSTRING_LITERAL U8STRING_LITERAL U16STRING_LITERAL U32STRING_LITERAL PLUS MINUS TIMES DIVIDE MOD OR AND NOT XOR LSHIFT RSHIFT LOR LAND LNOT LT LE GT GE EQ NE EQUALS TIMESEQUAL DIVEQUAL MODEQUAL PLUSEQUAL MINUSEQUAL LSHIFTEQUAL RSHIFTEQUAL ANDEQUAL XOREQUAL OREQUAL PLUSPLUS MINUSMINUS ARROW CONDOP LPAREN RPAREN LBRACKET RBRACKET LBRACE RBRACE COMMA PERIOD SEMI COLON ELLIPSIS PPHASH PPPRAGMA PPPRAGMASTRabstract_declarator_opt : empty\n| abstract_declaratorassignment_expression_opt : empty\n| assignment_expressionblock_item_list_opt : empty\n| block_item_listdeclaration_list_opt : empty\n| declaration_listdeclaration_specifiers_no_type_opt : empty\n| declaration_specifiers_no_typedesignation_opt : empty\n| designationexpression_opt : empty\n| expressionid_init_declarator_list_opt : empty\n| id_init_declarator_listidentifier_list_opt : empty\n| identifier_listinit_declarator_list_opt : empty\n| init_declarator_listinitializer_list_opt : empty\n| initializer_listparameter_type_list_opt : empty\n| parameter_type_liststruct_declarator_list_opt : empty\n| struct_declarator_listtype_qualifier_list_opt : empty\n| type_qualifier_list direct_id_declarator   : ID\n         direct_id_declarator   : LPAREN id_declarator RPAREN\n         direct_id_declarator   : direct_id_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET\n         direct_id_declarator   : direct_id_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET\n                                    | direct_id_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET\n         direct_id_declarator   : direct_id_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET\n         direct_id_declarator   : direct_id_declarator LPAREN parameter_type_list RPAREN\n                                    | direct_id_declarator LPAREN identifier_list_opt RPAREN\n         direct_typeid_declarator   : TYPEID\n         direct_typeid_declarator   : LPAREN typeid_declarator RPAREN\n         direct_typeid_declarator   : direct_typeid_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET\n         direct_typeid_declarator   : direct_typeid_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET\n                                    | direct_typeid_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET\n         direct_typeid_declarator   : direct_typeid_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET\n         direct_typeid_declarator   : direct_typeid_declarator LPAREN parameter_type_list RPAREN\n                                    | direct_typeid_declarator LPAREN identifier_list_opt RPAREN\n         direct_typeid_noparen_declarator   : TYPEID\n         direct_typeid_noparen_declarator   : direct_typeid_noparen_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET\n         direct_typeid_noparen_declarator   : direct_typeid_noparen_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET\n                                    | direct_typeid_noparen_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET\n         direct_typeid_noparen_declarator   : direct_typeid_noparen_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET\n         direct_typeid_noparen_declarator   : direct_typeid_noparen_declarator LPAREN parameter_type_list RPAREN\n                                    | direct_typeid_noparen_declarator LPAREN identifier_list_opt RPAREN\n         id_declarator  : direct_id_declarator\n         id_declarator  : pointer direct_id_declarator\n         typeid_declarator  : direct_typeid_declarator\n         typeid_declarator  : pointer direct_typeid_declarator\n         typeid_noparen_declarator  : direct_typeid_noparen_declarator\n         typeid_noparen_declarator  : pointer direct_typeid_noparen_declarator\n         translation_unit_or_empty   : translation_unit\n                                        | empty\n         translation_unit    : external_declaration\n         translation_unit    : translation_unit external_declaration\n         external_declaration    : function_definition\n         external_declaration    : declaration\n         external_declaration    : pp_directive\n                                    | pppragma_directive\n         external_declaration    : SEMI\n         external_declaration    : static_assert\n         static_assert           : _STATIC_ASSERT LPAREN constant_expression COMMA unified_string_literal RPAREN\n                                    | _STATIC_ASSERT LPAREN constant_expression RPAREN\n         pp_directive  : PPHASH\n         pppragma_directive      : PPPRAGMA\n                                    | PPPRAGMA PPPRAGMASTR\n                                    | _PRAGMA LPAREN unified_string_literal RPAREN\n         pppragma_directive_list : pppragma_directive\n                                    | pppragma_directive_list pppragma_directive\n         function_definition : id_declarator declaration_list_opt compound_statement\n         function_definition : declaration_specifiers id_declarator declaration_list_opt compound_statement\n         statement   : labeled_statement\n                        | expression_statement\n                        | compound_statement\n                        | selection_statement\n                        | iteration_statement\n                        | jump_statement\n                        | pppragma_directive\n                        | static_assert\n         pragmacomp_or_statement     : pppragma_directive_list statement\n                                        | statement\n         decl_body : declaration_specifiers init_declarator_list_opt\n                      | declaration_specifiers_no_type id_init_declarator_list_opt\n         declaration : decl_body SEMI\n         declaration_list    : declaration\n                                | declaration_list declaration\n         declaration_specifiers_no_type  : type_qualifier declaration_specifiers_no_type_opt\n         declaration_specifiers_no_type  : storage_class_specifier declaration_specifiers_no_type_opt\n         declaration_specifiers_no_type  : function_specifier declaration_specifiers_no_type_opt\n         declaration_specifiers_no_type  : atomic_specifier declaration_specifiers_no_type_opt\n         declaration_specifiers_no_type  : alignment_specifier declaration_specifiers_no_type_opt\n         declaration_specifiers  : declaration_specifiers type_qualifier\n         declaration_specifiers  : declaration_specifiers storage_class_specifier\n         declaration_specifiers  : declaration_specifiers function_specifier\n         declaration_specifiers  : declaration_specifiers type_specifier_no_typeid\n         declaration_specifiers  : type_specifier\n         declaration_specifiers  : declaration_specifiers_no_type type_specifier\n         declaration_specifiers  : declaration_specifiers alignment_specifier\n         storage_class_specifier : AUTO\n                                    | REGISTER\n                                    | STATIC\n                                    | EXTERN\n                                    | TYPEDEF\n                                    | _THREAD_LOCAL\n         function_specifier  : INLINE\n                                | _NORETURN\n         type_specifier_no_typeid  : VOID\n                                      | _BOOL\n                                      | CHAR\n                                      | SHORT\n                                      | INT\n                                      | LONG\n                                      | FLOAT\n                                      | DOUBLE\n                                      | _COMPLEX\n                                      | SIGNED\n                                      | UNSIGNED\n                                      | __INT128\n         type_specifier  : typedef_name\n                            | enum_specifier\n                            | struct_or_union_specifier\n                            | type_specifier_no_typeid\n                            | atomic_specifier\n         atomic_specifier  : _ATOMIC LPAREN type_name RPAREN\n         type_qualifier  : CONST\n                            | RESTRICT\n                            | VOLATILE\n                            | _ATOMIC\n         init_declarator_list    : init_declarator\n                                    | init_declarator_list COMMA init_declarator\n         init_declarator : declarator\n                            | declarator EQUALS initializer\n         id_init_declarator_list    : id_init_declarator\n                                       | id_init_declarator_list COMMA init_declarator\n         id_init_declarator : id_declarator\n                               | id_declarator EQUALS initializer\n         specifier_qualifier_list    : specifier_qualifier_list type_specifier_no_typeid\n         specifier_qualifier_list    : specifier_qualifier_list type_qualifier\n         specifier_qualifier_list  : type_specifier\n         specifier_qualifier_list  : type_qualifier_list type_specifier\n         specifier_qualifier_list  : alignment_specifier\n         specifier_qualifier_list  : specifier_qualifier_list alignment_specifier\n         struct_or_union_specifier   : struct_or_union ID\n                                        | struct_or_union TYPEID\n         struct_or_union_specifier : struct_or_union brace_open struct_declaration_list brace_close\n                                      | struct_or_union brace_open brace_close\n         struct_or_union_specifier   : struct_or_union ID brace_open struct_declaration_list brace_close\n                                        | struct_or_union ID brace_open brace_close\n                                        | struct_or_union TYPEID brace_open struct_declaration_list brace_close\n                                        | struct_or_union TYPEID brace_open brace_close\n         struct_or_union : STRUCT\n                            | UNION\n         struct_declaration_list     : struct_declaration\n                                        | struct_declaration_list struct_declaration\n         struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI\n         struct_declaration : SEMI\n         struct_declaration : pppragma_directive\n         struct_declarator_list  : struct_declarator\n                                    | struct_declarator_list COMMA struct_declarator\n         struct_declarator : declarator\n         struct_declarator   : declarator COLON constant_expression\n                                | COLON constant_expression\n         enum_specifier  : ENUM ID\n                            | ENUM TYPEID\n         enum_specifier  : ENUM brace_open enumerator_list brace_close\n         enum_specifier  : ENUM ID brace_open enumerator_list brace_close\n                            | ENUM TYPEID brace_open enumerator_list brace_close\n         enumerator_list : enumerator\n                            | enumerator_list COMMA\n                            | enumerator_list COMMA enumerator\n         alignment_specifier  : _ALIGNAS LPAREN type_name RPAREN\n                                 | _ALIGNAS LPAREN constant_expression RPAREN\n         enumerator  : ID\n                        | ID EQUALS constant_expression\n         declarator  : id_declarator\n                        | typeid_declarator\n         pointer : TIMES type_qualifier_list_opt\n                    | TIMES type_qualifier_list_opt pointer\n         type_qualifier_list : type_qualifier\n                                | type_qualifier_list type_qualifier\n         parameter_type_list : parameter_list\n                                | parameter_list COMMA ELLIPSIS\n         parameter_list  : parameter_declaration\n                            | parameter_list COMMA parameter_declaration\n         parameter_declaration   : declaration_specifiers id_declarator\n                                    | declaration_specifiers typeid_noparen_declarator\n         parameter_declaration   : declaration_specifiers abstract_declarator_opt\n         identifier_list : identifier\n                            | identifier_list COMMA identifier\n         initializer : assignment_expression\n         initializer : brace_open initializer_list_opt brace_close\n                        | brace_open initializer_list COMMA brace_close\n         initializer_list    : designation_opt initializer\n                                | initializer_list COMMA designation_opt initializer\n         designation : designator_list EQUALS\n         designator_list : designator\n                            | designator_list designator\n         designator  : LBRACKET constant_expression RBRACKET\n                        | PERIOD identifier\n         type_name   : specifier_qualifier_list abstract_declarator_opt\n         abstract_declarator     : pointer\n         abstract_declarator     : pointer direct_abstract_declarator\n         abstract_declarator     : direct_abstract_declarator\n         direct_abstract_declarator  : LPAREN abstract_declarator RPAREN  direct_abstract_declarator  : direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET\n         direct_abstract_declarator  : LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET\n         direct_abstract_declarator  : direct_abstract_declarator LBRACKET TIMES RBRACKET\n         direct_abstract_declarator  : LBRACKET TIMES RBRACKET\n         direct_abstract_declarator  : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN\n         direct_abstract_declarator  : LPAREN parameter_type_list_opt RPAREN\n         direct_abstract_declarator  : LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET\n                                         | LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET\n         block_item  : declaration\n                        | statement\n         block_item_list : block_item\n                            | block_item_list block_item\n         compound_statement : brace_open block_item_list_opt brace_close  labeled_statement : ID COLON pragmacomp_or_statement  labeled_statement : CASE constant_expression COLON pragmacomp_or_statement  labeled_statement : DEFAULT COLON pragmacomp_or_statement  labeled_statement : ID COLON  labeled_statement : CASE constant_expression COLON  labeled_statement : DEFAULT COLON  selection_statement : IF LPAREN expression RPAREN pragmacomp_or_statement  selection_statement : IF LPAREN expression RPAREN statement ELSE pragmacomp_or_statement  selection_statement : SWITCH LPAREN expression RPAREN pragmacomp_or_statement  iteration_statement : WHILE LPAREN expression RPAREN pragmacomp_or_statement  iteration_statement : DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI  iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement  iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement  jump_statement  : GOTO ID SEMI  jump_statement  : BREAK SEMI  jump_statement  : CONTINUE SEMI  jump_statement  : RETURN expression SEMI\n                            | RETURN SEMI\n         expression_statement : expression_opt SEMI  expression  : assignment_expression\n                        | expression COMMA assignment_expression\n         assignment_expression : LPAREN compound_statement RPAREN  typedef_name : TYPEID  assignment_expression   : conditional_expression\n                                    | unary_expression assignment_operator assignment_expression\n         assignment_operator : EQUALS\n                                | XOREQUAL\n                                | TIMESEQUAL\n                                | DIVEQUAL\n                                | MODEQUAL\n                                | PLUSEQUAL\n                                | MINUSEQUAL\n                                | LSHIFTEQUAL\n                                | RSHIFTEQUAL\n                                | ANDEQUAL\n                                | OREQUAL\n         constant_expression : conditional_expression  conditional_expression  : binary_expression\n                                    | binary_expression CONDOP expression COLON conditional_expression\n         binary_expression   : cast_expression\n                                | binary_expression TIMES binary_expression\n                                | binary_expression DIVIDE binary_expression\n                                | binary_expression MOD binary_expression\n                                | binary_expression PLUS binary_expression\n                                | binary_expression MINUS binary_expression\n                                | binary_expression RSHIFT binary_expression\n                                | binary_expression LSHIFT binary_expression\n                                | binary_expression LT binary_expression\n                                | binary_expression LE binary_expression\n                                | binary_expression GE binary_expression\n                                | binary_expression GT binary_expression\n                                | binary_expression EQ binary_expression\n                                | binary_expression NE binary_expression\n                                | binary_expression AND binary_expression\n                                | binary_expression OR binary_expression\n                                | binary_expression XOR binary_expression\n                                | binary_expression LAND binary_expression\n                                | binary_expression LOR binary_expression\n         cast_expression : unary_expression  cast_expression : LPAREN type_name RPAREN cast_expression  unary_expression    : postfix_expression  unary_expression    : PLUSPLUS unary_expression\n                                | MINUSMINUS unary_expression\n                                | unary_operator cast_expression\n         unary_expression    : SIZEOF unary_expression\n                                | SIZEOF LPAREN type_name RPAREN\n                                | _ALIGNOF LPAREN type_name RPAREN\n         unary_operator  : AND\n                            | TIMES\n                            | PLUS\n                            | MINUS\n                            | NOT\n                            | LNOT\n         postfix_expression  : primary_expression  postfix_expression  : postfix_expression LBRACKET expression RBRACKET  postfix_expression  : postfix_expression LPAREN argument_expression_list RPAREN\n                                | postfix_expression LPAREN RPAREN\n         postfix_expression  : postfix_expression PERIOD ID\n                                | postfix_expression PERIOD TYPEID\n                                | postfix_expression ARROW ID\n                                | postfix_expression ARROW TYPEID\n         postfix_expression  : postfix_expression PLUSPLUS\n                                | postfix_expression MINUSMINUS\n         postfix_expression  : LPAREN type_name RPAREN brace_open initializer_list brace_close\n                                | LPAREN type_name RPAREN brace_open initializer_list COMMA brace_close\n         primary_expression  : identifier  primary_expression  : constant  primary_expression  : unified_string_literal\n                                | unified_wstring_literal\n         primary_expression  : LPAREN expression RPAREN  primary_expression  : OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPAREN\n         offsetof_member_designator : identifier\n                                         | offsetof_member_designator PERIOD identifier\n                                         | offsetof_member_designator LBRACKET expression RBRACKET\n         argument_expression_list    : assignment_expression\n                                        | argument_expression_list COMMA assignment_expression\n         identifier  : ID  constant    : INT_CONST_DEC\n                        | INT_CONST_OCT\n                        | INT_CONST_HEX\n                        | INT_CONST_BIN\n                        | INT_CONST_CHAR\n         constant    : FLOAT_CONST\n                        | HEX_FLOAT_CONST\n         constant    : CHAR_CONST\n                        | WCHAR_CONST\n                        | U8CHAR_CONST\n                        | U16CHAR_CONST\n                        | U32CHAR_CONST\n         unified_string_literal  : STRING_LITERAL\n                                    | unified_string_literal STRING_LITERAL\n         unified_wstring_literal : WSTRING_LITERAL\n                                    | U8STRING_LITERAL\n                                    | U16STRING_LITERAL\n                                    | U32STRING_LITERAL\n                                    | unified_wstring_literal WSTRING_LITERAL\n                                    | unified_wstring_literal U8STRING_LITERAL\n                                    | unified_wstring_literal U16STRING_LITERAL\n                                    | unified_wstring_literal U32STRING_LITERAL\n         brace_open  :   LBRACE\n         brace_close :   RBRACE\n        empty : '
    
_lr_action_items = {'$end':([0,1,2,3,4,5,6,7,8,9,10,14,15,64,90,91,127,208,251,262,267,355,501,],[-345,0,-58,-59,-60,-62,-63,-64,-65,-66,-67,-70,-71,-61,-90,-72,-76,-344,-77,-73,-69,-223,-68,]),'SEMI':([0,2,4,5,6,7,8,9,10,12,13,14,15,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,69,70,71,72,73,74,75,76,77,78,79,81,83,84,85,86,87,88,89,90,91,97,98,99,100,101,102,103,104,105,106,107,108,110,111,112,117,118,119,121,122,123,124,127,128,130,132,139,140,143,144,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,203,204,205,206,207,208,209,210,211,212,214,220,221,222,223,224,225,226,227,228,229,230,231,232,233,236,239,242,245,246,247,248,249,250,251,252,253,254,255,262,263,267,291,292,293,295,296,297,300,301,302,303,311,312,326,327,330,333,334,335,336,337,338,339,340,341,342,343,344,345,346,348,349,353,354,355,356,357,358,360,361,369,370,371,372,373,374,375,376,377,403,404,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,439,440,461,462,465,466,467,470,471,472,473,475,477,481,482,483,484,485,486,487,488,495,496,499,501,503,504,507,508,510,511,526,527,528,529,530,531,533,534,535,539,540,542,558,559,560,561,562,564,567,569,578,579,582,587,588,590,592,593,594,],[9,9,-60,-62,-63,-64,-65,-66,-67,-345,90,-70,-71,-52,-345,-345,-345,-128,-102,-345,-345,-29,-107,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,-345,-345,-129,-134,-181,-98,-99,-100,-101,-104,-88,-134,-19,-20,-135,-137,-182,-54,-37,-90,-72,-53,-93,-9,-10,-345,-94,-95,-103,-89,-129,-15,-16,-139,-141,-97,-96,-169,-170,-343,-149,-150,210,-76,-345,-181,-55,-333,-30,-311,-260,-261,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,210,210,210,-152,-159,-344,-345,-162,-163,-145,-147,-13,-345,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-320,361,-14,-345,374,375,377,-243,-247,-282,-77,-38,-136,-138,-196,-73,-334,-69,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-35,-36,-140,-142,-171,210,-154,210,-156,-151,-160,467,-143,-144,-148,-25,-26,-164,-166,-146,-130,-177,-178,-223,-222,-13,-227,-229,-242,-345,-87,-74,-345,485,-238,-239,486,-241,-43,-44,-313,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,-275,-276,-277,-278,-279,-280,-281,-300,-301,-302,-303,-304,-31,-34,-172,-173,-153,-155,-161,-168,-224,-228,-226,-245,-244,-86,-75,533,-345,-237,-240,-248,-197,-39,-42,-283,-68,-298,-299,-289,-290,-32,-33,-165,-167,-225,-345,-345,-345,-345,565,-198,-40,-41,-262,-230,-87,-74,-232,-233,580,-307,-314,-345,588,-308,-231,-234,-345,-345,-236,-235,]),'PPHASH':([0,2,4,5,6,7,8,9,10,14,15,64,90,91,127,208,251,262,267,355,501,],[14,14,-60,-62,-63,-64,-65,-66,-67,-70,-71,-61,-90,-72,-76,-344,-77,-73,-69,-223,-68,]),'PPPRAGMA':([0,2,4,5,6,7,8,9,10,14,15,64,90,91,121,124,127,128,203,204,205,207,208,210,211,221,222,223,224,225,226,227,228,229,230,231,232,242,251,262,267,333,335,338,355,356,358,360,361,369,370,371,374,375,377,467,471,472,473,481,482,485,486,501,528,529,530,531,558,559,560,561,562,578,587,588,590,592,593,594,],[15,15,-60,-62,-63,-64,-65,-66,-67,-70,-71,-61,-90,-72,-343,15,-76,15,15,15,15,-159,-344,-162,-163,15,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,15,-77,-73,-69,15,15,-160,-223,-222,15,15,-242,15,-87,-74,-238,-239,-241,-161,-224,15,-226,-86,-75,-237,-240,-68,-225,15,15,15,-230,-87,-74,-232,-233,15,-231,-234,15,15,-236,-235,]),'_PRAGMA':([0,2,4,5,6,7,8,9,10,14,15,64,90,91,121,124,127,128,203,204,205,207,208,210,211,221,222,223,224,225,226,227,228,229,230,231,232,242,251,262,267,333,335,338,355,356,358,360,361,369,370,371,374,375,377,467,471,472,473,481,482,485,486,501,528,529,530,531,558,559,560,561,562,578,587,588,590,592,593,594,],[16,16,-60,-62,-63,-64,-65,-66,-67,-70,-71,-61,-90,-72,-343,16,-76,16,16,16,16,-159,-344,-162,-163,16,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,16,-77,-73,-69,16,16,-160,-223,-222,16,16,-242,16,-87,-74,-238,-239,-241,-161,-224,16,-226,-86,-75,-237,-240,-68,-225,16,16,16,-230,-87,-74,-232,-233,16,-231,-234,16,16,-236,-235,]),'_STATIC_ASSERT':([0,2,4,5,6,7,8,9,10,14,15,64,90,91,121,127,128,208,221,222,223,224,225,226,227,228,229,230,231,232,242,251,262,267,355,356,358,360,361,369,370,371,374,375,377,471,472,473,481,482,485,486,501,528,529,530,531,558,559,560,561,562,578,587,588,590,592,593,594,],[18,18,-60,-62,-63,-64,-65,-66,-67,-70,-71,-61,-90,-72,-343,-76,18,-344,18,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,18,-77,-73,-69,-223,-222,18,18,-242,18,-87,-74,-238,-239,-241,-224,18,-226,-86,-75,-237,-240,-68,-225,18,18,18,-230,-87,-74,-232,-233,18,-231,-234,18,18,-236,-235,]),'ID':([0,2,4,5,6,7,8,9,10,12,14,15,17,20,21,22,23,24,25,26,27,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,62,63,64,69,70,71,72,74,75,76,77,78,80,81,82,90,91,94,95,96,98,99,100,101,102,103,104,106,112,113,114,115,116,117,118,119,120,121,122,123,126,127,128,134,135,136,137,141,147,148,149,150,153,154,155,156,160,161,182,183,184,192,194,195,196,197,198,199,206,208,209,212,214,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,244,247,251,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,294,298,306,309,310,314,318,322,323,330,331,332,334,336,337,340,341,342,347,348,349,353,354,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,398,400,401,402,405,448,449,452,455,457,458,459,461,462,465,466,468,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,509,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,570,571,578,580,587,588,590,592,593,594,],[28,28,-60,-62,-63,-64,-65,-66,-67,28,-70,-71,28,28,-345,-345,-345,-128,-102,28,-345,-107,-345,-125,-126,-127,-129,-246,118,122,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-157,-158,-61,28,28,-129,-134,-98,-99,-100,-101,-104,28,-134,28,-90,-72,159,-345,159,-93,-9,-10,-345,-94,-95,-103,-129,-97,-183,-27,-28,-185,-96,-169,-170,202,-343,-149,-150,159,-76,233,28,159,-345,159,159,-292,-293,-294,-291,159,159,159,159,-295,-296,159,-345,-28,28,28,159,-184,-186,202,202,-152,-344,28,-145,-147,233,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,159,159,233,373,159,-77,-345,159,-345,-28,-73,-69,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,159,431,433,159,159,-292,159,159,159,28,28,-345,-171,202,159,-154,-156,-151,-143,-144,-148,159,-146,-130,-177,-178,-223,-222,233,233,-242,159,159,159,159,233,-87,-74,159,-238,-239,-241,159,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,159,-12,159,159,-292,159,159,159,-345,159,28,159,-345,-28,159,-172,-173,-153,-155,28,159,-224,233,-226,159,-86,-75,159,-237,-240,-345,-201,-345,-68,159,159,159,159,-345,-28,159,159,-292,-225,233,233,233,159,159,159,-11,-292,159,159,-230,-87,-74,-232,-233,159,-345,159,159,233,159,-231,-234,233,233,-236,-235,]),'LPAREN':([0,2,4,5,6,7,8,9,10,12,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,64,69,70,71,72,74,75,76,77,78,80,81,82,88,89,90,91,94,95,97,98,99,100,101,102,103,104,106,109,112,113,114,115,116,117,118,119,121,122,123,126,127,128,132,134,135,136,139,140,141,143,147,148,149,150,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,192,194,195,196,197,206,208,209,212,214,216,221,222,223,224,225,226,227,228,229,230,231,232,233,234,237,238,240,241,242,243,247,251,252,256,257,258,259,262,263,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,291,292,294,298,300,301,302,303,306,309,310,311,312,318,319,322,323,324,325,330,332,334,336,337,340,341,342,347,348,349,351,352,353,354,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,403,404,405,406,429,431,432,433,434,439,440,446,447,448,452,455,457,458,459,461,462,465,466,468,469,471,472,473,476,480,481,482,484,485,486,489,491,495,496,500,501,502,503,504,505,510,511,512,513,514,517,518,520,521,522,524,528,529,530,531,532,533,536,537,539,540,547,548,549,550,551,552,555,556,557,558,559,560,561,562,565,567,568,569,571,572,573,576,577,578,580,582,585,586,587,588,590,592,593,594,],[17,17,-60,-62,-63,-64,-65,-66,-67,82,-70,-71,92,17,94,96,17,-345,-345,-345,-128,-102,17,-345,-29,-107,-345,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,125,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,126,-61,82,17,-129,125,-98,-99,-100,-101,-104,82,-134,82,137,-37,-90,-72,141,-345,96,-93,-9,-10,-345,-94,-95,-103,-129,125,-97,-183,-27,-28,-185,-96,-169,-170,-343,-149,-150,141,-76,238,137,82,238,-345,-333,-30,238,-311,-292,-293,-294,-291,288,294,294,141,298,299,-297,-320,-295,-296,-309,-310,-312,304,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,238,-345,-28,322,82,238,-184,-186,-152,-344,82,-145,-147,351,238,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-320,141,362,238,366,367,238,372,238,-77,-38,-345,238,-345,-28,-73,-334,-69,238,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,141,238,238,-305,-306,238,238,-339,-340,-341,-342,-292,238,238,-35,-36,322,449,322,-345,-45,460,-171,141,-154,-156,-151,-143,-144,-148,141,-146,-130,351,351,-177,-178,-223,-222,238,238,-242,238,238,238,238,238,-87,-74,238,-238,-239,-241,238,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,238,-12,141,-292,238,238,-43,-44,141,-313,-300,-301,-302,-303,-304,-31,-34,449,460,-345,322,238,-345,-28,238,-172,-173,-153,-155,82,141,-224,238,-226,141,532,-86,-75,238,-237,-240,-345,-201,-39,-42,-345,-68,141,-298,-299,238,-32,-33,238,-345,-28,-210,-216,-214,238,238,-292,-225,238,238,238,238,238,238,-11,-40,-41,-292,238,238,-50,-51,-212,-211,-213,-215,-230,-87,-74,-232,-233,238,-307,-345,-314,238,-46,-49,-217,-218,238,238,-308,-47,-48,-231,-234,238,238,-236,-235,]),'TIMES':([0,2,4,5,6,7,8,9,10,12,14,15,17,21,22,23,24,25,26,27,29,30,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,69,70,71,72,74,75,76,77,78,81,82,90,91,94,95,98,99,100,101,102,103,104,106,112,113,114,115,116,117,118,119,121,122,123,126,127,128,134,135,136,139,141,143,145,146,147,148,149,150,151,152,153,154,155,156,158,159,160,161,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,192,194,195,197,206,208,209,212,214,216,221,222,223,224,225,226,227,228,229,230,231,232,233,234,238,242,247,250,251,256,257,258,259,262,263,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,291,292,293,294,295,296,297,298,300,301,302,303,306,309,310,322,323,330,332,334,336,337,340,341,342,347,348,349,351,353,354,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,448,455,457,458,459,461,462,465,466,468,469,471,472,473,476,481,482,484,485,486,489,491,499,500,501,502,503,504,505,507,508,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,567,568,569,571,578,580,582,587,588,590,592,593,594,],[30,30,-60,-62,-63,-64,-65,-66,-67,30,-70,-71,30,-345,-345,-345,-128,-102,30,-345,-107,-345,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,30,30,-129,-134,-98,-99,-100,-101,-104,-134,30,-90,-72,147,-345,-93,-9,-10,-345,-94,-95,-103,-129,-97,30,-27,-28,-185,-96,-169,-170,-343,-149,-150,147,-76,147,30,147,-345,-333,147,-311,269,-263,-292,-293,-294,-291,-282,-284,147,147,147,147,-297,-320,-295,-296,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,306,-345,-28,30,30,147,-186,-152,-344,30,-145,-147,30,147,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-320,147,147,147,147,-282,-77,-345,400,-345,-28,-73,-334,-69,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,147,-305,-306,-285,147,-286,-287,-288,147,-339,-340,-341,-342,-292,147,147,30,456,-171,147,-154,-156,-151,-143,-144,-148,147,-146,-130,30,-177,-178,-223,-222,147,147,-242,147,147,147,147,147,-87,-74,147,-238,-239,-241,147,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,147,-12,147,-292,147,147,147,-313,-264,-265,-266,269,269,269,269,269,269,269,269,269,269,269,269,269,269,269,-300,-301,-302,-303,-304,-345,147,-345,-28,524,-172,-173,-153,-155,30,147,-224,147,-226,147,-86,-75,147,-237,-240,-345,-201,-283,-345,-68,147,-298,-299,147,-289,-290,547,-345,-28,147,147,-292,-225,147,147,147,147,147,147,-11,-292,147,147,-230,-87,-74,-232,-233,147,-307,-345,-314,147,147,147,-308,-231,-234,147,147,-236,-235,]),'TYPEID':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,62,63,64,67,68,69,70,71,72,73,74,75,76,77,78,80,81,82,90,91,96,97,98,99,100,101,102,103,104,106,112,113,114,115,116,117,118,119,121,122,123,124,125,126,127,128,129,134,137,140,141,192,193,194,196,197,203,204,205,206,207,208,209,210,211,212,213,214,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,289,290,294,298,299,304,311,312,313,318,322,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,467,468,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[35,35,-60,-62,-63,-64,-65,-66,-67,35,89,-70,-71,-52,-345,-345,-345,-128,-102,35,-345,-29,-107,-345,-125,-126,-127,-129,-246,119,123,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-157,-158,-61,35,-91,89,35,-129,-134,35,-98,-99,-100,-101,-104,89,-134,89,-90,-72,35,-53,-93,-9,-10,-345,-94,-95,-103,-129,-97,-183,-27,-28,-185,-96,-169,-170,-343,-149,-150,35,35,35,-76,35,-92,89,35,-30,35,324,35,89,-184,-186,35,35,35,-152,-159,-344,89,-162,-163,-145,35,-147,35,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,35,-77,-73,-69,432,434,35,35,35,35,-35,-36,35,324,35,-171,35,-154,35,-156,-151,-160,-143,-144,-148,-146,-130,35,-177,-178,-223,-222,-227,-229,-242,-87,-84,35,-238,-239,-241,-31,-34,35,35,-172,-173,-153,-155,-161,89,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'ENUM':([0,2,4,5,6,7,8,9,10,11,14,15,19,21,22,23,26,27,28,29,34,50,51,52,53,54,55,56,57,58,59,60,64,67,68,70,71,72,73,90,91,96,97,98,99,100,101,102,103,112,116,117,121,124,125,126,127,128,129,137,140,141,193,197,203,204,205,207,208,210,211,213,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,333,335,338,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[36,36,-60,-62,-63,-64,-65,-66,-67,36,-70,-71,-52,-345,-345,-345,36,-345,-29,-107,-345,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,36,-91,36,-345,-134,36,-90,-72,36,-53,-93,-9,-10,-345,-94,-95,-97,-185,-96,-343,36,36,36,-76,36,-92,36,-30,36,36,-186,36,36,36,-159,-344,-162,-163,36,36,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,36,-77,-73,-69,36,36,36,36,-35,-36,36,36,36,36,-160,-130,36,-177,-178,-223,-222,-227,-229,-242,-87,-84,36,-238,-239,-241,-31,-34,36,36,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'VOID':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,70,71,72,73,74,75,76,77,78,81,90,91,96,97,98,99,100,101,102,103,104,106,112,116,117,118,119,121,122,123,124,125,126,127,128,129,137,140,141,192,193,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[38,38,-60,-62,-63,-64,-65,-66,-67,38,38,-70,-71,-52,-345,-345,-345,-128,-102,38,-345,-29,-107,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,38,-91,38,38,-129,-134,38,-98,-99,-100,-101,-104,-134,-90,-72,38,-53,-93,-9,-10,-345,-94,-95,-103,-129,-97,-185,-96,-169,-170,-343,-149,-150,38,38,38,-76,38,-92,38,-30,38,38,38,-186,38,38,38,-152,-159,-344,38,-162,-163,-145,38,-147,38,38,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,38,-77,-73,-69,38,38,38,38,-35,-36,38,38,-171,38,-154,38,-156,-151,-160,-143,-144,-148,-146,-130,38,-177,-178,-223,-222,-227,-229,-242,-87,-84,38,-238,-239,-241,-31,-34,38,38,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'_BOOL':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,70,71,72,73,74,75,76,77,78,81,90,91,96,97,98,99,100,101,102,103,104,106,112,116,117,118,119,121,122,123,124,125,126,127,128,129,137,140,141,192,193,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[39,39,-60,-62,-63,-64,-65,-66,-67,39,39,-70,-71,-52,-345,-345,-345,-128,-102,39,-345,-29,-107,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,39,-91,39,39,-129,-134,39,-98,-99,-100,-101,-104,-134,-90,-72,39,-53,-93,-9,-10,-345,-94,-95,-103,-129,-97,-185,-96,-169,-170,-343,-149,-150,39,39,39,-76,39,-92,39,-30,39,39,39,-186,39,39,39,-152,-159,-344,39,-162,-163,-145,39,-147,39,39,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,39,-77,-73,-69,39,39,39,39,-35,-36,39,39,-171,39,-154,39,-156,-151,-160,-143,-144,-148,-146,-130,39,-177,-178,-223,-222,-227,-229,-242,-87,-84,39,-238,-239,-241,-31,-34,39,39,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'CHAR':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,70,71,72,73,74,75,76,77,78,81,90,91,96,97,98,99,100,101,102,103,104,106,112,116,117,118,119,121,122,123,124,125,126,127,128,129,137,140,141,192,193,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[40,40,-60,-62,-63,-64,-65,-66,-67,40,40,-70,-71,-52,-345,-345,-345,-128,-102,40,-345,-29,-107,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,40,-91,40,40,-129,-134,40,-98,-99,-100,-101,-104,-134,-90,-72,40,-53,-93,-9,-10,-345,-94,-95,-103,-129,-97,-185,-96,-169,-170,-343,-149,-150,40,40,40,-76,40,-92,40,-30,40,40,40,-186,40,40,40,-152,-159,-344,40,-162,-163,-145,40,-147,40,40,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,40,-77,-73,-69,40,40,40,40,-35,-36,40,40,-171,40,-154,40,-156,-151,-160,-143,-144,-148,-146,-130,40,-177,-178,-223,-222,-227,-229,-242,-87,-84,40,-238,-239,-241,-31,-34,40,40,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'SHORT':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,70,71,72,73,74,75,76,77,78,81,90,91,96,97,98,99,100,101,102,103,104,106,112,116,117,118,119,121,122,123,124,125,126,127,128,129,137,140,141,192,193,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[41,41,-60,-62,-63,-64,-65,-66,-67,41,41,-70,-71,-52,-345,-345,-345,-128,-102,41,-345,-29,-107,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,41,-91,41,41,-129,-134,41,-98,-99,-100,-101,-104,-134,-90,-72,41,-53,-93,-9,-10,-345,-94,-95,-103,-129,-97,-185,-96,-169,-170,-343,-149,-150,41,41,41,-76,41,-92,41,-30,41,41,41,-186,41,41,41,-152,-159,-344,41,-162,-163,-145,41,-147,41,41,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,41,-77,-73,-69,41,41,41,41,-35,-36,41,41,-171,41,-154,41,-156,-151,-160,-143,-144,-148,-146,-130,41,-177,-178,-223,-222,-227,-229,-242,-87,-84,41,-238,-239,-241,-31,-34,41,41,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'INT':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,70,71,72,73,74,75,76,77,78,81,90,91,96,97,98,99,100,101,102,103,104,106,112,116,117,118,119,121,122,123,124,125,126,127,128,129,137,140,141,192,193,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[42,42,-60,-62,-63,-64,-65,-66,-67,42,42,-70,-71,-52,-345,-345,-345,-128,-102,42,-345,-29,-107,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,42,-91,42,42,-129,-134,42,-98,-99,-100,-101,-104,-134,-90,-72,42,-53,-93,-9,-10,-345,-94,-95,-103,-129,-97,-185,-96,-169,-170,-343,-149,-150,42,42,42,-76,42,-92,42,-30,42,42,42,-186,42,42,42,-152,-159,-344,42,-162,-163,-145,42,-147,42,42,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,42,-77,-73,-69,42,42,42,42,-35,-36,42,42,-171,42,-154,42,-156,-151,-160,-143,-144,-148,-146,-130,42,-177,-178,-223,-222,-227,-229,-242,-87,-84,42,-238,-239,-241,-31,-34,42,42,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'LONG':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,70,71,72,73,74,75,76,77,78,81,90,91,96,97,98,99,100,101,102,103,104,106,112,116,117,118,119,121,122,123,124,125,126,127,128,129,137,140,141,192,193,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[43,43,-60,-62,-63,-64,-65,-66,-67,43,43,-70,-71,-52,-345,-345,-345,-128,-102,43,-345,-29,-107,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,43,-91,43,43,-129,-134,43,-98,-99,-100,-101,-104,-134,-90,-72,43,-53,-93,-9,-10,-345,-94,-95,-103,-129,-97,-185,-96,-169,-170,-343,-149,-150,43,43,43,-76,43,-92,43,-30,43,43,43,-186,43,43,43,-152,-159,-344,43,-162,-163,-145,43,-147,43,43,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,43,-77,-73,-69,43,43,43,43,-35,-36,43,43,-171,43,-154,43,-156,-151,-160,-143,-144,-148,-146,-130,43,-177,-178,-223,-222,-227,-229,-242,-87,-84,43,-238,-239,-241,-31,-34,43,43,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'FLOAT':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,70,71,72,73,74,75,76,77,78,81,90,91,96,97,98,99,100,101,102,103,104,106,112,116,117,118,119,121,122,123,124,125,126,127,128,129,137,140,141,192,193,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[44,44,-60,-62,-63,-64,-65,-66,-67,44,44,-70,-71,-52,-345,-345,-345,-128,-102,44,-345,-29,-107,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,44,-91,44,44,-129,-134,44,-98,-99,-100,-101,-104,-134,-90,-72,44,-53,-93,-9,-10,-345,-94,-95,-103,-129,-97,-185,-96,-169,-170,-343,-149,-150,44,44,44,-76,44,-92,44,-30,44,44,44,-186,44,44,44,-152,-159,-344,44,-162,-163,-145,44,-147,44,44,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,44,-77,-73,-69,44,44,44,44,-35,-36,44,44,-171,44,-154,44,-156,-151,-160,-143,-144,-148,-146,-130,44,-177,-178,-223,-222,-227,-229,-242,-87,-84,44,-238,-239,-241,-31,-34,44,44,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'DOUBLE':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,70,71,72,73,74,75,76,77,78,81,90,91,96,97,98,99,100,101,102,103,104,106,112,116,117,118,119,121,122,123,124,125,126,127,128,129,137,140,141,192,193,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[45,45,-60,-62,-63,-64,-65,-66,-67,45,45,-70,-71,-52,-345,-345,-345,-128,-102,45,-345,-29,-107,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,45,-91,45,45,-129,-134,45,-98,-99,-100,-101,-104,-134,-90,-72,45,-53,-93,-9,-10,-345,-94,-95,-103,-129,-97,-185,-96,-169,-170,-343,-149,-150,45,45,45,-76,45,-92,45,-30,45,45,45,-186,45,45,45,-152,-159,-344,45,-162,-163,-145,45,-147,45,45,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,45,-77,-73,-69,45,45,45,45,-35,-36,45,45,-171,45,-154,45,-156,-151,-160,-143,-144,-148,-146,-130,45,-177,-178,-223,-222,-227,-229,-242,-87,-84,45,-238,-239,-241,-31,-34,45,45,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'_COMPLEX':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,70,71,72,73,74,75,76,77,78,81,90,91,96,97,98,99,100,101,102,103,104,106,112,116,117,118,119,121,122,123,124,125,126,127,128,129,137,140,141,192,193,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[46,46,-60,-62,-63,-64,-65,-66,-67,46,46,-70,-71,-52,-345,-345,-345,-128,-102,46,-345,-29,-107,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,46,-91,46,46,-129,-134,46,-98,-99,-100,-101,-104,-134,-90,-72,46,-53,-93,-9,-10,-345,-94,-95,-103,-129,-97,-185,-96,-169,-170,-343,-149,-150,46,46,46,-76,46,-92,46,-30,46,46,46,-186,46,46,46,-152,-159,-344,46,-162,-163,-145,46,-147,46,46,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,46,-77,-73,-69,46,46,46,46,-35,-36,46,46,-171,46,-154,46,-156,-151,-160,-143,-144,-148,-146,-130,46,-177,-178,-223,-222,-227,-229,-242,-87,-84,46,-238,-239,-241,-31,-34,46,46,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'SIGNED':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,70,71,72,73,74,75,76,77,78,81,90,91,96,97,98,99,100,101,102,103,104,106,112,116,117,118,119,121,122,123,124,125,126,127,128,129,137,140,141,192,193,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[47,47,-60,-62,-63,-64,-65,-66,-67,47,47,-70,-71,-52,-345,-345,-345,-128,-102,47,-345,-29,-107,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,47,-91,47,47,-129,-134,47,-98,-99,-100,-101,-104,-134,-90,-72,47,-53,-93,-9,-10,-345,-94,-95,-103,-129,-97,-185,-96,-169,-170,-343,-149,-150,47,47,47,-76,47,-92,47,-30,47,47,47,-186,47,47,47,-152,-159,-344,47,-162,-163,-145,47,-147,47,47,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,47,-77,-73,-69,47,47,47,47,-35,-36,47,47,-171,47,-154,47,-156,-151,-160,-143,-144,-148,-146,-130,47,-177,-178,-223,-222,-227,-229,-242,-87,-84,47,-238,-239,-241,-31,-34,47,47,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'UNSIGNED':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,70,71,72,73,74,75,76,77,78,81,90,91,96,97,98,99,100,101,102,103,104,106,112,116,117,118,119,121,122,123,124,125,126,127,128,129,137,140,141,192,193,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[48,48,-60,-62,-63,-64,-65,-66,-67,48,48,-70,-71,-52,-345,-345,-345,-128,-102,48,-345,-29,-107,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,48,-91,48,48,-129,-134,48,-98,-99,-100,-101,-104,-134,-90,-72,48,-53,-93,-9,-10,-345,-94,-95,-103,-129,-97,-185,-96,-169,-170,-343,-149,-150,48,48,48,-76,48,-92,48,-30,48,48,48,-186,48,48,48,-152,-159,-344,48,-162,-163,-145,48,-147,48,48,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,48,-77,-73,-69,48,48,48,48,-35,-36,48,48,-171,48,-154,48,-156,-151,-160,-143,-144,-148,-146,-130,48,-177,-178,-223,-222,-227,-229,-242,-87,-84,48,-238,-239,-241,-31,-34,48,48,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'__INT128':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,26,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,70,71,72,73,74,75,76,77,78,81,90,91,96,97,98,99,100,101,102,103,104,106,112,116,117,118,119,121,122,123,124,125,126,127,128,129,137,140,141,192,193,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[49,49,-60,-62,-63,-64,-65,-66,-67,49,49,-70,-71,-52,-345,-345,-345,-128,-102,49,-345,-29,-107,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,49,-91,49,49,-129,-134,49,-98,-99,-100,-101,-104,-134,-90,-72,49,-53,-93,-9,-10,-345,-94,-95,-103,-129,-97,-185,-96,-169,-170,-343,-149,-150,49,49,49,-76,49,-92,49,-30,49,49,49,-186,49,49,49,-152,-159,-344,49,-162,-163,-145,49,-147,49,49,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,49,-77,-73,-69,49,49,49,49,-35,-36,49,49,-171,49,-154,49,-156,-151,-160,-143,-144,-148,-146,-130,49,-177,-178,-223,-222,-227,-229,-242,-87,-84,49,-238,-239,-241,-31,-34,49,49,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'_ATOMIC':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,70,71,72,73,74,75,76,77,78,81,90,91,95,96,97,98,99,100,101,102,103,104,106,112,115,116,117,118,119,121,122,123,124,125,126,127,128,129,136,137,140,141,183,184,192,193,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,258,259,262,267,294,298,299,304,311,312,313,322,323,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,448,449,457,458,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,513,514,528,558,559,560,561,562,587,588,593,594,],[50,50,-60,-62,-63,-64,-65,-66,-67,72,81,-70,-71,-52,72,72,72,-128,-102,109,72,-29,-107,81,-125,-126,-127,72,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,72,-91,81,109,72,-134,72,-98,-99,-100,-101,-104,-134,-90,-72,81,50,-53,-93,-9,-10,72,-94,-95,-103,-129,-97,81,-185,-96,-169,-170,-343,-149,-150,50,50,50,-76,72,-92,81,50,-30,50,81,81,81,109,-186,50,50,50,-152,-159,-344,81,-162,-163,-145,72,-147,81,72,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,50,-77,81,81,-73,-69,50,50,50,50,-35,-36,50,50,81,-171,50,-154,50,-156,-151,-160,-143,-144,-148,-146,-130,50,-177,-178,-223,-222,-227,-229,-242,-87,-84,72,-238,-239,-241,-31,-34,81,50,81,81,50,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,81,81,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'CONST':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,27,28,29,30,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,71,72,73,74,75,76,77,78,81,90,91,95,96,97,101,104,106,115,116,118,119,121,122,123,124,125,126,127,128,129,136,137,140,141,183,184,192,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,258,259,262,267,294,298,299,304,311,312,313,322,323,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,448,449,457,458,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,513,514,528,558,559,560,561,562,587,588,593,594,],[51,51,-60,-62,-63,-64,-65,-66,-67,51,51,-70,-71,-52,51,51,51,-128,-102,51,-29,-107,51,-125,-126,-127,51,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,51,-91,51,51,-134,51,-98,-99,-100,-101,-104,-134,-90,-72,51,51,-53,51,-103,-129,51,-185,-169,-170,-343,-149,-150,51,51,51,-76,51,-92,51,51,-30,51,51,51,51,-186,51,51,51,-152,-159,-344,51,-162,-163,-145,51,-147,51,51,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,51,-77,51,51,-73,-69,51,51,51,51,-35,-36,51,51,51,-171,51,-154,51,-156,-151,-160,-143,-144,-148,-146,-130,51,-177,-178,-223,-222,-227,-229,-242,-87,-84,51,-238,-239,-241,-31,-34,51,51,51,51,51,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,51,51,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'RESTRICT':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,27,28,29,30,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,71,72,73,74,75,76,77,78,81,90,91,95,96,97,101,104,106,115,116,118,119,121,122,123,124,125,126,127,128,129,136,137,140,141,183,184,192,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,258,259,262,267,294,298,299,304,311,312,313,322,323,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,448,449,457,458,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,513,514,528,558,559,560,561,562,587,588,593,594,],[52,52,-60,-62,-63,-64,-65,-66,-67,52,52,-70,-71,-52,52,52,52,-128,-102,52,-29,-107,52,-125,-126,-127,52,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,52,-91,52,52,-134,52,-98,-99,-100,-101,-104,-134,-90,-72,52,52,-53,52,-103,-129,52,-185,-169,-170,-343,-149,-150,52,52,52,-76,52,-92,52,52,-30,52,52,52,52,-186,52,52,52,-152,-159,-344,52,-162,-163,-145,52,-147,52,52,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,52,-77,52,52,-73,-69,52,52,52,52,-35,-36,52,52,52,-171,52,-154,52,-156,-151,-160,-143,-144,-148,-146,-130,52,-177,-178,-223,-222,-227,-229,-242,-87,-84,52,-238,-239,-241,-31,-34,52,52,52,52,52,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,52,52,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'VOLATILE':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,27,28,29,30,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,71,72,73,74,75,76,77,78,81,90,91,95,96,97,101,104,106,115,116,118,119,121,122,123,124,125,126,127,128,129,136,137,140,141,183,184,192,197,203,204,205,206,207,208,209,210,211,212,213,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,258,259,262,267,294,298,299,304,311,312,313,322,323,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,448,449,457,458,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,513,514,528,558,559,560,561,562,587,588,593,594,],[53,53,-60,-62,-63,-64,-65,-66,-67,53,53,-70,-71,-52,53,53,53,-128,-102,53,-29,-107,53,-125,-126,-127,53,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,53,-91,53,53,-134,53,-98,-99,-100,-101,-104,-134,-90,-72,53,53,-53,53,-103,-129,53,-185,-169,-170,-343,-149,-150,53,53,53,-76,53,-92,53,53,-30,53,53,53,53,-186,53,53,53,-152,-159,-344,53,-162,-163,-145,53,-147,53,53,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,53,-77,53,53,-73,-69,53,53,53,53,-35,-36,53,53,53,-171,53,-154,53,-156,-151,-160,-143,-144,-148,-146,-130,53,-177,-178,-223,-222,-227,-229,-242,-87,-84,53,-238,-239,-241,-31,-34,53,53,53,53,53,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,53,53,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'AUTO':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,71,72,73,74,75,76,77,78,81,90,91,96,97,101,104,106,118,119,121,122,123,127,128,129,137,140,192,206,208,221,222,223,224,225,226,227,228,229,230,231,232,251,262,267,311,312,313,322,330,334,336,337,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[54,54,-60,-62,-63,-64,-65,-66,-67,54,54,-70,-71,-52,54,54,54,-128,-102,54,-29,-107,-125,-126,-127,54,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,54,-91,54,54,-134,54,-98,-99,-100,-101,-104,-134,-90,-72,54,-53,54,-103,-129,-169,-170,-343,-149,-150,-76,54,-92,54,-30,54,-152,-344,54,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-77,-73,-69,-35,-36,54,54,-171,-154,-156,-151,-130,54,-177,-178,-223,-222,-227,-229,-242,-87,-84,54,-238,-239,-241,-31,-34,54,54,-172,-173,-153,-155,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'REGISTER':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,71,72,73,74,75,76,77,78,81,90,91,96,97,101,104,106,118,119,121,122,123,127,128,129,137,140,192,206,208,221,222,223,224,225,226,227,228,229,230,231,232,251,262,267,311,312,313,322,330,334,336,337,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[55,55,-60,-62,-63,-64,-65,-66,-67,55,55,-70,-71,-52,55,55,55,-128,-102,55,-29,-107,-125,-126,-127,55,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,55,-91,55,55,-134,55,-98,-99,-100,-101,-104,-134,-90,-72,55,-53,55,-103,-129,-169,-170,-343,-149,-150,-76,55,-92,55,-30,55,-152,-344,55,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-77,-73,-69,-35,-36,55,55,-171,-154,-156,-151,-130,55,-177,-178,-223,-222,-227,-229,-242,-87,-84,55,-238,-239,-241,-31,-34,55,55,-172,-173,-153,-155,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'STATIC':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,71,72,73,74,75,76,77,78,81,90,91,95,96,97,101,104,106,116,118,119,121,122,123,127,128,129,136,137,140,184,192,197,206,208,221,222,223,224,225,226,227,228,229,230,231,232,251,259,262,267,311,312,313,322,323,330,334,336,337,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,448,449,458,460,461,462,465,466,471,472,473,481,482,485,486,501,510,511,514,528,558,559,560,561,562,587,588,593,594,],[29,29,-60,-62,-63,-64,-65,-66,-67,29,29,-70,-71,-52,29,29,29,-128,-102,29,-29,-107,-125,-126,-127,29,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,29,-91,29,29,-134,29,-98,-99,-100,-101,-104,-134,-90,-72,183,29,-53,29,-103,-129,-185,-169,-170,-343,-149,-150,-76,29,-92,258,29,-30,310,29,-186,-152,-344,29,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-77,402,-73,-69,-35,-36,29,29,457,-171,-154,-156,-151,-130,29,-177,-178,-223,-222,-227,-229,-242,-87,-84,29,-238,-239,-241,-31,-34,513,29,522,29,-172,-173,-153,-155,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,549,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'EXTERN':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,71,72,73,74,75,76,77,78,81,90,91,96,97,101,104,106,118,119,121,122,123,127,128,129,137,140,192,206,208,221,222,223,224,225,226,227,228,229,230,231,232,251,262,267,311,312,313,322,330,334,336,337,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[56,56,-60,-62,-63,-64,-65,-66,-67,56,56,-70,-71,-52,56,56,56,-128,-102,56,-29,-107,-125,-126,-127,56,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,56,-91,56,56,-134,56,-98,-99,-100,-101,-104,-134,-90,-72,56,-53,56,-103,-129,-169,-170,-343,-149,-150,-76,56,-92,56,-30,56,-152,-344,56,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-77,-73,-69,-35,-36,56,56,-171,-154,-156,-151,-130,56,-177,-178,-223,-222,-227,-229,-242,-87,-84,56,-238,-239,-241,-31,-34,56,56,-172,-173,-153,-155,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'TYPEDEF':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,71,72,73,74,75,76,77,78,81,90,91,96,97,101,104,106,118,119,121,122,123,127,128,129,137,140,192,206,208,221,222,223,224,225,226,227,228,229,230,231,232,251,262,267,311,312,313,322,330,334,336,337,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[57,57,-60,-62,-63,-64,-65,-66,-67,57,57,-70,-71,-52,57,57,57,-128,-102,57,-29,-107,-125,-126,-127,57,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,57,-91,57,57,-134,57,-98,-99,-100,-101,-104,-134,-90,-72,57,-53,57,-103,-129,-169,-170,-343,-149,-150,-76,57,-92,57,-30,57,-152,-344,57,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-77,-73,-69,-35,-36,57,57,-171,-154,-156,-151,-130,57,-177,-178,-223,-222,-227,-229,-242,-87,-84,57,-238,-239,-241,-31,-34,57,57,-172,-173,-153,-155,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'_THREAD_LOCAL':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,71,72,73,74,75,76,77,78,81,90,91,96,97,101,104,106,118,119,121,122,123,127,128,129,137,140,192,206,208,221,222,223,224,225,226,227,228,229,230,231,232,251,262,267,311,312,313,322,330,334,336,337,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[58,58,-60,-62,-63,-64,-65,-66,-67,58,58,-70,-71,-52,58,58,58,-128,-102,58,-29,-107,-125,-126,-127,58,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,58,-91,58,58,-134,58,-98,-99,-100,-101,-104,-134,-90,-72,58,-53,58,-103,-129,-169,-170,-343,-149,-150,-76,58,-92,58,-30,58,-152,-344,58,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-77,-73,-69,-35,-36,58,58,-171,-154,-156,-151,-130,58,-177,-178,-223,-222,-227,-229,-242,-87,-84,58,-238,-239,-241,-31,-34,58,58,-172,-173,-153,-155,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'INLINE':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,71,72,73,74,75,76,77,78,81,90,91,96,97,101,104,106,118,119,121,122,123,127,128,129,137,140,192,206,208,221,222,223,224,225,226,227,228,229,230,231,232,251,262,267,311,312,313,322,330,334,336,337,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[59,59,-60,-62,-63,-64,-65,-66,-67,59,59,-70,-71,-52,59,59,59,-128,-102,59,-29,-107,-125,-126,-127,59,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,59,-91,59,59,-134,59,-98,-99,-100,-101,-104,-134,-90,-72,59,-53,59,-103,-129,-169,-170,-343,-149,-150,-76,59,-92,59,-30,59,-152,-344,59,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-77,-73,-69,-35,-36,59,59,-171,-154,-156,-151,-130,59,-177,-178,-223,-222,-227,-229,-242,-87,-84,59,-238,-239,-241,-31,-34,59,59,-172,-173,-153,-155,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'_NORETURN':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,71,72,73,74,75,76,77,78,81,90,91,96,97,101,104,106,118,119,121,122,123,127,128,129,137,140,192,206,208,221,222,223,224,225,226,227,228,229,230,231,232,251,262,267,311,312,313,322,330,334,336,337,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[60,60,-60,-62,-63,-64,-65,-66,-67,60,60,-70,-71,-52,60,60,60,-128,-102,60,-29,-107,-125,-126,-127,60,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,60,-91,60,60,-134,60,-98,-99,-100,-101,-104,-134,-90,-72,60,-53,60,-103,-129,-169,-170,-343,-149,-150,-76,60,-92,60,-30,60,-152,-344,60,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-77,-73,-69,-35,-36,60,60,-171,-154,-156,-151,-130,60,-177,-178,-223,-222,-227,-229,-242,-87,-84,60,-238,-239,-241,-31,-34,60,60,-172,-173,-153,-155,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'_ALIGNAS':([0,2,4,5,6,7,8,9,10,11,12,14,15,19,21,22,23,24,25,27,28,29,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,64,67,68,69,71,72,73,74,75,76,77,78,81,90,91,96,97,101,104,106,118,119,121,122,123,124,125,126,127,128,129,137,140,141,192,203,204,205,206,207,208,209,210,211,212,214,216,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,330,333,334,335,336,337,338,340,341,342,348,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,461,462,465,466,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[61,61,-60,-62,-63,-64,-65,-66,-67,61,61,-70,-71,-52,61,61,61,-128,-102,61,-29,-107,-125,-126,-127,61,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,61,-91,61,61,-134,61,-98,-99,-100,-101,-104,-134,-90,-72,61,-53,61,-103,-129,-169,-170,-343,-149,-150,61,61,61,-76,61,-92,61,-30,61,61,61,61,61,-152,-159,-344,61,-162,-163,-145,-147,61,61,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,61,-77,-73,-69,61,61,61,61,-35,-36,61,61,-171,61,-154,61,-156,-151,-160,-143,-144,-148,-146,-130,61,-177,-178,-223,-222,-227,-229,-242,-87,-84,61,-238,-239,-241,-31,-34,61,61,-172,-173,-153,-155,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'STRUCT':([0,2,4,5,6,7,8,9,10,11,14,15,19,21,22,23,26,27,28,29,34,50,51,52,53,54,55,56,57,58,59,60,64,67,68,70,71,72,73,90,91,96,97,98,99,100,101,102,103,112,116,117,121,124,125,126,127,128,129,137,140,141,193,197,203,204,205,207,208,210,211,213,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,333,335,338,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[62,62,-60,-62,-63,-64,-65,-66,-67,62,-70,-71,-52,-345,-345,-345,62,-345,-29,-107,-345,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,62,-91,62,-345,-134,62,-90,-72,62,-53,-93,-9,-10,-345,-94,-95,-97,-185,-96,-343,62,62,62,-76,62,-92,62,-30,62,62,-186,62,62,62,-159,-344,-162,-163,62,62,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,62,-77,-73,-69,62,62,62,62,-35,-36,62,62,62,62,-160,-130,62,-177,-178,-223,-222,-227,-229,-242,-87,-84,62,-238,-239,-241,-31,-34,62,62,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'UNION':([0,2,4,5,6,7,8,9,10,11,14,15,19,21,22,23,26,27,28,29,34,50,51,52,53,54,55,56,57,58,59,60,64,67,68,70,71,72,73,90,91,96,97,98,99,100,101,102,103,112,116,117,121,124,125,126,127,128,129,137,140,141,193,197,203,204,205,207,208,210,211,213,221,222,223,224,225,226,227,228,229,230,231,232,238,251,262,267,294,298,299,304,311,312,313,322,333,335,338,349,351,353,354,355,356,358,360,361,370,371,372,374,375,377,439,440,449,460,467,471,472,473,481,482,485,486,501,510,511,528,558,559,560,561,562,587,588,593,594,],[63,63,-60,-62,-63,-64,-65,-66,-67,63,-70,-71,-52,-345,-345,-345,63,-345,-29,-107,-345,-134,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-61,63,-91,63,-345,-134,63,-90,-72,63,-53,-93,-9,-10,-345,-94,-95,-97,-185,-96,-343,63,63,63,-76,63,-92,63,-30,63,63,-186,63,63,63,-159,-344,-162,-163,63,63,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,63,-77,-73,-69,63,63,63,63,-35,-36,63,63,63,63,-160,-130,63,-177,-178,-223,-222,-227,-229,-242,-87,-84,63,-238,-239,-241,-31,-34,63,63,-161,-224,-228,-226,-86,-84,-237,-240,-68,-32,-33,-225,-230,-87,-84,-232,-233,-231,-234,-236,-235,]),'LBRACE':([11,15,19,28,36,37,62,63,65,66,67,68,73,90,91,97,118,119,121,122,123,128,129,131,135,140,195,208,221,222,223,224,225,226,227,228,229,230,231,232,238,242,256,262,267,311,312,355,356,358,360,361,369,370,371,374,375,377,392,393,394,405,439,440,471,472,473,476,481,482,485,486,489,491,500,501,506,507,510,511,528,529,530,531,536,537,558,559,560,561,562,568,578,587,588,590,592,593,594,],[-345,-71,-52,-29,121,121,-157,-158,121,-7,-8,-91,-345,-90,-72,-53,121,121,-343,121,121,121,-92,121,121,-30,121,-344,121,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,121,121,-345,-73,-69,-35,-36,-223,-222,121,121,-242,121,-87,-74,-238,-239,-241,-11,121,-12,121,-31,-34,-224,121,-226,121,-86,-75,-237,-240,-345,-201,-345,-68,121,121,-32,-33,-225,121,121,121,121,-11,-230,-87,-74,-232,-233,-345,121,-231,-234,121,121,-236,-235,]),'RBRACE':([15,90,91,121,124,128,139,143,144,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,200,201,202,203,204,205,207,208,210,211,219,220,221,222,223,224,225,226,227,228,229,230,231,232,249,250,255,256,262,263,267,291,292,293,295,296,297,300,301,302,303,328,329,331,333,335,338,355,356,358,360,361,370,371,374,375,377,390,391,392,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,463,464,467,471,472,473,475,481,482,485,486,487,488,489,490,499,501,503,504,507,508,528,535,541,542,558,559,560,561,562,566,567,568,569,582,587,588,593,594,],[-71,-90,-72,-343,208,-345,-333,-311,-260,-261,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,208,-174,-179,208,208,208,-159,-344,-162,-163,208,-5,-6,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-247,-282,-196,-345,-73,-334,-69,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,208,208,-175,208,208,-160,-223,-222,-227,-229,-242,-87,-84,-238,-239,-241,208,-22,-21,-313,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,-275,-276,-277,-278,-279,-280,-281,-300,-301,-302,-303,-304,-176,-180,-161,-224,-228,-226,-245,-86,-84,-237,-240,-248,-197,208,-199,-283,-68,-298,-299,-289,-290,-225,-198,208,-262,-230,-87,-84,-232,-233,-200,-307,208,-314,-308,-231,-234,-236,-235,]),'CASE':([15,90,91,121,128,208,221,222,223,224,225,226,227,228,229,230,231,232,242,262,267,355,356,358,360,361,369,370,371,374,375,377,471,472,473,481,482,485,486,501,528,529,530,531,558,559,560,561,562,578,587,588,590,592,593,594,],[-71,-90,-72,-343,234,-344,234,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,234,-73,-69,-223,-222,234,234,-242,234,-87,-74,-238,-239,-241,-224,234,-226,-86,-75,-237,-240,-68,-225,234,234,234,-230,-87,-74,-232,-233,234,-231,-234,234,234,-236,-235,]),'DEFAULT':([15,90,91,121,128,208,221,222,223,224,225,226,227,228,229,230,231,232,242,262,267,355,356,358,360,361,369,370,371,374,375,377,471,472,473,481,482,485,486,501,528,529,530,531,558,559,560,561,562,578,587,588,590,592,593,594,],[-71,-90,-72,-343,235,-344,235,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,235,-73,-69,-223,-222,235,235,-242,235,-87,-74,-238,-239,-241,-224,235,-226,-86,-75,-237,-240,-68,-225,235,235,235,-230,-87,-74,-232,-233,235,-231,-234,235,235,-236,-235,]),'IF':([15,90,91,121,128,208,221,222,223,224,225,226,227,228,229,230,231,232,242,262,267,355,356,358,360,361,369,370,371,374,375,377,471,472,473,481,482,485,486,501,528,529,530,531,558,559,560,561,562,578,587,588,590,592,593,594,],[-71,-90,-72,-343,237,-344,237,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,237,-73,-69,-223,-222,237,237,-242,237,-87,-74,-238,-239,-241,-224,237,-226,-86,-75,-237,-240,-68,-225,237,237,237,-230,-87,-74,-232,-233,237,-231,-234,237,237,-236,-235,]),'SWITCH':([15,90,91,121,128,208,221,222,223,224,225,226,227,228,229,230,231,232,242,262,267,355,356,358,360,361,369,370,371,374,375,377,471,472,473,481,482,485,486,501,528,529,530,531,558,559,560,561,562,578,587,588,590,592,593,594,],[-71,-90,-72,-343,240,-344,240,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,240,-73,-69,-223,-222,240,240,-242,240,-87,-74,-238,-239,-241,-224,240,-226,-86,-75,-237,-240,-68,-225,240,240,240,-230,-87,-74,-232,-233,240,-231,-234,240,240,-236,-235,]),'WHILE':([15,90,91,121,128,208,221,222,223,224,225,226,227,228,229,230,231,232,242,262,267,355,356,358,360,361,368,369,370,371,374,375,377,471,472,473,481,482,485,486,501,528,529,530,531,558,559,560,561,562,578,587,588,590,592,593,594,],[-71,-90,-72,-343,241,-344,241,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,241,-73,-69,-223,-222,241,241,-242,480,241,-87,-74,-238,-239,-241,-224,241,-226,-86,-75,-237,-240,-68,-225,241,241,241,-230,-87,-74,-232,-233,241,-231,-234,241,241,-236,-235,]),'DO':([15,90,91,121,128,208,221,222,223,224,225,226,227,228,229,230,231,232,242,262,267,355,356,358,360,361,369,370,371,374,375,377,471,472,473,481,482,485,486,501,528,529,530,531,558,559,560,561,562,578,587,588,590,592,593,594,],[-71,-90,-72,-343,242,-344,242,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,242,-73,-69,-223,-222,242,242,-242,242,-87,-74,-238,-239,-241,-224,242,-226,-86,-75,-237,-240,-68,-225,242,242,242,-230,-87,-74,-232,-233,242,-231,-234,242,242,-236,-235,]),'FOR':([15,90,91,121,128,208,221,222,223,224,225,226,227,228,229,230,231,232,242,262,267,355,356,358,360,361,369,370,371,374,375,377,471,472,473,481,482,485,486,501,528,529,530,531,558,559,560,561,562,578,587,588,590,592,593,594,],[-71,-90,-72,-343,243,-344,243,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,243,-73,-69,-223,-222,243,243,-242,243,-87,-74,-238,-239,-241,-224,243,-226,-86,-75,-237,-240,-68,-225,243,243,243,-230,-87,-74,-232,-233,243,-231,-234,243,243,-236,-235,]),'GOTO':([15,90,91,121,128,208,221,222,223,224,225,226,227,228,229,230,231,232,242,262,267,355,356,358,360,361,369,370,371,374,375,377,471,472,473,481,482,485,486,501,528,529,530,531,558,559,560,561,562,578,587,588,590,592,593,594,],[-71,-90,-72,-343,244,-344,244,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,244,-73,-69,-223,-222,244,244,-242,244,-87,-74,-238,-239,-241,-224,244,-226,-86,-75,-237,-240,-68,-225,244,244,244,-230,-87,-74,-232,-233,244,-231,-234,244,244,-236,-235,]),'BREAK':([15,90,91,121,128,208,221,222,223,224,225,226,227,228,229,230,231,232,242,262,267,355,356,358,360,361,369,370,371,374,375,377,471,472,473,481,482,485,486,501,528,529,530,531,558,559,560,561,562,578,587,588,590,592,593,594,],[-71,-90,-72,-343,245,-344,245,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,245,-73,-69,-223,-222,245,245,-242,245,-87,-74,-238,-239,-241,-224,245,-226,-86,-75,-237,-240,-68,-225,245,245,245,-230,-87,-74,-232,-233,245,-231,-234,245,245,-236,-235,]),'CONTINUE':([15,90,91,121,128,208,221,222,223,224,225,226,227,228,229,230,231,232,242,262,267,355,356,358,360,361,369,370,371,374,375,377,471,472,473,481,482,485,486,501,528,529,530,531,558,559,560,561,562,578,587,588,590,592,593,594,],[-71,-90,-72,-343,246,-344,246,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,246,-73,-69,-223,-222,246,246,-242,246,-87,-74,-238,-239,-241,-224,246,-226,-86,-75,-237,-240,-68,-225,246,246,246,-230,-87,-74,-232,-233,246,-231,-234,246,246,-236,-235,]),'RETURN':([15,90,91,121,128,208,221,222,223,224,225,226,227,228,229,230,231,232,242,262,267,355,356,358,360,361,369,370,371,374,375,377,471,472,473,481,482,485,486,501,528,529,530,531,558,559,560,561,562,578,587,588,590,592,593,594,],[-71,-90,-72,-343,247,-344,247,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,247,-73,-69,-223,-222,247,247,-242,247,-87,-74,-238,-239,-241,-224,247,-226,-86,-75,-237,-240,-68,-225,247,247,247,-230,-87,-74,-232,-233,247,-231,-234,247,247,-236,-235,]),'PLUSPLUS':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,139,141,143,147,148,149,150,152,153,154,155,156,158,159,160,161,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,233,234,238,242,247,256,257,258,259,262,263,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,291,292,294,298,300,301,302,303,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,406,429,431,432,433,434,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,503,504,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,567,568,569,571,578,580,582,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,153,-345,-27,-28,-185,-343,153,153,153,-345,-333,153,-311,-292,-293,-294,-291,291,153,153,153,153,-297,-320,-295,-296,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,153,-345,-28,153,-186,-344,153,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-320,153,153,153,153,-345,153,-345,-28,-73,-334,-69,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,153,-305,-306,153,153,-339,-340,-341,-342,-292,153,153,-345,153,153,-223,-222,153,153,-242,153,153,153,153,153,-87,-74,153,-238,-239,-241,153,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,153,-12,153,-292,153,153,153,-313,-300,-301,-302,-303,-304,-345,153,-345,-28,153,153,-224,153,-226,153,-86,-75,153,-237,-240,-345,-201,-345,-68,153,-298,-299,153,153,-345,-28,153,153,-292,-225,153,153,153,153,153,153,-11,-292,153,153,-230,-87,-74,-232,-233,153,-307,-345,-314,153,153,153,-308,-231,-234,153,153,-236,-235,]),'MINUSMINUS':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,139,141,143,147,148,149,150,152,153,154,155,156,158,159,160,161,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,233,234,238,242,247,256,257,258,259,262,263,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,291,292,294,298,300,301,302,303,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,406,429,431,432,433,434,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,503,504,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,567,568,569,571,578,580,582,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,154,-345,-27,-28,-185,-343,154,154,154,-345,-333,154,-311,-292,-293,-294,-291,292,154,154,154,154,-297,-320,-295,-296,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,154,-345,-28,154,-186,-344,154,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-320,154,154,154,154,-345,154,-345,-28,-73,-334,-69,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,154,-305,-306,154,154,-339,-340,-341,-342,-292,154,154,-345,154,154,-223,-222,154,154,-242,154,154,154,154,154,-87,-74,154,-238,-239,-241,154,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,154,-12,154,-292,154,154,154,-313,-300,-301,-302,-303,-304,-345,154,-345,-28,154,154,-224,154,-226,154,-86,-75,154,-237,-240,-345,-201,-345,-68,154,-298,-299,154,154,-345,-28,154,154,-292,-225,154,154,154,154,154,154,-11,-292,154,154,-230,-87,-74,-232,-233,154,-307,-345,-314,154,154,154,-308,-231,-234,154,154,-236,-235,]),'SIZEOF':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,156,-345,-27,-28,-185,-343,156,156,156,-345,156,-292,-293,-294,-291,156,156,156,156,-295,-296,156,-345,-28,156,-186,-344,156,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,156,156,156,156,-345,156,-345,-28,-73,-69,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,156,-292,156,156,-345,156,156,-223,-222,156,156,-242,156,156,156,156,156,-87,-74,156,-238,-239,-241,156,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,156,-12,156,-292,156,156,156,-345,156,-345,-28,156,156,-224,156,-226,156,-86,-75,156,-237,-240,-345,-201,-345,-68,156,156,156,-345,-28,156,156,-292,-225,156,156,156,156,156,156,-11,-292,156,156,-230,-87,-74,-232,-233,156,-345,156,156,156,-231,-234,156,156,-236,-235,]),'_ALIGNOF':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,157,-345,-27,-28,-185,-343,157,157,157,-345,157,-292,-293,-294,-291,157,157,157,157,-295,-296,157,-345,-28,157,-186,-344,157,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,157,157,157,157,-345,157,-345,-28,-73,-69,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,-292,157,157,-345,157,157,-223,-222,157,157,-242,157,157,157,157,157,-87,-74,157,-238,-239,-241,157,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,157,-12,157,-292,157,157,157,-345,157,-345,-28,157,157,-224,157,-226,157,-86,-75,157,-237,-240,-345,-201,-345,-68,157,157,157,-345,-28,157,157,-292,-225,157,157,157,157,157,157,-11,-292,157,157,-230,-87,-74,-232,-233,157,-345,157,157,157,-231,-234,157,157,-236,-235,]),'AND':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,139,141,143,145,146,147,148,149,150,151,152,153,154,155,156,158,159,160,161,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,233,234,238,242,247,250,256,257,258,259,262,263,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,291,292,293,294,295,296,297,298,300,301,302,303,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,499,500,501,502,503,504,505,507,508,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,567,568,569,571,578,580,582,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,150,-345,-27,-28,-185,-343,150,150,150,-345,-333,150,-311,282,-263,-292,-293,-294,-291,-282,-284,150,150,150,150,-297,-320,-295,-296,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,150,-345,-28,150,-186,-344,150,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-320,150,150,150,150,-282,-345,150,-345,-28,-73,-334,-69,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,150,-305,-306,-285,150,-286,-287,-288,150,-339,-340,-341,-342,-292,150,150,-345,150,150,-223,-222,150,150,-242,150,150,150,150,150,-87,-74,150,-238,-239,-241,150,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,150,-12,150,-292,150,150,150,-313,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,-275,-276,-277,282,282,282,282,-300,-301,-302,-303,-304,-345,150,-345,-28,150,150,-224,150,-226,150,-86,-75,150,-237,-240,-345,-201,-283,-345,-68,150,-298,-299,150,-289,-290,150,-345,-28,150,150,-292,-225,150,150,150,150,150,150,-11,-292,150,150,-230,-87,-74,-232,-233,150,-307,-345,-314,150,150,150,-308,-231,-234,150,150,-236,-235,]),'PLUS':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,139,141,143,145,146,147,148,149,150,151,152,153,154,155,156,158,159,160,161,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,233,234,238,242,247,250,256,257,258,259,262,263,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,291,292,293,294,295,296,297,298,300,301,302,303,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,499,500,501,502,503,504,505,507,508,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,567,568,569,571,578,580,582,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,148,-345,-27,-28,-185,-343,148,148,148,-345,-333,148,-311,272,-263,-292,-293,-294,-291,-282,-284,148,148,148,148,-297,-320,-295,-296,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,148,-345,-28,148,-186,-344,148,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-320,148,148,148,148,-282,-345,148,-345,-28,-73,-334,-69,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,148,-305,-306,-285,148,-286,-287,-288,148,-339,-340,-341,-342,-292,148,148,-345,148,148,-223,-222,148,148,-242,148,148,148,148,148,-87,-74,148,-238,-239,-241,148,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,148,-12,148,-292,148,148,148,-313,-264,-265,-266,-267,-268,272,272,272,272,272,272,272,272,272,272,272,272,272,-300,-301,-302,-303,-304,-345,148,-345,-28,148,148,-224,148,-226,148,-86,-75,148,-237,-240,-345,-201,-283,-345,-68,148,-298,-299,148,-289,-290,148,-345,-28,148,148,-292,-225,148,148,148,148,148,148,-11,-292,148,148,-230,-87,-74,-232,-233,148,-307,-345,-314,148,148,148,-308,-231,-234,148,148,-236,-235,]),'MINUS':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,139,141,143,145,146,147,148,149,150,151,152,153,154,155,156,158,159,160,161,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,233,234,238,242,247,250,256,257,258,259,262,263,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,291,292,293,294,295,296,297,298,300,301,302,303,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,499,500,501,502,503,504,505,507,508,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,567,568,569,571,578,580,582,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,149,-345,-27,-28,-185,-343,149,149,149,-345,-333,149,-311,273,-263,-292,-293,-294,-291,-282,-284,149,149,149,149,-297,-320,-295,-296,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,149,-345,-28,149,-186,-344,149,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,-320,149,149,149,149,-282,-345,149,-345,-28,-73,-334,-69,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,-305,-306,-285,149,-286,-287,-288,149,-339,-340,-341,-342,-292,149,149,-345,149,149,-223,-222,149,149,-242,149,149,149,149,149,-87,-74,149,-238,-239,-241,149,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,149,-12,149,-292,149,149,149,-313,-264,-265,-266,-267,-268,273,273,273,273,273,273,273,273,273,273,273,273,273,-300,-301,-302,-303,-304,-345,149,-345,-28,149,149,-224,149,-226,149,-86,-75,149,-237,-240,-345,-201,-283,-345,-68,149,-298,-299,149,-289,-290,149,-345,-28,149,149,-292,-225,149,149,149,149,149,149,-11,-292,149,149,-230,-87,-74,-232,-233,149,-307,-345,-314,149,149,149,-308,-231,-234,149,149,-236,-235,]),'NOT':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,160,-345,-27,-28,-185,-343,160,160,160,-345,160,-292,-293,-294,-291,160,160,160,160,-295,-296,160,-345,-28,160,-186,-344,160,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,160,160,160,160,-345,160,-345,-28,-73,-69,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,160,-292,160,160,-345,160,160,-223,-222,160,160,-242,160,160,160,160,160,-87,-74,160,-238,-239,-241,160,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,160,-12,160,-292,160,160,160,-345,160,-345,-28,160,160,-224,160,-226,160,-86,-75,160,-237,-240,-345,-201,-345,-68,160,160,160,-345,-28,160,160,-292,-225,160,160,160,160,160,160,-11,-292,160,160,-230,-87,-74,-232,-233,160,-345,160,160,160,-231,-234,160,160,-236,-235,]),'LNOT':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,161,-345,-27,-28,-185,-343,161,161,161,-345,161,-292,-293,-294,-291,161,161,161,161,-295,-296,161,-345,-28,161,-186,-344,161,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,161,161,161,161,-345,161,-345,-28,-73,-69,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,161,-292,161,161,-345,161,161,-223,-222,161,161,-242,161,161,161,161,161,-87,-74,161,-238,-239,-241,161,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,161,-12,161,-292,161,161,161,-345,161,-345,-28,161,161,-224,161,-226,161,-86,-75,161,-237,-240,-345,-201,-345,-68,161,161,161,-345,-28,161,161,-292,-225,161,161,161,161,161,161,-11,-292,161,161,-230,-87,-74,-232,-233,161,-345,161,161,161,-231,-234,161,161,-236,-235,]),'OFFSETOF':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,165,-345,-27,-28,-185,-343,165,165,165,-345,165,-292,-293,-294,-291,165,165,165,165,-295,-296,165,-345,-28,165,-186,-344,165,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,165,165,165,165,-345,165,-345,-28,-73,-69,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,165,-292,165,165,-345,165,165,-223,-222,165,165,-242,165,165,165,165,165,-87,-74,165,-238,-239,-241,165,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,165,-12,165,-292,165,165,165,-345,165,-345,-28,165,165,-224,165,-226,165,-86,-75,165,-237,-240,-345,-201,-345,-68,165,165,165,-345,-28,165,165,-292,-225,165,165,165,165,165,165,-11,-292,165,165,-230,-87,-74,-232,-233,165,-345,165,165,165,-231,-234,165,165,-236,-235,]),'INT_CONST_DEC':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,166,-345,-27,-28,-185,-343,166,166,166,-345,166,-292,-293,-294,-291,166,166,166,166,-295,-296,166,-345,-28,166,-186,-344,166,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,166,166,166,166,-345,166,-345,-28,-73,-69,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,166,-292,166,166,-345,166,166,-223,-222,166,166,-242,166,166,166,166,166,-87,-74,166,-238,-239,-241,166,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,166,-12,166,-292,166,166,166,-345,166,-345,-28,166,166,-224,166,-226,166,-86,-75,166,-237,-240,-345,-201,-345,-68,166,166,166,-345,-28,166,166,-292,-225,166,166,166,166,166,166,-11,-292,166,166,-230,-87,-74,-232,-233,166,-345,166,166,166,-231,-234,166,166,-236,-235,]),'INT_CONST_OCT':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,167,-345,-27,-28,-185,-343,167,167,167,-345,167,-292,-293,-294,-291,167,167,167,167,-295,-296,167,-345,-28,167,-186,-344,167,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,167,167,167,167,-345,167,-345,-28,-73,-69,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,167,-292,167,167,-345,167,167,-223,-222,167,167,-242,167,167,167,167,167,-87,-74,167,-238,-239,-241,167,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,167,-12,167,-292,167,167,167,-345,167,-345,-28,167,167,-224,167,-226,167,-86,-75,167,-237,-240,-345,-201,-345,-68,167,167,167,-345,-28,167,167,-292,-225,167,167,167,167,167,167,-11,-292,167,167,-230,-87,-74,-232,-233,167,-345,167,167,167,-231,-234,167,167,-236,-235,]),'INT_CONST_HEX':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,168,-345,-27,-28,-185,-343,168,168,168,-345,168,-292,-293,-294,-291,168,168,168,168,-295,-296,168,-345,-28,168,-186,-344,168,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,168,168,168,168,-345,168,-345,-28,-73,-69,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,168,-292,168,168,-345,168,168,-223,-222,168,168,-242,168,168,168,168,168,-87,-74,168,-238,-239,-241,168,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,168,-12,168,-292,168,168,168,-345,168,-345,-28,168,168,-224,168,-226,168,-86,-75,168,-237,-240,-345,-201,-345,-68,168,168,168,-345,-28,168,168,-292,-225,168,168,168,168,168,168,-11,-292,168,168,-230,-87,-74,-232,-233,168,-345,168,168,168,-231,-234,168,168,-236,-235,]),'INT_CONST_BIN':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,169,-345,-27,-28,-185,-343,169,169,169,-345,169,-292,-293,-294,-291,169,169,169,169,-295,-296,169,-345,-28,169,-186,-344,169,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,169,169,169,169,-345,169,-345,-28,-73,-69,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,169,-292,169,169,-345,169,169,-223,-222,169,169,-242,169,169,169,169,169,-87,-74,169,-238,-239,-241,169,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,169,-12,169,-292,169,169,169,-345,169,-345,-28,169,169,-224,169,-226,169,-86,-75,169,-237,-240,-345,-201,-345,-68,169,169,169,-345,-28,169,169,-292,-225,169,169,169,169,169,169,-11,-292,169,169,-230,-87,-74,-232,-233,169,-345,169,169,169,-231,-234,169,169,-236,-235,]),'INT_CONST_CHAR':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,170,-345,-27,-28,-185,-343,170,170,170,-345,170,-292,-293,-294,-291,170,170,170,170,-295,-296,170,-345,-28,170,-186,-344,170,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,170,170,170,170,-345,170,-345,-28,-73,-69,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,170,-292,170,170,-345,170,170,-223,-222,170,170,-242,170,170,170,170,170,-87,-74,170,-238,-239,-241,170,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,170,-12,170,-292,170,170,170,-345,170,-345,-28,170,170,-224,170,-226,170,-86,-75,170,-237,-240,-345,-201,-345,-68,170,170,170,-345,-28,170,170,-292,-225,170,170,170,170,170,170,-11,-292,170,170,-230,-87,-74,-232,-233,170,-345,170,170,170,-231,-234,170,170,-236,-235,]),'FLOAT_CONST':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,171,-345,-27,-28,-185,-343,171,171,171,-345,171,-292,-293,-294,-291,171,171,171,171,-295,-296,171,-345,-28,171,-186,-344,171,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,171,171,171,171,-345,171,-345,-28,-73,-69,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,171,-292,171,171,-345,171,171,-223,-222,171,171,-242,171,171,171,171,171,-87,-74,171,-238,-239,-241,171,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,171,-12,171,-292,171,171,171,-345,171,-345,-28,171,171,-224,171,-226,171,-86,-75,171,-237,-240,-345,-201,-345,-68,171,171,171,-345,-28,171,171,-292,-225,171,171,171,171,171,171,-11,-292,171,171,-230,-87,-74,-232,-233,171,-345,171,171,171,-231,-234,171,171,-236,-235,]),'HEX_FLOAT_CONST':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,172,-345,-27,-28,-185,-343,172,172,172,-345,172,-292,-293,-294,-291,172,172,172,172,-295,-296,172,-345,-28,172,-186,-344,172,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,172,172,172,172,-345,172,-345,-28,-73,-69,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,172,-292,172,172,-345,172,172,-223,-222,172,172,-242,172,172,172,172,172,-87,-74,172,-238,-239,-241,172,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,172,-12,172,-292,172,172,172,-345,172,-345,-28,172,172,-224,172,-226,172,-86,-75,172,-237,-240,-345,-201,-345,-68,172,172,172,-345,-28,172,172,-292,-225,172,172,172,172,172,172,-11,-292,172,172,-230,-87,-74,-232,-233,172,-345,172,172,172,-231,-234,172,172,-236,-235,]),'CHAR_CONST':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,173,-345,-27,-28,-185,-343,173,173,173,-345,173,-292,-293,-294,-291,173,173,173,173,-295,-296,173,-345,-28,173,-186,-344,173,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,173,173,173,173,-345,173,-345,-28,-73,-69,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,173,-292,173,173,-345,173,173,-223,-222,173,173,-242,173,173,173,173,173,-87,-74,173,-238,-239,-241,173,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,173,-12,173,-292,173,173,173,-345,173,-345,-28,173,173,-224,173,-226,173,-86,-75,173,-237,-240,-345,-201,-345,-68,173,173,173,-345,-28,173,173,-292,-225,173,173,173,173,173,173,-11,-292,173,173,-230,-87,-74,-232,-233,173,-345,173,173,173,-231,-234,173,173,-236,-235,]),'WCHAR_CONST':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,174,-345,-27,-28,-185,-343,174,174,174,-345,174,-292,-293,-294,-291,174,174,174,174,-295,-296,174,-345,-28,174,-186,-344,174,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,174,174,174,174,-345,174,-345,-28,-73,-69,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,174,-292,174,174,-345,174,174,-223,-222,174,174,-242,174,174,174,174,174,-87,-74,174,-238,-239,-241,174,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,174,-12,174,-292,174,174,174,-345,174,-345,-28,174,174,-224,174,-226,174,-86,-75,174,-237,-240,-345,-201,-345,-68,174,174,174,-345,-28,174,174,-292,-225,174,174,174,174,174,174,-11,-292,174,174,-230,-87,-74,-232,-233,174,-345,174,174,174,-231,-234,174,174,-236,-235,]),'U8CHAR_CONST':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,175,-345,-27,-28,-185,-343,175,175,175,-345,175,-292,-293,-294,-291,175,175,175,175,-295,-296,175,-345,-28,175,-186,-344,175,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,175,175,175,175,-345,175,-345,-28,-73,-69,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,175,-292,175,175,-345,175,175,-223,-222,175,175,-242,175,175,175,175,175,-87,-74,175,-238,-239,-241,175,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,175,-12,175,-292,175,175,175,-345,175,-345,-28,175,175,-224,175,-226,175,-86,-75,175,-237,-240,-345,-201,-345,-68,175,175,175,-345,-28,175,175,-292,-225,175,175,175,175,175,175,-11,-292,175,175,-230,-87,-74,-232,-233,175,-345,175,175,175,-231,-234,175,175,-236,-235,]),'U16CHAR_CONST':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,176,-345,-27,-28,-185,-343,176,176,176,-345,176,-292,-293,-294,-291,176,176,176,176,-295,-296,176,-345,-28,176,-186,-344,176,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,176,176,176,176,-345,176,-345,-28,-73,-69,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,176,-292,176,176,-345,176,176,-223,-222,176,176,-242,176,176,176,176,176,-87,-74,176,-238,-239,-241,176,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,176,-12,176,-292,176,176,176,-345,176,-345,-28,176,176,-224,176,-226,176,-86,-75,176,-237,-240,-345,-201,-345,-68,176,176,176,-345,-28,176,176,-292,-225,176,176,176,176,176,176,-11,-292,176,176,-230,-87,-74,-232,-233,176,-345,176,176,176,-231,-234,176,176,-236,-235,]),'U32CHAR_CONST':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,177,-345,-27,-28,-185,-343,177,177,177,-345,177,-292,-293,-294,-291,177,177,177,177,-295,-296,177,-345,-28,177,-186,-344,177,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,177,177,177,177,-345,177,-345,-28,-73,-69,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,177,-292,177,177,-345,177,177,-223,-222,177,177,-242,177,177,177,177,177,-87,-74,177,-238,-239,-241,177,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,177,-12,177,-292,177,177,177,-345,177,-345,-28,177,177,-224,177,-226,177,-86,-75,177,-237,-240,-345,-201,-345,-68,177,177,177,-345,-28,177,177,-292,-225,177,177,177,177,177,177,-11,-292,177,177,-230,-87,-74,-232,-233,177,-345,177,177,177,-231,-234,177,177,-236,-235,]),'STRING_LITERAL':([15,51,52,53,81,90,91,92,94,95,114,115,116,121,126,128,135,136,138,139,141,143,147,148,149,150,153,154,155,156,160,161,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,263,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,407,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,139,139,-345,-27,-28,-185,-343,139,139,139,-345,263,-333,139,263,-292,-293,-294,-291,139,139,139,139,-295,-296,139,-345,-28,139,-186,-344,139,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,139,139,139,139,-345,139,-345,-28,-73,-334,139,-69,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,139,-292,139,139,-345,139,139,-223,-222,139,139,-242,139,139,139,139,139,-87,-74,139,-238,-239,-241,139,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,139,-12,139,-292,139,139,139,263,-345,139,-345,-28,139,139,-224,139,-226,139,-86,-75,139,-237,-240,-345,-201,-345,-68,139,139,139,-345,-28,139,139,-292,-225,139,139,139,139,139,139,-11,-292,139,139,-230,-87,-74,-232,-233,139,-345,139,139,139,-231,-234,139,139,-236,-235,]),'WSTRING_LITERAL':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,164,178,179,180,181,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,300,301,302,303,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,178,-345,-27,-28,-185,-343,178,178,178,-345,178,-292,-293,-294,-291,178,178,178,178,-295,-296,300,-335,-336,-337,-338,178,-345,-28,178,-186,-344,178,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,178,178,178,178,-345,178,-345,-28,-73,-69,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,178,-339,-340,-341,-342,-292,178,178,-345,178,178,-223,-222,178,178,-242,178,178,178,178,178,-87,-74,178,-238,-239,-241,178,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,178,-12,178,-292,178,178,178,-345,178,-345,-28,178,178,-224,178,-226,178,-86,-75,178,-237,-240,-345,-201,-345,-68,178,178,178,-345,-28,178,178,-292,-225,178,178,178,178,178,178,-11,-292,178,178,-230,-87,-74,-232,-233,178,-345,178,178,178,-231,-234,178,178,-236,-235,]),'U8STRING_LITERAL':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,164,178,179,180,181,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,300,301,302,303,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,179,-345,-27,-28,-185,-343,179,179,179,-345,179,-292,-293,-294,-291,179,179,179,179,-295,-296,301,-335,-336,-337,-338,179,-345,-28,179,-186,-344,179,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,179,179,179,179,-345,179,-345,-28,-73,-69,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,179,-339,-340,-341,-342,-292,179,179,-345,179,179,-223,-222,179,179,-242,179,179,179,179,179,-87,-74,179,-238,-239,-241,179,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,179,-12,179,-292,179,179,179,-345,179,-345,-28,179,179,-224,179,-226,179,-86,-75,179,-237,-240,-345,-201,-345,-68,179,179,179,-345,-28,179,179,-292,-225,179,179,179,179,179,179,-11,-292,179,179,-230,-87,-74,-232,-233,179,-345,179,179,179,-231,-234,179,179,-236,-235,]),'U16STRING_LITERAL':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,164,178,179,180,181,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,300,301,302,303,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,180,-345,-27,-28,-185,-343,180,180,180,-345,180,-292,-293,-294,-291,180,180,180,180,-295,-296,302,-335,-336,-337,-338,180,-345,-28,180,-186,-344,180,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,180,180,180,180,-345,180,-345,-28,-73,-69,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,180,-339,-340,-341,-342,-292,180,180,-345,180,180,-223,-222,180,180,-242,180,180,180,180,180,-87,-74,180,-238,-239,-241,180,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,180,-12,180,-292,180,180,180,-345,180,-345,-28,180,180,-224,180,-226,180,-86,-75,180,-237,-240,-345,-201,-345,-68,180,180,180,-345,-28,180,180,-292,-225,180,180,180,180,180,180,-11,-292,180,180,-230,-87,-74,-232,-233,180,-345,180,180,180,-231,-234,180,180,-236,-235,]),'U32STRING_LITERAL':([15,51,52,53,81,90,91,94,95,114,115,116,121,126,128,135,136,141,147,148,149,150,153,154,155,156,160,161,164,178,179,180,181,182,183,184,195,197,208,221,222,223,224,225,226,227,228,229,230,231,232,234,238,242,247,256,257,258,259,262,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,300,301,302,303,306,309,310,323,332,347,355,356,358,360,361,362,365,366,367,369,370,371,372,374,375,377,378,379,380,381,382,383,384,385,386,387,388,389,392,393,394,397,400,401,402,405,448,455,457,458,459,469,471,472,473,476,481,482,484,485,486,489,491,500,501,502,505,512,513,514,521,522,524,528,529,530,531,532,533,536,537,547,548,549,558,559,560,561,562,565,568,571,578,580,587,588,590,592,593,594,],[-71,-131,-132,-133,-134,-90,-72,181,-345,-27,-28,-185,-343,181,181,181,-345,181,-292,-293,-294,-291,181,181,181,181,-295,-296,303,-335,-336,-337,-338,181,-345,-28,181,-186,-344,181,-221,-219,-220,-78,-79,-80,-81,-82,-83,-84,-85,181,181,181,181,-345,181,-345,-28,-73,-69,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,181,-339,-340,-341,-342,-292,181,181,-345,181,181,-223,-222,181,181,-242,181,181,181,181,181,-87,-74,181,-238,-239,-241,181,-249,-250,-251,-252,-253,-254,-255,-256,-257,-258,-259,-11,181,-12,181,-292,181,181,181,-345,181,-345,-28,181,181,-224,181,-226,181,-86,-75,181,-237,-240,-345,-201,-345,-68,181,181,181,-345,-28,181,181,-292,-225,181,181,181,181,181,181,-11,-292,181,181,-230,-87,-74,-232,-233,181,-345,181,181,181,-231,-234,181,181,-236,-235,]),'ELSE':([15,91,208,225,226,227,228,229,230,232,262,267,355,358,360,361,370,371,374,375,377,471,472,473,481,482,485,486,501,528,558,559,560,561,562,587,588,593,594,],[-71,-72,-344,-78,-79,-80,-81,-82,-83,-85,-73,-69,-223,-227,-229,-242,-87,-84,-238,-239,-241,-224,-228,-226,-86,-84,-237,-240,-68,-225,-230,578,-84,-232,-233,-231,-234,-236,-235,]),'PPPRAGMASTR':([15,],[91,]),'EQUALS':([19,28,73,86,87,88,89,97,111,130,132,139,140,143,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,202,208,233,250,252,263,291,292,293,295,296,297,300,301,302,303,311,312,395,396,403,404,406,429,431,432,433,434,439,440,492,494,495,496,499,503,504,507,508,510,511,538,539,540,567,569,582,],[-52,-29,-181,135,-182,-54,-37,-53,195,-181,-55,-333,-30,-311,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,332,-344,-320,379,-38,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-35,-36,491,-202,-43,-44,-313,-300,-301,-302,-303,-304,-31,-34,-203,-205,-39,-42,-283,-298,-299,-289,-290,-32,-33,-204,-40,-41,-307,-314,-308,]),'COMMA':([19,24,25,28,29,30,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,51,52,53,54,55,56,57,58,59,60,73,74,75,76,77,78,81,84,85,86,87,88,89,97,104,106,108,110,111,113,114,115,116,118,119,122,123,130,132,139,140,142,143,144,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,187,189,190,191,192,196,197,200,201,202,206,208,212,214,216,233,239,248,249,250,252,253,254,255,263,265,291,292,293,295,296,297,300,301,302,303,311,312,315,316,317,318,319,320,321,324,325,326,327,328,329,330,331,334,336,337,340,341,342,344,345,346,348,349,350,352,353,354,376,391,403,404,406,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,438,439,440,444,445,446,447,461,462,463,464,465,466,470,474,475,477,478,479,487,488,490,495,496,499,503,504,507,508,510,511,517,518,520,526,527,535,539,540,541,542,543,550,551,552,555,556,557,563,566,567,569,572,573,576,577,582,584,585,586,],[-52,-128,-102,-29,-107,-345,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-181,-98,-99,-100,-101,-104,-134,134,-135,-137,-182,-54,-37,-53,-103,-129,194,-139,-141,-183,-27,-28,-185,-169,-170,-149,-150,-181,-55,-333,-30,266,-311,-260,-261,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,313,314,-189,-194,-345,-184,-186,331,-174,-179,-152,-344,-145,-147,-345,-320,365,-243,-247,-282,-38,-136,-138,-196,-334,365,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-35,-36,-191,-192,-193,-207,-56,-1,-2,-45,-209,-140,-142,331,331,-171,-175,-154,-156,-151,-143,-144,-148,468,-164,-166,-146,-130,-206,-207,-177,-178,365,489,-43,-44,-313,365,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,-275,-276,-277,-278,-279,-280,-281,365,505,-300,-318,-301,-302,-303,-304,509,-31,-34,-190,-195,-57,-208,-172,-173,-176,-180,-153,-155,-168,365,-245,-244,365,365,-248,-197,-199,-39,-42,-283,-298,-299,-289,-290,-32,-33,-210,-216,-214,-165,-167,-198,-40,-41,568,-262,-319,-50,-51,-212,-211,-213,-215,365,-200,-307,-314,-46,-49,-217,-218,-308,365,-47,-48,]),'RPAREN':([19,24,25,28,29,30,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,51,52,53,54,55,56,57,58,59,60,74,75,76,77,78,81,88,89,93,96,97,104,106,113,114,115,116,118,119,122,123,132,133,137,138,139,140,142,143,144,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,185,186,187,188,189,190,191,192,196,197,206,208,212,214,215,216,217,218,239,248,249,250,252,260,261,263,264,265,288,291,292,293,295,296,297,300,301,302,303,311,312,315,316,317,318,319,320,321,322,324,325,330,334,336,337,340,341,342,348,349,350,351,352,353,354,355,357,363,364,403,404,406,407,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,428,429,430,431,432,433,434,435,436,437,439,440,443,444,445,446,447,449,450,451,452,453,454,460,461,462,465,466,474,475,477,478,479,487,495,496,499,503,504,507,508,510,511,515,516,517,518,520,525,539,540,542,543,544,545,550,551,552,555,556,557,563,565,567,569,572,573,576,577,580,581,582,583,585,586,589,591,],[-52,-128,-102,-29,-107,-345,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-98,-99,-100,-101,-104,-134,-54,-37,140,-345,-53,-103,-129,-183,-27,-28,-185,-169,-170,-149,-150,-55,252,-345,262,-333,-30,267,-311,-260,-261,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,311,312,-187,-17,-18,-189,-194,-345,-184,-186,-152,-344,-145,-147,349,-345,353,354,-14,-243,-247,-282,-38,403,404,-334,405,406,429,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-35,-36,-191,-192,-193,-207,-56,-1,-2,-345,-45,-209,-171,-154,-156,-151,-143,-144,-148,-146,-130,-206,-345,-207,-177,-178,-223,-13,475,476,-43,-44,-313,501,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,-275,-276,-277,-278,-279,-280,-281,504,-300,-318,-301,-302,-303,-304,506,507,508,-31,-34,-188,-190,-195,-57,-208,-345,517,518,-207,-23,-24,-345,-172,-173,-153,-155,529,-245,-244,530,531,-248,-39,-42,-283,-298,-299,-289,-290,-32,-33,550,551,-210,-216,-214,557,-40,-41,-262,-319,569,-315,-50,-51,-212,-211,-213,-215,579,-345,-307,-314,-46,-49,-217,-218,-345,590,-308,-316,-47,-48,592,-317,]),'COLON':([19,24,28,31,32,33,35,38,39,40,41,42,43,44,45,46,47,48,49,51,52,53,81,87,88,89,97,106,118,119,122,123,130,132,139,140,143,144,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,206,208,209,212,214,233,235,248,249,250,252,263,291,292,293,295,296,297,300,301,302,303,311,312,330,334,336,337,340,341,342,346,348,349,353,354,359,403,404,406,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,439,440,461,462,465,466,468,475,477,487,495,496,499,503,504,507,508,510,511,539,540,542,567,569,582,],[-52,-128,-29,-125,-126,-127,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-131,-132,-133,-134,-182,-54,-37,-53,-129,-169,-170,-149,-150,-181,-55,-333,-30,-311,-260,-261,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-152,-344,347,-145,-147,358,360,-243,-247,-282,-38,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-35,-36,-171,-154,-156,-151,-143,-144,-148,469,-146,-130,-177,-178,472,-43,-44,-313,502,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,-275,-276,-277,-278,-279,-280,-281,-300,-301,-302,-303,-304,-31,-34,-172,-173,-153,-155,347,-245,-244,-248,-39,-42,-283,-298,-299,-289,-290,-32,-33,-40,-41,-262,-307,-314,-308,]),'LBRACKET':([19,24,25,28,29,30,31,32,33,34,35,38,39,40,41,42,43,44,45,46,47,48,49,51,52,53,54,55,56,57,58,59,60,74,75,76,77,78,81,88,89,97,104,106,113,114,115,116,118,119,121,122,123,132,139,140,143,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,192,196,197,206,208,212,214,216,233,252,256,263,291,292,300,301,302,303,311,312,318,319,322,324,325,330,334,336,337,340,341,342,348,349,351,352,353,354,395,396,403,404,406,429,431,432,433,434,439,440,446,447,452,461,462,465,466,489,492,494,495,496,500,503,504,510,511,517,518,520,538,539,540,544,545,550,551,552,555,556,557,567,568,569,572,573,576,577,582,583,585,586,591,],[95,-128,-102,-29,-107,-345,-125,-126,-127,-129,-246,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-131,-132,-133,-105,-106,-108,-109,-110,-111,-112,-98,-99,-100,-101,-104,-134,136,-37,95,-103,-129,-183,-27,-28,-185,-169,-170,-343,-149,-150,136,-333,-30,-311,287,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,323,-184,-186,-152,-344,-145,-147,323,-320,-38,397,-334,-305,-306,-339,-340,-341,-342,-35,-36,323,448,323,-45,459,-171,-154,-156,-151,-143,-144,-148,-146,-130,323,323,-177,-178,397,-202,-43,-44,-313,-300,-301,-302,-303,-304,-31,-34,448,459,323,-172,-173,-153,-155,397,-203,-205,-39,-42,397,-298,-299,-32,-33,-210,-216,-214,-204,-40,-41,571,-315,-50,-51,-212,-211,-213,-215,-307,397,-314,-46,-49,-217,-218,-308,-316,-47,-48,-317,]),'RBRACKET':([51,52,53,81,95,114,116,136,139,143,144,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,184,197,208,248,249,250,257,259,263,291,292,293,295,296,297,300,301,302,303,305,306,307,308,323,399,400,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,429,431,432,433,434,441,442,448,455,456,458,459,475,477,487,493,497,498,499,503,504,507,508,512,514,519,523,524,542,546,547,553,554,567,569,574,575,582,584,],[-131,-132,-133,-134,-345,-27,-185,-345,-333,-311,-260,-261,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-345,-28,-186,-344,-243,-247,-282,-345,-28,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,439,440,-3,-4,-345,495,496,-313,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,-275,-276,-277,-278,-279,-280,-281,503,-300,-301,-302,-303,-304,510,511,-345,-345,520,-28,-345,-245,-244,-248,538,539,540,-283,-298,-299,-289,-290,-345,-28,552,555,556,-262,572,573,576,577,-307,-314,585,586,-308,591,]),'PERIOD':([121,139,143,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,256,263,291,292,300,301,302,303,395,396,406,429,431,432,433,434,489,492,494,500,503,504,538,544,545,567,568,569,582,583,591,],[-343,-333,-311,289,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,398,-334,-305,-306,-339,-340,-341,-342,398,-202,-313,-300,-301,-302,-303,-304,398,-203,-205,398,-298,-299,-204,570,-315,-307,398,-314,-308,-316,-317,]),'ARROW':([139,143,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,263,291,292,300,301,302,303,406,429,431,432,433,434,503,504,567,569,582,],[-333,-311,290,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-334,-305,-306,-339,-340,-341,-342,-313,-300,-301,-302,-303,-304,-298,-299,-307,-314,-308,]),'CONDOP':([139,143,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,268,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-282,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,-275,-276,-277,-278,-279,-280,-281,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'DIVIDE':([139,143,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,270,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-282,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-264,-265,-266,270,270,270,270,270,270,270,270,270,270,270,270,270,270,270,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'MOD':([139,143,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,271,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-282,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-264,-265,-266,271,271,271,271,271,271,271,271,271,271,271,271,271,271,271,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'RSHIFT':([139,143,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,274,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-282,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-264,-265,-266,-267,-268,-269,-270,274,274,274,274,274,274,274,274,274,274,274,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'LSHIFT':([139,143,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,275,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-282,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-264,-265,-266,-267,-268,-269,-270,275,275,275,275,275,275,275,275,275,275,275,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'LT':([139,143,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,276,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-282,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,276,276,276,276,276,276,276,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'LE':([139,143,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,277,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-282,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,277,277,277,277,277,277,277,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'GE':([139,143,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,278,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-282,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,278,278,278,278,278,278,278,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'GT':([139,143,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,279,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-282,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,279,279,279,279,279,279,279,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'EQ':([139,143,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,280,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-282,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,-275,-276,280,280,280,280,280,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'NE':([139,143,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,281,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-282,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,-275,-276,281,281,281,281,281,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'OR':([139,143,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,283,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-282,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,-275,-276,-277,-278,-279,283,283,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'XOR':([139,143,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,284,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-282,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,-275,-276,-277,284,-279,284,284,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'LAND':([139,143,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,285,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-282,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,-275,-276,-277,-278,-279,-280,285,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'LOR':([139,143,145,146,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,286,-263,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,-282,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,-275,-276,-277,-278,-279,-280,-281,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'XOREQUAL':([139,143,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,380,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'TIMESEQUAL':([139,143,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,381,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'DIVEQUAL':([139,143,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,382,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'MODEQUAL':([139,143,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,383,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'PLUSEQUAL':([139,143,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,384,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'MINUSEQUAL':([139,143,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,385,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'LSHIFTEQUAL':([139,143,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,386,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'RSHIFTEQUAL':([139,143,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,387,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'ANDEQUAL':([139,143,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,388,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'OREQUAL':([139,143,151,152,158,159,162,163,164,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,208,233,250,263,291,292,293,295,296,297,300,301,302,303,406,429,431,432,433,434,499,503,504,507,508,567,569,582,],[-333,-311,-282,-284,-297,-320,-309,-310,-312,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-335,-336,-337,-338,-344,-320,389,-334,-305,-306,-285,-286,-287,-288,-339,-340,-341,-342,-313,-300,-301,-302,-303,-304,-283,-298,-299,-289,-290,-307,-314,-308,]),'ELLIPSIS':([313,],[443,]),}

_lr_action = {}
for _k, _v in _lr_action_items.items():
   for _x,_y in zip(_v[0],_v[1]):
      if not _x in _lr_action:  _lr_action[_x] = {}
      _lr_action[_x][_k] = _y
del _lr_action_items

_lr_goto_items = {'translation_unit_or_empty':([0,],[1,]),'translation_unit':([0,],[2,]),'empty':([0,11,12,21,22,23,26,27,30,34,69,70,71,73,95,96,101,128,136,137,182,183,192,209,216,221,242,256,257,258,322,323,351,358,360,369,372,448,449,455,457,459,460,472,484,489,500,512,513,529,530,531,533,565,568,578,580,590,592,],[3,66,83,99,99,99,107,99,114,99,83,107,99,66,114,188,99,220,114,188,307,114,320,343,320,357,357,392,307,114,453,114,453,357,357,357,357,114,188,307,114,307,453,357,357,537,537,307,114,357,357,357,357,357,537,357,357,357,357,]),'external_declaration':([0,2,],[4,64,]),'function_definition':([0,2,],[5,5,]),'declaration':([0,2,11,67,73,128,221,372,],[6,6,68,129,68,223,223,484,]),'pp_directive':([0,2,],[7,7,]),'pppragma_directive':([0,2,124,128,203,204,205,221,242,333,335,358,360,369,472,529,530,531,578,590,592,],[8,8,211,231,211,211,211,231,371,211,211,371,371,482,371,560,371,371,371,371,371,]),'static_assert':([0,2,128,221,242,358,360,369,472,529,530,531,578,590,592,],[10,10,232,232,232,232,232,232,232,232,232,232,232,232,232,]),'id_declarator':([0,2,12,17,26,69,70,82,134,192,194,209,322,468,],[11,11,73,93,111,130,111,93,130,315,130,130,93,130,]),'declaration_specifiers':([0,2,11,67,73,96,128,137,221,313,322,351,372,449,460,],[12,12,69,69,69,192,69,192,69,192,192,192,69,192,192,]),'decl_body':([0,2,11,67,73,128,221,372,],[13,13,13,13,13,13,13,13,]),'direct_id_declarator':([0,2,12,17,20,26,69,70,80,82,134,192,194,209,318,322,452,468,],[19,19,19,19,97,19,19,19,97,19,19,19,19,19,97,19,97,19,]),'pointer':([0,2,12,17,26,69,70,82,113,134,192,194,209,216,322,351,468,],[20,20,80,20,20,80,20,80,196,80,318,80,80,352,452,352,80,]),'type_qualifier':([0,2,11,12,21,22,23,27,30,34,67,69,71,73,95,96,101,115,124,125,126,128,136,137,141,183,184,192,203,204,205,209,213,216,221,238,258,259,294,298,299,304,313,322,323,333,335,351,372,448,449,457,458,460,513,514,],[21,21,21,74,21,21,21,21,116,21,21,74,21,21,116,21,21,197,116,116,116,21,116,21,116,116,197,74,116,116,116,341,197,341,21,116,116,197,116,116,116,116,21,21,116,116,116,21,21,116,21,116,197,21,116,197,]),'storage_class_specifier':([0,2,11,12,21,22,23,27,34,67,69,71,73,96,101,128,137,192,221,313,322,351,372,449,460,],[22,22,22,75,22,22,22,22,22,22,75,22,22,22,22,22,22,75,22,22,22,22,22,22,22,]),'function_specifier':([0,2,11,12,21,22,23,27,34,67,69,71,73,96,101,128,137,192,221,313,322,351,372,449,460,],[23,23,23,76,23,23,23,23,23,23,76,23,23,23,23,23,23,76,23,23,23,23,23,23,23,]),'type_specifier_no_typeid':([0,2,11,12,26,67,69,70,73,96,124,125,126,128,137,141,192,193,203,204,205,209,213,216,221,238,294,298,299,304,313,322,333,335,351,372,449,460,],[24,24,24,77,24,24,77,24,24,24,24,24,24,24,24,24,77,24,24,24,24,340,24,340,24,24,24,24,24,24,24,24,24,24,24,24,24,24,]),'type_specifier':([0,2,11,26,67,70,73,96,124,125,126,128,137,141,193,203,204,205,213,221,238,294,298,299,304,313,322,333,335,351,372,449,460,],[25,25,25,104,25,104,25,25,212,212,212,25,25,212,104,212,212,212,348,25,212,212,212,212,212,25,25,212,212,25,25,25,25,]),'declaration_specifiers_no_type':([0,2,11,21,22,23,27,34,67,71,73,96,101,128,137,221,313,322,351,372,449,460,],[26,26,70,100,100,100,100,100,70,100,70,193,100,70,193,70,193,193,193,70,193,193,]),'alignment_specifier':([0,2,11,12,21,22,23,27,34,67,69,71,73,96,101,124,125,126,128,137,141,192,203,204,205,209,216,221,238,294,298,299,304,313,322,333,335,351,372,449,460,],[27,27,27,78,27,27,27,27,27,27,78,27,27,27,27,214,214,214,27,27,214,78,214,214,214,342,342,27,214,214,214,214,214,27,27,214,214,27,27,27,27,]),'typedef_name':([0,2,11,26,67,70,73,96,124,125,126,128,137,141,193,203,204,205,213,221,238,294,298,299,304,313,322,333,335,351,372,449,460,],[31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,]),'enum_specifier':([0,2,11,26,67,70,73,96,124,125,126,128,137,141,193,203,204,205,213,221,238,294,298,299,304,313,322,333,335,351,372,449,460,],[32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,]),'struct_or_union_specifier':([0,2,11,26,67,70,73,96,124,125,126,128,137,141,193,203,204,205,213,221,238,294,298,299,304,313,322,333,335,351,372,449,460,],[33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,33,]),'atomic_specifier':([0,2,11,21,22,23,26,27,34,67,70,71,73,96,101,124,125,126,128,137,141,193,203,204,205,213,221,238,294,298,299,304,313,322,333,335,351,372,449,460,],[34,34,71,101,101,101,106,101,101,71,106,101,71,34,101,106,106,106,71,34,106,106,106,106,106,106,71,106,106,106,106,106,34,34,106,106,34,71,34,34,]),'struct_or_union':([0,2,11,26,67,70,73,96,124,125,126,128,137,141,193,203,204,205,213,221,238,294,298,299,304,313,322,333,335,351,372,449,460,],[37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,37,]),'declaration_list_opt':([11,73,],[65,131,]),'declaration_list':([11,73,],[67,67,]),'init_declarator_list_opt':([12,69,],[79,79,]),'init_declarator_list':([12,69,],[84,84,]),'init_declarator':([12,69,134,194,],[85,85,253,326,]),'declarator':([12,69,134,194,209,468,],[86,86,86,86,346,346,]),'typeid_declarator':([12,69,82,134,194,209,468,],[87,87,133,87,87,87,87,]),'direct_typeid_declarator':([12,69,80,82,134,194,209,468,],[88,88,132,88,88,88,88,88,]),'declaration_specifiers_no_type_opt':([21,22,23,27,34,71,101,],[98,102,103,112,117,117,117,]),'id_init_declarator_list_opt':([26,70,],[105,105,]),'id_init_declarator_list':([26,70,],[108,108,]),'id_init_declarator':([26,70,],[110,110,]),'type_qualifier_list_opt':([30,95,136,183,258,323,448,457,513,],[113,182,257,309,401,455,512,521,548,]),'type_qualifier_list':([30,95,124,125,126,136,141,183,203,204,205,238,258,294,298,299,304,323,333,335,448,457,513,],[115,184,213,213,213,259,213,115,213,213,213,213,115,213,213,213,213,458,213,213,514,115,115,]),'brace_open':([36,37,65,118,119,122,123,128,131,135,195,221,238,242,358,360,369,393,405,472,476,506,507,529,530,531,536,578,590,592,],[120,124,128,198,199,203,204,128,128,256,256,128,128,128,128,128,128,256,500,128,500,500,500,128,128,128,256,128,128,128,]),'compound_statement':([65,128,131,221,238,242,358,360,369,472,529,530,531,578,590,592,],[127,227,251,227,363,227,227,227,227,227,227,227,227,227,227,227,]),'unified_string_literal':([92,94,126,128,135,141,153,154,155,156,182,195,221,234,238,242,247,257,266,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,309,310,332,347,358,360,362,365,366,367,369,372,378,393,397,401,402,405,455,459,469,472,476,484,502,505,512,521,522,529,530,531,532,533,536,548,549,565,571,578,580,590,592,],[138,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,407,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,]),'constant_expression':([94,126,234,332,347,397,469,],[142,218,359,464,470,493,527,]),'conditional_expression':([94,126,128,135,141,182,195,221,234,238,242,247,257,268,287,288,294,298,309,310,332,347,358,360,362,365,366,367,369,372,378,393,397,401,402,455,459,469,472,484,502,505,512,521,522,529,530,531,532,533,536,548,549,565,571,578,580,590,592,],[144,144,249,249,249,249,249,249,144,249,249,249,249,249,249,249,249,249,249,249,144,144,249,249,249,249,249,249,249,249,249,249,144,249,249,249,249,144,249,249,542,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,249,]),'binary_expression':([94,126,128,135,141,182,195,221,234,238,242,247,257,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,309,310,332,347,358,360,362,365,366,367,369,372,378,393,397,401,402,455,459,469,472,484,502,505,512,521,522,529,530,531,532,533,536,548,549,565,571,578,580,590,592,],[145,145,145,145,145,145,145,145,145,145,145,145,145,145,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,145,]),'cast_expression':([94,126,128,135,141,155,182,195,221,234,238,242,247,257,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,309,310,332,347,358,360,362,365,366,367,369,372,378,393,397,401,402,405,455,459,469,472,476,484,502,505,512,521,522,529,530,531,532,533,536,548,549,565,571,578,580,590,592,],[146,146,146,146,146,296,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,499,146,146,146,146,499,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,146,]),'unary_expression':([94,126,128,135,141,153,154,155,156,182,195,221,234,238,242,247,257,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,309,310,332,347,358,360,362,365,366,367,369,372,378,393,397,401,402,405,455,459,469,472,476,484,502,505,512,521,522,529,530,531,532,533,536,548,549,565,571,578,580,590,592,],[151,151,250,250,250,293,295,151,297,250,250,250,151,250,250,250,250,250,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,151,250,250,250,250,250,250,151,151,250,250,250,250,250,250,250,250,250,250,151,250,250,151,250,250,151,250,151,250,151,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,250,]),'postfix_expression':([94,126,128,135,141,153,154,155,156,182,195,221,234,238,242,247,257,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,309,310,332,347,358,360,362,365,366,367,369,372,378,393,397,401,402,405,455,459,469,472,476,484,502,505,512,521,522,529,530,531,532,533,536,548,549,565,571,578,580,590,592,],[152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,]),'unary_operator':([94,126,128,135,141,153,154,155,156,182,195,221,234,238,242,247,257,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,309,310,332,347,358,360,362,365,366,367,369,372,378,393,397,401,402,405,455,459,469,472,476,484,502,505,512,521,522,529,530,531,532,533,536,548,549,565,571,578,580,590,592,],[155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,155,]),'primary_expression':([94,126,128,135,141,153,154,155,156,182,195,221,234,238,242,247,257,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,309,310,332,347,358,360,362,365,366,367,369,372,378,393,397,401,402,405,455,459,469,472,476,484,502,505,512,521,522,529,530,531,532,533,536,548,549,565,571,578,580,590,592,],[158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,158,]),'identifier':([94,96,126,128,135,137,141,153,154,155,156,182,195,221,234,238,242,247,257,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,309,310,314,332,347,358,360,362,365,366,367,369,372,378,393,397,398,401,402,405,449,455,459,469,472,476,484,502,505,509,512,521,522,529,530,531,532,533,536,548,549,565,570,571,578,580,590,592,],[162,191,162,162,162,191,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,162,445,162,162,162,162,162,162,162,162,162,162,162,162,162,494,162,162,162,191,162,162,162,162,162,162,162,162,545,162,162,162,162,162,162,162,162,162,162,162,162,583,162,162,162,162,162,]),'constant':([94,126,128,135,141,153,154,155,156,182,195,221,234,238,242,247,257,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,309,310,332,347,358,360,362,365,366,367,369,372,378,393,397,401,402,405,455,459,469,472,476,484,502,505,512,521,522,529,530,531,532,533,536,548,549,565,571,578,580,590,592,],[163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,163,]),'unified_wstring_literal':([94,126,128,135,141,153,154,155,156,182,195,221,234,238,242,247,257,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,294,298,309,310,332,347,358,360,362,365,366,367,369,372,378,393,397,401,402,405,455,459,469,472,476,484,502,505,512,521,522,529,530,531,532,533,536,548,549,565,571,578,580,590,592,],[164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,164,]),'parameter_type_list':([96,137,322,351,449,460,],[185,260,454,454,515,454,]),'identifier_list_opt':([96,137,449,],[186,261,516,]),'parameter_list':([96,137,322,351,449,460,],[187,187,187,187,187,187,]),'identifier_list':([96,137,449,],[189,189,189,]),'parameter_declaration':([96,137,313,322,351,449,460,],[190,190,444,190,190,190,190,]),'enumerator_list':([120,198,199,],[200,328,329,]),'enumerator':([120,198,199,331,],[201,201,201,463,]),'struct_declaration_list':([124,203,204,],[205,333,335,]),'brace_close':([124,200,203,204,205,219,328,329,333,335,390,489,541,568,],[206,330,334,336,337,355,461,462,465,466,488,535,567,582,]),'struct_declaration':([124,203,204,205,333,335,],[207,207,207,338,338,338,]),'specifier_qualifier_list':([124,125,126,141,203,204,205,238,294,298,299,304,333,335,],[209,216,216,216,209,209,209,216,216,216,216,216,209,209,]),'type_name':([125,126,141,238,294,298,299,304,],[215,217,264,364,435,436,437,438,]),'block_item_list_opt':([128,],[219,]),'block_item_list':([128,],[221,]),'block_item':([128,221,],[222,356,]),'statement':([128,221,242,358,360,369,472,529,530,531,578,590,592,],[224,224,370,370,370,481,370,559,370,370,370,370,370,]),'labeled_statement':([128,221,242,358,360,369,472,529,530,531,578,590,592,],[225,225,225,225,225,225,225,225,225,225,225,225,225,]),'expression_statement':([128,221,242,358,360,369,472,529,530,531,578,590,592,],[226,226,226,226,226,226,226,226,226,226,226,226,226,]),'selection_statement':([128,221,242,358,360,369,472,529,530,531,578,590,592,],[228,228,228,228,228,228,228,228,228,228,228,228,228,]),'iteration_statement':([128,221,242,358,360,369,472,529,530,531,578,590,592,],[229,229,229,229,229,229,229,229,229,229,229,229,229,]),'jump_statement':([128,221,242,358,360,369,472,529,530,531,578,590,592,],[230,230,230,230,230,230,230,230,230,230,230,230,230,]),'expression_opt':([128,221,242,358,360,369,372,472,484,529,530,531,533,565,578,580,590,592,],[236,236,236,236,236,236,483,236,534,236,236,236,564,581,236,589,236,236,]),'expression':([128,141,221,238,242,247,268,287,294,298,358,360,362,366,367,369,372,472,484,529,530,531,532,533,565,571,578,580,590,592,],[239,265,239,265,239,376,408,427,265,265,239,239,474,478,479,239,239,239,239,239,239,239,563,239,239,584,239,239,239,239,]),'assignment_expression':([128,135,141,182,195,221,238,242,247,257,268,287,288,294,298,309,310,358,360,362,365,366,367,369,372,378,393,401,402,455,459,472,484,505,512,521,522,529,530,531,532,533,536,548,549,565,571,578,580,590,592,],[248,255,248,308,255,248,248,248,248,308,248,248,430,248,248,441,442,248,248,248,477,248,248,248,248,487,255,497,498,308,308,248,248,543,308,553,554,248,248,248,248,248,255,574,575,248,248,248,248,248,248,]),'initializer':([135,195,393,536,],[254,327,490,566,]),'assignment_expression_opt':([182,257,455,459,512,],[305,399,519,523,546,]),'typeid_noparen_declarator':([192,],[316,]),'abstract_declarator_opt':([192,216,],[317,350,]),'direct_typeid_noparen_declarator':([192,318,],[319,446,]),'abstract_declarator':([192,216,322,351,],[321,321,450,450,]),'direct_abstract_declarator':([192,216,318,322,351,352,452,],[325,325,447,325,325,447,447,]),'struct_declarator_list_opt':([209,],[339,]),'struct_declarator_list':([209,],[344,]),'struct_declarator':([209,468,],[345,526,]),'pragmacomp_or_statement':([242,358,360,472,529,530,531,578,590,592,],[368,471,473,528,558,561,562,587,593,594,]),'pppragma_directive_list':([242,358,360,472,529,530,531,578,590,592,],[369,369,369,369,369,369,369,369,369,369,]),'assignment_operator':([250,],[378,]),'initializer_list_opt':([256,],[390,]),'initializer_list':([256,500,],[391,541,]),'designation_opt':([256,489,500,568,],[393,536,393,536,]),'designation':([256,489,500,568,],[394,394,394,394,]),'designator_list':([256,489,500,568,],[395,395,395,395,]),'designator':([256,395,489,500,568,],[396,492,396,396,396,]),'argument_expression_list':([288,],[428,]),'parameter_type_list_opt':([322,351,460,],[451,451,525,]),'offsetof_member_designator':([509,],[544,]),}

_lr_goto = {}
for _k, _v in _lr_goto_items.items():
   for _x, _y in zip(_v[0], _v[1]):
       if not _x in _lr_goto: _lr_goto[_x] = {}
       _lr_goto[_x][_k] = _y
del _lr_goto_items
_lr_productions = [
  ("S' -> translation_unit_or_empty","S'",1,None,None,None),
  ('abstract_declarator_opt -> empty','abstract_declarator_opt',1,'p_abstract_declarator_opt','plyparser.py',43),
  ('abstract_declarator_opt -> abstract_declarator','abstract_declarator_opt',1,'p_abstract_declarator_opt','plyparser.py',44),
  ('assignment_expression_opt -> empty','assignment_expression_opt',1,'p_assignment_expression_opt','plyparser.py',43),
  ('assignment_expression_opt -> assignment_expression','assignment_expression_opt',1,'p_assignment_expression_opt','plyparser.py',44),
  ('block_item_list_opt -> empty','block_item_list_opt',1,'p_block_item_list_opt','plyparser.py',43),
  ('block_item_list_opt -> block_item_list','block_item_list_opt',1,'p_block_item_list_opt','plyparser.py',44),
  ('declaration_list_opt -> empty','declaration_list_opt',1,'p_declaration_list_opt','plyparser.py',43),
  ('declaration_list_opt -> declaration_list','declaration_list_opt',1,'p_declaration_list_opt','plyparser.py',44),
  ('declaration_specifiers_no_type_opt -> empty','declaration_specifiers_no_type_opt',1,'p_declaration_specifiers_no_type_opt','plyparser.py',43),
  ('declaration_specifiers_no_type_opt -> declaration_specifiers_no_type','declaration_specifiers_no_type_opt',1,'p_declaration_specifiers_no_type_opt','plyparser.py',44),
  ('designation_opt -> empty','designation_opt',1,'p_designation_opt','plyparser.py',43),
  ('designation_opt -> designation','designation_opt',1,'p_designation_opt','plyparser.py',44),
  ('expression_opt -> empty','expression_opt',1,'p_expression_opt','plyparser.py',43),
  ('expression_opt -> expression','expression_opt',1,'p_expression_opt','plyparser.py',44),
  ('id_init_declarator_list_opt -> empty','id_init_declarator_list_opt',1,'p_id_init_declarator_list_opt','plyparser.py',43),
  ('id_init_declarator_list_opt -> id_init_declarator_list','id_init_declarator_list_opt',1,'p_id_init_declarator_list_opt','plyparser.py',44),
  ('identifier_list_opt -> empty','identifier_list_opt',1,'p_identifier_list_opt','plyparser.py',43),
  ('identifier_list_opt -> identifier_list','identifier_list_opt',1,'p_identifier_list_opt','plyparser.py',44),
  ('init_declarator_list_opt -> empty','init_declarator_list_opt',1,'p_init_declarator_list_opt','plyparser.py',43),
  ('init_declarator_list_opt -> init_declarator_list','init_declarator_list_opt',1,'p_init_declarator_list_opt','plyparser.py',44),
  ('initializer_list_opt -> empty','initializer_list_opt',1,'p_initializer_list_opt','plyparser.py',43),
  ('initializer_list_opt -> initializer_list','initializer_list_opt',1,'p_initializer_list_opt','plyparser.py',44),
  ('parameter_type_list_opt -> empty','parameter_type_list_opt',1,'p_parameter_type_list_opt','plyparser.py',43),
  ('parameter_type_list_opt -> parameter_type_list','parameter_type_list_opt',1,'p_parameter_type_list_opt','plyparser.py',44),
  ('struct_declarator_list_opt -> empty','struct_declarator_list_opt',1,'p_struct_declarator_list_opt','plyparser.py',43),
  ('struct_declarator_list_opt -> struct_declarator_list','struct_declarator_list_opt',1,'p_struct_declarator_list_opt','plyparser.py',44),
  ('type_qualifier_list_opt -> empty','type_qualifier_list_opt',1,'p_type_qualifier_list_opt','plyparser.py',43),
  ('type_qualifier_list_opt -> type_qualifier_list','type_qualifier_list_opt',1,'p_type_qualifier_list_opt','plyparser.py',44),
  ('direct_id_declarator -> ID','direct_id_declarator',1,'p_direct_id_declarator_1','plyparser.py',126),
  ('direct_id_declarator -> LPAREN id_declarator RPAREN','direct_id_declarator',3,'p_direct_id_declarator_2','plyparser.py',126),
  ('direct_id_declarator -> direct_id_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET','direct_id_declarator',5,'p_direct_id_declarator_3','plyparser.py',126),
  ('direct_id_declarator -> direct_id_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET','direct_id_declarator',6,'p_direct_id_declarator_4','plyparser.py',126),
  ('direct_id_declarator -> direct_id_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET','direct_id_declarator',6,'p_direct_id_declarator_4','plyparser.py',127),
  ('direct_id_declarator -> direct_id_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET','direct_id_declarator',5,'p_direct_id_declarator_5','plyparser.py',126),
  ('direct_id_declarator -> direct_id_declarator LPAREN parameter_type_list RPAREN','direct_id_declarator',4,'p_direct_id_declarator_6','plyparser.py',126),
  ('direct_id_declarator -> direct_id_declarator LPAREN identifier_list_opt RPAREN','direct_id_declarator',4,'p_direct_id_declarator_6','plyparser.py',127),
  ('direct_typeid_declarator -> TYPEID','direct_typeid_declarator',1,'p_direct_typeid_declarator_1','plyparser.py',126),
  ('direct_typeid_declarator -> LPAREN typeid_declarator RPAREN','direct_typeid_declarator',3,'p_direct_typeid_declarator_2','plyparser.py',126),
  ('direct_typeid_declarator -> direct_typeid_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET','direct_typeid_declarator',5,'p_direct_typeid_declarator_3','plyparser.py',126),
  ('direct_typeid_declarator -> direct_typeid_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET','direct_typeid_declarator',6,'p_direct_typeid_declarator_4','plyparser.py',126),
  ('direct_typeid_declarator -> direct_typeid_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET','direct_typeid_declarator',6,'p_direct_typeid_declarator_4','plyparser.py',127),
  ('direct_typeid_declarator -> direct_typeid_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET','direct_typeid_declarator',5,'p_direct_typeid_declarator_5','plyparser.py',126),
  ('direct_typeid_declarator -> direct_typeid_declarator LPAREN parameter_type_list RPAREN','direct_typeid_declarator',4,'p_direct_typeid_declarator_6','plyparser.py',126),
  ('direct_typeid_declarator -> direct_typeid_declarator LPAREN identifier_list_opt RPAREN','direct_typeid_declarator',4,'p_direct_typeid_declarator_6','plyparser.py',127),
  ('direct_typeid_noparen_declarator -> TYPEID','direct_typeid_noparen_declarator',1,'p_direct_typeid_noparen_declarator_1','plyparser.py',126),
  ('direct_typeid_noparen_declarator -> direct_typeid_noparen_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET','direct_typeid_noparen_declarator',5,'p_direct_typeid_noparen_declarator_3','plyparser.py',126),
  ('direct_typeid_noparen_declarator -> direct_typeid_noparen_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET','direct_typeid_noparen_declarator',6,'p_direct_typeid_noparen_declarator_4','plyparser.py',126),
  ('direct_typeid_noparen_declarator -> direct_typeid_noparen_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET','direct_typeid_noparen_declarator',6,'p_direct_typeid_noparen_declarator_4','plyparser.py',127),
  ('direct_typeid_noparen_declarator -> direct_typeid_noparen_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET','direct_typeid_noparen_declarator',5,'p_direct_typeid_noparen_declarator_5','plyparser.py',126),
  ('direct_typeid_noparen_declarator -> direct_typeid_noparen_declarator LPAREN parameter_type_list RPAREN','direct_typeid_noparen_declarator',4,'p_direct_typeid_noparen_declarator_6','plyparser.py',126),
  ('direct_typeid_noparen_declarator -> direct_typeid_noparen_declarator LPAREN identifier_list_opt RPAREN','direct_typeid_noparen_declarator',4,'p_direct_typeid_noparen_declarator_6','plyparser.py',127),
  ('id_declarator -> direct_id_declarator','id_declarator',1,'p_id_declarator_1','plyparser.py',126),
  ('id_declarator -> pointer direct_id_declarator','id_declarator',2,'p_id_declarator_2','plyparser.py',126),
  ('typeid_declarator -> direct_typeid_declarator','typeid_declarator',1,'p_typeid_declarator_1','plyparser.py',126),
  ('typeid_declarator -> pointer direct_typeid_declarator','typeid_declarator',2,'p_typeid_declarator_2','plyparser.py',126),
  ('typeid_noparen_declarator -> direct_typeid_noparen_declarator','typeid_noparen_declarator',1,'p_typeid_noparen_declarator_1','plyparser.py',126),
  ('typeid_noparen_declarator -> pointer direct_typeid_noparen_declarator','typeid_noparen_declarator',2,'p_typeid_noparen_declarator_2','plyparser.py',126),
  ('translation_unit_or_empty -> translation_unit','translation_unit_or_empty',1,'p_translation_unit_or_empty','c_parser.py',509),
  ('translation_unit_or_empty -> empty','translation_unit_or_empty',1,'p_translation_unit_or_empty','c_parser.py',510),
  ('translation_unit -> external_declaration','translation_unit',1,'p_translation_unit_1','c_parser.py',518),
  ('translation_unit -> translation_unit external_declaration','translation_unit',2,'p_translation_unit_2','c_parser.py',524),
  ('external_declaration -> function_definition','external_declaration',1,'p_external_declaration_1','c_parser.py',534),
  ('external_declaration -> declaration','external_declaration',1,'p_external_declaration_2','c_parser.py',539),
  ('external_declaration -> pp_directive','external_declaration',1,'p_external_declaration_3','c_parser.py',544),
  ('external_declaration -> pppragma_directive','external_declaration',1,'p_external_declaration_3','c_parser.py',545),
  ('external_declaration -> SEMI','external_declaration',1,'p_external_declaration_4','c_parser.py',550),
  ('external_declaration -> static_assert','external_declaration',1,'p_external_declaration_5','c_parser.py',555),
  ('static_assert -> _STATIC_ASSERT LPAREN constant_expression COMMA unified_string_literal RPAREN','static_assert',6,'p_static_assert_declaration','c_parser.py',560),
  ('static_assert -> _STATIC_ASSERT LPAREN constant_expression RPAREN','static_assert',4,'p_static_assert_declaration','c_parser.py',561),
  ('pp_directive -> PPHASH','pp_directive',1,'p_pp_directive','c_parser.py',569),
  ('pppragma_directive -> PPPRAGMA','pppragma_directive',1,'p_pppragma_directive','c_parser.py',580),
  ('pppragma_directive -> PPPRAGMA PPPRAGMASTR','pppragma_directive',2,'p_pppragma_directive','c_parser.py',581),
  ('pppragma_directive -> _PRAGMA LPAREN unified_string_literal RPAREN','pppragma_directive',4,'p_pppragma_directive','c_parser.py',582),
  ('pppragma_directive_list -> pppragma_directive','pppragma_directive_list',1,'p_pppragma_directive_list','c_parser.py',592),
  ('pppragma_directive_list -> pppragma_directive_list pppragma_directive','pppragma_directive_list',2,'p_pppragma_directive_list','c_parser.py',593),
  ('function_definition -> id_declarator declaration_list_opt compound_statement','function_definition',3,'p_function_definition_1','c_parser.py',600),
  ('function_definition -> declaration_specifiers id_declarator declaration_list_opt compound_statement','function_definition',4,'p_function_definition_2','c_parser.py',618),
  ('statement -> labeled_statement','statement',1,'p_statement','c_parser.py',633),
  ('statement -> expression_statement','statement',1,'p_statement','c_parser.py',634),
  ('statement -> compound_statement','statement',1,'p_statement','c_parser.py',635),
  ('statement -> selection_statement','statement',1,'p_statement','c_parser.py',636),
  ('statement -> iteration_statement','statement',1,'p_statement','c_parser.py',637),
  ('statement -> jump_statement','statement',1,'p_statement','c_parser.py',638),
  ('statement -> pppragma_directive','statement',1,'p_statement','c_parser.py',639),
  ('statement -> static_assert','statement',1,'p_statement','c_parser.py',640),
  ('pragmacomp_or_statement -> pppragma_directive_list statement','pragmacomp_or_statement',2,'p_pragmacomp_or_statement','c_parser.py',688),
  ('pragmacomp_or_statement -> statement','pragmacomp_or_statement',1,'p_pragmacomp_or_statement','c_parser.py',689),
  ('decl_body -> declaration_specifiers init_declarator_list_opt','decl_body',2,'p_decl_body','c_parser.py',708),
  ('decl_body -> declaration_specifiers_no_type id_init_declarator_list_opt','decl_body',2,'p_decl_body','c_parser.py',709),
  ('declaration -> decl_body SEMI','declaration',2,'p_declaration','c_parser.py',769),
  ('declaration_list -> declaration','declaration_list',1,'p_declaration_list','c_parser.py',778),
  ('declaration_list -> declaration_list declaration','declaration_list',2,'p_declaration_list','c_parser.py',779),
  ('declaration_specifiers_no_type -> type_qualifier declaration_specifiers_no_type_opt','declaration_specifiers_no_type',2,'p_declaration_specifiers_no_type_1','c_parser.py',789),
  ('declaration_specifiers_no_type -> storage_class_specifier declaration_specifiers_no_type_opt','declaration_specifiers_no_type',2,'p_declaration_specifiers_no_type_2','c_parser.py',794),
  ('declaration_specifiers_no_type -> function_specifier declaration_specifiers_no_type_opt','declaration_specifiers_no_type',2,'p_declaration_specifiers_no_type_3','c_parser.py',799),
  ('declaration_specifiers_no_type -> atomic_specifier declaration_specifiers_no_type_opt','declaration_specifiers_no_type',2,'p_declaration_specifiers_no_type_4','c_parser.py',806),
  ('declaration_specifiers_no_type -> alignment_specifier declaration_specifiers_no_type_opt','declaration_specifiers_no_type',2,'p_declaration_specifiers_no_type_5','c_parser.py',811),
  ('declaration_specifiers -> declaration_specifiers type_qualifier','declaration_specifiers',2,'p_declaration_specifiers_1','c_parser.py',816),
  ('declaration_specifiers -> declaration_specifiers storage_class_specifier','declaration_specifiers',2,'p_declaration_specifiers_2','c_parser.py',821),
  ('declaration_specifiers -> declaration_specifiers function_specifier','declaration_specifiers',2,'p_declaration_specifiers_3','c_parser.py',826),
  ('declaration_specifiers -> declaration_specifiers type_specifier_no_typeid','declaration_specifiers',2,'p_declaration_specifiers_4','c_parser.py',831),
  ('declaration_specifiers -> type_specifier','declaration_specifiers',1,'p_declaration_specifiers_5','c_parser.py',836),
  ('declaration_specifiers -> declaration_specifiers_no_type type_specifier','declaration_specifiers',2,'p_declaration_specifiers_6','c_parser.py',841),
  ('declaration_specifiers -> declaration_specifiers alignment_specifier','declaration_specifiers',2,'p_declaration_specifiers_7','c_parser.py',846),
  ('storage_class_specifier -> AUTO','storage_class_specifier',1,'p_storage_class_specifier','c_parser.py',851),
  ('storage_class_specifier -> REGISTER','storage_class_specifier',1,'p_storage_class_specifier','c_parser.py',852),
  ('storage_class_specifier -> STATIC','storage_class_specifier',1,'p_storage_class_specifier','c_parser.py',853),
  ('storage_class_specifier -> EXTERN','storage_class_specifier',1,'p_storage_class_specifier','c_parser.py',854),
  ('storage_class_specifier -> TYPEDEF','storage_class_specifier',1,'p_storage_class_specifier','c_parser.py',855),
  ('storage_class_specifier -> _THREAD_LOCAL','storage_class_specifier',1,'p_storage_class_specifier','c_parser.py',856),
  ('function_specifier -> INLINE','function_specifier',1,'p_function_specifier','c_parser.py',861),
  ('function_specifier -> _NORETURN','function_specifier',1,'p_function_specifier','c_parser.py',862),
  ('type_specifier_no_typeid -> VOID','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',867),
  ('type_specifier_no_typeid -> _BOOL','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',868),
  ('type_specifier_no_typeid -> CHAR','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',869),
  ('type_specifier_no_typeid -> SHORT','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',870),
  ('type_specifier_no_typeid -> INT','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',871),
  ('type_specifier_no_typeid -> LONG','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',872),
  ('type_specifier_no_typeid -> FLOAT','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',873),
  ('type_specifier_no_typeid -> DOUBLE','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',874),
  ('type_specifier_no_typeid -> _COMPLEX','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',875),
  ('type_specifier_no_typeid -> SIGNED','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',876),
  ('type_specifier_no_typeid -> UNSIGNED','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',877),
  ('type_specifier_no_typeid -> __INT128','type_specifier_no_typeid',1,'p_type_specifier_no_typeid','c_parser.py',878),
  ('type_specifier -> typedef_name','type_specifier',1,'p_type_specifier','c_parser.py',883),
  ('type_specifier -> enum_specifier','type_specifier',1,'p_type_specifier','c_parser.py',884),
  ('type_specifier -> struct_or_union_specifier','type_specifier',1,'p_type_specifier','c_parser.py',885),
  ('type_specifier -> type_specifier_no_typeid','type_specifier',1,'p_type_specifier','c_parser.py',886),
  ('type_specifier -> atomic_specifier','type_specifier',1,'p_type_specifier','c_parser.py',887),
  ('atomic_specifier -> _ATOMIC LPAREN type_name RPAREN','atomic_specifier',4,'p_atomic_specifier','c_parser.py',893),
  ('type_qualifier -> CONST','type_qualifier',1,'p_type_qualifier','c_parser.py',900),
  ('type_qualifier -> RESTRICT','type_qualifier',1,'p_type_qualifier','c_parser.py',901),
  ('type_qualifier -> VOLATILE','type_qualifier',1,'p_type_qualifier','c_parser.py',902),
  ('type_qualifier -> _ATOMIC','type_qualifier',1,'p_type_qualifier','c_parser.py',903),
  ('init_declarator_list -> init_declarator','init_declarator_list',1,'p_init_declarator_list','c_parser.py',908),
  ('init_declarator_list -> init_declarator_list COMMA init_declarator','init_declarator_list',3,'p_init_declarator_list','c_parser.py',909),
  ('init_declarator -> declarator','init_declarator',1,'p_init_declarator','c_parser.py',917),
  ('init_declarator -> declarator EQUALS initializer','init_declarator',3,'p_init_declarator','c_parser.py',918),
  ('id_init_declarator_list -> id_init_declarator','id_init_declarator_list',1,'p_id_init_declarator_list','c_parser.py',923),
  ('id_init_declarator_list -> id_init_declarator_list COMMA init_declarator','id_init_declarator_list',3,'p_id_init_declarator_list','c_parser.py',924),
  ('id_init_declarator -> id_declarator','id_init_declarator',1,'p_id_init_declarator','c_parser.py',929),
  ('id_init_declarator -> id_declarator EQUALS initializer','id_init_declarator',3,'p_id_init_declarator','c_parser.py',930),
  ('specifier_qualifier_list -> specifier_qualifier_list type_specifier_no_typeid','specifier_qualifier_list',2,'p_specifier_qualifier_list_1','c_parser.py',937),
  ('specifier_qualifier_list -> specifier_qualifier_list type_qualifier','specifier_qualifier_list',2,'p_specifier_qualifier_list_2','c_parser.py',942),
  ('specifier_qualifier_list -> type_specifier','specifier_qualifier_list',1,'p_specifier_qualifier_list_3','c_parser.py',947),
  ('specifier_qualifier_list -> type_qualifier_list type_specifier','specifier_qualifier_list',2,'p_specifier_qualifier_list_4','c_parser.py',952),
  ('specifier_qualifier_list -> alignment_specifier','specifier_qualifier_list',1,'p_specifier_qualifier_list_5','c_parser.py',957),
  ('specifier_qualifier_list -> specifier_qualifier_list alignment_specifier','specifier_qualifier_list',2,'p_specifier_qualifier_list_6','c_parser.py',962),
  ('struct_or_union_specifier -> struct_or_union ID','struct_or_union_specifier',2,'p_struct_or_union_specifier_1','c_parser.py',970),
  ('struct_or_union_specifier -> struct_or_union TYPEID','struct_or_union_specifier',2,'p_struct_or_union_specifier_1','c_parser.py',971),
  ('struct_or_union_specifier -> struct_or_union brace_open struct_declaration_list brace_close','struct_or_union_specifier',4,'p_struct_or_union_specifier_2','c_parser.py',981),
  ('struct_or_union_specifier -> struct_or_union brace_open brace_close','struct_or_union_specifier',3,'p_struct_or_union_specifier_2','c_parser.py',982),
  ('struct_or_union_specifier -> struct_or_union ID brace_open struct_declaration_list brace_close','struct_or_union_specifier',5,'p_struct_or_union_specifier_3','c_parser.py',999),
  ('struct_or_union_specifier -> struct_or_union ID brace_open brace_close','struct_or_union_specifier',4,'p_struct_or_union_specifier_3','c_parser.py',1000),
  ('struct_or_union_specifier -> struct_or_union TYPEID brace_open struct_declaration_list brace_close','struct_or_union_specifier',5,'p_struct_or_union_specifier_3','c_parser.py',1001),
  ('struct_or_union_specifier -> struct_or_union TYPEID brace_open brace_close','struct_or_union_specifier',4,'p_struct_or_union_specifier_3','c_parser.py',1002),
  ('struct_or_union -> STRUCT','struct_or_union',1,'p_struct_or_union','c_parser.py',1018),
  ('struct_or_union -> UNION','struct_or_union',1,'p_struct_or_union','c_parser.py',1019),
  ('struct_declaration_list -> struct_declaration','struct_declaration_list',1,'p_struct_declaration_list','c_parser.py',1026),
  ('struct_declaration_list -> struct_declaration_list struct_declaration','struct_declaration_list',2,'p_struct_declaration_list','c_parser.py',1027),
  ('struct_declaration -> specifier_qualifier_list struct_declarator_list_opt SEMI','struct_declaration',3,'p_struct_declaration_1','c_parser.py',1035),
  ('struct_declaration -> SEMI','struct_declaration',1,'p_struct_declaration_2','c_parser.py',1073),
  ('struct_declaration -> pppragma_directive','struct_declaration',1,'p_struct_declaration_3','c_parser.py',1078),
  ('struct_declarator_list -> struct_declarator','struct_declarator_list',1,'p_struct_declarator_list','c_parser.py',1083),
  ('struct_declarator_list -> struct_declarator_list COMMA struct_declarator','struct_declarator_list',3,'p_struct_declarator_list','c_parser.py',1084),
  ('struct_declarator -> declarator','struct_declarator',1,'p_struct_declarator_1','c_parser.py',1092),
  ('struct_declarator -> declarator COLON constant_expression','struct_declarator',3,'p_struct_declarator_2','c_parser.py',1097),
  ('struct_declarator -> COLON constant_expression','struct_declarator',2,'p_struct_declarator_2','c_parser.py',1098),
  ('enum_specifier -> ENUM ID','enum_specifier',2,'p_enum_specifier_1','c_parser.py',1106),
  ('enum_specifier -> ENUM TYPEID','enum_specifier',2,'p_enum_specifier_1','c_parser.py',1107),
  ('enum_specifier -> ENUM brace_open enumerator_list brace_close','enum_specifier',4,'p_enum_specifier_2','c_parser.py',1112),
  ('enum_specifier -> ENUM ID brace_open enumerator_list brace_close','enum_specifier',5,'p_enum_specifier_3','c_parser.py',1117),
  ('enum_specifier -> ENUM TYPEID brace_open enumerator_list brace_close','enum_specifier',5,'p_enum_specifier_3','c_parser.py',1118),
  ('enumerator_list -> enumerator','enumerator_list',1,'p_enumerator_list','c_parser.py',1123),
  ('enumerator_list -> enumerator_list COMMA','enumerator_list',2,'p_enumerator_list','c_parser.py',1124),
  ('enumerator_list -> enumerator_list COMMA enumerator','enumerator_list',3,'p_enumerator_list','c_parser.py',1125),
  ('alignment_specifier -> _ALIGNAS LPAREN type_name RPAREN','alignment_specifier',4,'p_alignment_specifier','c_parser.py',1136),
  ('alignment_specifier -> _ALIGNAS LPAREN constant_expression RPAREN','alignment_specifier',4,'p_alignment_specifier','c_parser.py',1137),
  ('enumerator -> ID','enumerator',1,'p_enumerator','c_parser.py',1142),
  ('enumerator -> ID EQUALS constant_expression','enumerator',3,'p_enumerator','c_parser.py',1143),
  ('declarator -> id_declarator','declarator',1,'p_declarator','c_parser.py',1158),
  ('declarator -> typeid_declarator','declarator',1,'p_declarator','c_parser.py',1159),
  ('pointer -> TIMES type_qualifier_list_opt','pointer',2,'p_pointer','c_parser.py',1271),
  ('pointer -> TIMES type_qualifier_list_opt pointer','pointer',3,'p_pointer','c_parser.py',1272),
  ('type_qualifier_list -> type_qualifier','type_qualifier_list',1,'p_type_qualifier_list','c_parser.py',1301),
  ('type_qualifier_list -> type_qualifier_list type_qualifier','type_qualifier_list',2,'p_type_qualifier_list','c_parser.py',1302),
  ('parameter_type_list -> parameter_list','parameter_type_list',1,'p_parameter_type_list','c_parser.py',1307),
  ('parameter_type_list -> parameter_list COMMA ELLIPSIS','parameter_type_list',3,'p_parameter_type_list','c_parser.py',1308),
  ('parameter_list -> parameter_declaration','parameter_list',1,'p_parameter_list','c_parser.py',1316),
  ('parameter_list -> parameter_list COMMA parameter_declaration','parameter_list',3,'p_parameter_list','c_parser.py',1317),
  ('parameter_declaration -> declaration_specifiers id_declarator','parameter_declaration',2,'p_parameter_declaration_1','c_parser.py',1336),
  ('parameter_declaration -> declaration_specifiers typeid_noparen_declarator','parameter_declaration',2,'p_parameter_declaration_1','c_parser.py',1337),
  ('parameter_declaration -> declaration_specifiers abstract_declarator_opt','parameter_declaration',2,'p_parameter_declaration_2','c_parser.py',1348),
  ('identifier_list -> identifier','identifier_list',1,'p_identifier_list','c_parser.py',1380),
  ('identifier_list -> identifier_list COMMA identifier','identifier_list',3,'p_identifier_list','c_parser.py',1381),
  ('initializer -> assignment_expression','initializer',1,'p_initializer_1','c_parser.py',1390),
  ('initializer -> brace_open initializer_list_opt brace_close','initializer',3,'p_initializer_2','c_parser.py',1395),
  ('initializer -> brace_open initializer_list COMMA brace_close','initializer',4,'p_initializer_2','c_parser.py',1396),
  ('initializer_list -> designation_opt initializer','initializer_list',2,'p_initializer_list','c_parser.py',1404),
  ('initializer_list -> initializer_list COMMA designation_opt initializer','initializer_list',4,'p_initializer_list','c_parser.py',1405),
  ('designation -> designator_list EQUALS','designation',2,'p_designation','c_parser.py',1416),
  ('designator_list -> designator','designator_list',1,'p_designator_list','c_parser.py',1424),
  ('designator_list -> designator_list designator','designator_list',2,'p_designator_list','c_parser.py',1425),
  ('designator -> LBRACKET constant_expression RBRACKET','designator',3,'p_designator','c_parser.py',1430),
  ('designator -> PERIOD identifier','designator',2,'p_designator','c_parser.py',1431),
  ('type_name -> specifier_qualifier_list abstract_declarator_opt','type_name',2,'p_type_name','c_parser.py',1436),
  ('abstract_declarator -> pointer','abstract_declarator',1,'p_abstract_declarator_1','c_parser.py',1448),
  ('abstract_declarator -> pointer direct_abstract_declarator','abstract_declarator',2,'p_abstract_declarator_2','c_parser.py',1456),
  ('abstract_declarator -> direct_abstract_declarator','abstract_declarator',1,'p_abstract_declarator_3','c_parser.py',1461),
  ('direct_abstract_declarator -> LPAREN abstract_declarator RPAREN','direct_abstract_declarator',3,'p_direct_abstract_declarator_1','c_parser.py',1471),
  ('direct_abstract_declarator -> direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET','direct_abstract_declarator',4,'p_direct_abstract_declarator_2','c_parser.py',1475),
  ('direct_abstract_declarator -> LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET','direct_abstract_declarator',4,'p_direct_abstract_declarator_3','c_parser.py',1486),
  ('direct_abstract_declarator -> direct_abstract_declarator LBRACKET TIMES RBRACKET','direct_abstract_declarator',4,'p_direct_abstract_declarator_4','c_parser.py',1496),
  ('direct_abstract_declarator -> LBRACKET TIMES RBRACKET','direct_abstract_declarator',3,'p_direct_abstract_declarator_5','c_parser.py',1507),
  ('direct_abstract_declarator -> direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN','direct_abstract_declarator',4,'p_direct_abstract_declarator_6','c_parser.py',1516),
  ('direct_abstract_declarator -> LPAREN parameter_type_list_opt RPAREN','direct_abstract_declarator',3,'p_direct_abstract_declarator_7','c_parser.py',1526),
  ('direct_abstract_declarator -> LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET','direct_abstract_declarator',5,'p_direct_abstract_declarator_8','c_parser.py',1534),
  ('direct_abstract_declarator -> LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET','direct_abstract_declarator',5,'p_direct_abstract_declarator_8','c_parser.py',1535),
  ('block_item -> declaration','block_item',1,'p_block_item','c_parser.py',1551),
  ('block_item -> statement','block_item',1,'p_block_item','c_parser.py',1552),
  ('block_item_list -> block_item','block_item_list',1,'p_block_item_list','c_parser.py',1559),
  ('block_item_list -> block_item_list block_item','block_item_list',2,'p_block_item_list','c_parser.py',1560),
  ('compound_statement -> brace_open block_item_list_opt brace_close','compound_statement',3,'p_compound_statement_1','c_parser.py',1566),
  ('labeled_statement -> ID COLON pragmacomp_or_statement','labeled_statement',3,'p_labeled_statement_1','c_parser.py',1572),
  ('labeled_statement -> CASE constant_expression COLON pragmacomp_or_statement','labeled_statement',4,'p_labeled_statement_2','c_parser.py',1576),
  ('labeled_statement -> DEFAULT COLON pragmacomp_or_statement','labeled_statement',3,'p_labeled_statement_3','c_parser.py',1580),
  ('labeled_statement -> ID COLON','labeled_statement',2,'p_labeled_statement_4','c_parser.py',1584),
  ('labeled_statement -> CASE constant_expression COLON','labeled_statement',3,'p_labeled_statement_5','c_parser.py',1588),
  ('labeled_statement -> DEFAULT COLON','labeled_statement',2,'p_labeled_statement_6','c_parser.py',1592),
  ('selection_statement -> IF LPAREN expression RPAREN pragmacomp_or_statement','selection_statement',5,'p_selection_statement_1','c_parser.py',1596),
  ('selection_statement -> IF LPAREN expression RPAREN statement ELSE pragmacomp_or_statement','selection_statement',7,'p_selection_statement_2','c_parser.py',1600),
  ('selection_statement -> SWITCH LPAREN expression RPAREN pragmacomp_or_statement','selection_statement',5,'p_selection_statement_3','c_parser.py',1604),
  ('iteration_statement -> WHILE LPAREN expression RPAREN pragmacomp_or_statement','iteration_statement',5,'p_iteration_statement_1','c_parser.py',1609),
  ('iteration_statement -> DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI','iteration_statement',7,'p_iteration_statement_2','c_parser.py',1613),
  ('iteration_statement -> FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement','iteration_statement',9,'p_iteration_statement_3','c_parser.py',1617),
  ('iteration_statement -> FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement','iteration_statement',8,'p_iteration_statement_4','c_parser.py',1621),
  ('jump_statement -> GOTO ID SEMI','jump_statement',3,'p_jump_statement_1','c_parser.py',1626),
  ('jump_statement -> BREAK SEMI','jump_statement',2,'p_jump_statement_2','c_parser.py',1630),
  ('jump_statement -> CONTINUE SEMI','jump_statement',2,'p_jump_statement_3','c_parser.py',1634),
  ('jump_statement -> RETURN expression SEMI','jump_statement',3,'p_jump_statement_4','c_parser.py',1638),
  ('jump_statement -> RETURN SEMI','jump_statement',2,'p_jump_statement_4','c_parser.py',1639),
  ('expression_statement -> expression_opt SEMI','expression_statement',2,'p_expression_statement','c_parser.py',1644),
  ('expression -> assignment_expression','expression',1,'p_expression','c_parser.py',1651),
  ('expression -> expression COMMA assignment_expression','expression',3,'p_expression','c_parser.py',1652),
  ('assignment_expression -> LPAREN compound_statement RPAREN','assignment_expression',3,'p_parenthesized_compound_expression','c_parser.py',1664),
  ('typedef_name -> TYPEID','typedef_name',1,'p_typedef_name','c_parser.py',1668),
  ('assignment_expression -> conditional_expression','assignment_expression',1,'p_assignment_expression','c_parser.py',1672),
  ('assignment_expression -> unary_expression assignment_operator assignment_expression','assignment_expression',3,'p_assignment_expression','c_parser.py',1673),
  ('assignment_operator -> EQUALS','assignment_operator',1,'p_assignment_operator','c_parser.py',1686),
  ('assignment_operator -> XOREQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1687),
  ('assignment_operator -> TIMESEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1688),
  ('assignment_operator -> DIVEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1689),
  ('assignment_operator -> MODEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1690),
  ('assignment_operator -> PLUSEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1691),
  ('assignment_operator -> MINUSEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1692),
  ('assignment_operator -> LSHIFTEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1693),
  ('assignment_operator -> RSHIFTEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1694),
  ('assignment_operator -> ANDEQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1695),
  ('assignment_operator -> OREQUAL','assignment_operator',1,'p_assignment_operator','c_parser.py',1696),
  ('constant_expression -> conditional_expression','constant_expression',1,'p_constant_expression','c_parser.py',1701),
  ('conditional_expression -> binary_expression','conditional_expression',1,'p_conditional_expression','c_parser.py',1705),
  ('conditional_expression -> binary_expression CONDOP expression COLON conditional_expression','conditional_expression',5,'p_conditional_expression','c_parser.py',1706),
  ('binary_expression -> cast_expression','binary_expression',1,'p_binary_expression','c_parser.py',1714),
  ('binary_expression -> binary_expression TIMES binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1715),
  ('binary_expression -> binary_expression DIVIDE binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1716),
  ('binary_expression -> binary_expression MOD binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1717),
  ('binary_expression -> binary_expression PLUS binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1718),
  ('binary_expression -> binary_expression MINUS binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1719),
  ('binary_expression -> binary_expression RSHIFT binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1720),
  ('binary_expression -> binary_expression LSHIFT binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1721),
  ('binary_expression -> binary_expression LT binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1722),
  ('binary_expression -> binary_expression LE binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1723),
  ('binary_expression -> binary_expression GE binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1724),
  ('binary_expression -> binary_expression GT binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1725),
  ('binary_expression -> binary_expression EQ binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1726),
  ('binary_expression -> binary_expression NE binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1727),
  ('binary_expression -> binary_expression AND binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1728),
  ('binary_expression -> binary_expression OR binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1729),
  ('binary_expression -> binary_expression XOR binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1730),
  ('binary_expression -> binary_expression LAND binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1731),
  ('binary_expression -> binary_expression LOR binary_expression','binary_expression',3,'p_binary_expression','c_parser.py',1732),
  ('cast_expression -> unary_expression','cast_expression',1,'p_cast_expression_1','c_parser.py',1740),
  ('cast_expression -> LPAREN type_name RPAREN cast_expression','cast_expression',4,'p_cast_expression_2','c_parser.py',1744),
  ('unary_expression -> postfix_expression','unary_expression',1,'p_unary_expression_1','c_parser.py',1748),
  ('unary_expression -> PLUSPLUS unary_expression','unary_expression',2,'p_unary_expression_2','c_parser.py',1752),
  ('unary_expression -> MINUSMINUS unary_expression','unary_expression',2,'p_unary_expression_2','c_parser.py',1753),
  ('unary_expression -> unary_operator cast_expression','unary_expression',2,'p_unary_expression_2','c_parser.py',1754),
  ('unary_expression -> SIZEOF unary_expression','unary_expression',2,'p_unary_expression_3','c_parser.py',1759),
  ('unary_expression -> SIZEOF LPAREN type_name RPAREN','unary_expression',4,'p_unary_expression_3','c_parser.py',1760),
  ('unary_expression -> _ALIGNOF LPAREN type_name RPAREN','unary_expression',4,'p_unary_expression_3','c_parser.py',1761),
  ('unary_operator -> AND','unary_operator',1,'p_unary_operator','c_parser.py',1769),
  ('unary_operator -> TIMES','unary_operator',1,'p_unary_operator','c_parser.py',1770),
  ('unary_operator -> PLUS','unary_operator',1,'p_unary_operator','c_parser.py',1771),
  ('unary_operator -> MINUS','unary_operator',1,'p_unary_operator','c_parser.py',1772),
  ('unary_operator -> NOT','unary_operator',1,'p_unary_operator','c_parser.py',1773),
  ('unary_operator -> LNOT','unary_operator',1,'p_unary_operator','c_parser.py',1774),
  ('postfix_expression -> primary_expression','postfix_expression',1,'p_postfix_expression_1','c_parser.py',1779),
  ('postfix_expression -> postfix_expression LBRACKET expression RBRACKET','postfix_expression',4,'p_postfix_expression_2','c_parser.py',1783),
  ('postfix_expression -> postfix_expression LPAREN argument_expression_list RPAREN','postfix_expression',4,'p_postfix_expression_3','c_parser.py',1787),
  ('postfix_expression -> postfix_expression LPAREN RPAREN','postfix_expression',3,'p_postfix_expression_3','c_parser.py',1788),
  ('postfix_expression -> postfix_expression PERIOD ID','postfix_expression',3,'p_postfix_expression_4','c_parser.py',1793),
  ('postfix_expression -> postfix_expression PERIOD TYPEID','postfix_expression',3,'p_postfix_expression_4','c_parser.py',1794),
  ('postfix_expression -> postfix_expression ARROW ID','postfix_expression',3,'p_postfix_expression_4','c_parser.py',1795),
  ('postfix_expression -> postfix_expression ARROW TYPEID','postfix_expression',3,'p_postfix_expression_4','c_parser.py',1796),
  ('postfix_expression -> postfix_expression PLUSPLUS','postfix_expression',2,'p_postfix_expression_5','c_parser.py',1802),
  ('postfix_expression -> postfix_expression MINUSMINUS','postfix_expression',2,'p_postfix_expression_5','c_parser.py',1803),
  ('postfix_expression -> LPAREN type_name RPAREN brace_open initializer_list brace_close','postfix_expression',6,'p_postfix_expression_6','c_parser.py',1808),
  ('postfix_expression -> LPAREN type_name RPAREN brace_open initializer_list COMMA brace_close','postfix_expression',7,'p_postfix_expression_6','c_parser.py',1809),
  ('primary_expression -> identifier','primary_expression',1,'p_primary_expression_1','c_parser.py',1814),
  ('primary_expression -> constant','primary_expression',1,'p_primary_expression_2','c_parser.py',1818),
  ('primary_expression -> unified_string_literal','primary_expression',1,'p_primary_expression_3','c_parser.py',1822),
  ('primary_expression -> unified_wstring_literal','primary_expression',1,'p_primary_expression_3','c_parser.py',1823),
  ('primary_expression -> LPAREN expression RPAREN','primary_expression',3,'p_primary_expression_4','c_parser.py',1828),
  ('primary_expression -> OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPAREN','primary_expression',6,'p_primary_expression_5','c_parser.py',1832),
  ('offsetof_member_designator -> identifier','offsetof_member_designator',1,'p_offsetof_member_designator','c_parser.py',1840),
  ('offsetof_member_designator -> offsetof_member_designator PERIOD identifier','offsetof_member_designator',3,'p_offsetof_member_designator','c_parser.py',1841),
  ('offsetof_member_designator -> offsetof_member_designator LBRACKET expression RBRACKET','offsetof_member_designator',4,'p_offsetof_member_designator','c_parser.py',1842),
  ('argument_expression_list -> assignment_expression','argument_expression_list',1,'p_argument_expression_list','c_parser.py',1854),
  ('argument_expression_list -> argument_expression_list COMMA assignment_expression','argument_expression_list',3,'p_argument_expression_list','c_parser.py',1855),
  ('identifier -> ID','identifier',1,'p_identifier','c_parser.py',1864),
  ('constant -> INT_CONST_DEC','constant',1,'p_constant_1','c_parser.py',1868),
  ('constant -> INT_CONST_OCT','constant',1,'p_constant_1','c_parser.py',1869),
  ('constant -> INT_CONST_HEX','constant',1,'p_constant_1','c_parser.py',1870),
  ('constant -> INT_CONST_BIN','constant',1,'p_constant_1','c_parser.py',1871),
  ('constant -> INT_CONST_CHAR','constant',1,'p_constant_1','c_parser.py',1872),
  ('constant -> FLOAT_CONST','constant',1,'p_constant_2','c_parser.py',1891),
  ('constant -> HEX_FLOAT_CONST','constant',1,'p_constant_2','c_parser.py',1892),
  ('constant -> CHAR_CONST','constant',1,'p_constant_3','c_parser.py',1905),
  ('constant -> WCHAR_CONST','constant',1,'p_constant_3','c_parser.py',1906),
  ('constant -> U8CHAR_CONST','constant',1,'p_constant_3','c_parser.py',1907),
  ('constant -> U16CHAR_CONST','constant',1,'p_constant_3','c_parser.py',1908),
  ('constant -> U32CHAR_CONST','constant',1,'p_constant_3','c_parser.py',1909),
  ('unified_string_literal -> STRING_LITERAL','unified_string_literal',1,'p_unified_string_literal','c_parser.py',1920),
  ('unified_string_literal -> unified_string_literal STRING_LITERAL','unified_string_literal',2,'p_unified_string_literal','c_parser.py',1921),
  ('unified_wstring_literal -> WSTRING_LITERAL','unified_wstring_literal',1,'p_unified_wstring_literal','c_parser.py',1931),
  ('unified_wstring_literal -> U8STRING_LITERAL','unified_wstring_literal',1,'p_unified_wstring_literal','c_parser.py',1932),
  ('unified_wstring_literal -> U16STRING_LITERAL','unified_wstring_literal',1,'p_unified_wstring_literal','c_parser.py',1933),
  ('unified_wstring_literal -> U32STRING_LITERAL','unified_wstring_literal',1,'p_unified_wstring_literal','c_parser.py',1934),
  ('unified_wstring_literal -> unified_wstring_literal WSTRING_LITERAL','unified_wstring_literal',2,'p_unified_wstring_literal','c_parser.py',1935),
  ('unified_wstring_literal -> unified_wstring_literal U8STRING_LITERAL','unified_wstring_literal',2,'p_unified_wstring_literal','c_parser.py',1936),
  ('unified_wstring_literal -> unified_wstring_literal U16STRING_LITERAL','unified_wstring_literal',2,'p_unified_wstring_literal','c_parser.py',1937),
  ('unified_wstring_literal -> unified_wstring_literal U32STRING_LITERAL','unified_wstring_literal',2,'p_unified_wstring_literal','c_parser.py',1938),
  ('brace_open -> LBRACE','brace_open',1,'p_brace_open','c_parser.py',1948),
  ('brace_close -> RBRACE','brace_close',1,'p_brace_close','c_parser.py',1954),
  ('empty -> <empty>','empty',0,'p_empty','c_parser.py',1960),
]
PK�t�\ލXoffply/__init__.pynu�[���# PLY package
# Author: David Beazley (dave@dabeaz.com)

__version__ = '3.9'
__all__ = ['lex','yacc']
PK�t�\U�ؙ��
ply/cpp.pynu�[���# -----------------------------------------------------------------------------
# cpp.py
#
# Author:  David Beazley (http://www.dabeaz.com)
# Copyright (C) 2017
# All rights reserved
#
# This module implements an ANSI-C style lexical preprocessor for PLY.
# -----------------------------------------------------------------------------
import sys

# Some Python 3 compatibility shims
if sys.version_info.major < 3:
    STRING_TYPES = (str, unicode)
else:
    STRING_TYPES = str
    xrange = range

# -----------------------------------------------------------------------------
# Default preprocessor lexer definitions.   These tokens are enough to get
# a basic preprocessor working.   Other modules may import these if they want
# -----------------------------------------------------------------------------

tokens = (
   'CPP_ID','CPP_INTEGER', 'CPP_FLOAT', 'CPP_STRING', 'CPP_CHAR', 'CPP_WS', 'CPP_COMMENT1', 'CPP_COMMENT2', 'CPP_POUND','CPP_DPOUND'
)

literals = "+-*/%|&~^<>=!?()[]{}.,;:\\\'\""

# Whitespace
def t_CPP_WS(t):
    r'\s+'
    t.lexer.lineno += t.value.count("\n")
    return t

t_CPP_POUND = r'\#'
t_CPP_DPOUND = r'\#\#'

# Identifier
t_CPP_ID = r'[A-Za-z_][\w_]*'

# Integer literal
def CPP_INTEGER(t):
    r'(((((0x)|(0X))[0-9a-fA-F]+)|(\d+))([uU][lL]|[lL][uU]|[uU]|[lL])?)'
    return t

t_CPP_INTEGER = CPP_INTEGER

# Floating literal
t_CPP_FLOAT = r'((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?'

# String literal
def t_CPP_STRING(t):
    r'\"([^\\\n]|(\\(.|\n)))*?\"'
    t.lexer.lineno += t.value.count("\n")
    return t

# Character constant 'c' or L'c'
def t_CPP_CHAR(t):
    r'(L)?\'([^\\\n]|(\\(.|\n)))*?\''
    t.lexer.lineno += t.value.count("\n")
    return t

# Comment
def t_CPP_COMMENT1(t):
    r'(/\*(.|\n)*?\*/)'
    ncr = t.value.count("\n")
    t.lexer.lineno += ncr
    # replace with one space or a number of '\n'
    t.type = 'CPP_WS'; t.value = '\n' * ncr if ncr else ' '
    return t

# Line comment
def t_CPP_COMMENT2(t):
    r'(//.*?(\n|$))'
    # replace with '/n'
    t.type = 'CPP_WS'; t.value = '\n'
    return t

def t_error(t):
    t.type = t.value[0]
    t.value = t.value[0]
    t.lexer.skip(1)
    return t

import re
import copy
import time
import os.path

# -----------------------------------------------------------------------------
# trigraph()
#
# Given an input string, this function replaces all trigraph sequences.
# The following mapping is used:
#
#     ??=    #
#     ??/    \
#     ??'    ^
#     ??(    [
#     ??)    ]
#     ??!    |
#     ??<    {
#     ??>    }
#     ??-    ~
# -----------------------------------------------------------------------------

_trigraph_pat = re.compile(r'''\?\?[=/\'\(\)\!<>\-]''')
_trigraph_rep = {
    '=':'#',
    '/':'\\',
    "'":'^',
    '(':'[',
    ')':']',
    '!':'|',
    '<':'{',
    '>':'}',
    '-':'~'
}

def trigraph(input):
    return _trigraph_pat.sub(lambda g: _trigraph_rep[g.group()[-1]],input)

# ------------------------------------------------------------------
# Macro object
#
# This object holds information about preprocessor macros
#
#    .name      - Macro name (string)
#    .value     - Macro value (a list of tokens)
#    .arglist   - List of argument names
#    .variadic  - Boolean indicating whether or not variadic macro
#    .vararg    - Name of the variadic parameter
#
# When a macro is created, the macro replacement token sequence is
# pre-scanned and used to create patch lists that are later used
# during macro expansion
# ------------------------------------------------------------------

class Macro(object):
    def __init__(self,name,value,arglist=None,variadic=False):
        self.name = name
        self.value = value
        self.arglist = arglist
        self.variadic = variadic
        if variadic:
            self.vararg = arglist[-1]
        self.source = None

# ------------------------------------------------------------------
# Preprocessor object
#
# Object representing a preprocessor.  Contains macro definitions,
# include directories, and other information
# ------------------------------------------------------------------

class Preprocessor(object):
    def __init__(self,lexer=None):
        if lexer is None:
            lexer = lex.lexer
        self.lexer = lexer
        self.macros = { }
        self.path = []
        self.temp_path = []

        # Probe the lexer for selected tokens
        self.lexprobe()

        tm = time.localtime()
        self.define("__DATE__ \"%s\"" % time.strftime("%b %d %Y",tm))
        self.define("__TIME__ \"%s\"" % time.strftime("%H:%M:%S",tm))
        self.parser = None

    # -----------------------------------------------------------------------------
    # tokenize()
    #
    # Utility function. Given a string of text, tokenize into a list of tokens
    # -----------------------------------------------------------------------------

    def tokenize(self,text):
        tokens = []
        self.lexer.input(text)
        while True:
            tok = self.lexer.token()
            if not tok: break
            tokens.append(tok)
        return tokens

    # ---------------------------------------------------------------------
    # error()
    #
    # Report a preprocessor error/warning of some kind
    # ----------------------------------------------------------------------

    def error(self,file,line,msg):
        print("%s:%d %s" % (file,line,msg))

    # ----------------------------------------------------------------------
    # lexprobe()
    #
    # This method probes the preprocessor lexer object to discover
    # the token types of symbols that are important to the preprocessor.
    # If this works right, the preprocessor will simply "work"
    # with any suitable lexer regardless of how tokens have been named.
    # ----------------------------------------------------------------------

    def lexprobe(self):

        # Determine the token type for identifiers
        self.lexer.input("identifier")
        tok = self.lexer.token()
        if not tok or tok.value != "identifier":
            print("Couldn't determine identifier type")
        else:
            self.t_ID = tok.type

        # Determine the token type for integers
        self.lexer.input("12345")
        tok = self.lexer.token()
        if not tok or int(tok.value) != 12345:
            print("Couldn't determine integer type")
        else:
            self.t_INTEGER = tok.type
            self.t_INTEGER_TYPE = type(tok.value)

        # Determine the token type for strings enclosed in double quotes
        self.lexer.input("\"filename\"")
        tok = self.lexer.token()
        if not tok or tok.value != "\"filename\"":
            print("Couldn't determine string type")
        else:
            self.t_STRING = tok.type

        # Determine the token type for whitespace--if any
        self.lexer.input("  ")
        tok = self.lexer.token()
        if not tok or tok.value != "  ":
            self.t_SPACE = None
        else:
            self.t_SPACE = tok.type

        # Determine the token type for newlines
        self.lexer.input("\n")
        tok = self.lexer.token()
        if not tok or tok.value != "\n":
            self.t_NEWLINE = None
            print("Couldn't determine token for newlines")
        else:
            self.t_NEWLINE = tok.type

        self.t_WS = (self.t_SPACE, self.t_NEWLINE)

        # Check for other characters used by the preprocessor
        chars = [ '<','>','#','##','\\','(',')',',','.']
        for c in chars:
            self.lexer.input(c)
            tok = self.lexer.token()
            if not tok or tok.value != c:
                print("Unable to lex '%s' required for preprocessor" % c)

    # ----------------------------------------------------------------------
    # add_path()
    #
    # Adds a search path to the preprocessor.
    # ----------------------------------------------------------------------

    def add_path(self,path):
        self.path.append(path)

    # ----------------------------------------------------------------------
    # group_lines()
    #
    # Given an input string, this function splits it into lines.  Trailing whitespace
    # is removed.   Any line ending with \ is grouped with the next line.  This
    # function forms the lowest level of the preprocessor---grouping into text into
    # a line-by-line format.
    # ----------------------------------------------------------------------

    def group_lines(self,input):
        lex = self.lexer.clone()
        lines = [x.rstrip() for x in input.splitlines()]
        for i in xrange(len(lines)):
            j = i+1
            while lines[i].endswith('\\') and (j < len(lines)):
                lines[i] = lines[i][:-1]+lines[j]
                lines[j] = ""
                j += 1

        input = "\n".join(lines)
        lex.input(input)
        lex.lineno = 1

        current_line = []
        while True:
            tok = lex.token()
            if not tok:
                break
            current_line.append(tok)
            if tok.type in self.t_WS and '\n' in tok.value:
                yield current_line
                current_line = []

        if current_line:
            yield current_line

    # ----------------------------------------------------------------------
    # tokenstrip()
    #
    # Remove leading/trailing whitespace tokens from a token list
    # ----------------------------------------------------------------------

    def tokenstrip(self,tokens):
        i = 0
        while i < len(tokens) and tokens[i].type in self.t_WS:
            i += 1
        del tokens[:i]
        i = len(tokens)-1
        while i >= 0 and tokens[i].type in self.t_WS:
            i -= 1
        del tokens[i+1:]
        return tokens


    # ----------------------------------------------------------------------
    # collect_args()
    #
    # Collects comma separated arguments from a list of tokens.   The arguments
    # must be enclosed in parenthesis.  Returns a tuple (tokencount,args,positions)
    # where tokencount is the number of tokens consumed, args is a list of arguments,
    # and positions is a list of integers containing the starting index of each
    # argument.  Each argument is represented by a list of tokens.
    #
    # When collecting arguments, leading and trailing whitespace is removed
    # from each argument.
    #
    # This function properly handles nested parenthesis and commas---these do not
    # define new arguments.
    # ----------------------------------------------------------------------

    def collect_args(self,tokenlist):
        args = []
        positions = []
        current_arg = []
        nesting = 1
        tokenlen = len(tokenlist)

        # Search for the opening '('.
        i = 0
        while (i < tokenlen) and (tokenlist[i].type in self.t_WS):
            i += 1

        if (i < tokenlen) and (tokenlist[i].value == '('):
            positions.append(i+1)
        else:
            self.error(self.source,tokenlist[0].lineno,"Missing '(' in macro arguments")
            return 0, [], []

        i += 1

        while i < tokenlen:
            t = tokenlist[i]
            if t.value == '(':
                current_arg.append(t)
                nesting += 1
            elif t.value == ')':
                nesting -= 1
                if nesting == 0:
                    if current_arg:
                        args.append(self.tokenstrip(current_arg))
                        positions.append(i)
                    return i+1,args,positions
                current_arg.append(t)
            elif t.value == ',' and nesting == 1:
                args.append(self.tokenstrip(current_arg))
                positions.append(i+1)
                current_arg = []
            else:
                current_arg.append(t)
            i += 1

        # Missing end argument
        self.error(self.source,tokenlist[-1].lineno,"Missing ')' in macro arguments")
        return 0, [],[]

    # ----------------------------------------------------------------------
    # macro_prescan()
    #
    # Examine the macro value (token sequence) and identify patch points
    # This is used to speed up macro expansion later on---we'll know
    # right away where to apply patches to the value to form the expansion
    # ----------------------------------------------------------------------

    def macro_prescan(self,macro):
        macro.patch     = []             # Standard macro arguments
        macro.str_patch = []             # String conversion expansion
        macro.var_comma_patch = []       # Variadic macro comma patch
        i = 0
        while i < len(macro.value):
            if macro.value[i].type == self.t_ID and macro.value[i].value in macro.arglist:
                argnum = macro.arglist.index(macro.value[i].value)
                # Conversion of argument to a string
                if i > 0 and macro.value[i-1].value == '#':
                    macro.value[i] = copy.copy(macro.value[i])
                    macro.value[i].type = self.t_STRING
                    del macro.value[i-1]
                    macro.str_patch.append((argnum,i-1))
                    continue
                # Concatenation
                elif (i > 0 and macro.value[i-1].value == '##'):
                    macro.patch.append(('c',argnum,i-1))
                    del macro.value[i-1]
                    continue
                elif ((i+1) < len(macro.value) and macro.value[i+1].value == '##'):
                    macro.patch.append(('c',argnum,i))
                    i += 1
                    continue
                # Standard expansion
                else:
                    macro.patch.append(('e',argnum,i))
            elif macro.value[i].value == '##':
                if macro.variadic and (i > 0) and (macro.value[i-1].value == ',') and \
                        ((i+1) < len(macro.value)) and (macro.value[i+1].type == self.t_ID) and \
                        (macro.value[i+1].value == macro.vararg):
                    macro.var_comma_patch.append(i-1)
            i += 1
        macro.patch.sort(key=lambda x: x[2],reverse=True)

    # ----------------------------------------------------------------------
    # macro_expand_args()
    #
    # Given a Macro and list of arguments (each a token list), this method
    # returns an expanded version of a macro.  The return value is a token sequence
    # representing the replacement macro tokens
    # ----------------------------------------------------------------------

    def macro_expand_args(self,macro,args):
        # Make a copy of the macro token sequence
        rep = [copy.copy(_x) for _x in macro.value]

        # Make string expansion patches.  These do not alter the length of the replacement sequence

        str_expansion = {}
        for argnum, i in macro.str_patch:
            if argnum not in str_expansion:
                str_expansion[argnum] = ('"%s"' % "".join([x.value for x in args[argnum]])).replace("\\","\\\\")
            rep[i] = copy.copy(rep[i])
            rep[i].value = str_expansion[argnum]

        # Make the variadic macro comma patch.  If the variadic macro argument is empty, we get rid
        comma_patch = False
        if macro.variadic and not args[-1]:
            for i in macro.var_comma_patch:
                rep[i] = None
                comma_patch = True

        # Make all other patches.   The order of these matters.  It is assumed that the patch list
        # has been sorted in reverse order of patch location since replacements will cause the
        # size of the replacement sequence to expand from the patch point.

        expanded = { }
        for ptype, argnum, i in macro.patch:
            # Concatenation.   Argument is left unexpanded
            if ptype == 'c':
                rep[i:i+1] = args[argnum]
            # Normal expansion.  Argument is macro expanded first
            elif ptype == 'e':
                if argnum not in expanded:
                    expanded[argnum] = self.expand_macros(args[argnum])
                rep[i:i+1] = expanded[argnum]

        # Get rid of removed comma if necessary
        if comma_patch:
            rep = [_i for _i in rep if _i]

        return rep


    # ----------------------------------------------------------------------
    # expand_macros()
    #
    # Given a list of tokens, this function performs macro expansion.
    # The expanded argument is a dictionary that contains macros already
    # expanded.  This is used to prevent infinite recursion.
    # ----------------------------------------------------------------------

    def expand_macros(self,tokens,expanded=None):
        if expanded is None:
            expanded = {}
        i = 0
        while i < len(tokens):
            t = tokens[i]
            if t.type == self.t_ID:
                if t.value in self.macros and t.value not in expanded:
                    # Yes, we found a macro match
                    expanded[t.value] = True

                    m = self.macros[t.value]
                    if not m.arglist:
                        # A simple macro
                        ex = self.expand_macros([copy.copy(_x) for _x in m.value],expanded)
                        for e in ex:
                            e.lineno = t.lineno
                        tokens[i:i+1] = ex
                        i += len(ex)
                    else:
                        # A macro with arguments
                        j = i + 1
                        while j < len(tokens) and tokens[j].type in self.t_WS:
                            j += 1
                        if tokens[j].value == '(':
                            tokcount,args,positions = self.collect_args(tokens[j:])
                            if not m.variadic and len(args) !=  len(m.arglist):
                                self.error(self.source,t.lineno,"Macro %s requires %d arguments" % (t.value,len(m.arglist)))
                                i = j + tokcount
                            elif m.variadic and len(args) < len(m.arglist)-1:
                                if len(m.arglist) > 2:
                                    self.error(self.source,t.lineno,"Macro %s must have at least %d arguments" % (t.value, len(m.arglist)-1))
                                else:
                                    self.error(self.source,t.lineno,"Macro %s must have at least %d argument" % (t.value, len(m.arglist)-1))
                                i = j + tokcount
                            else:
                                if m.variadic:
                                    if len(args) == len(m.arglist)-1:
                                        args.append([])
                                    else:
                                        args[len(m.arglist)-1] = tokens[j+positions[len(m.arglist)-1]:j+tokcount-1]
                                        del args[len(m.arglist):]

                                # Get macro replacement text
                                rep = self.macro_expand_args(m,args)
                                rep = self.expand_macros(rep,expanded)
                                for r in rep:
                                    r.lineno = t.lineno
                                tokens[i:j+tokcount] = rep
                                i += len(rep)
                    del expanded[t.value]
                    continue
                elif t.value == '__LINE__':
                    t.type = self.t_INTEGER
                    t.value = self.t_INTEGER_TYPE(t.lineno)

            i += 1
        return tokens

    # ----------------------------------------------------------------------
    # evalexpr()
    #
    # Evaluate an expression token sequence for the purposes of evaluating
    # integral expressions.
    # ----------------------------------------------------------------------

    def evalexpr(self,tokens):
        # tokens = tokenize(line)
        # Search for defined macros
        i = 0
        while i < len(tokens):
            if tokens[i].type == self.t_ID and tokens[i].value == 'defined':
                j = i + 1
                needparen = False
                result = "0L"
                while j < len(tokens):
                    if tokens[j].type in self.t_WS:
                        j += 1
                        continue
                    elif tokens[j].type == self.t_ID:
                        if tokens[j].value in self.macros:
                            result = "1L"
                        else:
                            result = "0L"
                        if not needparen: break
                    elif tokens[j].value == '(':
                        needparen = True
                    elif tokens[j].value == ')':
                        break
                    else:
                        self.error(self.source,tokens[i].lineno,"Malformed defined()")
                    j += 1
                tokens[i].type = self.t_INTEGER
                tokens[i].value = self.t_INTEGER_TYPE(result)
                del tokens[i+1:j+1]
            i += 1
        tokens = self.expand_macros(tokens)
        for i,t in enumerate(tokens):
            if t.type == self.t_ID:
                tokens[i] = copy.copy(t)
                tokens[i].type = self.t_INTEGER
                tokens[i].value = self.t_INTEGER_TYPE("0L")
            elif t.type == self.t_INTEGER:
                tokens[i] = copy.copy(t)
                # Strip off any trailing suffixes
                tokens[i].value = str(tokens[i].value)
                while tokens[i].value[-1] not in "0123456789abcdefABCDEF":
                    tokens[i].value = tokens[i].value[:-1]

        expr = "".join([str(x.value) for x in tokens])
        expr = expr.replace("&&"," and ")
        expr = expr.replace("||"," or ")
        expr = expr.replace("!"," not ")
        try:
            result = eval(expr)
        except Exception:
            self.error(self.source,tokens[0].lineno,"Couldn't evaluate expression")
            result = 0
        return result

    # ----------------------------------------------------------------------
    # parsegen()
    #
    # Parse an input string/
    # ----------------------------------------------------------------------
    def parsegen(self,input,source=None):

        # Replace trigraph sequences
        t = trigraph(input)
        lines = self.group_lines(t)

        if not source:
            source = ""

        self.define("__FILE__ \"%s\"" % source)

        self.source = source
        chunk = []
        enable = True
        iftrigger = False
        ifstack = []

        for x in lines:
            for i,tok in enumerate(x):
                if tok.type not in self.t_WS: break
            if tok.value == '#':
                # Preprocessor directive

                # insert necessary whitespace instead of eaten tokens
                for tok in x:
                    if tok.type in self.t_WS and '\n' in tok.value:
                        chunk.append(tok)

                dirtokens = self.tokenstrip(x[i+1:])
                if dirtokens:
                    name = dirtokens[0].value
                    args = self.tokenstrip(dirtokens[1:])
                else:
                    name = ""
                    args = []

                if name == 'define':
                    if enable:
                        for tok in self.expand_macros(chunk):
                            yield tok
                        chunk = []
                        self.define(args)
                elif name == 'include':
                    if enable:
                        for tok in self.expand_macros(chunk):
                            yield tok
                        chunk = []
                        oldfile = self.macros['__FILE__']
                        for tok in self.include(args):
                            yield tok
                        self.macros['__FILE__'] = oldfile
                        self.source = source
                elif name == 'undef':
                    if enable:
                        for tok in self.expand_macros(chunk):
                            yield tok
                        chunk = []
                        self.undef(args)
                elif name == 'ifdef':
                    ifstack.append((enable,iftrigger))
                    if enable:
                        if not args[0].value in self.macros:
                            enable = False
                            iftrigger = False
                        else:
                            iftrigger = True
                elif name == 'ifndef':
                    ifstack.append((enable,iftrigger))
                    if enable:
                        if args[0].value in self.macros:
                            enable = False
                            iftrigger = False
                        else:
                            iftrigger = True
                elif name == 'if':
                    ifstack.append((enable,iftrigger))
                    if enable:
                        result = self.evalexpr(args)
                        if not result:
                            enable = False
                            iftrigger = False
                        else:
                            iftrigger = True
                elif name == 'elif':
                    if ifstack:
                        if ifstack[-1][0]:     # We only pay attention if outer "if" allows this
                            if enable:         # If already true, we flip enable False
                                enable = False
                            elif not iftrigger:   # If False, but not triggered yet, we'll check expression
                                result = self.evalexpr(args)
                                if result:
                                    enable  = True
                                    iftrigger = True
                    else:
                        self.error(self.source,dirtokens[0].lineno,"Misplaced #elif")

                elif name == 'else':
                    if ifstack:
                        if ifstack[-1][0]:
                            if enable:
                                enable = False
                            elif not iftrigger:
                                enable = True
                                iftrigger = True
                    else:
                        self.error(self.source,dirtokens[0].lineno,"Misplaced #else")

                elif name == 'endif':
                    if ifstack:
                        enable,iftrigger = ifstack.pop()
                    else:
                        self.error(self.source,dirtokens[0].lineno,"Misplaced #endif")
                else:
                    # Unknown preprocessor directive
                    pass

            else:
                # Normal text
                if enable:
                    chunk.extend(x)

        for tok in self.expand_macros(chunk):
            yield tok
        chunk = []

    # ----------------------------------------------------------------------
    # include()
    #
    # Implementation of file-inclusion
    # ----------------------------------------------------------------------

    def include(self,tokens):
        # Try to extract the filename and then process an include file
        if not tokens:
            return
        if tokens:
            if tokens[0].value != '<' and tokens[0].type != self.t_STRING:
                tokens = self.expand_macros(tokens)

            if tokens[0].value == '<':
                # Include <...>
                i = 1
                while i < len(tokens):
                    if tokens[i].value == '>':
                        break
                    i += 1
                else:
                    print("Malformed #include <...>")
                    return
                filename = "".join([x.value for x in tokens[1:i]])
                path = self.path + [""] + self.temp_path
            elif tokens[0].type == self.t_STRING:
                filename = tokens[0].value[1:-1]
                path = self.temp_path + [""] + self.path
            else:
                print("Malformed #include statement")
                return
        for p in path:
            iname = os.path.join(p,filename)
            try:
                data = open(iname,"r").read()
                dname = os.path.dirname(iname)
                if dname:
                    self.temp_path.insert(0,dname)
                for tok in self.parsegen(data,filename):
                    yield tok
                if dname:
                    del self.temp_path[0]
                break
            except IOError:
                pass
        else:
            print("Couldn't find '%s'" % filename)

    # ----------------------------------------------------------------------
    # define()
    #
    # Define a new macro
    # ----------------------------------------------------------------------

    def define(self,tokens):
        if isinstance(tokens,STRING_TYPES):
            tokens = self.tokenize(tokens)

        linetok = tokens
        try:
            name = linetok[0]
            if len(linetok) > 1:
                mtype = linetok[1]
            else:
                mtype = None
            if not mtype:
                m = Macro(name.value,[])
                self.macros[name.value] = m
            elif mtype.type in self.t_WS:
                # A normal macro
                m = Macro(name.value,self.tokenstrip(linetok[2:]))
                self.macros[name.value] = m
            elif mtype.value == '(':
                # A macro with arguments
                tokcount, args, positions = self.collect_args(linetok[1:])
                variadic = False
                for a in args:
                    if variadic:
                        print("No more arguments may follow a variadic argument")
                        break
                    astr = "".join([str(_i.value) for _i in a])
                    if astr == "...":
                        variadic = True
                        a[0].type = self.t_ID
                        a[0].value = '__VA_ARGS__'
                        variadic = True
                        del a[1:]
                        continue
                    elif astr[-3:] == "..." and a[0].type == self.t_ID:
                        variadic = True
                        del a[1:]
                        # If, for some reason, "." is part of the identifier, strip off the name for the purposes
                        # of macro expansion
                        if a[0].value[-3:] == '...':
                            a[0].value = a[0].value[:-3]
                        continue
                    if len(a) > 1 or a[0].type != self.t_ID:
                        print("Invalid macro argument")
                        break
                else:
                    mvalue = self.tokenstrip(linetok[1+tokcount:])
                    i = 0
                    while i < len(mvalue):
                        if i+1 < len(mvalue):
                            if mvalue[i].type in self.t_WS and mvalue[i+1].value == '##':
                                del mvalue[i]
                                continue
                            elif mvalue[i].value == '##' and mvalue[i+1].type in self.t_WS:
                                del mvalue[i+1]
                        i += 1
                    m = Macro(name.value,mvalue,[x[0].value for x in args],variadic)
                    self.macro_prescan(m)
                    self.macros[name.value] = m
            else:
                print("Bad macro definition")
        except LookupError:
            print("Bad macro definition")

    # ----------------------------------------------------------------------
    # undef()
    #
    # Undefine a macro
    # ----------------------------------------------------------------------

    def undef(self,tokens):
        id = tokens[0].value
        try:
            del self.macros[id]
        except LookupError:
            pass

    # ----------------------------------------------------------------------
    # parse()
    #
    # Parse input text.
    # ----------------------------------------------------------------------
    def parse(self,input,source=None,ignore={}):
        self.ignore = ignore
        self.parser = self.parsegen(input,source)

    # ----------------------------------------------------------------------
    # token()
    #
    # Method to return individual tokens
    # ----------------------------------------------------------------------
    def token(self):
        try:
            while True:
                tok = next(self.parser)
                if tok.type not in self.ignore: return tok
        except StopIteration:
            self.parser = None
            return None

if __name__ == '__main__':
    import ply.lex as lex
    lexer = lex.lex()

    # Run a preprocessor
    import sys
    f = open(sys.argv[1])
    input = f.read()

    p = Preprocessor(lexer)
    p.parse(input,sys.argv[1])
    while True:
        tok = p.token()
        if not tok: break
        print(p.source, tok)
PK�t�\�X{iiply/ctokens.pynu�[���# ----------------------------------------------------------------------
# ctokens.py
#
# Token specifications for symbols in ANSI C and C++.  This file is
# meant to be used as a library in other tokenizers.
# ----------------------------------------------------------------------

# Reserved words

tokens = [
    # Literals (identifier, integer constant, float constant, string constant, char const)
    'ID', 'TYPEID', 'INTEGER', 'FLOAT', 'STRING', 'CHARACTER',

    # Operators (+,-,*,/,%,|,&,~,^,<<,>>, ||, &&, !, <, <=, >, >=, ==, !=)
    'PLUS', 'MINUS', 'TIMES', 'DIVIDE', 'MODULO',
    'OR', 'AND', 'NOT', 'XOR', 'LSHIFT', 'RSHIFT',
    'LOR', 'LAND', 'LNOT',
    'LT', 'LE', 'GT', 'GE', 'EQ', 'NE',
    
    # Assignment (=, *=, /=, %=, +=, -=, <<=, >>=, &=, ^=, |=)
    'EQUALS', 'TIMESEQUAL', 'DIVEQUAL', 'MODEQUAL', 'PLUSEQUAL', 'MINUSEQUAL',
    'LSHIFTEQUAL','RSHIFTEQUAL', 'ANDEQUAL', 'XOREQUAL', 'OREQUAL',

    # Increment/decrement (++,--)
    'INCREMENT', 'DECREMENT',

    # Structure dereference (->)
    'ARROW',

    # Ternary operator (?)
    'TERNARY',
    
    # Delimeters ( ) [ ] { } , . ; :
    'LPAREN', 'RPAREN',
    'LBRACKET', 'RBRACKET',
    'LBRACE', 'RBRACE',
    'COMMA', 'PERIOD', 'SEMI', 'COLON',

    # Ellipsis (...)
    'ELLIPSIS',
]
    
# Operators
t_PLUS             = r'\+'
t_MINUS            = r'-'
t_TIMES            = r'\*'
t_DIVIDE           = r'/'
t_MODULO           = r'%'
t_OR               = r'\|'
t_AND              = r'&'
t_NOT              = r'~'
t_XOR              = r'\^'
t_LSHIFT           = r'<<'
t_RSHIFT           = r'>>'
t_LOR              = r'\|\|'
t_LAND             = r'&&'
t_LNOT             = r'!'
t_LT               = r'<'
t_GT               = r'>'
t_LE               = r'<='
t_GE               = r'>='
t_EQ               = r'=='
t_NE               = r'!='

# Assignment operators

t_EQUALS           = r'='
t_TIMESEQUAL       = r'\*='
t_DIVEQUAL         = r'/='
t_MODEQUAL         = r'%='
t_PLUSEQUAL        = r'\+='
t_MINUSEQUAL       = r'-='
t_LSHIFTEQUAL      = r'<<='
t_RSHIFTEQUAL      = r'>>='
t_ANDEQUAL         = r'&='
t_OREQUAL          = r'\|='
t_XOREQUAL         = r'\^='

# Increment/decrement
t_INCREMENT        = r'\+\+'
t_DECREMENT        = r'--'

# ->
t_ARROW            = r'->'

# ?
t_TERNARY          = r'\?'

# Delimeters
t_LPAREN           = r'\('
t_RPAREN           = r'\)'
t_LBRACKET         = r'\['
t_RBRACKET         = r'\]'
t_LBRACE           = r'\{'
t_RBRACE           = r'\}'
t_COMMA            = r','
t_PERIOD           = r'\.'
t_SEMI             = r';'
t_COLON            = r':'
t_ELLIPSIS         = r'\.\.\.'

# Identifiers
t_ID = r'[A-Za-z_][A-Za-z0-9_]*'

# Integer literal
t_INTEGER = r'\d+([uU]|[lL]|[uU][lL]|[lL][uU])?'

# Floating literal
t_FLOAT = r'((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?'

# String literal
t_STRING = r'\"([^\\\n]|(\\.))*?\"'

# Character constant 'c' or L'c'
t_CHARACTER = r'(L)?\'([^\\\n]|(\\.))*?\''

# Comment (C-Style)
def t_COMMENT(t):
    r'/\*(.|\n)*?\*/'
    t.lexer.lineno += t.value.count('\n')
    return t

# Comment (C++-Style)
def t_CPPCOMMENT(t):
    r'//.*\n'
    t.lexer.lineno += 1
    return t


    



PK�t�\e�������
ply/lex.pynu�[���# -----------------------------------------------------------------------------
# ply: lex.py
#
# Copyright (C) 2001-2017
# David M. Beazley (Dabeaz LLC)
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright notice,
#   this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
#   this list of conditions and the following disclaimer in the documentation
#   and/or other materials provided with the distribution.
# * Neither the name of the David Beazley or Dabeaz LLC may be used to
#   endorse or promote products derived from this software without
#  specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -----------------------------------------------------------------------------

__version__    = '3.10'
__tabversion__ = '3.10'

import re
import sys
import types
import copy
import os
import inspect

# This tuple contains known string types
try:
    # Python 2.6
    StringTypes = (types.StringType, types.UnicodeType)
except AttributeError:
    # Python 3.0
    StringTypes = (str, bytes)

# This regular expression is used to match valid token names
_is_identifier = re.compile(r'^[a-zA-Z0-9_]+$')

# Exception thrown when invalid token encountered and no default error
# handler is defined.
class LexError(Exception):
    def __init__(self, message, s):
        self.args = (message,)
        self.text = s


# Token class.  This class is used to represent the tokens produced.
class LexToken(object):
    def __str__(self):
        return 'LexToken(%s,%r,%d,%d)' % (self.type, self.value, self.lineno, self.lexpos)

    def __repr__(self):
        return str(self)


# This object is a stand-in for a logging object created by the
# logging module.

class PlyLogger(object):
    def __init__(self, f):
        self.f = f

    def critical(self, msg, *args, **kwargs):
        self.f.write((msg % args) + '\n')

    def warning(self, msg, *args, **kwargs):
        self.f.write('WARNING: ' + (msg % args) + '\n')

    def error(self, msg, *args, **kwargs):
        self.f.write('ERROR: ' + (msg % args) + '\n')

    info = critical
    debug = critical


# Null logger is used when no output is generated. Does nothing.
class NullLogger(object):
    def __getattribute__(self, name):
        return self

    def __call__(self, *args, **kwargs):
        return self


# -----------------------------------------------------------------------------
#                        === Lexing Engine ===
#
# The following Lexer class implements the lexer runtime.   There are only
# a few public methods and attributes:
#
#    input()          -  Store a new string in the lexer
#    token()          -  Get the next token
#    clone()          -  Clone the lexer
#
#    lineno           -  Current line number
#    lexpos           -  Current position in the input string
# -----------------------------------------------------------------------------

class Lexer:
    def __init__(self):
        self.lexre = None             # Master regular expression. This is a list of
                                      # tuples (re, findex) where re is a compiled
                                      # regular expression and findex is a list
                                      # mapping regex group numbers to rules
        self.lexretext = None         # Current regular expression strings
        self.lexstatere = {}          # Dictionary mapping lexer states to master regexs
        self.lexstateretext = {}      # Dictionary mapping lexer states to regex strings
        self.lexstaterenames = {}     # Dictionary mapping lexer states to symbol names
        self.lexstate = 'INITIAL'     # Current lexer state
        self.lexstatestack = []       # Stack of lexer states
        self.lexstateinfo = None      # State information
        self.lexstateignore = {}      # Dictionary of ignored characters for each state
        self.lexstateerrorf = {}      # Dictionary of error functions for each state
        self.lexstateeoff = {}        # Dictionary of eof functions for each state
        self.lexreflags = 0           # Optional re compile flags
        self.lexdata = None           # Actual input data (as a string)
        self.lexpos = 0               # Current position in input text
        self.lexlen = 0               # Length of the input text
        self.lexerrorf = None         # Error rule (if any)
        self.lexeoff = None           # EOF rule (if any)
        self.lextokens = None         # List of valid tokens
        self.lexignore = ''           # Ignored characters
        self.lexliterals = ''         # Literal characters that can be passed through
        self.lexmodule = None         # Module
        self.lineno = 1               # Current line number
        self.lexoptimize = False      # Optimized mode

    def clone(self, object=None):
        c = copy.copy(self)

        # If the object parameter has been supplied, it means we are attaching the
        # lexer to a new object.  In this case, we have to rebind all methods in
        # the lexstatere and lexstateerrorf tables.

        if object:
            newtab = {}
            for key, ritem in self.lexstatere.items():
                newre = []
                for cre, findex in ritem:
                    newfindex = []
                    for f in findex:
                        if not f or not f[0]:
                            newfindex.append(f)
                            continue
                        newfindex.append((getattr(object, f[0].__name__), f[1]))
                newre.append((cre, newfindex))
                newtab[key] = newre
            c.lexstatere = newtab
            c.lexstateerrorf = {}
            for key, ef in self.lexstateerrorf.items():
                c.lexstateerrorf[key] = getattr(object, ef.__name__)
            c.lexmodule = object
        return c

    # ------------------------------------------------------------
    # writetab() - Write lexer information to a table file
    # ------------------------------------------------------------
    def writetab(self, lextab, outputdir=''):
        if isinstance(lextab, types.ModuleType):
            raise IOError("Won't overwrite existing lextab module")
        basetabmodule = lextab.split('.')[-1]
        filename = os.path.join(outputdir, basetabmodule) + '.py'
        with open(filename, 'w') as tf:
            tf.write('# %s.py. This file automatically created by PLY (version %s). Don\'t edit!\n' % (basetabmodule, __version__))
            tf.write('_tabversion   = %s\n' % repr(__tabversion__))
            tf.write('_lextokens    = set(%s)\n' % repr(tuple(sorted(self.lextokens))))
            tf.write('_lexreflags   = %s\n' % repr(self.lexreflags))
            tf.write('_lexliterals  = %s\n' % repr(self.lexliterals))
            tf.write('_lexstateinfo = %s\n' % repr(self.lexstateinfo))

            # Rewrite the lexstatere table, replacing function objects with function names
            tabre = {}
            for statename, lre in self.lexstatere.items():
                titem = []
                for (pat, func), retext, renames in zip(lre, self.lexstateretext[statename], self.lexstaterenames[statename]):
                    titem.append((retext, _funcs_to_names(func, renames)))
                tabre[statename] = titem

            tf.write('_lexstatere   = %s\n' % repr(tabre))
            tf.write('_lexstateignore = %s\n' % repr(self.lexstateignore))

            taberr = {}
            for statename, ef in self.lexstateerrorf.items():
                taberr[statename] = ef.__name__ if ef else None
            tf.write('_lexstateerrorf = %s\n' % repr(taberr))

            tabeof = {}
            for statename, ef in self.lexstateeoff.items():
                tabeof[statename] = ef.__name__ if ef else None
            tf.write('_lexstateeoff = %s\n' % repr(tabeof))

    # ------------------------------------------------------------
    # readtab() - Read lexer information from a tab file
    # ------------------------------------------------------------
    def readtab(self, tabfile, fdict):
        if isinstance(tabfile, types.ModuleType):
            lextab = tabfile
        else:
            exec('import %s' % tabfile)
            lextab = sys.modules[tabfile]

        if getattr(lextab, '_tabversion', '0.0') != __tabversion__:
            raise ImportError('Inconsistent PLY version')

        self.lextokens      = lextab._lextokens
        self.lexreflags     = lextab._lexreflags
        self.lexliterals    = lextab._lexliterals
        self.lextokens_all  = self.lextokens | set(self.lexliterals)
        self.lexstateinfo   = lextab._lexstateinfo
        self.lexstateignore = lextab._lexstateignore
        self.lexstatere     = {}
        self.lexstateretext = {}
        for statename, lre in lextab._lexstatere.items():
            titem = []
            txtitem = []
            for pat, func_name in lre:
                titem.append((re.compile(pat, lextab._lexreflags), _names_to_funcs(func_name, fdict)))

            self.lexstatere[statename] = titem
            self.lexstateretext[statename] = txtitem

        self.lexstateerrorf = {}
        for statename, ef in lextab._lexstateerrorf.items():
            self.lexstateerrorf[statename] = fdict[ef]

        self.lexstateeoff = {}
        for statename, ef in lextab._lexstateeoff.items():
            self.lexstateeoff[statename] = fdict[ef]

        self.begin('INITIAL')

    # ------------------------------------------------------------
    # input() - Push a new string into the lexer
    # ------------------------------------------------------------
    def input(self, s):
        # Pull off the first character to see if s looks like a string
        c = s[:1]
        if not isinstance(c, StringTypes):
            raise ValueError('Expected a string')
        self.lexdata = s
        self.lexpos = 0
        self.lexlen = len(s)

    # ------------------------------------------------------------
    # begin() - Changes the lexing state
    # ------------------------------------------------------------
    def begin(self, state):
        if state not in self.lexstatere:
            raise ValueError('Undefined state')
        self.lexre = self.lexstatere[state]
        self.lexretext = self.lexstateretext[state]
        self.lexignore = self.lexstateignore.get(state, '')
        self.lexerrorf = self.lexstateerrorf.get(state, None)
        self.lexeoff = self.lexstateeoff.get(state, None)
        self.lexstate = state

    # ------------------------------------------------------------
    # push_state() - Changes the lexing state and saves old on stack
    # ------------------------------------------------------------
    def push_state(self, state):
        self.lexstatestack.append(self.lexstate)
        self.begin(state)

    # ------------------------------------------------------------
    # pop_state() - Restores the previous state
    # ------------------------------------------------------------
    def pop_state(self):
        self.begin(self.lexstatestack.pop())

    # ------------------------------------------------------------
    # current_state() - Returns the current lexing state
    # ------------------------------------------------------------
    def current_state(self):
        return self.lexstate

    # ------------------------------------------------------------
    # skip() - Skip ahead n characters
    # ------------------------------------------------------------
    def skip(self, n):
        self.lexpos += n

    # ------------------------------------------------------------
    # opttoken() - Return the next token from the Lexer
    #
    # Note: This function has been carefully implemented to be as fast
    # as possible.  Don't make changes unless you really know what
    # you are doing
    # ------------------------------------------------------------
    def token(self):
        # Make local copies of frequently referenced attributes
        lexpos    = self.lexpos
        lexlen    = self.lexlen
        lexignore = self.lexignore
        lexdata   = self.lexdata

        while lexpos < lexlen:
            # This code provides some short-circuit code for whitespace, tabs, and other ignored characters
            if lexdata[lexpos] in lexignore:
                lexpos += 1
                continue

            # Look for a regular expression match
            for lexre, lexindexfunc in self.lexre:
                m = lexre.match(lexdata, lexpos)
                if not m:
                    continue

                # Create a token for return
                tok = LexToken()
                tok.value = m.group()
                tok.lineno = self.lineno
                tok.lexpos = lexpos

                i = m.lastindex
                func, tok.type = lexindexfunc[i]

                if not func:
                    # If no token type was set, it's an ignored token
                    if tok.type:
                        self.lexpos = m.end()
                        return tok
                    else:
                        lexpos = m.end()
                        break

                lexpos = m.end()

                # If token is processed by a function, call it

                tok.lexer = self      # Set additional attributes useful in token rules
                self.lexmatch = m
                self.lexpos = lexpos

                newtok = func(tok)

                # Every function must return a token, if nothing, we just move to next token
                if not newtok:
                    lexpos    = self.lexpos         # This is here in case user has updated lexpos.
                    lexignore = self.lexignore      # This is here in case there was a state change
                    break

                # Verify type of the token.  If not in the token map, raise an error
                if not self.lexoptimize:
                    if newtok.type not in self.lextokens_all:
                        raise LexError("%s:%d: Rule '%s' returned an unknown token type '%s'" % (
                            func.__code__.co_filename, func.__code__.co_firstlineno,
                            func.__name__, newtok.type), lexdata[lexpos:])

                return newtok
            else:
                # No match, see if in literals
                if lexdata[lexpos] in self.lexliterals:
                    tok = LexToken()
                    tok.value = lexdata[lexpos]
                    tok.lineno = self.lineno
                    tok.type = tok.value
                    tok.lexpos = lexpos
                    self.lexpos = lexpos + 1
                    return tok

                # No match. Call t_error() if defined.
                if self.lexerrorf:
                    tok = LexToken()
                    tok.value = self.lexdata[lexpos:]
                    tok.lineno = self.lineno
                    tok.type = 'error'
                    tok.lexer = self
                    tok.lexpos = lexpos
                    self.lexpos = lexpos
                    newtok = self.lexerrorf(tok)
                    if lexpos == self.lexpos:
                        # Error method didn't change text position at all. This is an error.
                        raise LexError("Scanning error. Illegal character '%s'" % (lexdata[lexpos]), lexdata[lexpos:])
                    lexpos = self.lexpos
                    if not newtok:
                        continue
                    return newtok

                self.lexpos = lexpos
                raise LexError("Illegal character '%s' at index %d" % (lexdata[lexpos], lexpos), lexdata[lexpos:])

        if self.lexeoff:
            tok = LexToken()
            tok.type = 'eof'
            tok.value = ''
            tok.lineno = self.lineno
            tok.lexpos = lexpos
            tok.lexer = self
            self.lexpos = lexpos
            newtok = self.lexeoff(tok)
            return newtok

        self.lexpos = lexpos + 1
        if self.lexdata is None:
            raise RuntimeError('No input string given with input()')
        return None

    # Iterator interface
    def __iter__(self):
        return self

    def next(self):
        t = self.token()
        if t is None:
            raise StopIteration
        return t

    __next__ = next

# -----------------------------------------------------------------------------
#                           ==== Lex Builder ===
#
# The functions and classes below are used to collect lexing information
# and build a Lexer object from it.
# -----------------------------------------------------------------------------

# -----------------------------------------------------------------------------
# _get_regex(func)
#
# Returns the regular expression assigned to a function either as a doc string
# or as a .regex attribute attached by the @TOKEN decorator.
# -----------------------------------------------------------------------------
def _get_regex(func):
    return getattr(func, 'regex', func.__doc__)

# -----------------------------------------------------------------------------
# get_caller_module_dict()
#
# This function returns a dictionary containing all of the symbols defined within
# a caller further down the call stack.  This is used to get the environment
# associated with the yacc() call if none was provided.
# -----------------------------------------------------------------------------
def get_caller_module_dict(levels):
    f = sys._getframe(levels)
    ldict = f.f_globals.copy()
    if f.f_globals != f.f_locals:
        ldict.update(f.f_locals)
    return ldict

# -----------------------------------------------------------------------------
# _funcs_to_names()
#
# Given a list of regular expression functions, this converts it to a list
# suitable for output to a table file
# -----------------------------------------------------------------------------
def _funcs_to_names(funclist, namelist):
    result = []
    for f, name in zip(funclist, namelist):
        if f and f[0]:
            result.append((name, f[1]))
        else:
            result.append(f)
    return result

# -----------------------------------------------------------------------------
# _names_to_funcs()
#
# Given a list of regular expression function names, this converts it back to
# functions.
# -----------------------------------------------------------------------------
def _names_to_funcs(namelist, fdict):
    result = []
    for n in namelist:
        if n and n[0]:
            result.append((fdict[n[0]], n[1]))
        else:
            result.append(n)
    return result

# -----------------------------------------------------------------------------
# _form_master_re()
#
# This function takes a list of all of the regex components and attempts to
# form the master regular expression.  Given limitations in the Python re
# module, it may be necessary to break the master regex into separate expressions.
# -----------------------------------------------------------------------------
def _form_master_re(relist, reflags, ldict, toknames):
    if not relist:
        return []
    regex = '|'.join(relist)
    try:
        lexre = re.compile(regex, reflags)

        # Build the index to function map for the matching engine
        lexindexfunc = [None] * (max(lexre.groupindex.values()) + 1)
        lexindexnames = lexindexfunc[:]

        for f, i in lexre.groupindex.items():
            handle = ldict.get(f, None)
            if type(handle) in (types.FunctionType, types.MethodType):
                lexindexfunc[i] = (handle, toknames[f])
                lexindexnames[i] = f
            elif handle is not None:
                lexindexnames[i] = f
                if f.find('ignore_') > 0:
                    lexindexfunc[i] = (None, None)
                else:
                    lexindexfunc[i] = (None, toknames[f])

        return [(lexre, lexindexfunc)], [regex], [lexindexnames]
    except Exception:
        m = int(len(relist)/2)
        if m == 0:
            m = 1
        llist, lre, lnames = _form_master_re(relist[:m], reflags, ldict, toknames)
        rlist, rre, rnames = _form_master_re(relist[m:], reflags, ldict, toknames)
        return (llist+rlist), (lre+rre), (lnames+rnames)

# -----------------------------------------------------------------------------
# def _statetoken(s,names)
#
# Given a declaration name s of the form "t_" and a dictionary whose keys are
# state names, this function returns a tuple (states,tokenname) where states
# is a tuple of state names and tokenname is the name of the token.  For example,
# calling this with s = "t_foo_bar_SPAM" might return (('foo','bar'),'SPAM')
# -----------------------------------------------------------------------------
def _statetoken(s, names):
    nonstate = 1
    parts = s.split('_')
    for i, part in enumerate(parts[1:], 1):
        if part not in names and part != 'ANY':
            break

    if i > 1:
        states = tuple(parts[1:i])
    else:
        states = ('INITIAL',)

    if 'ANY' in states:
        states = tuple(names)

    tokenname = '_'.join(parts[i:])
    return (states, tokenname)


# -----------------------------------------------------------------------------
# LexerReflect()
#
# This class represents information needed to build a lexer as extracted from a
# user's input file.
# -----------------------------------------------------------------------------
class LexerReflect(object):
    def __init__(self, ldict, log=None, reflags=0):
        self.ldict      = ldict
        self.error_func = None
        self.tokens     = []
        self.reflags    = reflags
        self.stateinfo  = {'INITIAL': 'inclusive'}
        self.modules    = set()
        self.error      = False
        self.log        = PlyLogger(sys.stderr) if log is None else log

    # Get all of the basic information
    def get_all(self):
        self.get_tokens()
        self.get_literals()
        self.get_states()
        self.get_rules()

    # Validate all of the information
    def validate_all(self):
        self.validate_tokens()
        self.validate_literals()
        self.validate_rules()
        return self.error

    # Get the tokens map
    def get_tokens(self):
        tokens = self.ldict.get('tokens', None)
        if not tokens:
            self.log.error('No token list is defined')
            self.error = True
            return

        if not isinstance(tokens, (list, tuple)):
            self.log.error('tokens must be a list or tuple')
            self.error = True
            return

        if not tokens:
            self.log.error('tokens is empty')
            self.error = True
            return

        self.tokens = tokens

    # Validate the tokens
    def validate_tokens(self):
        terminals = {}
        for n in self.tokens:
            if not _is_identifier.match(n):
                self.log.error("Bad token name '%s'", n)
                self.error = True
            if n in terminals:
                self.log.warning("Token '%s' multiply defined", n)
            terminals[n] = 1

    # Get the literals specifier
    def get_literals(self):
        self.literals = self.ldict.get('literals', '')
        if not self.literals:
            self.literals = ''

    # Validate literals
    def validate_literals(self):
        try:
            for c in self.literals:
                if not isinstance(c, StringTypes) or len(c) > 1:
                    self.log.error('Invalid literal %s. Must be a single character', repr(c))
                    self.error = True

        except TypeError:
            self.log.error('Invalid literals specification. literals must be a sequence of characters')
            self.error = True

    def get_states(self):
        self.states = self.ldict.get('states', None)
        # Build statemap
        if self.states:
            if not isinstance(self.states, (tuple, list)):
                self.log.error('states must be defined as a tuple or list')
                self.error = True
            else:
                for s in self.states:
                    if not isinstance(s, tuple) or len(s) != 2:
                        self.log.error("Invalid state specifier %s. Must be a tuple (statename,'exclusive|inclusive')", repr(s))
                        self.error = True
                        continue
                    name, statetype = s
                    if not isinstance(name, StringTypes):
                        self.log.error('State name %s must be a string', repr(name))
                        self.error = True
                        continue
                    if not (statetype == 'inclusive' or statetype == 'exclusive'):
                        self.log.error("State type for state %s must be 'inclusive' or 'exclusive'", name)
                        self.error = True
                        continue
                    if name in self.stateinfo:
                        self.log.error("State '%s' already defined", name)
                        self.error = True
                        continue
                    self.stateinfo[name] = statetype

    # Get all of the symbols with a t_ prefix and sort them into various
    # categories (functions, strings, error functions, and ignore characters)

    def get_rules(self):
        tsymbols = [f for f in self.ldict if f[:2] == 't_']

        # Now build up a list of functions and a list of strings
        self.toknames = {}        # Mapping of symbols to token names
        self.funcsym  = {}        # Symbols defined as functions
        self.strsym   = {}        # Symbols defined as strings
        self.ignore   = {}        # Ignore strings by state
        self.errorf   = {}        # Error functions by state
        self.eoff     = {}        # EOF functions by state

        for s in self.stateinfo:
            self.funcsym[s] = []
            self.strsym[s] = []

        if len(tsymbols) == 0:
            self.log.error('No rules of the form t_rulename are defined')
            self.error = True
            return

        for f in tsymbols:
            t = self.ldict[f]
            states, tokname = _statetoken(f, self.stateinfo)
            self.toknames[f] = tokname

            if hasattr(t, '__call__'):
                if tokname == 'error':
                    for s in states:
                        self.errorf[s] = t
                elif tokname == 'eof':
                    for s in states:
                        self.eoff[s] = t
                elif tokname == 'ignore':
                    line = t.__code__.co_firstlineno
                    file = t.__code__.co_filename
                    self.log.error("%s:%d: Rule '%s' must be defined as a string", file, line, t.__name__)
                    self.error = True
                else:
                    for s in states:
                        self.funcsym[s].append((f, t))
            elif isinstance(t, StringTypes):
                if tokname == 'ignore':
                    for s in states:
                        self.ignore[s] = t
                    if '\\' in t:
                        self.log.warning("%s contains a literal backslash '\\'", f)

                elif tokname == 'error':
                    self.log.error("Rule '%s' must be defined as a function", f)
                    self.error = True
                else:
                    for s in states:
                        self.strsym[s].append((f, t))
            else:
                self.log.error('%s not defined as a function or string', f)
                self.error = True

        # Sort the functions by line number
        for f in self.funcsym.values():
            f.sort(key=lambda x: x[1].__code__.co_firstlineno)

        # Sort the strings by regular expression length
        for s in self.strsym.values():
            s.sort(key=lambda x: len(x[1]), reverse=True)

    # Validate all of the t_rules collected
    def validate_rules(self):
        for state in self.stateinfo:
            # Validate all rules defined by functions

            for fname, f in self.funcsym[state]:
                line = f.__code__.co_firstlineno
                file = f.__code__.co_filename
                module = inspect.getmodule(f)
                self.modules.add(module)

                tokname = self.toknames[fname]
                if isinstance(f, types.MethodType):
                    reqargs = 2
                else:
                    reqargs = 1
                nargs = f.__code__.co_argcount
                if nargs > reqargs:
                    self.log.error("%s:%d: Rule '%s' has too many arguments", file, line, f.__name__)
                    self.error = True
                    continue

                if nargs < reqargs:
                    self.log.error("%s:%d: Rule '%s' requires an argument", file, line, f.__name__)
                    self.error = True
                    continue

                if not _get_regex(f):
                    self.log.error("%s:%d: No regular expression defined for rule '%s'", file, line, f.__name__)
                    self.error = True
                    continue

                try:
                    c = re.compile('(?P<%s>%s)' % (fname, _get_regex(f)), self.reflags)
                    if c.match(''):
                        self.log.error("%s:%d: Regular expression for rule '%s' matches empty string", file, line, f.__name__)
                        self.error = True
                except re.error as e:
                    self.log.error("%s:%d: Invalid regular expression for rule '%s'. %s", file, line, f.__name__, e)
                    if '#' in _get_regex(f):
                        self.log.error("%s:%d. Make sure '#' in rule '%s' is escaped with '\\#'", file, line, f.__name__)
                    self.error = True

            # Validate all rules defined by strings
            for name, r in self.strsym[state]:
                tokname = self.toknames[name]
                if tokname == 'error':
                    self.log.error("Rule '%s' must be defined as a function", name)
                    self.error = True
                    continue

                if tokname not in self.tokens and tokname.find('ignore_') < 0:
                    self.log.error("Rule '%s' defined for an unspecified token %s", name, tokname)
                    self.error = True
                    continue

                try:
                    c = re.compile('(?P<%s>%s)' % (name, r), self.reflags)
                    if (c.match('')):
                        self.log.error("Regular expression for rule '%s' matches empty string", name)
                        self.error = True
                except re.error as e:
                    self.log.error("Invalid regular expression for rule '%s'. %s", name, e)
                    if '#' in r:
                        self.log.error("Make sure '#' in rule '%s' is escaped with '\\#'", name)
                    self.error = True

            if not self.funcsym[state] and not self.strsym[state]:
                self.log.error("No rules defined for state '%s'", state)
                self.error = True

            # Validate the error function
            efunc = self.errorf.get(state, None)
            if efunc:
                f = efunc
                line = f.__code__.co_firstlineno
                file = f.__code__.co_filename
                module = inspect.getmodule(f)
                self.modules.add(module)

                if isinstance(f, types.MethodType):
                    reqargs = 2
                else:
                    reqargs = 1
                nargs = f.__code__.co_argcount
                if nargs > reqargs:
                    self.log.error("%s:%d: Rule '%s' has too many arguments", file, line, f.__name__)
                    self.error = True

                if nargs < reqargs:
                    self.log.error("%s:%d: Rule '%s' requires an argument", file, line, f.__name__)
                    self.error = True

        for module in self.modules:
            self.validate_module(module)

    # -----------------------------------------------------------------------------
    # validate_module()
    #
    # This checks to see if there are duplicated t_rulename() functions or strings
    # in the parser input file.  This is done using a simple regular expression
    # match on each line in the source code of the given module.
    # -----------------------------------------------------------------------------

    def validate_module(self, module):
        try:
            lines, linen = inspect.getsourcelines(module)
        except IOError:
            return

        fre = re.compile(r'\s*def\s+(t_[a-zA-Z_0-9]*)\(')
        sre = re.compile(r'\s*(t_[a-zA-Z_0-9]*)\s*=')

        counthash = {}
        linen += 1
        for line in lines:
            m = fre.match(line)
            if not m:
                m = sre.match(line)
            if m:
                name = m.group(1)
                prev = counthash.get(name)
                if not prev:
                    counthash[name] = linen
                else:
                    filename = inspect.getsourcefile(module)
                    self.log.error('%s:%d: Rule %s redefined. Previously defined on line %d', filename, linen, name, prev)
                    self.error = True
            linen += 1

# -----------------------------------------------------------------------------
# lex(module)
#
# Build all of the regular expression rules from definitions in the supplied module
# -----------------------------------------------------------------------------
def lex(module=None, object=None, debug=False, optimize=False, lextab='lextab',
        reflags=int(re.VERBOSE), nowarn=False, outputdir=None, debuglog=None, errorlog=None):

    if lextab is None:
        lextab = 'lextab'

    global lexer

    ldict = None
    stateinfo  = {'INITIAL': 'inclusive'}
    lexobj = Lexer()
    lexobj.lexoptimize = optimize
    global token, input

    if errorlog is None:
        errorlog = PlyLogger(sys.stderr)

    if debug:
        if debuglog is None:
            debuglog = PlyLogger(sys.stderr)

    # Get the module dictionary used for the lexer
    if object:
        module = object

    # Get the module dictionary used for the parser
    if module:
        _items = [(k, getattr(module, k)) for k in dir(module)]
        ldict = dict(_items)
        # If no __file__ attribute is available, try to obtain it from the __module__ instead
        if '__file__' not in ldict:
            ldict['__file__'] = sys.modules[ldict['__module__']].__file__
    else:
        ldict = get_caller_module_dict(2)

    # Determine if the module is package of a package or not.
    # If so, fix the tabmodule setting so that tables load correctly
    pkg = ldict.get('__package__')
    if pkg and isinstance(lextab, str):
        if '.' not in lextab:
            lextab = pkg + '.' + lextab

    # Collect parser information from the dictionary
    linfo = LexerReflect(ldict, log=errorlog, reflags=reflags)
    linfo.get_all()
    if not optimize:
        if linfo.validate_all():
            raise SyntaxError("Can't build lexer")

    if optimize and lextab:
        try:
            lexobj.readtab(lextab, ldict)
            token = lexobj.token
            input = lexobj.input
            lexer = lexobj
            return lexobj

        except ImportError:
            pass

    # Dump some basic debugging information
    if debug:
        debuglog.info('lex: tokens   = %r', linfo.tokens)
        debuglog.info('lex: literals = %r', linfo.literals)
        debuglog.info('lex: states   = %r', linfo.stateinfo)

    # Build a dictionary of valid token names
    lexobj.lextokens = set()
    for n in linfo.tokens:
        lexobj.lextokens.add(n)

    # Get literals specification
    if isinstance(linfo.literals, (list, tuple)):
        lexobj.lexliterals = type(linfo.literals[0])().join(linfo.literals)
    else:
        lexobj.lexliterals = linfo.literals

    lexobj.lextokens_all = lexobj.lextokens | set(lexobj.lexliterals)

    # Get the stateinfo dictionary
    stateinfo = linfo.stateinfo

    regexs = {}
    # Build the master regular expressions
    for state in stateinfo:
        regex_list = []

        # Add rules defined by functions first
        for fname, f in linfo.funcsym[state]:
            line = f.__code__.co_firstlineno
            file = f.__code__.co_filename
            regex_list.append('(?P<%s>%s)' % (fname, _get_regex(f)))
            if debug:
                debuglog.info("lex: Adding rule %s -> '%s' (state '%s')", fname, _get_regex(f), state)

        # Now add all of the simple rules
        for name, r in linfo.strsym[state]:
            regex_list.append('(?P<%s>%s)' % (name, r))
            if debug:
                debuglog.info("lex: Adding rule %s -> '%s' (state '%s')", name, r, state)

        regexs[state] = regex_list

    # Build the master regular expressions

    if debug:
        debuglog.info('lex: ==== MASTER REGEXS FOLLOW ====')

    for state in regexs:
        lexre, re_text, re_names = _form_master_re(regexs[state], reflags, ldict, linfo.toknames)
        lexobj.lexstatere[state] = lexre
        lexobj.lexstateretext[state] = re_text
        lexobj.lexstaterenames[state] = re_names
        if debug:
            for i, text in enumerate(re_text):
                debuglog.info("lex: state '%s' : regex[%d] = '%s'", state, i, text)

    # For inclusive states, we need to add the regular expressions from the INITIAL state
    for state, stype in stateinfo.items():
        if state != 'INITIAL' and stype == 'inclusive':
            lexobj.lexstatere[state].extend(lexobj.lexstatere['INITIAL'])
            lexobj.lexstateretext[state].extend(lexobj.lexstateretext['INITIAL'])
            lexobj.lexstaterenames[state].extend(lexobj.lexstaterenames['INITIAL'])

    lexobj.lexstateinfo = stateinfo
    lexobj.lexre = lexobj.lexstatere['INITIAL']
    lexobj.lexretext = lexobj.lexstateretext['INITIAL']
    lexobj.lexreflags = reflags

    # Set up ignore variables
    lexobj.lexstateignore = linfo.ignore
    lexobj.lexignore = lexobj.lexstateignore.get('INITIAL', '')

    # Set up error functions
    lexobj.lexstateerrorf = linfo.errorf
    lexobj.lexerrorf = linfo.errorf.get('INITIAL', None)
    if not lexobj.lexerrorf:
        errorlog.warning('No t_error rule is defined')

    # Set up eof functions
    lexobj.lexstateeoff = linfo.eoff
    lexobj.lexeoff = linfo.eoff.get('INITIAL', None)

    # Check state information for ignore and error rules
    for s, stype in stateinfo.items():
        if stype == 'exclusive':
            if s not in linfo.errorf:
                errorlog.warning("No error rule is defined for exclusive state '%s'", s)
            if s not in linfo.ignore and lexobj.lexignore:
                errorlog.warning("No ignore rule is defined for exclusive state '%s'", s)
        elif stype == 'inclusive':
            if s not in linfo.errorf:
                linfo.errorf[s] = linfo.errorf.get('INITIAL', None)
            if s not in linfo.ignore:
                linfo.ignore[s] = linfo.ignore.get('INITIAL', '')

    # Create global versions of the token() and input() functions
    token = lexobj.token
    input = lexobj.input
    lexer = lexobj

    # If in optimize mode, we write the lextab
    if lextab and optimize:
        if outputdir is None:
            # If no output directory is set, the location of the output files
            # is determined according to the following rules:
            #     - If lextab specifies a package, files go into that package directory
            #     - Otherwise, files go in the same directory as the specifying module
            if isinstance(lextab, types.ModuleType):
                srcfile = lextab.__file__
            else:
                if '.' not in lextab:
                    srcfile = ldict['__file__']
                else:
                    parts = lextab.split('.')
                    pkgname = '.'.join(parts[:-1])
                    exec('import %s' % pkgname)
                    srcfile = getattr(sys.modules[pkgname], '__file__', '')
            outputdir = os.path.dirname(srcfile)
        try:
            lexobj.writetab(lextab, outputdir)
        except IOError as e:
            errorlog.warning("Couldn't write lextab module %r. %s" % (lextab, e))

    return lexobj

# -----------------------------------------------------------------------------
# runmain()
#
# This runs the lexer as a main program
# -----------------------------------------------------------------------------

def runmain(lexer=None, data=None):
    if not data:
        try:
            filename = sys.argv[1]
            f = open(filename)
            data = f.read()
            f.close()
        except IndexError:
            sys.stdout.write('Reading from standard input (type EOF to end):\n')
            data = sys.stdin.read()

    if lexer:
        _input = lexer.input
    else:
        _input = input
    _input(data)
    if lexer:
        _token = lexer.token
    else:
        _token = token

    while True:
        tok = _token()
        if not tok:
            break
        sys.stdout.write('(%s,%r,%d,%d)\n' % (tok.type, tok.value, tok.lineno, tok.lexpos))

# -----------------------------------------------------------------------------
# @TOKEN(regex)
#
# This decorator function can be used to set the regex expression on a function
# when its docstring might need to be set in an alternative way
# -----------------------------------------------------------------------------

def TOKEN(r):
    def set_regex(f):
        if hasattr(r, '__call__'):
            f.regex = _get_regex(r)
        else:
            f.regex = r
        return f
    return set_regex

# Alternative spelling of the TOKEN decorator
Token = TOKEN
PK�t�\�?�0kkply/yacc.pynu�[���# -----------------------------------------------------------------------------
# ply: yacc.py
#
# Copyright (C) 2001-2017
# David M. Beazley (Dabeaz LLC)
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# * Redistributions of source code must retain the above copyright notice,
#   this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright notice,
#   this list of conditions and the following disclaimer in the documentation
#   and/or other materials provided with the distribution.
# * Neither the name of the David Beazley or Dabeaz LLC may be used to
#   endorse or promote products derived from this software without
#  specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# -----------------------------------------------------------------------------
#
# This implements an LR parser that is constructed from grammar rules defined
# as Python functions. The grammer is specified by supplying the BNF inside
# Python documentation strings.  The inspiration for this technique was borrowed
# from John Aycock's Spark parsing system.  PLY might be viewed as cross between
# Spark and the GNU bison utility.
#
# The current implementation is only somewhat object-oriented. The
# LR parser itself is defined in terms of an object (which allows multiple
# parsers to co-exist).  However, most of the variables used during table
# construction are defined in terms of global variables.  Users shouldn't
# notice unless they are trying to define multiple parsers at the same
# time using threads (in which case they should have their head examined).
#
# This implementation supports both SLR and LALR(1) parsing.  LALR(1)
# support was originally implemented by Elias Ioup (ezioup@alumni.uchicago.edu),
# using the algorithm found in Aho, Sethi, and Ullman "Compilers: Principles,
# Techniques, and Tools" (The Dragon Book).  LALR(1) has since been replaced
# by the more efficient DeRemer and Pennello algorithm.
#
# :::::::: WARNING :::::::
#
# Construction of LR parsing tables is fairly complicated and expensive.
# To make this module run fast, a *LOT* of work has been put into
# optimization---often at the expensive of readability and what might
# consider to be good Python "coding style."   Modify the code at your
# own risk!
# ----------------------------------------------------------------------------

import re
import types
import sys
import os.path
import inspect
import base64
import warnings

__version__    = '3.10'
__tabversion__ = '3.10'

#-----------------------------------------------------------------------------
#                     === User configurable parameters ===
#
# Change these to modify the default behavior of yacc (if you wish)
#-----------------------------------------------------------------------------

yaccdebug   = True             # Debugging mode.  If set, yacc generates a
                               # a 'parser.out' file in the current directory

debug_file  = 'parser.out'     # Default name of the debugging file
tab_module  = 'parsetab'       # Default name of the table module
default_lr  = 'LALR'           # Default LR table generation method

error_count = 3                # Number of symbols that must be shifted to leave recovery mode

yaccdevel   = False            # Set to True if developing yacc.  This turns off optimized
                               # implementations of certain functions.

resultlimit = 40               # Size limit of results when running in debug mode.

pickle_protocol = 0            # Protocol to use when writing pickle files

# String type-checking compatibility
if sys.version_info[0] < 3:
    string_types = basestring
else:
    string_types = str

MAXINT = sys.maxsize

# This object is a stand-in for a logging object created by the
# logging module.   PLY will use this by default to create things
# such as the parser.out file.  If a user wants more detailed
# information, they can create their own logging object and pass
# it into PLY.

class PlyLogger(object):
    def __init__(self, f):
        self.f = f

    def debug(self, msg, *args, **kwargs):
        self.f.write((msg % args) + '\n')

    info = debug

    def warning(self, msg, *args, **kwargs):
        self.f.write('WARNING: ' + (msg % args) + '\n')

    def error(self, msg, *args, **kwargs):
        self.f.write('ERROR: ' + (msg % args) + '\n')

    critical = debug

# Null logger is used when no output is generated. Does nothing.
class NullLogger(object):
    def __getattribute__(self, name):
        return self

    def __call__(self, *args, **kwargs):
        return self

# Exception raised for yacc-related errors
class YaccError(Exception):
    pass

# Format the result message that the parser produces when running in debug mode.
def format_result(r):
    repr_str = repr(r)
    if '\n' in repr_str:
        repr_str = repr(repr_str)
    if len(repr_str) > resultlimit:
        repr_str = repr_str[:resultlimit] + ' ...'
    result = '<%s @ 0x%x> (%s)' % (type(r).__name__, id(r), repr_str)
    return result

# Format stack entries when the parser is running in debug mode
def format_stack_entry(r):
    repr_str = repr(r)
    if '\n' in repr_str:
        repr_str = repr(repr_str)
    if len(repr_str) < 16:
        return repr_str
    else:
        return '<%s @ 0x%x>' % (type(r).__name__, id(r))

# Panic mode error recovery support.   This feature is being reworked--much of the
# code here is to offer a deprecation/backwards compatible transition

_errok = None
_token = None
_restart = None
_warnmsg = '''PLY: Don't use global functions errok(), token(), and restart() in p_error().
Instead, invoke the methods on the associated parser instance:

    def p_error(p):
        ...
        # Use parser.errok(), parser.token(), parser.restart()
        ...

    parser = yacc.yacc()
'''

def errok():
    warnings.warn(_warnmsg)
    return _errok()

def restart():
    warnings.warn(_warnmsg)
    return _restart()

def token():
    warnings.warn(_warnmsg)
    return _token()

# Utility function to call the p_error() function with some deprecation hacks
def call_errorfunc(errorfunc, token, parser):
    global _errok, _token, _restart
    _errok = parser.errok
    _token = parser.token
    _restart = parser.restart
    r = errorfunc(token)
    try:
        del _errok, _token, _restart
    except NameError:
        pass
    return r

#-----------------------------------------------------------------------------
#                        ===  LR Parsing Engine ===
#
# The following classes are used for the LR parser itself.  These are not
# used during table construction and are independent of the actual LR
# table generation algorithm
#-----------------------------------------------------------------------------

# This class is used to hold non-terminal grammar symbols during parsing.
# It normally has the following attributes set:
#        .type       = Grammar symbol type
#        .value      = Symbol value
#        .lineno     = Starting line number
#        .endlineno  = Ending line number (optional, set automatically)
#        .lexpos     = Starting lex position
#        .endlexpos  = Ending lex position (optional, set automatically)

class YaccSymbol:
    def __str__(self):
        return self.type

    def __repr__(self):
        return str(self)

# This class is a wrapper around the objects actually passed to each
# grammar rule.   Index lookup and assignment actually assign the
# .value attribute of the underlying YaccSymbol object.
# The lineno() method returns the line number of a given
# item (or 0 if not defined).   The linespan() method returns
# a tuple of (startline,endline) representing the range of lines
# for a symbol.  The lexspan() method returns a tuple (lexpos,endlexpos)
# representing the range of positional information for a symbol.

class YaccProduction:
    def __init__(self, s, stack=None):
        self.slice = s
        self.stack = stack
        self.lexer = None
        self.parser = None

    def __getitem__(self, n):
        if isinstance(n, slice):
            return [s.value for s in self.slice[n]]
        elif n >= 0:
            return self.slice[n].value
        else:
            return self.stack[n].value

    def __setitem__(self, n, v):
        self.slice[n].value = v

    def __getslice__(self, i, j):
        return [s.value for s in self.slice[i:j]]

    def __len__(self):
        return len(self.slice)

    def lineno(self, n):
        return getattr(self.slice[n], 'lineno', 0)

    def set_lineno(self, n, lineno):
        self.slice[n].lineno = lineno

    def linespan(self, n):
        startline = getattr(self.slice[n], 'lineno', 0)
        endline = getattr(self.slice[n], 'endlineno', startline)
        return startline, endline

    def lexpos(self, n):
        return getattr(self.slice[n], 'lexpos', 0)

    def lexspan(self, n):
        startpos = getattr(self.slice[n], 'lexpos', 0)
        endpos = getattr(self.slice[n], 'endlexpos', startpos)
        return startpos, endpos

    def error(self):
        raise SyntaxError

# -----------------------------------------------------------------------------
#                               == LRParser ==
#
# The LR Parsing engine.
# -----------------------------------------------------------------------------

class LRParser:
    def __init__(self, lrtab, errorf):
        self.productions = lrtab.lr_productions
        self.action = lrtab.lr_action
        self.goto = lrtab.lr_goto
        self.errorfunc = errorf
        self.set_defaulted_states()
        self.errorok = True

    def errok(self):
        self.errorok = True

    def restart(self):
        del self.statestack[:]
        del self.symstack[:]
        sym = YaccSymbol()
        sym.type = '$end'
        self.symstack.append(sym)
        self.statestack.append(0)

    # Defaulted state support.
    # This method identifies parser states where there is only one possible reduction action.
    # For such states, the parser can make a choose to make a rule reduction without consuming
    # the next look-ahead token.  This delayed invocation of the tokenizer can be useful in
    # certain kinds of advanced parsing situations where the lexer and parser interact with
    # each other or change states (i.e., manipulation of scope, lexer states, etc.).
    #
    # See:  https://www.gnu.org/software/bison/manual/html_node/Default-Reductions.html#Default-Reductions
    def set_defaulted_states(self):
        self.defaulted_states = {}
        for state, actions in self.action.items():
            rules = list(actions.values())
            if len(rules) == 1 and rules[0] < 0:
                self.defaulted_states[state] = rules[0]

    def disable_defaulted_states(self):
        self.defaulted_states = {}

    def parse(self, input=None, lexer=None, debug=False, tracking=False, tokenfunc=None):
        if debug or yaccdevel:
            if isinstance(debug, int):
                debug = PlyLogger(sys.stderr)
            return self.parsedebug(input, lexer, debug, tracking, tokenfunc)
        elif tracking:
            return self.parseopt(input, lexer, debug, tracking, tokenfunc)
        else:
            return self.parseopt_notrack(input, lexer, debug, tracking, tokenfunc)


    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    # parsedebug().
    #
    # This is the debugging enabled version of parse().  All changes made to the
    # parsing engine should be made here.   Optimized versions of this function
    # are automatically created by the ply/ygen.py script.  This script cuts out
    # sections enclosed in markers such as this:
    #
    #      #--! DEBUG
    #      statements
    #      #--! DEBUG
    #
    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    def parsedebug(self, input=None, lexer=None, debug=False, tracking=False, tokenfunc=None):
        #--! parsedebug-start
        lookahead = None                         # Current lookahead symbol
        lookaheadstack = []                      # Stack of lookahead symbols
        actions = self.action                    # Local reference to action table (to avoid lookup on self.)
        goto    = self.goto                      # Local reference to goto table (to avoid lookup on self.)
        prod    = self.productions               # Local reference to production list (to avoid lookup on self.)
        defaulted_states = self.defaulted_states # Local reference to defaulted states
        pslice  = YaccProduction(None)           # Production object passed to grammar rules
        errorcount = 0                           # Used during error recovery

        #--! DEBUG
        debug.info('PLY: PARSE DEBUG START')
        #--! DEBUG

        # If no lexer was given, we will try to use the lex module
        if not lexer:
            from . import lex
            lexer = lex.lexer

        # Set up the lexer and parser objects on pslice
        pslice.lexer = lexer
        pslice.parser = self

        # If input was supplied, pass to lexer
        if input is not None:
            lexer.input(input)

        if tokenfunc is None:
            # Tokenize function
            get_token = lexer.token
        else:
            get_token = tokenfunc

        # Set the parser() token method (sometimes used in error recovery)
        self.token = get_token

        # Set up the state and symbol stacks

        statestack = []                # Stack of parsing states
        self.statestack = statestack
        symstack   = []                # Stack of grammar symbols
        self.symstack = symstack

        pslice.stack = symstack         # Put in the production
        errtoken   = None               # Err token

        # The start state is assumed to be (0,$end)

        statestack.append(0)
        sym = YaccSymbol()
        sym.type = '$end'
        symstack.append(sym)
        state = 0
        while True:
            # Get the next symbol on the input.  If a lookahead symbol
            # is already set, we just use that. Otherwise, we'll pull
            # the next token off of the lookaheadstack or from the lexer

            #--! DEBUG
            debug.debug('')
            debug.debug('State  : %s', state)
            #--! DEBUG

            if state not in defaulted_states:
                if not lookahead:
                    if not lookaheadstack:
                        lookahead = get_token()     # Get the next token
                    else:
                        lookahead = lookaheadstack.pop()
                    if not lookahead:
                        lookahead = YaccSymbol()
                        lookahead.type = '$end'

                # Check the action table
                ltype = lookahead.type
                t = actions[state].get(ltype)
            else:
                t = defaulted_states[state]
                #--! DEBUG
                debug.debug('Defaulted state %s: Reduce using %d', state, -t)
                #--! DEBUG

            #--! DEBUG
            debug.debug('Stack  : %s',
                        ('%s . %s' % (' '.join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip())
            #--! DEBUG

            if t is not None:
                if t > 0:
                    # shift a symbol on the stack
                    statestack.append(t)
                    state = t

                    #--! DEBUG
                    debug.debug('Action : Shift and goto state %s', t)
                    #--! DEBUG

                    symstack.append(lookahead)
                    lookahead = None

                    # Decrease error count on successful shift
                    if errorcount:
                        errorcount -= 1
                    continue

                if t < 0:
                    # reduce a symbol on the stack, emit a production
                    p = prod[-t]
                    pname = p.name
                    plen  = p.len

                    # Get production function
                    sym = YaccSymbol()
                    sym.type = pname       # Production name
                    sym.value = None

                    #--! DEBUG
                    if plen:
                        debug.info('Action : Reduce rule [%s] with %s and goto state %d', p.str,
                                   '['+','.join([format_stack_entry(_v.value) for _v in symstack[-plen:]])+']',
                                   goto[statestack[-1-plen]][pname])
                    else:
                        debug.info('Action : Reduce rule [%s] with %s and goto state %d', p.str, [],
                                   goto[statestack[-1]][pname])

                    #--! DEBUG

                    if plen:
                        targ = symstack[-plen-1:]
                        targ[0] = sym

                        #--! TRACKING
                        if tracking:
                            t1 = targ[1]
                            sym.lineno = t1.lineno
                            sym.lexpos = t1.lexpos
                            t1 = targ[-1]
                            sym.endlineno = getattr(t1, 'endlineno', t1.lineno)
                            sym.endlexpos = getattr(t1, 'endlexpos', t1.lexpos)
                        #--! TRACKING

                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        # The code enclosed in this section is duplicated
                        # below as a performance optimization.  Make sure
                        # changes get made in both locations.

                        pslice.slice = targ

                        try:
                            # Call the grammar rule with our special slice object
                            del symstack[-plen:]
                            self.state = state
                            p.callable(pslice)
                            del statestack[-plen:]
                            #--! DEBUG
                            debug.info('Result : %s', format_result(pslice[0]))
                            #--! DEBUG
                            symstack.append(sym)
                            state = goto[statestack[-1]][pname]
                            statestack.append(state)
                        except SyntaxError:
                            # If an error was set. Enter error recovery state
                            lookaheadstack.append(lookahead)    # Save the current lookahead token
                            symstack.extend(targ[1:-1])         # Put the production slice back on the stack
                            statestack.pop()                    # Pop back one state (before the reduce)
                            state = statestack[-1]
                            sym.type = 'error'
                            sym.value = 'error'
                            lookahead = sym
                            errorcount = error_count
                            self.errorok = False

                        continue
                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                    else:

                        #--! TRACKING
                        if tracking:
                            sym.lineno = lexer.lineno
                            sym.lexpos = lexer.lexpos
                        #--! TRACKING

                        targ = [sym]

                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        # The code enclosed in this section is duplicated
                        # above as a performance optimization.  Make sure
                        # changes get made in both locations.

                        pslice.slice = targ

                        try:
                            # Call the grammar rule with our special slice object
                            self.state = state
                            p.callable(pslice)
                            #--! DEBUG
                            debug.info('Result : %s', format_result(pslice[0]))
                            #--! DEBUG
                            symstack.append(sym)
                            state = goto[statestack[-1]][pname]
                            statestack.append(state)
                        except SyntaxError:
                            # If an error was set. Enter error recovery state
                            lookaheadstack.append(lookahead)    # Save the current lookahead token
                            statestack.pop()                    # Pop back one state (before the reduce)
                            state = statestack[-1]
                            sym.type = 'error'
                            sym.value = 'error'
                            lookahead = sym
                            errorcount = error_count
                            self.errorok = False

                        continue
                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                if t == 0:
                    n = symstack[-1]
                    result = getattr(n, 'value', None)
                    #--! DEBUG
                    debug.info('Done   : Returning %s', format_result(result))
                    debug.info('PLY: PARSE DEBUG END')
                    #--! DEBUG
                    return result

            if t is None:

                #--! DEBUG
                debug.error('Error  : %s',
                            ('%s . %s' % (' '.join([xx.type for xx in symstack][1:]), str(lookahead))).lstrip())
                #--! DEBUG

                # We have some kind of parsing error here.  To handle
                # this, we are going to push the current token onto
                # the tokenstack and replace it with an 'error' token.
                # If there are any synchronization rules, they may
                # catch it.
                #
                # In addition to pushing the error token, we call call
                # the user defined p_error() function if this is the
                # first syntax error.  This function is only called if
                # errorcount == 0.
                if errorcount == 0 or self.errorok:
                    errorcount = error_count
                    self.errorok = False
                    errtoken = lookahead
                    if errtoken.type == '$end':
                        errtoken = None               # End of file!
                    if self.errorfunc:
                        if errtoken and not hasattr(errtoken, 'lexer'):
                            errtoken.lexer = lexer
                        self.state = state
                        tok = call_errorfunc(self.errorfunc, errtoken, self)
                        if self.errorok:
                            # User must have done some kind of panic
                            # mode recovery on their own.  The
                            # returned token is the next lookahead
                            lookahead = tok
                            errtoken = None
                            continue
                    else:
                        if errtoken:
                            if hasattr(errtoken, 'lineno'):
                                lineno = lookahead.lineno
                            else:
                                lineno = 0
                            if lineno:
                                sys.stderr.write('yacc: Syntax error at line %d, token=%s\n' % (lineno, errtoken.type))
                            else:
                                sys.stderr.write('yacc: Syntax error, token=%s' % errtoken.type)
                        else:
                            sys.stderr.write('yacc: Parse error in input. EOF\n')
                            return

                else:
                    errorcount = error_count

                # case 1:  the statestack only has 1 entry on it.  If we're in this state, the
                # entire parse has been rolled back and we're completely hosed.   The token is
                # discarded and we just keep going.

                if len(statestack) <= 1 and lookahead.type != '$end':
                    lookahead = None
                    errtoken = None
                    state = 0
                    # Nuke the pushback stack
                    del lookaheadstack[:]
                    continue

                # case 2: the statestack has a couple of entries on it, but we're
                # at the end of the file. nuke the top entry and generate an error token

                # Start nuking entries on the stack
                if lookahead.type == '$end':
                    # Whoa. We're really hosed here. Bail out
                    return

                if lookahead.type != 'error':
                    sym = symstack[-1]
                    if sym.type == 'error':
                        # Hmmm. Error is on top of stack, we'll just nuke input
                        # symbol and continue
                        #--! TRACKING
                        if tracking:
                            sym.endlineno = getattr(lookahead, 'lineno', sym.lineno)
                            sym.endlexpos = getattr(lookahead, 'lexpos', sym.lexpos)
                        #--! TRACKING
                        lookahead = None
                        continue

                    # Create the error symbol for the first time and make it the new lookahead symbol
                    t = YaccSymbol()
                    t.type = 'error'

                    if hasattr(lookahead, 'lineno'):
                        t.lineno = t.endlineno = lookahead.lineno
                    if hasattr(lookahead, 'lexpos'):
                        t.lexpos = t.endlexpos = lookahead.lexpos
                    t.value = lookahead
                    lookaheadstack.append(lookahead)
                    lookahead = t
                else:
                    sym = symstack.pop()
                    #--! TRACKING
                    if tracking:
                        lookahead.lineno = sym.lineno
                        lookahead.lexpos = sym.lexpos
                    #--! TRACKING
                    statestack.pop()
                    state = statestack[-1]

                continue

            # Call an error function here
            raise RuntimeError('yacc: internal parser error!!!\n')

        #--! parsedebug-end

    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    # parseopt().
    #
    # Optimized version of parse() method.  DO NOT EDIT THIS CODE DIRECTLY!
    # This code is automatically generated by the ply/ygen.py script. Make
    # changes to the parsedebug() method instead.
    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    def parseopt(self, input=None, lexer=None, debug=False, tracking=False, tokenfunc=None):
        #--! parseopt-start
        lookahead = None                         # Current lookahead symbol
        lookaheadstack = []                      # Stack of lookahead symbols
        actions = self.action                    # Local reference to action table (to avoid lookup on self.)
        goto    = self.goto                      # Local reference to goto table (to avoid lookup on self.)
        prod    = self.productions               # Local reference to production list (to avoid lookup on self.)
        defaulted_states = self.defaulted_states # Local reference to defaulted states
        pslice  = YaccProduction(None)           # Production object passed to grammar rules
        errorcount = 0                           # Used during error recovery


        # If no lexer was given, we will try to use the lex module
        if not lexer:
            from . import lex
            lexer = lex.lexer

        # Set up the lexer and parser objects on pslice
        pslice.lexer = lexer
        pslice.parser = self

        # If input was supplied, pass to lexer
        if input is not None:
            lexer.input(input)

        if tokenfunc is None:
            # Tokenize function
            get_token = lexer.token
        else:
            get_token = tokenfunc

        # Set the parser() token method (sometimes used in error recovery)
        self.token = get_token

        # Set up the state and symbol stacks

        statestack = []                # Stack of parsing states
        self.statestack = statestack
        symstack   = []                # Stack of grammar symbols
        self.symstack = symstack

        pslice.stack = symstack         # Put in the production
        errtoken   = None               # Err token

        # The start state is assumed to be (0,$end)

        statestack.append(0)
        sym = YaccSymbol()
        sym.type = '$end'
        symstack.append(sym)
        state = 0
        while True:
            # Get the next symbol on the input.  If a lookahead symbol
            # is already set, we just use that. Otherwise, we'll pull
            # the next token off of the lookaheadstack or from the lexer


            if state not in defaulted_states:
                if not lookahead:
                    if not lookaheadstack:
                        lookahead = get_token()     # Get the next token
                    else:
                        lookahead = lookaheadstack.pop()
                    if not lookahead:
                        lookahead = YaccSymbol()
                        lookahead.type = '$end'

                # Check the action table
                ltype = lookahead.type
                t = actions[state].get(ltype)
            else:
                t = defaulted_states[state]


            if t is not None:
                if t > 0:
                    # shift a symbol on the stack
                    statestack.append(t)
                    state = t


                    symstack.append(lookahead)
                    lookahead = None

                    # Decrease error count on successful shift
                    if errorcount:
                        errorcount -= 1
                    continue

                if t < 0:
                    # reduce a symbol on the stack, emit a production
                    p = prod[-t]
                    pname = p.name
                    plen  = p.len

                    # Get production function
                    sym = YaccSymbol()
                    sym.type = pname       # Production name
                    sym.value = None


                    if plen:
                        targ = symstack[-plen-1:]
                        targ[0] = sym

                        #--! TRACKING
                        if tracking:
                            t1 = targ[1]
                            sym.lineno = t1.lineno
                            sym.lexpos = t1.lexpos
                            t1 = targ[-1]
                            sym.endlineno = getattr(t1, 'endlineno', t1.lineno)
                            sym.endlexpos = getattr(t1, 'endlexpos', t1.lexpos)
                        #--! TRACKING

                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        # The code enclosed in this section is duplicated
                        # below as a performance optimization.  Make sure
                        # changes get made in both locations.

                        pslice.slice = targ

                        try:
                            # Call the grammar rule with our special slice object
                            del symstack[-plen:]
                            self.state = state
                            p.callable(pslice)
                            del statestack[-plen:]
                            symstack.append(sym)
                            state = goto[statestack[-1]][pname]
                            statestack.append(state)
                        except SyntaxError:
                            # If an error was set. Enter error recovery state
                            lookaheadstack.append(lookahead)    # Save the current lookahead token
                            symstack.extend(targ[1:-1])         # Put the production slice back on the stack
                            statestack.pop()                    # Pop back one state (before the reduce)
                            state = statestack[-1]
                            sym.type = 'error'
                            sym.value = 'error'
                            lookahead = sym
                            errorcount = error_count
                            self.errorok = False

                        continue
                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                    else:

                        #--! TRACKING
                        if tracking:
                            sym.lineno = lexer.lineno
                            sym.lexpos = lexer.lexpos
                        #--! TRACKING

                        targ = [sym]

                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        # The code enclosed in this section is duplicated
                        # above as a performance optimization.  Make sure
                        # changes get made in both locations.

                        pslice.slice = targ

                        try:
                            # Call the grammar rule with our special slice object
                            self.state = state
                            p.callable(pslice)
                            symstack.append(sym)
                            state = goto[statestack[-1]][pname]
                            statestack.append(state)
                        except SyntaxError:
                            # If an error was set. Enter error recovery state
                            lookaheadstack.append(lookahead)    # Save the current lookahead token
                            statestack.pop()                    # Pop back one state (before the reduce)
                            state = statestack[-1]
                            sym.type = 'error'
                            sym.value = 'error'
                            lookahead = sym
                            errorcount = error_count
                            self.errorok = False

                        continue
                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                if t == 0:
                    n = symstack[-1]
                    result = getattr(n, 'value', None)
                    return result

            if t is None:


                # We have some kind of parsing error here.  To handle
                # this, we are going to push the current token onto
                # the tokenstack and replace it with an 'error' token.
                # If there are any synchronization rules, they may
                # catch it.
                #
                # In addition to pushing the error token, we call call
                # the user defined p_error() function if this is the
                # first syntax error.  This function is only called if
                # errorcount == 0.
                if errorcount == 0 or self.errorok:
                    errorcount = error_count
                    self.errorok = False
                    errtoken = lookahead
                    if errtoken.type == '$end':
                        errtoken = None               # End of file!
                    if self.errorfunc:
                        if errtoken and not hasattr(errtoken, 'lexer'):
                            errtoken.lexer = lexer
                        self.state = state
                        tok = call_errorfunc(self.errorfunc, errtoken, self)
                        if self.errorok:
                            # User must have done some kind of panic
                            # mode recovery on their own.  The
                            # returned token is the next lookahead
                            lookahead = tok
                            errtoken = None
                            continue
                    else:
                        if errtoken:
                            if hasattr(errtoken, 'lineno'):
                                lineno = lookahead.lineno
                            else:
                                lineno = 0
                            if lineno:
                                sys.stderr.write('yacc: Syntax error at line %d, token=%s\n' % (lineno, errtoken.type))
                            else:
                                sys.stderr.write('yacc: Syntax error, token=%s' % errtoken.type)
                        else:
                            sys.stderr.write('yacc: Parse error in input. EOF\n')
                            return

                else:
                    errorcount = error_count

                # case 1:  the statestack only has 1 entry on it.  If we're in this state, the
                # entire parse has been rolled back and we're completely hosed.   The token is
                # discarded and we just keep going.

                if len(statestack) <= 1 and lookahead.type != '$end':
                    lookahead = None
                    errtoken = None
                    state = 0
                    # Nuke the pushback stack
                    del lookaheadstack[:]
                    continue

                # case 2: the statestack has a couple of entries on it, but we're
                # at the end of the file. nuke the top entry and generate an error token

                # Start nuking entries on the stack
                if lookahead.type == '$end':
                    # Whoa. We're really hosed here. Bail out
                    return

                if lookahead.type != 'error':
                    sym = symstack[-1]
                    if sym.type == 'error':
                        # Hmmm. Error is on top of stack, we'll just nuke input
                        # symbol and continue
                        #--! TRACKING
                        if tracking:
                            sym.endlineno = getattr(lookahead, 'lineno', sym.lineno)
                            sym.endlexpos = getattr(lookahead, 'lexpos', sym.lexpos)
                        #--! TRACKING
                        lookahead = None
                        continue

                    # Create the error symbol for the first time and make it the new lookahead symbol
                    t = YaccSymbol()
                    t.type = 'error'

                    if hasattr(lookahead, 'lineno'):
                        t.lineno = t.endlineno = lookahead.lineno
                    if hasattr(lookahead, 'lexpos'):
                        t.lexpos = t.endlexpos = lookahead.lexpos
                    t.value = lookahead
                    lookaheadstack.append(lookahead)
                    lookahead = t
                else:
                    sym = symstack.pop()
                    #--! TRACKING
                    if tracking:
                        lookahead.lineno = sym.lineno
                        lookahead.lexpos = sym.lexpos
                    #--! TRACKING
                    statestack.pop()
                    state = statestack[-1]

                continue

            # Call an error function here
            raise RuntimeError('yacc: internal parser error!!!\n')

        #--! parseopt-end

    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    # parseopt_notrack().
    #
    # Optimized version of parseopt() with line number tracking removed.
    # DO NOT EDIT THIS CODE DIRECTLY. This code is automatically generated
    # by the ply/ygen.py script. Make changes to the parsedebug() method instead.
    # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    def parseopt_notrack(self, input=None, lexer=None, debug=False, tracking=False, tokenfunc=None):
        #--! parseopt-notrack-start
        lookahead = None                         # Current lookahead symbol
        lookaheadstack = []                      # Stack of lookahead symbols
        actions = self.action                    # Local reference to action table (to avoid lookup on self.)
        goto    = self.goto                      # Local reference to goto table (to avoid lookup on self.)
        prod    = self.productions               # Local reference to production list (to avoid lookup on self.)
        defaulted_states = self.defaulted_states # Local reference to defaulted states
        pslice  = YaccProduction(None)           # Production object passed to grammar rules
        errorcount = 0                           # Used during error recovery


        # If no lexer was given, we will try to use the lex module
        if not lexer:
            from . import lex
            lexer = lex.lexer

        # Set up the lexer and parser objects on pslice
        pslice.lexer = lexer
        pslice.parser = self

        # If input was supplied, pass to lexer
        if input is not None:
            lexer.input(input)

        if tokenfunc is None:
            # Tokenize function
            get_token = lexer.token
        else:
            get_token = tokenfunc

        # Set the parser() token method (sometimes used in error recovery)
        self.token = get_token

        # Set up the state and symbol stacks

        statestack = []                # Stack of parsing states
        self.statestack = statestack
        symstack   = []                # Stack of grammar symbols
        self.symstack = symstack

        pslice.stack = symstack         # Put in the production
        errtoken   = None               # Err token

        # The start state is assumed to be (0,$end)

        statestack.append(0)
        sym = YaccSymbol()
        sym.type = '$end'
        symstack.append(sym)
        state = 0
        while True:
            # Get the next symbol on the input.  If a lookahead symbol
            # is already set, we just use that. Otherwise, we'll pull
            # the next token off of the lookaheadstack or from the lexer


            if state not in defaulted_states:
                if not lookahead:
                    if not lookaheadstack:
                        lookahead = get_token()     # Get the next token
                    else:
                        lookahead = lookaheadstack.pop()
                    if not lookahead:
                        lookahead = YaccSymbol()
                        lookahead.type = '$end'

                # Check the action table
                ltype = lookahead.type
                t = actions[state].get(ltype)
            else:
                t = defaulted_states[state]


            if t is not None:
                if t > 0:
                    # shift a symbol on the stack
                    statestack.append(t)
                    state = t


                    symstack.append(lookahead)
                    lookahead = None

                    # Decrease error count on successful shift
                    if errorcount:
                        errorcount -= 1
                    continue

                if t < 0:
                    # reduce a symbol on the stack, emit a production
                    p = prod[-t]
                    pname = p.name
                    plen  = p.len

                    # Get production function
                    sym = YaccSymbol()
                    sym.type = pname       # Production name
                    sym.value = None


                    if plen:
                        targ = symstack[-plen-1:]
                        targ[0] = sym


                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        # The code enclosed in this section is duplicated
                        # below as a performance optimization.  Make sure
                        # changes get made in both locations.

                        pslice.slice = targ

                        try:
                            # Call the grammar rule with our special slice object
                            del symstack[-plen:]
                            self.state = state
                            p.callable(pslice)
                            del statestack[-plen:]
                            symstack.append(sym)
                            state = goto[statestack[-1]][pname]
                            statestack.append(state)
                        except SyntaxError:
                            # If an error was set. Enter error recovery state
                            lookaheadstack.append(lookahead)    # Save the current lookahead token
                            symstack.extend(targ[1:-1])         # Put the production slice back on the stack
                            statestack.pop()                    # Pop back one state (before the reduce)
                            state = statestack[-1]
                            sym.type = 'error'
                            sym.value = 'error'
                            lookahead = sym
                            errorcount = error_count
                            self.errorok = False

                        continue
                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                    else:


                        targ = [sym]

                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                        # The code enclosed in this section is duplicated
                        # above as a performance optimization.  Make sure
                        # changes get made in both locations.

                        pslice.slice = targ

                        try:
                            # Call the grammar rule with our special slice object
                            self.state = state
                            p.callable(pslice)
                            symstack.append(sym)
                            state = goto[statestack[-1]][pname]
                            statestack.append(state)
                        except SyntaxError:
                            # If an error was set. Enter error recovery state
                            lookaheadstack.append(lookahead)    # Save the current lookahead token
                            statestack.pop()                    # Pop back one state (before the reduce)
                            state = statestack[-1]
                            sym.type = 'error'
                            sym.value = 'error'
                            lookahead = sym
                            errorcount = error_count
                            self.errorok = False

                        continue
                        # !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                if t == 0:
                    n = symstack[-1]
                    result = getattr(n, 'value', None)
                    return result

            if t is None:


                # We have some kind of parsing error here.  To handle
                # this, we are going to push the current token onto
                # the tokenstack and replace it with an 'error' token.
                # If there are any synchronization rules, they may
                # catch it.
                #
                # In addition to pushing the error token, we call call
                # the user defined p_error() function if this is the
                # first syntax error.  This function is only called if
                # errorcount == 0.
                if errorcount == 0 or self.errorok:
                    errorcount = error_count
                    self.errorok = False
                    errtoken = lookahead
                    if errtoken.type == '$end':
                        errtoken = None               # End of file!
                    if self.errorfunc:
                        if errtoken and not hasattr(errtoken, 'lexer'):
                            errtoken.lexer = lexer
                        self.state = state
                        tok = call_errorfunc(self.errorfunc, errtoken, self)
                        if self.errorok:
                            # User must have done some kind of panic
                            # mode recovery on their own.  The
                            # returned token is the next lookahead
                            lookahead = tok
                            errtoken = None
                            continue
                    else:
                        if errtoken:
                            if hasattr(errtoken, 'lineno'):
                                lineno = lookahead.lineno
                            else:
                                lineno = 0
                            if lineno:
                                sys.stderr.write('yacc: Syntax error at line %d, token=%s\n' % (lineno, errtoken.type))
                            else:
                                sys.stderr.write('yacc: Syntax error, token=%s' % errtoken.type)
                        else:
                            sys.stderr.write('yacc: Parse error in input. EOF\n')
                            return

                else:
                    errorcount = error_count

                # case 1:  the statestack only has 1 entry on it.  If we're in this state, the
                # entire parse has been rolled back and we're completely hosed.   The token is
                # discarded and we just keep going.

                if len(statestack) <= 1 and lookahead.type != '$end':
                    lookahead = None
                    errtoken = None
                    state = 0
                    # Nuke the pushback stack
                    del lookaheadstack[:]
                    continue

                # case 2: the statestack has a couple of entries on it, but we're
                # at the end of the file. nuke the top entry and generate an error token

                # Start nuking entries on the stack
                if lookahead.type == '$end':
                    # Whoa. We're really hosed here. Bail out
                    return

                if lookahead.type != 'error':
                    sym = symstack[-1]
                    if sym.type == 'error':
                        # Hmmm. Error is on top of stack, we'll just nuke input
                        # symbol and continue
                        lookahead = None
                        continue

                    # Create the error symbol for the first time and make it the new lookahead symbol
                    t = YaccSymbol()
                    t.type = 'error'

                    if hasattr(lookahead, 'lineno'):
                        t.lineno = t.endlineno = lookahead.lineno
                    if hasattr(lookahead, 'lexpos'):
                        t.lexpos = t.endlexpos = lookahead.lexpos
                    t.value = lookahead
                    lookaheadstack.append(lookahead)
                    lookahead = t
                else:
                    sym = symstack.pop()
                    statestack.pop()
                    state = statestack[-1]

                continue

            # Call an error function here
            raise RuntimeError('yacc: internal parser error!!!\n')

        #--! parseopt-notrack-end

# -----------------------------------------------------------------------------
#                          === Grammar Representation ===
#
# The following functions, classes, and variables are used to represent and
# manipulate the rules that make up a grammar.
# -----------------------------------------------------------------------------

# regex matching identifiers
_is_identifier = re.compile(r'^[a-zA-Z0-9_-]+$')

# -----------------------------------------------------------------------------
# class Production:
#
# This class stores the raw information about a single production or grammar rule.
# A grammar rule refers to a specification such as this:
#
#       expr : expr PLUS term
#
# Here are the basic attributes defined on all productions
#
#       name     - Name of the production.  For example 'expr'
#       prod     - A list of symbols on the right side ['expr','PLUS','term']
#       prec     - Production precedence level
#       number   - Production number.
#       func     - Function that executes on reduce
#       file     - File where production function is defined
#       lineno   - Line number where production function is defined
#
# The following attributes are defined or optional.
#
#       len       - Length of the production (number of symbols on right hand side)
#       usyms     - Set of unique symbols found in the production
# -----------------------------------------------------------------------------

class Production(object):
    reduced = 0
    def __init__(self, number, name, prod, precedence=('right', 0), func=None, file='', line=0):
        self.name     = name
        self.prod     = tuple(prod)
        self.number   = number
        self.func     = func
        self.callable = None
        self.file     = file
        self.line     = line
        self.prec     = precedence

        # Internal settings used during table construction

        self.len  = len(self.prod)   # Length of the production

        # Create a list of unique production symbols used in the production
        self.usyms = []
        for s in self.prod:
            if s not in self.usyms:
                self.usyms.append(s)

        # List of all LR items for the production
        self.lr_items = []
        self.lr_next = None

        # Create a string representation
        if self.prod:
            self.str = '%s -> %s' % (self.name, ' '.join(self.prod))
        else:
            self.str = '%s -> <empty>' % self.name

    def __str__(self):
        return self.str

    def __repr__(self):
        return 'Production(' + str(self) + ')'

    def __len__(self):
        return len(self.prod)

    def __nonzero__(self):
        return 1

    def __getitem__(self, index):
        return self.prod[index]

    # Return the nth lr_item from the production (or None if at the end)
    def lr_item(self, n):
        if n > len(self.prod):
            return None
        p = LRItem(self, n)
        # Precompute the list of productions immediately following.
        try:
            p.lr_after = Prodnames[p.prod[n+1]]
        except (IndexError, KeyError):
            p.lr_after = []
        try:
            p.lr_before = p.prod[n-1]
        except IndexError:
            p.lr_before = None
        return p

    # Bind the production function name to a callable
    def bind(self, pdict):
        if self.func:
            self.callable = pdict[self.func]

# This class serves as a minimal standin for Production objects when
# reading table data from files.   It only contains information
# actually used by the LR parsing engine, plus some additional
# debugging information.
class MiniProduction(object):
    def __init__(self, str, name, len, func, file, line):
        self.name     = name
        self.len      = len
        self.func     = func
        self.callable = None
        self.file     = file
        self.line     = line
        self.str      = str

    def __str__(self):
        return self.str

    def __repr__(self):
        return 'MiniProduction(%s)' % self.str

    # Bind the production function name to a callable
    def bind(self, pdict):
        if self.func:
            self.callable = pdict[self.func]


# -----------------------------------------------------------------------------
# class LRItem
#
# This class represents a specific stage of parsing a production rule.  For
# example:
#
#       expr : expr . PLUS term
#
# In the above, the "." represents the current location of the parse.  Here
# basic attributes:
#
#       name       - Name of the production.  For example 'expr'
#       prod       - A list of symbols on the right side ['expr','.', 'PLUS','term']
#       number     - Production number.
#
#       lr_next      Next LR item. Example, if we are ' expr -> expr . PLUS term'
#                    then lr_next refers to 'expr -> expr PLUS . term'
#       lr_index   - LR item index (location of the ".") in the prod list.
#       lookaheads - LALR lookahead symbols for this item
#       len        - Length of the production (number of symbols on right hand side)
#       lr_after    - List of all productions that immediately follow
#       lr_before   - Grammar symbol immediately before
# -----------------------------------------------------------------------------

class LRItem(object):
    def __init__(self, p, n):
        self.name       = p.name
        self.prod       = list(p.prod)
        self.number     = p.number
        self.lr_index   = n
        self.lookaheads = {}
        self.prod.insert(n, '.')
        self.prod       = tuple(self.prod)
        self.len        = len(self.prod)
        self.usyms      = p.usyms

    def __str__(self):
        if self.prod:
            s = '%s -> %s' % (self.name, ' '.join(self.prod))
        else:
            s = '%s -> <empty>' % self.name
        return s

    def __repr__(self):
        return 'LRItem(' + str(self) + ')'

# -----------------------------------------------------------------------------
# rightmost_terminal()
#
# Return the rightmost terminal from a list of symbols.  Used in add_production()
# -----------------------------------------------------------------------------
def rightmost_terminal(symbols, terminals):
    i = len(symbols) - 1
    while i >= 0:
        if symbols[i] in terminals:
            return symbols[i]
        i -= 1
    return None

# -----------------------------------------------------------------------------
#                           === GRAMMAR CLASS ===
#
# The following class represents the contents of the specified grammar along
# with various computed properties such as first sets, follow sets, LR items, etc.
# This data is used for critical parts of the table generation process later.
# -----------------------------------------------------------------------------

class GrammarError(YaccError):
    pass

class Grammar(object):
    def __init__(self, terminals):
        self.Productions  = [None]  # A list of all of the productions.  The first
                                    # entry is always reserved for the purpose of
                                    # building an augmented grammar

        self.Prodnames    = {}      # A dictionary mapping the names of nonterminals to a list of all
                                    # productions of that nonterminal.

        self.Prodmap      = {}      # A dictionary that is only used to detect duplicate
                                    # productions.

        self.Terminals    = {}      # A dictionary mapping the names of terminal symbols to a
                                    # list of the rules where they are used.

        for term in terminals:
            self.Terminals[term] = []

        self.Terminals['error'] = []

        self.Nonterminals = {}      # A dictionary mapping names of nonterminals to a list
                                    # of rule numbers where they are used.

        self.First        = {}      # A dictionary of precomputed FIRST(x) symbols

        self.Follow       = {}      # A dictionary of precomputed FOLLOW(x) symbols

        self.Precedence   = {}      # Precedence rules for each terminal. Contains tuples of the
                                    # form ('right',level) or ('nonassoc', level) or ('left',level)

        self.UsedPrecedence = set() # Precedence rules that were actually used by the grammer.
                                    # This is only used to provide error checking and to generate
                                    # a warning about unused precedence rules.

        self.Start = None           # Starting symbol for the grammar


    def __len__(self):
        return len(self.Productions)

    def __getitem__(self, index):
        return self.Productions[index]

    # -----------------------------------------------------------------------------
    # set_precedence()
    #
    # Sets the precedence for a given terminal. assoc is the associativity such as
    # 'left','right', or 'nonassoc'.  level is a numeric level.
    #
    # -----------------------------------------------------------------------------

    def set_precedence(self, term, assoc, level):
        assert self.Productions == [None], 'Must call set_precedence() before add_production()'
        if term in self.Precedence:
            raise GrammarError('Precedence already specified for terminal %r' % term)
        if assoc not in ['left', 'right', 'nonassoc']:
            raise GrammarError("Associativity must be one of 'left','right', or 'nonassoc'")
        self.Precedence[term] = (assoc, level)

    # -----------------------------------------------------------------------------
    # add_production()
    #
    # Given an action function, this function assembles a production rule and
    # computes its precedence level.
    #
    # The production rule is supplied as a list of symbols.   For example,
    # a rule such as 'expr : expr PLUS term' has a production name of 'expr' and
    # symbols ['expr','PLUS','term'].
    #
    # Precedence is determined by the precedence of the right-most non-terminal
    # or the precedence of a terminal specified by %prec.
    #
    # A variety of error checks are performed to make sure production symbols
    # are valid and that %prec is used correctly.
    # -----------------------------------------------------------------------------

    def add_production(self, prodname, syms, func=None, file='', line=0):

        if prodname in self.Terminals:
            raise GrammarError('%s:%d: Illegal rule name %r. Already defined as a token' % (file, line, prodname))
        if prodname == 'error':
            raise GrammarError('%s:%d: Illegal rule name %r. error is a reserved word' % (file, line, prodname))
        if not _is_identifier.match(prodname):
            raise GrammarError('%s:%d: Illegal rule name %r' % (file, line, prodname))

        # Look for literal tokens
        for n, s in enumerate(syms):
            if s[0] in "'\"":
                try:
                    c = eval(s)
                    if (len(c) > 1):
                        raise GrammarError('%s:%d: Literal token %s in rule %r may only be a single character' %
                                           (file, line, s, prodname))
                    if c not in self.Terminals:
                        self.Terminals[c] = []
                    syms[n] = c
                    continue
                except SyntaxError:
                    pass
            if not _is_identifier.match(s) and s != '%prec':
                raise GrammarError('%s:%d: Illegal name %r in rule %r' % (file, line, s, prodname))

        # Determine the precedence level
        if '%prec' in syms:
            if syms[-1] == '%prec':
                raise GrammarError('%s:%d: Syntax error. Nothing follows %%prec' % (file, line))
            if syms[-2] != '%prec':
                raise GrammarError('%s:%d: Syntax error. %%prec can only appear at the end of a grammar rule' %
                                   (file, line))
            precname = syms[-1]
            prodprec = self.Precedence.get(precname)
            if not prodprec:
                raise GrammarError('%s:%d: Nothing known about the precedence of %r' % (file, line, precname))
            else:
                self.UsedPrecedence.add(precname)
            del syms[-2:]     # Drop %prec from the rule
        else:
            # If no %prec, precedence is determined by the rightmost terminal symbol
            precname = rightmost_terminal(syms, self.Terminals)
            prodprec = self.Precedence.get(precname, ('right', 0))

        # See if the rule is already in the rulemap
        map = '%s -> %s' % (prodname, syms)
        if map in self.Prodmap:
            m = self.Prodmap[map]
            raise GrammarError('%s:%d: Duplicate rule %s. ' % (file, line, m) +
                               'Previous definition at %s:%d' % (m.file, m.line))

        # From this point on, everything is valid.  Create a new Production instance
        pnumber  = len(self.Productions)
        if prodname not in self.Nonterminals:
            self.Nonterminals[prodname] = []

        # Add the production number to Terminals and Nonterminals
        for t in syms:
            if t in self.Terminals:
                self.Terminals[t].append(pnumber)
            else:
                if t not in self.Nonterminals:
                    self.Nonterminals[t] = []
                self.Nonterminals[t].append(pnumber)

        # Create a production and add it to the list of productions
        p = Production(pnumber, prodname, syms, prodprec, func, file, line)
        self.Productions.append(p)
        self.Prodmap[map] = p

        # Add to the global productions list
        try:
            self.Prodnames[prodname].append(p)
        except KeyError:
            self.Prodnames[prodname] = [p]

    # -----------------------------------------------------------------------------
    # set_start()
    #
    # Sets the starting symbol and creates the augmented grammar.  Production
    # rule 0 is S' -> start where start is the start symbol.
    # -----------------------------------------------------------------------------

    def set_start(self, start=None):
        if not start:
            start = self.Productions[1].name
        if start not in self.Nonterminals:
            raise GrammarError('start symbol %s undefined' % start)
        self.Productions[0] = Production(0, "S'", [start])
        self.Nonterminals[start].append(0)
        self.Start = start

    # -----------------------------------------------------------------------------
    # find_unreachable()
    #
    # Find all of the nonterminal symbols that can't be reached from the starting
    # symbol.  Returns a list of nonterminals that can't be reached.
    # -----------------------------------------------------------------------------

    def find_unreachable(self):

        # Mark all symbols that are reachable from a symbol s
        def mark_reachable_from(s):
            if s in reachable:
                return
            reachable.add(s)
            for p in self.Prodnames.get(s, []):
                for r in p.prod:
                    mark_reachable_from(r)

        reachable = set()
        mark_reachable_from(self.Productions[0].prod[0])
        return [s for s in self.Nonterminals if s not in reachable]

    # -----------------------------------------------------------------------------
    # infinite_cycles()
    #
    # This function looks at the various parsing rules and tries to detect
    # infinite recursion cycles (grammar rules where there is no possible way
    # to derive a string of only terminals).
    # -----------------------------------------------------------------------------

    def infinite_cycles(self):
        terminates = {}

        # Terminals:
        for t in self.Terminals:
            terminates[t] = True

        terminates['$end'] = True

        # Nonterminals:

        # Initialize to false:
        for n in self.Nonterminals:
            terminates[n] = False

        # Then propagate termination until no change:
        while True:
            some_change = False
            for (n, pl) in self.Prodnames.items():
                # Nonterminal n terminates iff any of its productions terminates.
                for p in pl:
                    # Production p terminates iff all of its rhs symbols terminate.
                    for s in p.prod:
                        if not terminates[s]:
                            # The symbol s does not terminate,
                            # so production p does not terminate.
                            p_terminates = False
                            break
                    else:
                        # didn't break from the loop,
                        # so every symbol s terminates
                        # so production p terminates.
                        p_terminates = True

                    if p_terminates:
                        # symbol n terminates!
                        if not terminates[n]:
                            terminates[n] = True
                            some_change = True
                        # Don't need to consider any more productions for this n.
                        break

            if not some_change:
                break

        infinite = []
        for (s, term) in terminates.items():
            if not term:
                if s not in self.Prodnames and s not in self.Terminals and s != 'error':
                    # s is used-but-not-defined, and we've already warned of that,
                    # so it would be overkill to say that it's also non-terminating.
                    pass
                else:
                    infinite.append(s)

        return infinite

    # -----------------------------------------------------------------------------
    # undefined_symbols()
    #
    # Find all symbols that were used the grammar, but not defined as tokens or
    # grammar rules.  Returns a list of tuples (sym, prod) where sym in the symbol
    # and prod is the production where the symbol was used.
    # -----------------------------------------------------------------------------
    def undefined_symbols(self):
        result = []
        for p in self.Productions:
            if not p:
                continue

            for s in p.prod:
                if s not in self.Prodnames and s not in self.Terminals and s != 'error':
                    result.append((s, p))
        return result

    # -----------------------------------------------------------------------------
    # unused_terminals()
    #
    # Find all terminals that were defined, but not used by the grammar.  Returns
    # a list of all symbols.
    # -----------------------------------------------------------------------------
    def unused_terminals(self):
        unused_tok = []
        for s, v in self.Terminals.items():
            if s != 'error' and not v:
                unused_tok.append(s)

        return unused_tok

    # ------------------------------------------------------------------------------
    # unused_rules()
    #
    # Find all grammar rules that were defined,  but not used (maybe not reachable)
    # Returns a list of productions.
    # ------------------------------------------------------------------------------

    def unused_rules(self):
        unused_prod = []
        for s, v in self.Nonterminals.items():
            if not v:
                p = self.Prodnames[s][0]
                unused_prod.append(p)
        return unused_prod

    # -----------------------------------------------------------------------------
    # unused_precedence()
    #
    # Returns a list of tuples (term,precedence) corresponding to precedence
    # rules that were never used by the grammar.  term is the name of the terminal
    # on which precedence was applied and precedence is a string such as 'left' or
    # 'right' corresponding to the type of precedence.
    # -----------------------------------------------------------------------------

    def unused_precedence(self):
        unused = []
        for termname in self.Precedence:
            if not (termname in self.Terminals or termname in self.UsedPrecedence):
                unused.append((termname, self.Precedence[termname][0]))

        return unused

    # -------------------------------------------------------------------------
    # _first()
    #
    # Compute the value of FIRST1(beta) where beta is a tuple of symbols.
    #
    # During execution of compute_first1, the result may be incomplete.
    # Afterward (e.g., when called from compute_follow()), it will be complete.
    # -------------------------------------------------------------------------
    def _first(self, beta):

        # We are computing First(x1,x2,x3,...,xn)
        result = []
        for x in beta:
            x_produces_empty = False

            # Add all the non-<empty> symbols of First[x] to the result.
            for f in self.First[x]:
                if f == '<empty>':
                    x_produces_empty = True
                else:
                    if f not in result:
                        result.append(f)

            if x_produces_empty:
                # We have to consider the next x in beta,
                # i.e. stay in the loop.
                pass
            else:
                # We don't have to consider any further symbols in beta.
                break
        else:
            # There was no 'break' from the loop,
            # so x_produces_empty was true for all x in beta,
            # so beta produces empty as well.
            result.append('<empty>')

        return result

    # -------------------------------------------------------------------------
    # compute_first()
    #
    # Compute the value of FIRST1(X) for all symbols
    # -------------------------------------------------------------------------
    def compute_first(self):
        if self.First:
            return self.First

        # Terminals:
        for t in self.Terminals:
            self.First[t] = [t]

        self.First['$end'] = ['$end']

        # Nonterminals:

        # Initialize to the empty set:
        for n in self.Nonterminals:
            self.First[n] = []

        # Then propagate symbols until no change:
        while True:
            some_change = False
            for n in self.Nonterminals:
                for p in self.Prodnames[n]:
                    for f in self._first(p.prod):
                        if f not in self.First[n]:
                            self.First[n].append(f)
                            some_change = True
            if not some_change:
                break

        return self.First

    # ---------------------------------------------------------------------
    # compute_follow()
    #
    # Computes all of the follow sets for every non-terminal symbol.  The
    # follow set is the set of all symbols that might follow a given
    # non-terminal.  See the Dragon book, 2nd Ed. p. 189.
    # ---------------------------------------------------------------------
    def compute_follow(self, start=None):
        # If already computed, return the result
        if self.Follow:
            return self.Follow

        # If first sets not computed yet, do that first.
        if not self.First:
            self.compute_first()

        # Add '$end' to the follow list of the start symbol
        for k in self.Nonterminals:
            self.Follow[k] = []

        if not start:
            start = self.Productions[1].name

        self.Follow[start] = ['$end']

        while True:
            didadd = False
            for p in self.Productions[1:]:
                # Here is the production set
                for i, B in enumerate(p.prod):
                    if B in self.Nonterminals:
                        # Okay. We got a non-terminal in a production
                        fst = self._first(p.prod[i+1:])
                        hasempty = False
                        for f in fst:
                            if f != '<empty>' and f not in self.Follow[B]:
                                self.Follow[B].append(f)
                                didadd = True
                            if f == '<empty>':
                                hasempty = True
                        if hasempty or i == (len(p.prod)-1):
                            # Add elements of follow(a) to follow(b)
                            for f in self.Follow[p.name]:
                                if f not in self.Follow[B]:
                                    self.Follow[B].append(f)
                                    didadd = True
            if not didadd:
                break
        return self.Follow


    # -----------------------------------------------------------------------------
    # build_lritems()
    #
    # This function walks the list of productions and builds a complete set of the
    # LR items.  The LR items are stored in two ways:  First, they are uniquely
    # numbered and placed in the list _lritems.  Second, a linked list of LR items
    # is built for each production.  For example:
    #
    #   E -> E PLUS E
    #
    # Creates the list
    #
    #  [E -> . E PLUS E, E -> E . PLUS E, E -> E PLUS . E, E -> E PLUS E . ]
    # -----------------------------------------------------------------------------

    def build_lritems(self):
        for p in self.Productions:
            lastlri = p
            i = 0
            lr_items = []
            while True:
                if i > len(p):
                    lri = None
                else:
                    lri = LRItem(p, i)
                    # Precompute the list of productions immediately following
                    try:
                        lri.lr_after = self.Prodnames[lri.prod[i+1]]
                    except (IndexError, KeyError):
                        lri.lr_after = []
                    try:
                        lri.lr_before = lri.prod[i-1]
                    except IndexError:
                        lri.lr_before = None

                lastlri.lr_next = lri
                if not lri:
                    break
                lr_items.append(lri)
                lastlri = lri
                i += 1
            p.lr_items = lr_items

# -----------------------------------------------------------------------------
#                            == Class LRTable ==
#
# This basic class represents a basic table of LR parsing information.
# Methods for generating the tables are not defined here.  They are defined
# in the derived class LRGeneratedTable.
# -----------------------------------------------------------------------------

class VersionError(YaccError):
    pass

class LRTable(object):
    def __init__(self):
        self.lr_action = None
        self.lr_goto = None
        self.lr_productions = None
        self.lr_method = None

    def read_table(self, module):
        if isinstance(module, types.ModuleType):
            parsetab = module
        else:
            exec('import %s' % module)
            parsetab = sys.modules[module]

        if parsetab._tabversion != __tabversion__:
            raise VersionError('yacc table file version is out of date')

        self.lr_action = parsetab._lr_action
        self.lr_goto = parsetab._lr_goto

        self.lr_productions = []
        for p in parsetab._lr_productions:
            self.lr_productions.append(MiniProduction(*p))

        self.lr_method = parsetab._lr_method
        return parsetab._lr_signature

    def read_pickle(self, filename):
        try:
            import cPickle as pickle
        except ImportError:
            import pickle

        if not os.path.exists(filename):
          raise ImportError

        in_f = open(filename, 'rb')

        tabversion = pickle.load(in_f)
        if tabversion != __tabversion__:
            raise VersionError('yacc table file version is out of date')
        self.lr_method = pickle.load(in_f)
        signature      = pickle.load(in_f)
        self.lr_action = pickle.load(in_f)
        self.lr_goto   = pickle.load(in_f)
        productions    = pickle.load(in_f)

        self.lr_productions = []
        for p in productions:
            self.lr_productions.append(MiniProduction(*p))

        in_f.close()
        return signature

    # Bind all production function names to callable objects in pdict
    def bind_callables(self, pdict):
        for p in self.lr_productions:
            p.bind(pdict)


# -----------------------------------------------------------------------------
#                           === LR Generator ===
#
# The following classes and functions are used to generate LR parsing tables on
# a grammar.
# -----------------------------------------------------------------------------

# -----------------------------------------------------------------------------
# digraph()
# traverse()
#
# The following two functions are used to compute set valued functions
# of the form:
#
#     F(x) = F'(x) U U{F(y) | x R y}
#
# This is used to compute the values of Read() sets as well as FOLLOW sets
# in LALR(1) generation.
#
# Inputs:  X    - An input set
#          R    - A relation
#          FP   - Set-valued function
# ------------------------------------------------------------------------------

def digraph(X, R, FP):
    N = {}
    for x in X:
        N[x] = 0
    stack = []
    F = {}
    for x in X:
        if N[x] == 0:
            traverse(x, N, stack, F, X, R, FP)
    return F

def traverse(x, N, stack, F, X, R, FP):
    stack.append(x)
    d = len(stack)
    N[x] = d
    F[x] = FP(x)             # F(X) <- F'(x)

    rel = R(x)               # Get y's related to x
    for y in rel:
        if N[y] == 0:
            traverse(y, N, stack, F, X, R, FP)
        N[x] = min(N[x], N[y])
        for a in F.get(y, []):
            if a not in F[x]:
                F[x].append(a)
    if N[x] == d:
        N[stack[-1]] = MAXINT
        F[stack[-1]] = F[x]
        element = stack.pop()
        while element != x:
            N[stack[-1]] = MAXINT
            F[stack[-1]] = F[x]
            element = stack.pop()

class LALRError(YaccError):
    pass

# -----------------------------------------------------------------------------
#                             == LRGeneratedTable ==
#
# This class implements the LR table generation algorithm.  There are no
# public methods except for write()
# -----------------------------------------------------------------------------

class LRGeneratedTable(LRTable):
    def __init__(self, grammar, method='LALR', log=None):
        if method not in ['SLR', 'LALR']:
            raise LALRError('Unsupported method %s' % method)

        self.grammar = grammar
        self.lr_method = method

        # Set up the logger
        if not log:
            log = NullLogger()
        self.log = log

        # Internal attributes
        self.lr_action     = {}        # Action table
        self.lr_goto       = {}        # Goto table
        self.lr_productions  = grammar.Productions    # Copy of grammar Production array
        self.lr_goto_cache = {}        # Cache of computed gotos
        self.lr0_cidhash   = {}        # Cache of closures

        self._add_count    = 0         # Internal counter used to detect cycles

        # Diagonistic information filled in by the table generator
        self.sr_conflict   = 0
        self.rr_conflict   = 0
        self.conflicts     = []        # List of conflicts

        self.sr_conflicts  = []
        self.rr_conflicts  = []

        # Build the tables
        self.grammar.build_lritems()
        self.grammar.compute_first()
        self.grammar.compute_follow()
        self.lr_parse_table()

    # Compute the LR(0) closure operation on I, where I is a set of LR(0) items.

    def lr0_closure(self, I):
        self._add_count += 1

        # Add everything in I to J
        J = I[:]
        didadd = True
        while didadd:
            didadd = False
            for j in J:
                for x in j.lr_after:
                    if getattr(x, 'lr0_added', 0) == self._add_count:
                        continue
                    # Add B --> .G to J
                    J.append(x.lr_next)
                    x.lr0_added = self._add_count
                    didadd = True

        return J

    # Compute the LR(0) goto function goto(I,X) where I is a set
    # of LR(0) items and X is a grammar symbol.   This function is written
    # in a way that guarantees uniqueness of the generated goto sets
    # (i.e. the same goto set will never be returned as two different Python
    # objects).  With uniqueness, we can later do fast set comparisons using
    # id(obj) instead of element-wise comparison.

    def lr0_goto(self, I, x):
        # First we look for a previously cached entry
        g = self.lr_goto_cache.get((id(I), x))
        if g:
            return g

        # Now we generate the goto set in a way that guarantees uniqueness
        # of the result

        s = self.lr_goto_cache.get(x)
        if not s:
            s = {}
            self.lr_goto_cache[x] = s

        gs = []
        for p in I:
            n = p.lr_next
            if n and n.lr_before == x:
                s1 = s.get(id(n))
                if not s1:
                    s1 = {}
                    s[id(n)] = s1
                gs.append(n)
                s = s1
        g = s.get('$end')
        if not g:
            if gs:
                g = self.lr0_closure(gs)
                s['$end'] = g
            else:
                s['$end'] = gs
        self.lr_goto_cache[(id(I), x)] = g
        return g

    # Compute the LR(0) sets of item function
    def lr0_items(self):
        C = [self.lr0_closure([self.grammar.Productions[0].lr_next])]
        i = 0
        for I in C:
            self.lr0_cidhash[id(I)] = i
            i += 1

        # Loop over the items in C and each grammar symbols
        i = 0
        while i < len(C):
            I = C[i]
            i += 1

            # Collect all of the symbols that could possibly be in the goto(I,X) sets
            asyms = {}
            for ii in I:
                for s in ii.usyms:
                    asyms[s] = None

            for x in asyms:
                g = self.lr0_goto(I, x)
                if not g or id(g) in self.lr0_cidhash:
                    continue
                self.lr0_cidhash[id(g)] = len(C)
                C.append(g)

        return C

    # -----------------------------------------------------------------------------
    #                       ==== LALR(1) Parsing ====
    #
    # LALR(1) parsing is almost exactly the same as SLR except that instead of
    # relying upon Follow() sets when performing reductions, a more selective
    # lookahead set that incorporates the state of the LR(0) machine is utilized.
    # Thus, we mainly just have to focus on calculating the lookahead sets.
    #
    # The method used here is due to DeRemer and Pennelo (1982).
    #
    # DeRemer, F. L., and T. J. Pennelo: "Efficient Computation of LALR(1)
    #     Lookahead Sets", ACM Transactions on Programming Languages and Systems,
    #     Vol. 4, No. 4, Oct. 1982, pp. 615-649
    #
    # Further details can also be found in:
    #
    #  J. Tremblay and P. Sorenson, "The Theory and Practice of Compiler Writing",
    #      McGraw-Hill Book Company, (1985).
    #
    # -----------------------------------------------------------------------------

    # -----------------------------------------------------------------------------
    # compute_nullable_nonterminals()
    #
    # Creates a dictionary containing all of the non-terminals that might produce
    # an empty production.
    # -----------------------------------------------------------------------------

    def compute_nullable_nonterminals(self):
        nullable = set()
        num_nullable = 0
        while True:
            for p in self.grammar.Productions[1:]:
                if p.len == 0:
                    nullable.add(p.name)
                    continue
                for t in p.prod:
                    if t not in nullable:
                        break
                else:
                    nullable.add(p.name)
            if len(nullable) == num_nullable:
                break
            num_nullable = len(nullable)
        return nullable

    # -----------------------------------------------------------------------------
    # find_nonterminal_trans(C)
    #
    # Given a set of LR(0) items, this functions finds all of the non-terminal
    # transitions.    These are transitions in which a dot appears immediately before
    # a non-terminal.   Returns a list of tuples of the form (state,N) where state
    # is the state number and N is the nonterminal symbol.
    #
    # The input C is the set of LR(0) items.
    # -----------------------------------------------------------------------------

    def find_nonterminal_transitions(self, C):
        trans = []
        for stateno, state in enumerate(C):
            for p in state:
                if p.lr_index < p.len - 1:
                    t = (stateno, p.prod[p.lr_index+1])
                    if t[1] in self.grammar.Nonterminals:
                        if t not in trans:
                            trans.append(t)
        return trans

    # -----------------------------------------------------------------------------
    # dr_relation()
    #
    # Computes the DR(p,A) relationships for non-terminal transitions.  The input
    # is a tuple (state,N) where state is a number and N is a nonterminal symbol.
    #
    # Returns a list of terminals.
    # -----------------------------------------------------------------------------

    def dr_relation(self, C, trans, nullable):
        dr_set = {}
        state, N = trans
        terms = []

        g = self.lr0_goto(C[state], N)
        for p in g:
            if p.lr_index < p.len - 1:
                a = p.prod[p.lr_index+1]
                if a in self.grammar.Terminals:
                    if a not in terms:
                        terms.append(a)

        # This extra bit is to handle the start state
        if state == 0 and N == self.grammar.Productions[0].prod[0]:
            terms.append('$end')

        return terms

    # -----------------------------------------------------------------------------
    # reads_relation()
    #
    # Computes the READS() relation (p,A) READS (t,C).
    # -----------------------------------------------------------------------------

    def reads_relation(self, C, trans, empty):
        # Look for empty transitions
        rel = []
        state, N = trans

        g = self.lr0_goto(C[state], N)
        j = self.lr0_cidhash.get(id(g), -1)
        for p in g:
            if p.lr_index < p.len - 1:
                a = p.prod[p.lr_index + 1]
                if a in empty:
                    rel.append((j, a))

        return rel

    # -----------------------------------------------------------------------------
    # compute_lookback_includes()
    #
    # Determines the lookback and includes relations
    #
    # LOOKBACK:
    #
    # This relation is determined by running the LR(0) state machine forward.
    # For example, starting with a production "N : . A B C", we run it forward
    # to obtain "N : A B C ."   We then build a relationship between this final
    # state and the starting state.   These relationships are stored in a dictionary
    # lookdict.
    #
    # INCLUDES:
    #
    # Computes the INCLUDE() relation (p,A) INCLUDES (p',B).
    #
    # This relation is used to determine non-terminal transitions that occur
    # inside of other non-terminal transition states.   (p,A) INCLUDES (p', B)
    # if the following holds:
    #
    #       B -> LAT, where T -> epsilon and p' -L-> p
    #
    # L is essentially a prefix (which may be empty), T is a suffix that must be
    # able to derive an empty string.  State p' must lead to state p with the string L.
    #
    # -----------------------------------------------------------------------------

    def compute_lookback_includes(self, C, trans, nullable):
        lookdict = {}          # Dictionary of lookback relations
        includedict = {}       # Dictionary of include relations

        # Make a dictionary of non-terminal transitions
        dtrans = {}
        for t in trans:
            dtrans[t] = 1

        # Loop over all transitions and compute lookbacks and includes
        for state, N in trans:
            lookb = []
            includes = []
            for p in C[state]:
                if p.name != N:
                    continue

                # Okay, we have a name match.  We now follow the production all the way
                # through the state machine until we get the . on the right hand side

                lr_index = p.lr_index
                j = state
                while lr_index < p.len - 1:
                    lr_index = lr_index + 1
                    t = p.prod[lr_index]

                    # Check to see if this symbol and state are a non-terminal transition
                    if (j, t) in dtrans:
                        # Yes.  Okay, there is some chance that this is an includes relation
                        # the only way to know for certain is whether the rest of the
                        # production derives empty

                        li = lr_index + 1
                        while li < p.len:
                            if p.prod[li] in self.grammar.Terminals:
                                break      # No forget it
                            if p.prod[li] not in nullable:
                                break
                            li = li + 1
                        else:
                            # Appears to be a relation between (j,t) and (state,N)
                            includes.append((j, t))

                    g = self.lr0_goto(C[j], t)               # Go to next set
                    j = self.lr0_cidhash.get(id(g), -1)      # Go to next state

                # When we get here, j is the final state, now we have to locate the production
                for r in C[j]:
                    if r.name != p.name:
                        continue
                    if r.len != p.len:
                        continue
                    i = 0
                    # This look is comparing a production ". A B C" with "A B C ."
                    while i < r.lr_index:
                        if r.prod[i] != p.prod[i+1]:
                            break
                        i = i + 1
                    else:
                        lookb.append((j, r))
            for i in includes:
                if i not in includedict:
                    includedict[i] = []
                includedict[i].append((state, N))
            lookdict[(state, N)] = lookb

        return lookdict, includedict

    # -----------------------------------------------------------------------------
    # compute_read_sets()
    #
    # Given a set of LR(0) items, this function computes the read sets.
    #
    # Inputs:  C        =  Set of LR(0) items
    #          ntrans   = Set of nonterminal transitions
    #          nullable = Set of empty transitions
    #
    # Returns a set containing the read sets
    # -----------------------------------------------------------------------------

    def compute_read_sets(self, C, ntrans, nullable):
        FP = lambda x: self.dr_relation(C, x, nullable)
        R =  lambda x: self.reads_relation(C, x, nullable)
        F = digraph(ntrans, R, FP)
        return F

    # -----------------------------------------------------------------------------
    # compute_follow_sets()
    #
    # Given a set of LR(0) items, a set of non-terminal transitions, a readset,
    # and an include set, this function computes the follow sets
    #
    # Follow(p,A) = Read(p,A) U U {Follow(p',B) | (p,A) INCLUDES (p',B)}
    #
    # Inputs:
    #            ntrans     = Set of nonterminal transitions
    #            readsets   = Readset (previously computed)
    #            inclsets   = Include sets (previously computed)
    #
    # Returns a set containing the follow sets
    # -----------------------------------------------------------------------------

    def compute_follow_sets(self, ntrans, readsets, inclsets):
        FP = lambda x: readsets[x]
        R  = lambda x: inclsets.get(x, [])
        F = digraph(ntrans, R, FP)
        return F

    # -----------------------------------------------------------------------------
    # add_lookaheads()
    #
    # Attaches the lookahead symbols to grammar rules.
    #
    # Inputs:    lookbacks         -  Set of lookback relations
    #            followset         -  Computed follow set
    #
    # This function directly attaches the lookaheads to productions contained
    # in the lookbacks set
    # -----------------------------------------------------------------------------

    def add_lookaheads(self, lookbacks, followset):
        for trans, lb in lookbacks.items():
            # Loop over productions in lookback
            for state, p in lb:
                if state not in p.lookaheads:
                    p.lookaheads[state] = []
                f = followset.get(trans, [])
                for a in f:
                    if a not in p.lookaheads[state]:
                        p.lookaheads[state].append(a)

    # -----------------------------------------------------------------------------
    # add_lalr_lookaheads()
    #
    # This function does all of the work of adding lookahead information for use
    # with LALR parsing
    # -----------------------------------------------------------------------------

    def add_lalr_lookaheads(self, C):
        # Determine all of the nullable nonterminals
        nullable = self.compute_nullable_nonterminals()

        # Find all non-terminal transitions
        trans = self.find_nonterminal_transitions(C)

        # Compute read sets
        readsets = self.compute_read_sets(C, trans, nullable)

        # Compute lookback/includes relations
        lookd, included = self.compute_lookback_includes(C, trans, nullable)

        # Compute LALR FOLLOW sets
        followsets = self.compute_follow_sets(trans, readsets, included)

        # Add all of the lookaheads
        self.add_lookaheads(lookd, followsets)

    # -----------------------------------------------------------------------------
    # lr_parse_table()
    #
    # This function constructs the parse tables for SLR or LALR
    # -----------------------------------------------------------------------------
    def lr_parse_table(self):
        Productions = self.grammar.Productions
        Precedence  = self.grammar.Precedence
        goto   = self.lr_goto         # Goto array
        action = self.lr_action       # Action array
        log    = self.log             # Logger for output

        actionp = {}                  # Action production array (temporary)

        log.info('Parsing method: %s', self.lr_method)

        # Step 1: Construct C = { I0, I1, ... IN}, collection of LR(0) items
        # This determines the number of states

        C = self.lr0_items()

        if self.lr_method == 'LALR':
            self.add_lalr_lookaheads(C)

        # Build the parser table, state by state
        st = 0
        for I in C:
            # Loop over each production in I
            actlist = []              # List of actions
            st_action  = {}
            st_actionp = {}
            st_goto    = {}
            log.info('')
            log.info('state %d', st)
            log.info('')
            for p in I:
                log.info('    (%d) %s', p.number, p)
            log.info('')

            for p in I:
                    if p.len == p.lr_index + 1:
                        if p.name == "S'":
                            # Start symbol. Accept!
                            st_action['$end'] = 0
                            st_actionp['$end'] = p
                        else:
                            # We are at the end of a production.  Reduce!
                            if self.lr_method == 'LALR':
                                laheads = p.lookaheads[st]
                            else:
                                laheads = self.grammar.Follow[p.name]
                            for a in laheads:
                                actlist.append((a, p, 'reduce using rule %d (%s)' % (p.number, p)))
                                r = st_action.get(a)
                                if r is not None:
                                    # Whoa. Have a shift/reduce or reduce/reduce conflict
                                    if r > 0:
                                        # Need to decide on shift or reduce here
                                        # By default we favor shifting. Need to add
                                        # some precedence rules here.

                                        # Shift precedence comes from the token
                                        sprec, slevel = Precedence.get(a, ('right', 0))

                                        # Reduce precedence comes from rule being reduced (p)
                                        rprec, rlevel = Productions[p.number].prec

                                        if (slevel < rlevel) or ((slevel == rlevel) and (rprec == 'left')):
                                            # We really need to reduce here.
                                            st_action[a] = -p.number
                                            st_actionp[a] = p
                                            if not slevel and not rlevel:
                                                log.info('  ! shift/reduce conflict for %s resolved as reduce', a)
                                                self.sr_conflicts.append((st, a, 'reduce'))
                                            Productions[p.number].reduced += 1
                                        elif (slevel == rlevel) and (rprec == 'nonassoc'):
                                            st_action[a] = None
                                        else:
                                            # Hmmm. Guess we'll keep the shift
                                            if not rlevel:
                                                log.info('  ! shift/reduce conflict for %s resolved as shift', a)
                                                self.sr_conflicts.append((st, a, 'shift'))
                                    elif r < 0:
                                        # Reduce/reduce conflict.   In this case, we favor the rule
                                        # that was defined first in the grammar file
                                        oldp = Productions[-r]
                                        pp = Productions[p.number]
                                        if oldp.line > pp.line:
                                            st_action[a] = -p.number
                                            st_actionp[a] = p
                                            chosenp, rejectp = pp, oldp
                                            Productions[p.number].reduced += 1
                                            Productions[oldp.number].reduced -= 1
                                        else:
                                            chosenp, rejectp = oldp, pp
                                        self.rr_conflicts.append((st, chosenp, rejectp))
                                        log.info('  ! reduce/reduce conflict for %s resolved using rule %d (%s)',
                                                 a, st_actionp[a].number, st_actionp[a])
                                    else:
                                        raise LALRError('Unknown conflict in state %d' % st)
                                else:
                                    st_action[a] = -p.number
                                    st_actionp[a] = p
                                    Productions[p.number].reduced += 1
                    else:
                        i = p.lr_index
                        a = p.prod[i+1]       # Get symbol right after the "."
                        if a in self.grammar.Terminals:
                            g = self.lr0_goto(I, a)
                            j = self.lr0_cidhash.get(id(g), -1)
                            if j >= 0:
                                # We are in a shift state
                                actlist.append((a, p, 'shift and go to state %d' % j))
                                r = st_action.get(a)
                                if r is not None:
                                    # Whoa have a shift/reduce or shift/shift conflict
                                    if r > 0:
                                        if r != j:
                                            raise LALRError('Shift/shift conflict in state %d' % st)
                                    elif r < 0:
                                        # Do a precedence check.
                                        #   -  if precedence of reduce rule is higher, we reduce.
                                        #   -  if precedence of reduce is same and left assoc, we reduce.
                                        #   -  otherwise we shift

                                        # Shift precedence comes from the token
                                        sprec, slevel = Precedence.get(a, ('right', 0))

                                        # Reduce precedence comes from the rule that could have been reduced
                                        rprec, rlevel = Productions[st_actionp[a].number].prec

                                        if (slevel > rlevel) or ((slevel == rlevel) and (rprec == 'right')):
                                            # We decide to shift here... highest precedence to shift
                                            Productions[st_actionp[a].number].reduced -= 1
                                            st_action[a] = j
                                            st_actionp[a] = p
                                            if not rlevel:
                                                log.info('  ! shift/reduce conflict for %s resolved as shift', a)
                                                self.sr_conflicts.append((st, a, 'shift'))
                                        elif (slevel == rlevel) and (rprec == 'nonassoc'):
                                            st_action[a] = None
                                        else:
                                            # Hmmm. Guess we'll keep the reduce
                                            if not slevel and not rlevel:
                                                log.info('  ! shift/reduce conflict for %s resolved as reduce', a)
                                                self.sr_conflicts.append((st, a, 'reduce'))

                                    else:
                                        raise LALRError('Unknown conflict in state %d' % st)
                                else:
                                    st_action[a] = j
                                    st_actionp[a] = p

            # Print the actions associated with each terminal
            _actprint = {}
            for a, p, m in actlist:
                if a in st_action:
                    if p is st_actionp[a]:
                        log.info('    %-15s %s', a, m)
                        _actprint[(a, m)] = 1
            log.info('')
            # Print the actions that were not used. (debugging)
            not_used = 0
            for a, p, m in actlist:
                if a in st_action:
                    if p is not st_actionp[a]:
                        if not (a, m) in _actprint:
                            log.debug('  ! %-15s [ %s ]', a, m)
                            not_used = 1
                            _actprint[(a, m)] = 1
            if not_used:
                log.debug('')

            # Construct the goto table for this state

            nkeys = {}
            for ii in I:
                for s in ii.usyms:
                    if s in self.grammar.Nonterminals:
                        nkeys[s] = None
            for n in nkeys:
                g = self.lr0_goto(I, n)
                j = self.lr0_cidhash.get(id(g), -1)
                if j >= 0:
                    st_goto[n] = j
                    log.info('    %-30s shift and go to state %d', n, j)

            action[st] = st_action
            actionp[st] = st_actionp
            goto[st] = st_goto
            st += 1

    # -----------------------------------------------------------------------------
    # write()
    #
    # This function writes the LR parsing tables to a file
    # -----------------------------------------------------------------------------

    def write_table(self, tabmodule, outputdir='', signature=''):
        if isinstance(tabmodule, types.ModuleType):
            raise IOError("Won't overwrite existing tabmodule")

        basemodulename = tabmodule.split('.')[-1]
        filename = os.path.join(outputdir, basemodulename) + '.py'
        try:
            f = open(filename, 'w')

            f.write('''
# %s
# This file is automatically generated. Do not edit.
_tabversion = %r

_lr_method = %r

_lr_signature = %r
    ''' % (os.path.basename(filename), __tabversion__, self.lr_method, signature))

            # Change smaller to 0 to go back to original tables
            smaller = 1

            # Factor out names to try and make smaller
            if smaller:
                items = {}

                for s, nd in self.lr_action.items():
                    for name, v in nd.items():
                        i = items.get(name)
                        if not i:
                            i = ([], [])
                            items[name] = i
                        i[0].append(s)
                        i[1].append(v)

                f.write('\n_lr_action_items = {')
                for k, v in items.items():
                    f.write('%r:([' % k)
                    for i in v[0]:
                        f.write('%r,' % i)
                    f.write('],[')
                    for i in v[1]:
                        f.write('%r,' % i)

                    f.write(']),')
                f.write('}\n')

                f.write('''
_lr_action = {}
for _k, _v in _lr_action_items.items():
   for _x,_y in zip(_v[0],_v[1]):
      if not _x in _lr_action:  _lr_action[_x] = {}
      _lr_action[_x][_k] = _y
del _lr_action_items
''')

            else:
                f.write('\n_lr_action = { ')
                for k, v in self.lr_action.items():
                    f.write('(%r,%r):%r,' % (k[0], k[1], v))
                f.write('}\n')

            if smaller:
                # Factor out names to try and make smaller
                items = {}

                for s, nd in self.lr_goto.items():
                    for name, v in nd.items():
                        i = items.get(name)
                        if not i:
                            i = ([], [])
                            items[name] = i
                        i[0].append(s)
                        i[1].append(v)

                f.write('\n_lr_goto_items = {')
                for k, v in items.items():
                    f.write('%r:([' % k)
                    for i in v[0]:
                        f.write('%r,' % i)
                    f.write('],[')
                    for i in v[1]:
                        f.write('%r,' % i)

                    f.write(']),')
                f.write('}\n')

                f.write('''
_lr_goto = {}
for _k, _v in _lr_goto_items.items():
   for _x, _y in zip(_v[0], _v[1]):
       if not _x in _lr_goto: _lr_goto[_x] = {}
       _lr_goto[_x][_k] = _y
del _lr_goto_items
''')
            else:
                f.write('\n_lr_goto = { ')
                for k, v in self.lr_goto.items():
                    f.write('(%r,%r):%r,' % (k[0], k[1], v))
                f.write('}\n')

            # Write production table
            f.write('_lr_productions = [\n')
            for p in self.lr_productions:
                if p.func:
                    f.write('  (%r,%r,%d,%r,%r,%d),\n' % (p.str, p.name, p.len,
                                                          p.func, os.path.basename(p.file), p.line))
                else:
                    f.write('  (%r,%r,%d,None,None,None),\n' % (str(p), p.name, p.len))
            f.write(']\n')
            f.close()

        except IOError as e:
            raise


    # -----------------------------------------------------------------------------
    # pickle_table()
    #
    # This function pickles the LR parsing tables to a supplied file object
    # -----------------------------------------------------------------------------

    def pickle_table(self, filename, signature=''):
        try:
            import cPickle as pickle
        except ImportError:
            import pickle
        with open(filename, 'wb') as outf:
            pickle.dump(__tabversion__, outf, pickle_protocol)
            pickle.dump(self.lr_method, outf, pickle_protocol)
            pickle.dump(signature, outf, pickle_protocol)
            pickle.dump(self.lr_action, outf, pickle_protocol)
            pickle.dump(self.lr_goto, outf, pickle_protocol)

            outp = []
            for p in self.lr_productions:
                if p.func:
                    outp.append((p.str, p.name, p.len, p.func, os.path.basename(p.file), p.line))
                else:
                    outp.append((str(p), p.name, p.len, None, None, None))
            pickle.dump(outp, outf, pickle_protocol)

# -----------------------------------------------------------------------------
#                            === INTROSPECTION ===
#
# The following functions and classes are used to implement the PLY
# introspection features followed by the yacc() function itself.
# -----------------------------------------------------------------------------

# -----------------------------------------------------------------------------
# get_caller_module_dict()
#
# This function returns a dictionary containing all of the symbols defined within
# a caller further down the call stack.  This is used to get the environment
# associated with the yacc() call if none was provided.
# -----------------------------------------------------------------------------

def get_caller_module_dict(levels):
    f = sys._getframe(levels)
    ldict = f.f_globals.copy()
    if f.f_globals != f.f_locals:
        ldict.update(f.f_locals)
    return ldict

# -----------------------------------------------------------------------------
# parse_grammar()
#
# This takes a raw grammar rule string and parses it into production data
# -----------------------------------------------------------------------------
def parse_grammar(doc, file, line):
    grammar = []
    # Split the doc string into lines
    pstrings = doc.splitlines()
    lastp = None
    dline = line
    for ps in pstrings:
        dline += 1
        p = ps.split()
        if not p:
            continue
        try:
            if p[0] == '|':
                # This is a continuation of a previous rule
                if not lastp:
                    raise SyntaxError("%s:%d: Misplaced '|'" % (file, dline))
                prodname = lastp
                syms = p[1:]
            else:
                prodname = p[0]
                lastp = prodname
                syms   = p[2:]
                assign = p[1]
                if assign != ':' and assign != '::=':
                    raise SyntaxError("%s:%d: Syntax error. Expected ':'" % (file, dline))

            grammar.append((file, dline, prodname, syms))
        except SyntaxError:
            raise
        except Exception:
            raise SyntaxError('%s:%d: Syntax error in rule %r' % (file, dline, ps.strip()))

    return grammar

# -----------------------------------------------------------------------------
# ParserReflect()
#
# This class represents information extracted for building a parser including
# start symbol, error function, tokens, precedence list, action functions,
# etc.
# -----------------------------------------------------------------------------
class ParserReflect(object):
    def __init__(self, pdict, log=None):
        self.pdict      = pdict
        self.start      = None
        self.error_func = None
        self.tokens     = None
        self.modules    = set()
        self.grammar    = []
        self.error      = False

        if log is None:
            self.log = PlyLogger(sys.stderr)
        else:
            self.log = log

    # Get all of the basic information
    def get_all(self):
        self.get_start()
        self.get_error_func()
        self.get_tokens()
        self.get_precedence()
        self.get_pfunctions()

    # Validate all of the information
    def validate_all(self):
        self.validate_start()
        self.validate_error_func()
        self.validate_tokens()
        self.validate_precedence()
        self.validate_pfunctions()
        self.validate_modules()
        return self.error

    # Compute a signature over the grammar
    def signature(self):
        parts = []
        try:
            if self.start:
                parts.append(self.start)
            if self.prec:
                parts.append(''.join([''.join(p) for p in self.prec]))
            if self.tokens:
                parts.append(' '.join(self.tokens))
            for f in self.pfuncs:
                if f[3]:
                    parts.append(f[3])
        except (TypeError, ValueError):
            pass
        return ''.join(parts)

    # -----------------------------------------------------------------------------
    # validate_modules()
    #
    # This method checks to see if there are duplicated p_rulename() functions
    # in the parser module file.  Without this function, it is really easy for
    # users to make mistakes by cutting and pasting code fragments (and it's a real
    # bugger to try and figure out why the resulting parser doesn't work).  Therefore,
    # we just do a little regular expression pattern matching of def statements
    # to try and detect duplicates.
    # -----------------------------------------------------------------------------

    def validate_modules(self):
        # Match def p_funcname(
        fre = re.compile(r'\s*def\s+(p_[a-zA-Z_0-9]*)\(')

        for module in self.modules:
            try:
                lines, linen = inspect.getsourcelines(module)
            except IOError:
                continue

            counthash = {}
            for linen, line in enumerate(lines):
                linen += 1
                m = fre.match(line)
                if m:
                    name = m.group(1)
                    prev = counthash.get(name)
                    if not prev:
                        counthash[name] = linen
                    else:
                        filename = inspect.getsourcefile(module)
                        self.log.warning('%s:%d: Function %s redefined. Previously defined on line %d',
                                         filename, linen, name, prev)

    # Get the start symbol
    def get_start(self):
        self.start = self.pdict.get('start')

    # Validate the start symbol
    def validate_start(self):
        if self.start is not None:
            if not isinstance(self.start, string_types):
                self.log.error("'start' must be a string")

    # Look for error handler
    def get_error_func(self):
        self.error_func = self.pdict.get('p_error')

    # Validate the error function
    def validate_error_func(self):
        if self.error_func:
            if isinstance(self.error_func, types.FunctionType):
                ismethod = 0
            elif isinstance(self.error_func, types.MethodType):
                ismethod = 1
            else:
                self.log.error("'p_error' defined, but is not a function or method")
                self.error = True
                return

            eline = self.error_func.__code__.co_firstlineno
            efile = self.error_func.__code__.co_filename
            module = inspect.getmodule(self.error_func)
            self.modules.add(module)

            argcount = self.error_func.__code__.co_argcount - ismethod
            if argcount != 1:
                self.log.error('%s:%d: p_error() requires 1 argument', efile, eline)
                self.error = True

    # Get the tokens map
    def get_tokens(self):
        tokens = self.pdict.get('tokens')
        if not tokens:
            self.log.error('No token list is defined')
            self.error = True
            return

        if not isinstance(tokens, (list, tuple)):
            self.log.error('tokens must be a list or tuple')
            self.error = True
            return

        if not tokens:
            self.log.error('tokens is empty')
            self.error = True
            return

        self.tokens = tokens

    # Validate the tokens
    def validate_tokens(self):
        # Validate the tokens.
        if 'error' in self.tokens:
            self.log.error("Illegal token name 'error'. Is a reserved word")
            self.error = True
            return

        terminals = set()
        for n in self.tokens:
            if n in terminals:
                self.log.warning('Token %r multiply defined', n)
            terminals.add(n)

    # Get the precedence map (if any)
    def get_precedence(self):
        self.prec = self.pdict.get('precedence')

    # Validate and parse the precedence map
    def validate_precedence(self):
        preclist = []
        if self.prec:
            if not isinstance(self.prec, (list, tuple)):
                self.log.error('precedence must be a list or tuple')
                self.error = True
                return
            for level, p in enumerate(self.prec):
                if not isinstance(p, (list, tuple)):
                    self.log.error('Bad precedence table')
                    self.error = True
                    return

                if len(p) < 2:
                    self.log.error('Malformed precedence entry %s. Must be (assoc, term, ..., term)', p)
                    self.error = True
                    return
                assoc = p[0]
                if not isinstance(assoc, string_types):
                    self.log.error('precedence associativity must be a string')
                    self.error = True
                    return
                for term in p[1:]:
                    if not isinstance(term, string_types):
                        self.log.error('precedence items must be strings')
                        self.error = True
                        return
                    preclist.append((term, assoc, level+1))
        self.preclist = preclist

    # Get all p_functions from the grammar
    def get_pfunctions(self):
        p_functions = []
        for name, item in self.pdict.items():
            if not name.startswith('p_') or name == 'p_error':
                continue
            if isinstance(item, (types.FunctionType, types.MethodType)):
                line = getattr(item, 'co_firstlineno', item.__code__.co_firstlineno)
                module = inspect.getmodule(item)
                p_functions.append((line, module, name, item.__doc__))

        # Sort all of the actions by line number; make sure to stringify
        # modules to make them sortable, since `line` may not uniquely sort all
        # p functions
        p_functions.sort(key=lambda p_function: (
            p_function[0],
            str(p_function[1]),
            p_function[2],
            p_function[3]))
        self.pfuncs = p_functions

    # Validate all of the p_functions
    def validate_pfunctions(self):
        grammar = []
        # Check for non-empty symbols
        if len(self.pfuncs) == 0:
            self.log.error('no rules of the form p_rulename are defined')
            self.error = True
            return

        for line, module, name, doc in self.pfuncs:
            file = inspect.getsourcefile(module)
            func = self.pdict[name]
            if isinstance(func, types.MethodType):
                reqargs = 2
            else:
                reqargs = 1
            if func.__code__.co_argcount > reqargs:
                self.log.error('%s:%d: Rule %r has too many arguments', file, line, func.__name__)
                self.error = True
            elif func.__code__.co_argcount < reqargs:
                self.log.error('%s:%d: Rule %r requires an argument', file, line, func.__name__)
                self.error = True
            elif not func.__doc__:
                self.log.warning('%s:%d: No documentation string specified in function %r (ignored)',
                                 file, line, func.__name__)
            else:
                try:
                    parsed_g = parse_grammar(doc, file, line)
                    for g in parsed_g:
                        grammar.append((name, g))
                except SyntaxError as e:
                    self.log.error(str(e))
                    self.error = True

                # Looks like a valid grammar rule
                # Mark the file in which defined.
                self.modules.add(module)

        # Secondary validation step that looks for p_ definitions that are not functions
        # or functions that look like they might be grammar rules.

        for n, v in self.pdict.items():
            if n.startswith('p_') and isinstance(v, (types.FunctionType, types.MethodType)):
                continue
            if n.startswith('t_'):
                continue
            if n.startswith('p_') and n != 'p_error':
                self.log.warning('%r not defined as a function', n)
            if ((isinstance(v, types.FunctionType) and v.__code__.co_argcount == 1) or
                   (isinstance(v, types.MethodType) and v.__func__.__code__.co_argcount == 2)):
                if v.__doc__:
                    try:
                        doc = v.__doc__.split(' ')
                        if doc[1] == ':':
                            self.log.warning('%s:%d: Possible grammar rule %r defined without p_ prefix',
                                             v.__code__.co_filename, v.__code__.co_firstlineno, n)
                    except IndexError:
                        pass

        self.grammar = grammar

# -----------------------------------------------------------------------------
# yacc(module)
#
# Build a parser
# -----------------------------------------------------------------------------

def yacc(method='LALR', debug=yaccdebug, module=None, tabmodule=tab_module, start=None,
         check_recursion=True, optimize=False, write_tables=True, debugfile=debug_file,
         outputdir=None, debuglog=None, errorlog=None, picklefile=None):

    if tabmodule is None:
        tabmodule = tab_module

    # Reference to the parsing method of the last built parser
    global parse

    # If pickling is enabled, table files are not created
    if picklefile:
        write_tables = 0

    if errorlog is None:
        errorlog = PlyLogger(sys.stderr)

    # Get the module dictionary used for the parser
    if module:
        _items = [(k, getattr(module, k)) for k in dir(module)]
        pdict = dict(_items)
        # If no __file__ attribute is available, try to obtain it from the __module__ instead
        if '__file__' not in pdict:
            pdict['__file__'] = sys.modules[pdict['__module__']].__file__
    else:
        pdict = get_caller_module_dict(2)

    if outputdir is None:
        # If no output directory is set, the location of the output files
        # is determined according to the following rules:
        #     - If tabmodule specifies a package, files go into that package directory
        #     - Otherwise, files go in the same directory as the specifying module
        if isinstance(tabmodule, types.ModuleType):
            srcfile = tabmodule.__file__
        else:
            if '.' not in tabmodule:
                srcfile = pdict['__file__']
            else:
                parts = tabmodule.split('.')
                pkgname = '.'.join(parts[:-1])
                exec('import %s' % pkgname)
                srcfile = getattr(sys.modules[pkgname], '__file__', '')
        outputdir = os.path.dirname(srcfile)

    # Determine if the module is package of a package or not.
    # If so, fix the tabmodule setting so that tables load correctly
    pkg = pdict.get('__package__')
    if pkg and isinstance(tabmodule, str):
        if '.' not in tabmodule:
            tabmodule = pkg + '.' + tabmodule



    # Set start symbol if it's specified directly using an argument
    if start is not None:
        pdict['start'] = start

    # Collect parser information from the dictionary
    pinfo = ParserReflect(pdict, log=errorlog)
    pinfo.get_all()

    if pinfo.error:
        raise YaccError('Unable to build parser')

    # Check signature against table files (if any)
    signature = pinfo.signature()

    # Read the tables
    try:
        lr = LRTable()
        if picklefile:
            read_signature = lr.read_pickle(picklefile)
        else:
            read_signature = lr.read_table(tabmodule)
        if optimize or (read_signature == signature):
            try:
                lr.bind_callables(pinfo.pdict)
                parser = LRParser(lr, pinfo.error_func)
                parse = parser.parse
                return parser
            except Exception as e:
                errorlog.warning('There was a problem loading the table file: %r', e)
    except VersionError as e:
        errorlog.warning(str(e))
    except ImportError:
        pass

    if debuglog is None:
        if debug:
            try:
                debuglog = PlyLogger(open(os.path.join(outputdir, debugfile), 'w'))
            except IOError as e:
                errorlog.warning("Couldn't open %r. %s" % (debugfile, e))
                debuglog = NullLogger()
        else:
            debuglog = NullLogger()

    debuglog.info('Created by PLY version %s (http://www.dabeaz.com/ply)', __version__)

    errors = False

    # Validate the parser information
    if pinfo.validate_all():
        raise YaccError('Unable to build parser')

    if not pinfo.error_func:
        errorlog.warning('no p_error() function is defined')

    # Create a grammar object
    grammar = Grammar(pinfo.tokens)

    # Set precedence level for terminals
    for term, assoc, level in pinfo.preclist:
        try:
            grammar.set_precedence(term, assoc, level)
        except GrammarError as e:
            errorlog.warning('%s', e)

    # Add productions to the grammar
    for funcname, gram in pinfo.grammar:
        file, line, prodname, syms = gram
        try:
            grammar.add_production(prodname, syms, funcname, file, line)
        except GrammarError as e:
            errorlog.error('%s', e)
            errors = True

    # Set the grammar start symbols
    try:
        if start is None:
            grammar.set_start(pinfo.start)
        else:
            grammar.set_start(start)
    except GrammarError as e:
        errorlog.error(str(e))
        errors = True

    if errors:
        raise YaccError('Unable to build parser')

    # Verify the grammar structure
    undefined_symbols = grammar.undefined_symbols()
    for sym, prod in undefined_symbols:
        errorlog.error('%s:%d: Symbol %r used, but not defined as a token or a rule', prod.file, prod.line, sym)
        errors = True

    unused_terminals = grammar.unused_terminals()
    if unused_terminals:
        debuglog.info('')
        debuglog.info('Unused terminals:')
        debuglog.info('')
        for term in unused_terminals:
            errorlog.warning('Token %r defined, but not used', term)
            debuglog.info('    %s', term)

    # Print out all productions to the debug log
    if debug:
        debuglog.info('')
        debuglog.info('Grammar')
        debuglog.info('')
        for n, p in enumerate(grammar.Productions):
            debuglog.info('Rule %-5d %s', n, p)

    # Find unused non-terminals
    unused_rules = grammar.unused_rules()
    for prod in unused_rules:
        errorlog.warning('%s:%d: Rule %r defined, but not used', prod.file, prod.line, prod.name)

    if len(unused_terminals) == 1:
        errorlog.warning('There is 1 unused token')
    if len(unused_terminals) > 1:
        errorlog.warning('There are %d unused tokens', len(unused_terminals))

    if len(unused_rules) == 1:
        errorlog.warning('There is 1 unused rule')
    if len(unused_rules) > 1:
        errorlog.warning('There are %d unused rules', len(unused_rules))

    if debug:
        debuglog.info('')
        debuglog.info('Terminals, with rules where they appear')
        debuglog.info('')
        terms = list(grammar.Terminals)
        terms.sort()
        for term in terms:
            debuglog.info('%-20s : %s', term, ' '.join([str(s) for s in grammar.Terminals[term]]))

        debuglog.info('')
        debuglog.info('Nonterminals, with rules where they appear')
        debuglog.info('')
        nonterms = list(grammar.Nonterminals)
        nonterms.sort()
        for nonterm in nonterms:
            debuglog.info('%-20s : %s', nonterm, ' '.join([str(s) for s in grammar.Nonterminals[nonterm]]))
        debuglog.info('')

    if check_recursion:
        unreachable = grammar.find_unreachable()
        for u in unreachable:
            errorlog.warning('Symbol %r is unreachable', u)

        infinite = grammar.infinite_cycles()
        for inf in infinite:
            errorlog.error('Infinite recursion detected for symbol %r', inf)
            errors = True

    unused_prec = grammar.unused_precedence()
    for term, assoc in unused_prec:
        errorlog.error('Precedence rule %r defined for unknown symbol %r', assoc, term)
        errors = True

    if errors:
        raise YaccError('Unable to build parser')

    # Run the LRGeneratedTable on the grammar
    if debug:
        errorlog.debug('Generating %s tables', method)

    lr = LRGeneratedTable(grammar, method, debuglog)

    if debug:
        num_sr = len(lr.sr_conflicts)

        # Report shift/reduce and reduce/reduce conflicts
        if num_sr == 1:
            errorlog.warning('1 shift/reduce conflict')
        elif num_sr > 1:
            errorlog.warning('%d shift/reduce conflicts', num_sr)

        num_rr = len(lr.rr_conflicts)
        if num_rr == 1:
            errorlog.warning('1 reduce/reduce conflict')
        elif num_rr > 1:
            errorlog.warning('%d reduce/reduce conflicts', num_rr)

    # Write out conflicts to the output file
    if debug and (lr.sr_conflicts or lr.rr_conflicts):
        debuglog.warning('')
        debuglog.warning('Conflicts:')
        debuglog.warning('')

        for state, tok, resolution in lr.sr_conflicts:
            debuglog.warning('shift/reduce conflict for %s in state %d resolved as %s',  tok, state, resolution)

        already_reported = set()
        for state, rule, rejected in lr.rr_conflicts:
            if (state, id(rule), id(rejected)) in already_reported:
                continue
            debuglog.warning('reduce/reduce conflict in state %d resolved using rule (%s)', state, rule)
            debuglog.warning('rejected rule (%s) in state %d', rejected, state)
            errorlog.warning('reduce/reduce conflict in state %d resolved using rule (%s)', state, rule)
            errorlog.warning('rejected rule (%s) in state %d', rejected, state)
            already_reported.add((state, id(rule), id(rejected)))

        warned_never = []
        for state, rule, rejected in lr.rr_conflicts:
            if not rejected.reduced and (rejected not in warned_never):
                debuglog.warning('Rule (%s) is never reduced', rejected)
                errorlog.warning('Rule (%s) is never reduced', rejected)
                warned_never.append(rejected)

    # Write the table file if requested
    if write_tables:
        try:
            lr.write_table(tabmodule, outputdir, signature)
        except IOError as e:
            errorlog.warning("Couldn't create %r. %s" % (tabmodule, e))

    # Write a pickled version of the tables
    if picklefile:
        try:
            lr.pickle_table(picklefile, signature)
        except IOError as e:
            errorlog.warning("Couldn't create %r. %s" % (picklefile, e))

    # Build the parser
    lr.bind_callables(pinfo.pdict)
    parser = LRParser(lr, pinfo.error_func)

    parse = parser.parse
    return parser
PK�t�\vw����ply/ygen.pynu�[���# ply: ygen.py
#
# This is a support program that auto-generates different versions of the YACC parsing
# function with different features removed for the purposes of performance.
#
# Users should edit the method LParser.parsedebug() in yacc.py.   The source code 
# for that method is then used to create the other methods.   See the comments in
# yacc.py for further details.

import os.path
import shutil

def get_source_range(lines, tag):
    srclines = enumerate(lines)
    start_tag = '#--! %s-start' % tag
    end_tag = '#--! %s-end' % tag

    for start_index, line in srclines:
        if line.strip().startswith(start_tag):
            break

    for end_index, line in srclines:
        if line.strip().endswith(end_tag):
            break

    return (start_index + 1, end_index)

def filter_section(lines, tag):
    filtered_lines = []
    include = True
    tag_text = '#--! %s' % tag
    for line in lines:
        if line.strip().startswith(tag_text):
            include = not include
        elif include:
            filtered_lines.append(line)
    return filtered_lines

def main():
    dirname = os.path.dirname(__file__)
    shutil.copy2(os.path.join(dirname, 'yacc.py'), os.path.join(dirname, 'yacc.py.bak'))
    with open(os.path.join(dirname, 'yacc.py'), 'r') as f:
        lines = f.readlines()

    parse_start, parse_end = get_source_range(lines, 'parsedebug')
    parseopt_start, parseopt_end = get_source_range(lines, 'parseopt')
    parseopt_notrack_start, parseopt_notrack_end = get_source_range(lines, 'parseopt-notrack')

    # Get the original source
    orig_lines = lines[parse_start:parse_end]

    # Filter the DEBUG sections out
    parseopt_lines = filter_section(orig_lines, 'DEBUG')

    # Filter the TRACKING sections out
    parseopt_notrack_lines = filter_section(parseopt_lines, 'TRACKING')

    # Replace the parser source sections with updated versions
    lines[parseopt_notrack_start:parseopt_notrack_end] = parseopt_notrack_lines
    lines[parseopt_start:parseopt_end] = parseopt_lines

    lines = [line.rstrip()+'\n' for line in lines]
    with open(os.path.join(dirname, 'yacc.py'), 'w') as f:
        f.writelines(lines)

    print('Updated yacc.py')

if __name__ == '__main__':
    main()





PK�t�\��<��(ply/__pycache__/__init__.cpython-312.pycnu�[����

=Uif���dZddgZy)z3.9�lex�yaccN)�__version__�__all__���G/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/ply/__init__.py�<module>r	s������.�rPK�t�\a�
��}�}#ply/__pycache__/cpp.cpython-312.pycnu�[����

=Ui��
�L�ddlZejjdkreefZneZeZdZdZ	d�Z
dZdZdZ
d	�ZeZd
Zd�Zd�Zd
�Zd�Zd�ZddlZddlZddlZddlZej6d�Zdddddddddd�	Zd�ZGd�de�Z Gd�de�Z!e"d k(r�ddl#m$Z$e$jH�Z%ddlZe&ejNd!�Z(e(jS�Z*e!e%�Z+e+jYe*ejNd!�	e+j[�Z.e.sye/e+j`e.��'y)"�N�)
�CPP_ID�CPP_INTEGER�	CPP_FLOAT�
CPP_STRING�CPP_CHAR�CPP_WS�CPP_COMMENT1�CPP_COMMENT2�	CPP_POUND�
CPP_DPOUNDz+-*/%|&~^<>=!?()[]{}.,;:\'"c�v�|jxj|jjd�z
c_|S)z\s+�
��lexer�lineno�value�count��ts �B/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/ply/cpp.py�t_CPP_WSr�&���G�G�N�N�a�g�g�m�m�D�)�)�N��H�z\#z\#\#z[A-Za-z_][\w_]*c��|S)zA(((((0x)|(0X))[0-9a-fA-F]+)|(\d+))([uU][lL]|[lL][uU]|[uU]|[lL])?)�rs rrr+s���Hrz?((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?c�v�|jxj|jjd�z
c_|S)z\"([^\\\n]|(\\(.|\n)))*?\"rrrs r�t_CPP_STRINGr5rrc�v�|jxj|jjd�z
c_|S)z(L)?\'([^\\\n]|(\\(.|\n)))*?\'rrrs r�
t_CPP_CHARr ;rrc��|jjd�}|jxj|z
c_d|_|rd|z|_|Sd|_|S)z(/\*(.|\n)*?\*/)rr	� )rrrr�type)r�ncrs  r�t_CPP_COMMENT1r%AsL��
�'�'�-�-��
�C��G�G�N�N�c��N�
�A�F�s����q�w��H�9<�q�w��Hrc�"�d|_d|_|S)z
(//.*?(\n|$))r	r)r#rrs r�t_CPP_COMMENT2r'Js���A�F��q�w��Hrc��|jd|_|jd|_|jjd�|S�Nr�)rr#r�skiprs r�t_errorr,Ps4��
�W�W�Q�Z�A�F��g�g�a�j�A�G��G�G�L�L��O��Hrz\?\?[=/\'\(\)\!<>\-]�#�\�^�[�]�|�{�}�~)	�=�/�'�(�)�!�<�>�-c�0�tjd�|�S)Nc�6�t|j�dS�N���)�
_trigraph_rep�group)�gs r�<lambda>ztrigraph.<locals>.<lambda>zs��}�Q�W�W�Y�r�]�'Cr)�
_trigraph_pat�sub)�inputs r�trigraphrJys�����C�E�J�Jrc��eZdZdd�Zy)�MacroNc�b�||_||_||_||_|r
|d|_d|_yrA)�namer�arglist�variadic�vararg�source)�selfrNrrOrPs     r�__init__zMacro.__init__�s3����	���
���� ��
��!�"�+�D�K���r)NF)�__name__�
__module__�__qualname__rTrrrrLrL�s��rrLc��eZdZdd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
d
�Zd�Zdd�Z
d
�Zdd�Zd�Zd�Zd�Zdifd�Zd�Zy)�PreprocessorNc�V�|�tj}||_i|_g|_g|_|j�t
j�}|jdt
jd|�z�|jdt
jd|�z�d|_
y)Nz
__DATE__ "%s"z%b %d %Yz
__TIME__ "%s"z%H:%M:%S)�lexr�macros�path�	temp_path�lexprobe�time�	localtime�define�strftime�parser)rSr�tms   rrTzPreprocessor.__init__�s����=��I�I�E���
������	����	
�
�
��
�^�^�
�����%��
�
�j��(D�D�E����%��
�
�j��(D�D�E���rc��g}|jj|�	|jj�}|s	|S|j|��1�N)rrI�token�append)rS�text�tokens�toks    r�tokenizezPreprocessor.tokenize�sK�����
�
�������*�*�"�"�$�C����
�
�M�M�#��rc�&�td|||fz�y)Nz%s:%d %s)�print)rS�file�line�msgs    r�errorzPreprocessor.error�s��
�j�D��c�?�*�+rc�(�|jjd�|jj�}|r|jdk7rt	d�n|j
|_|jjd�|jj�}|rt|j�dk7rt	d�n+|j
|_t|j�|_	|jjd�|jj�}|r|jdk7rt	d�n|j
|_
|jjd�|jj�}|r|jdk7rd|_n|j
|_|jjd	�|jj�}|r|jd	k7rd|_t	d
�n|j
|_|j|jf|_
gd�}|D]W}|jj|�|jj�}|r|j|k7s�Jt	d|z��Yy)
N�
identifierz"Couldn't determine identifier type�12345i90zCouldn't determine integer typez
"filename"zCouldn't determine string typez  rz%Couldn't determine token for newlines)	r<r=r-�##r.r9r:�,�.z,Unable to lex '%s' required for preprocessor)rrIrhrror#�t_ID�int�	t_INTEGER�t_INTEGER_TYPE�t_STRING�t_SPACE�	t_NEWLINE�t_WS)rSrl�chars�cs    rr_zPreprocessor.lexprobe�s���	
�
�
����&��j�j��� ���c�i�i�<�/��6�7����D�I�	
�
�
����!��j�j��� ���c�#�)�)�n��-��3�4� �X�X�D�N�"&�s�y�y�/�D��	
�
�
����(��j�j��� ���c�i�i�>�1��2�3��H�H�D�M�	
�
�
������j�j��� ���c�i�i�4�'��D�L��8�8�D�L�	
�
�
������j�j��� ���c�i�i�4�'�!�D�N��9�:� �X�X�D�N��\�\�4�>�>�2��	�9���A��J�J���Q���*�*�"�"�$�C��#�)�)�q�.��D�q�H�I�	rc�:�|jj|�yrg)r]ri)rSr]s  r�add_pathzPreprocessor.add_paths���	�	����rc#�K�|jj�}|j�D�cgc]}|j���}}t	t|��D]j}|dz}||j
d�s�|t|�ks�,||dd||z||<d||<|dz
}||j
d�s�\|t|�kr�?�ldj|�}|j|�d|_	g}	|j�}|sn>|j|�|j|jvrd|jvr|��g}�R|r|��yycc}w�w)Nr*r.rB�r)r�clone�
splitlines�rstrip�xrange�len�endswith�joinrIrrhrir#r�r)	rSrIr[�x�lines�i�j�current_linerls	         r�group_lineszPreprocessor.group_linessO�����j�j��� ��%*�%5�%5�%7�8�%7������%7��8���E�
�#�A��!��A���(�#�#�D�)�q�3�u�:�~� ��8�C�R�=��q��1��a����a���Q�����(�#�#�D�)�q�3�u�:�~�$��	�	�%� ����	�	�%����
�����#�)�)�+�C�������$��x�x�4�9�9�$�����):�"�"�!��������-9�s)�-E�E�2E�9E�/E�8E�BEc�|�d}|t|�krJ||j|jvr/|dz
}|t|�kr||j|jvr�/|d|�=t|�dz
}|dk\rA||j|jvr&|dz}|dk\r||j|jvr�&||dzd�=|Sr))r�r#r�)rSrkr�s   r�
tokenstripzPreprocessor.tokenstrip8s���
���#�f�+�o�&��)�.�.�D�I�I�"=�
��F�A��#�f�+�o�&��)�.�.�D�I�I�"=��2�A�2�J���K��M���1�f������4�9�9�4�
��F�A��1�f������4�9�9�4��1�Q�3�4�L��
rc���g}g}g}d}t|�}d}||krA||j|jvr&|dz
}||kr||j|jvr�&||kr'||jdk(r|j	|dz�n/|j|j|djd�dggfS|dz
}||kr�||}|jdk(r|j	|�|dz
}n�|jdk(rW|dz}|dk(r;|r1|j	|j|��|j	|�|dz||fS|j	|�n\|jdk(r<|dk(r7|j	|j|��|j	|dz�g}n|j	|�|dz
}||kr��|j|j|djd�dggfS)	Nr*rr9zMissing '(' in macro argumentsr:rxrBzMissing ')' in macro arguments)	r�r#r�rrirsrRrr�)	rS�	tokenlist�args�	positions�current_arg�nesting�tokenlenr�rs	         r�collect_argszPreprocessor.collect_argsTs������	������y�>��
���8�|�)�A�,�"3�"3�t�y�y�"@�
��F�A��8�|�)�A�,�"3�"3�t�y�y�"@�
��L�y��|�1�1�S�8����Q�q�S�!��J�J�t�{�{�9�Q�<�#6�#6�7W�X��b�"�9��	�Q����(�l��!��A��w�w�#�~��"�"�1�%��1������C���1����a�<�"����D�O�O�K�$@�A�!�(�(��+��Q�3�t�I�-�-��"�"�1�%����C��G�q�L����D�O�O�K�8�9�� � ��1��%� ���"�"�1�%�
��F�A�'�(�l�,	
�
�
�4�;�;�y��}�3�3�4T�U��"�R�x�rc�z�g|_g|_g|_d}|t|j�k�r�|j|j
|jk(�r�|j|j|jv�r�|jj|j|j�}|dkDr�|j|dz
jdk(rtj|j|�|j|<|j|j|_|j|dz
=|jj||dz
f���;|dkDrR|j|dz
jdk(r3|jjd||dz
f�|j|dz
=���|dzt|j�krD|j|dzjdk(r%|jjd||f�|dz
}���|jjd||f�n�|j|jdk(r�|jr�|dkDr�|j|dz
jdk(r�|dzt|j�krp|j|dzj
|jk(rG|j|dzj|jk(r|jj|dz
�|dz
}|t|j�kr���|jjd�d	�
�y)Nrr*r-rwr��erxc��|dS)N�r)r�s rrFz,Preprocessor.macro_prescan.<locals>.<lambda>�s��q��trT)�key�reverse)�patch�	str_patch�var_comma_patchr�rr#rzrO�index�copyr~rirPrQ�sort)rS�macror��argnums    r�
macro_prescanzPreprocessor.macro_prescan�s��������� "���
���#�e�k�k�"�"��{�{�1�~�"�"�d�i�i�/�E�K�K��N�4H�4H�E�M�M�4Y����,�,�U�[�[��^�-A�-A�B���q�5�U�[�[��1��-�3�3�s�:�%)�Y�Y�u�{�{�1�~�%>�E�K�K��N�*.�-�-�E�K�K��N�'����A�a�C�(��O�O�*�*�F�1�Q�3�<�8���!�e����A�a�C� 0� 6� 6�$� >��K�K�&�&��F�1�Q�3�'7�8����A�a�C�(����s�c�%�+�+�.�.�5�;�;�q��s�3C�3I�3I�T�3Q��K�K�&�&��F�1�~�6���F�A���K�K�&�&��F�1�~�6����Q��%�%��-��>�>�q�1�u�5�;�;�q��s�3C�3I�3I�S�3P��A�#��U�[�[�!1�1����A�a�C�8H�8M�8M�QU�QZ�QZ�8Z����Q�q�S�)�/�/�5�<�<�?��)�)�0�0��1��5�
��F�A�7�#�e�k�k�"�"�8	�����^�D��9rc��|jD�cgc]}tj|���}}i}|jD]s\}}||vrBddj||D�cgc]}|j��c}�zj	dd�||<tj||�||<||||_�ud}	|j
r|ds|jD]	}d||<d}	�i}
|jD]C\}}}|dk(r|||||d	z�|d
k(s�||
vr|j||�|
|<|
||||d	z�E|	r|D�cgc]}|s�|��	}}|Scc}wcc}wcc}w)Nz"%s"r�r.z\\FrBTr�r*r�)	rr�r�r��replacerPr�r��
expand_macros)
rSr�r��_x�rep�
str_expansionr�r�r��comma_patch�expanded�ptype�_is
             r�macro_expand_argszPreprocessor.macro_expand_args�s}��',�{�{�3�{��t�y�y��}�{��3��
����I�F�A��]�*�)/�"�'�'�D�QW�L�:Y�L�q�1�7�7�L�:Y�2Z�)Z�(c�(c�dh�io�(p�
�f�%��Y�Y�s�1�v�&�C��F�(��0�C��F�L�	)����>�>�$�r�(��*�*����A��"��+��� %����E�6�1���|�!�&�\��A�a��c�
��#����)�'+�'9�'9�$�v�,�'G�H�V�$�%�f�-��A�a��c�
�!,�� #�*��"�r�2��C�*��
��K4��;Z��8+s�E�E�6E�>Ec	��|�i}d}|t|�k�r$||}|j|jk(�r�|j|jv�r�|j|v�r�d||j<|j|j}|j
sm|j
|jD�cgc]}tj|���c}|�}|D]}|j|_�||||dz|t|�z
}�n�|dz}	|	t|�krJ||	j|jvr/|	dz
}	|	t|�kr||	j|jvr�/||	jdk(�rh|j||	d�\}
}}|jsqt|�t|j
�k7rP|j|j|jd|jt|j
�fz�|	|
z}�n�|jr�t|�t|j
�dz
kr�t|j
�dkDrM|j|j|jd|jt|j
�dz
fz�nL|j|j|jd|jt|j
�dz
fz�|	|
z}n�|jr�t|�t|j
�dz
k(r|jg�nX||	|t|j
�dz
z|	|
zdz
|t|j
�dz
<|t|j
�d�=|j||�}
|j
|
|�}
|
D]}|j|_�|
|||	|
z|t|
�z
}||j=���|jd	k(r1|j |_|j#|j�|_|dz
}|t|�kr��$|Scc}w)
NrTr*r9zMacro %s requires %d argumentsr�z(Macro %s must have at least %d argumentsz'Macro %s must have at least %d argument�__LINE__)r�r#rzrr\rOr�r�rr�r�rPrsrRrir�r|r})rSrkr�r�r�mr��exr�r��tokcountr�r�r��rs               rr�zPreprocessor.expand_macros�s������H�
���#�f�+�o��q�	�A��v�v����"��7�7�d�k�k�)�a�g�g�X�.E�(,�H�Q�W�W�%����A�G�G�,�A��9�9�!�/�/����0Q��2����2���0Q�RZ�[��!#�A�'(�x�x�A�H�"$�(*��q��1��
��S��W�����E���#�f�+�o�&��)�.�.�D�I�I�2M���F�A� �#�f�+�o�&��)�.�.�D�I�I�2M�!�!�9�?�?�c�1�6:�6G�6G��q�r�
�6S�3�H�T�)�#$�:�:�#�d�)��A�I�I��2N� $�
�
�4�;�;�q�x�x�@`�de�dk�dk�lo�pq�py�py�lz�c{�@{� |�$%��L��!"����D�	�C��	�	�N�1�<L�0L�#&�q�y�y�>�A�#5�$(�J�J�t�{�{�1�8�8�Dn�rs�ry�ry�{~�@A�@I�@I�|J�KL�|L�rM�EM�%N�$(�J�J�t�{�{�1�8�8�Dm�qr�qx�qx�z}�~�H�H�{I�JK�{K�qL�EL�%M�$%��L��#$�:�:�'*�4�y�C��	�	�N�1�4D�'D�(,���B��AG��)�TW�XY�Xa�Xa�Tb�cd�Td�Je�He�fg�hp�fp�qr�fr�As��S����^�A�-=�(>�,0��Q�Y�Y���,A�'+�&<�&<�Q�t�&D��&*�&8�&8��X�&F��),�A�/0�x�x�A�H�*-�7:��q��8�� 4� !�S��X�
�� ����)���W�W�
�*�!�^�^�A�F�"�1�1�!�(�(�;�A�G�
��F�A�i�#�f�+�o�j�
��W1Rs�*P<c�x�d}|t|�k�rZ||j|jk(�r(||jdk(�r|dz}d}d}|t|�kr�||j|jvr|dz
}�/||j|jk(r#||j|j
vrd}nd}|sSnf||jdk(rd}n=||jd	k(rn>|j
|j||jd
�|dz
}|t|�kr��|j||_|j|�||_||dz|dz�=|dz
}|t|�kr��Z|j|�}t|�D]�\}}|j|jk(rFtj|�||<|j||_|jd�||_�e|j|jk(s�tj|�||<t||j�||_||jddvs��||jdd||_||jddvr�/��d
j|D�cgc]}t|j���c}�}|j!dd�}|j!dd�}|j!dd�}	t#|�}|Scc}w#t$$r0|j
|j|djd�d}Y|SwxYw)Nr�definedr*F�0L�1Lr9Tr:zMalformed defined()rB�0123456789abcdefABCDEFr�z&&z and z||z or r;z not zCouldn't evaluate expression)r�r#rzrr�r\rsrRrr|r}r��	enumerater��strr�r��eval�	Exception)	rSrkr�r��	needparen�resultrr��exprs	         r�evalexprzPreprocessor.evalexpr(s���
���#�f�+�o��a�y�~�~����*�v�a�y���)�/K���E��!�	����#�f�+�o��a�y�~�~����2��Q��� ������4�9�9�4�!�!�9�?�?�d�k�k�9�%)�F�%)�F�(�%������C�/�$(�	������C�/���
�
�4�;�;�v�a�y�/?�/?�@U�V���F�A�!�#�f�+�o�""&����q�	��"&�"5�"5�f�"=��q�	���1�Q�3�q��s�7�O�
��F�A�3�#�f�+�o�4�#�#�F�+���V�$�C�A�a��v�v����"� �I�I�a�L��q�	�!%����q�	��"&�"5�"5�d�";��q�	�����4�>�>�)� �I�I�a�L��q�	�"%�f�Q�i�o�o�"6��q�	���Q�i�o�o�b�)�1I�I�&,�Q�i�o�o�c�r�&:�F�1�I�O��Q�i�o�o�b�)�1I�I�%��w�w�f�5�f���A�G�G��f�5�6���|�|�D��)���|�|�D��(���|�|�C��(��	��$�Z�F��
��6���	��J�J�t�{�{�6�!�9�#3�#3�4R�S��F��
�	�s�K;�.L�5L9�8L9c#�K�t|�}|j|�}|sd}|jd|z�||_g}d}d}g}|D�]^}	t	|	�D]\}
}|j
|jvs�njdk(�r	|	D];}|j
|jvs�d|jvs�+|j|��=|j|	
dzd�}|r$|dj}
|j|dd�}nd}
g}|
d	k(r1|s��|j|�D]}|���g}|j|���|
d
k(ra|s��|j|�D]}|���g}|jd}|j|�D]}|���||jd<||_��^|
dk(r3|s��g|j|�D]}|���g}|j|����|
d
k(r<|j||f�|s���|dj|jvrd}d}���d}���|
dk(r<|j||f�|s���|dj|jvrd}d}��d}��|
dk(r4|j||f�|s��4|j|�}|sd}d}��Md}��Q|
dk(r]|r/|dds��b|rd}��h|r��l|j|�}|s���d}d}���|j|j|dj d����|
dk(rH|r|dds���|rd}���|r���d}d}���|j|j|dj d���|
dk(rC|r|j#�\}}��|j|j|dj d���H��J|s��N|j%|	���a|j|�D]}|���g}y�w)Nr�z
__FILE__ "%s"TFr-rr*rrb�include�__FILE__�undef�ifdef�ifndef�if�elifrBzMisplaced #elif�elsezMisplaced #else�endifzMisplaced #endif)rJr�rbrRr�r#r�rrir�r�r\r�r�r�rsr�pop�extend)rSrIrRrr��chunk�enable�	iftrigger�ifstackr�r�rl�	dirtokensrNr��oldfiler�s                 r�parsegenzPreprocessor.parsegencs�����
�U�O��� � ��#����F����%��.�/���������	����A�"�1����#��8�8�4�9�9�,�e�&��y�y�C���C��x�x�4�9�9�,�����1B����S�)��!�O�O�A�a��c�d�G�4�	��$�Q�<�-�-�D��?�?�9�Q�R�=�9�D��D��D��8�#��#'�#5�#5�e�#<�C�"%�I�$=� "�����D�)��Y�&��#'�#5�#5�e�#<�C�"%�I�$=� "��"&�+�+�j�"9��#'�<�<��#5�C�"%�I�$6�29����J�/�&,����W�_��#'�#5�#5�e�#<�C�"%�I�$=� "���
�
�4�(��W�_��N�N�F�9�#5�6��#�A�w�}�}����;�%*�F�(-�I�(,�I��X�%��N�N�F�9�#5�6����7�=�=�D�K�K�7�%*�F�(-�I�(,�I��T�\��N�N�F�9�#5�6��!%���t�!4��%�%*�F�(-�I�(,�I��V�^��"�2�;�q�>�%�).��%.�)-���t�)<��#)�.2�F�04�I��
�
�4�;�;�y��|�/B�/B�CT�U��V�^��"�2�;�q�>�%�).��%.�)-��,0�	��
�
�4�;�;�y��|�/B�/B�CT�U��W�_��+2�;�;�=�(��y��
�
�4�;�;�y��|�/B�/B�CU�V����L�L��O�M�P�%�%�e�,�C��I�-���se�A3O�60O�'O�6AO�5O�	A$O�/A	O�:?O�;?O�<,O�*O�4O�	AO�O�A>O�1Oc#�K�|sy|�r6|djdk7r-|dj|jk7r|j|�}|djdk(r�d}|t	|�kr'||jdk(rn |dz
}|t	|�kr�'td�ydj
|d|D�cgc]}|j��c}�}|jdgz|jz}nX|dj|jk(r0|djdd}|jdgz|jz}ntd�yD]�}tjj
|�}	t|d	�j�}tjj|�}	|	r|jjd|	�|j||�D]}
|
���|	r
|jd=ytd
z�ycc}w#t$rY��wxYw�w)Nrr<r*r=zMalformed #include <...>r�rBzMalformed #include statementr�zCouldn't find '%s')rr#r~r�r�ror�r]r^�os�open�read�dirname�insertr��IOError)rSrkr�r��filenamer]�p�iname�data�dnamerls           rr�zPreprocessor.include�s���������a�y���#�%�&��)�.�.�D�M�M�*I��+�+�F�3���a�y���#�%����#�f�+�o��a�y���#�-����F�A��#�f�+�o�
�4�5���7�7�V�A�a�[�#A�[��A�G�G�[�#A�B���y�y�B�4�'�$�.�.�8�������4�=�=�0�!�!�9�?�?�1�R�0���~�~���,�t�y�y�8���4�5���A��G�G�L�L��8�,�E�
��E�#��+�+�-��������.����N�N�)�)�!�E�2��=�=��h�7�C��I�8�����q�)���
�&��1�2��/$B��(�
��
�s>�BH�H�/G8�B"H�%BG=�&H�=	H	�H�H	�	Hc	��t|t�r|j|�}|}	|d}t|�dkDr|d}nd}|s0t	|j
g�}||j|j
<y|j|jvrBt	|j
|j|dd��}||j|j
<y|j
dk(�r6|j|dd�\}}}d}	|D�]}
|	r
td�ydj|
D�cgc]}t|j
���c}�}|dk(r(d	}	|j|
d_d
|
d_d	}	|
dd�=�r|dddk(rS|
dj|jk(r7d	}	|
dd�=|
dj
dddk(r|
dj
dd|
d_��t|
�dkDs|
dj|jk7s��td�y|j|d|zd�}
d}|t|
�kr�|dzt|
�krj|
|j|jvr|
|dzj
d
k(r|
|=�S|
|j
d
k(r$|
|dzj|jvr|
|dz=|dz
}|t|
�kr��t	|j
|
|D�cgc]}|dj
��c}|	�}|j|�||j|j
<ytd�ycc}wcc}w#t $rtd�YywxYw)Nrr*r�r9Fz0No more arguments may follow a variadic argumentr�z...T�__VA_ARGS__���zInvalid macro argumentrwzBad macro definition)�
isinstance�STRING_TYPESrmr�rLrr\r#r�r�r�ror�r�rzr��LookupError)rSrk�linetokrN�mtyper�r�r�r�rP�ar��astr�mvaluer�r�s                rrbzPreprocessor.defines���f�\�*��]�]�6�*�F���9	*��1�:�D��7�|�a����
������$�*�*�R�(��*+����D�J�J�'����t�y�y�(��$�*�*�T�_�_�W�Q�R�[�%A�B��*+����D�J�J�'�����#�,0�,=�,=�g�a�b�k�,J�)��$�	� ���A���P�Q���7�7�A�#>�A�b�C����M�A�#>�?�D��u�}�#'��$(�I�I��!��	�%2��!��
�#'���a�b�E� ��b�c��e�+��!��	�	�T�Y�Y�0F�#'���a�b�E��Q�4�:�:�b�c�?�e�3�)*�1����C�R��A�a�D�J� ��1�v��z�Q�q�T�Y�Y�$�)�)�%;��6�7��-�0"�_�_�W�Q�x�Z�[�-A�B�F��A��c�&�k�/��Q�3��V��,�%�a�y�~�~����:�v�a��c�{�?P�?P�TX�?X�$*�1�I� (�!'�����D�!8�V�A�a�C�[�=M�=M�QU�QZ�QZ�=Z�$*�1�Q�3�K��Q����c�&�k�/��d�j�j��T�0J�T���1����T�0J�8�T�A��&�&�q�)�./�D�K�K��
�
�+��,�-��E$?��<1K��
�	*��(�)�	*�s]�AL(�2AL(�>L(�L(�L
�6B9L(�0L(�=B6L(�4L(�	L#�2L(�L(�
L(�(L?�>L?c�\�|dj}	|j|=y#t$rYywxYw)Nr)rr\r�)rSrk�ids   rr�zPreprocessor.undef]s1��
�A�Y�_�_��	����B����	��	�s�
�	+�+c�@�||_|j||�|_yrg)�ignorer�rd)rSrIrRr�s    r�parsezPreprocessor.parseis������m�m�E�&�1��rc��		t|j�}|j|jvr|S�0#t$r
d|_YywxYwrg)�nextrdr#r��
StopIteration)rSrls  rrhzPreprocessor.tokenrsL��	���4�;�;�'���8�8�4�;�;�.�s�
����	��D�K��	�s�/3�3�A�Arg)rUrVrWrTrmrsr_r�r�r�r�r�r�r�r�r�r�rbr�r�rhrrrrYrY�so���,�,�4J�x��B	�8+�j!:�V'�d9�D4�v{�F)3�b>*�L�!%�B�2�rrY�__main__r*)1�sys�version_info�majorr��unicoder��ranger�rk�literalsr�t_CPP_POUND�t_CPP_DPOUND�t_CPP_IDr�
t_CPP_INTEGER�t_CPP_FLOATrr r%r'r,�rer�r`�os.pathr��compilerGrCrJ�objectrLrYrU�ply.lexr[rr��argv�fr�rIr�r�rhrlrorRrrr�<module>rsq��������A����>�L��L�
�F�
��,��
�
������
��
�Q��
�
�
�
�
�
����&��
�
�6�7�
����������
�
�K�&�F��"\�6�\�|�z����C�G�G�I�E���S�X�X�a�[��A�
�F�F�H�E��U��A��G�G�E�#�(�(�1�+��
��g�g�i���E�
�a�h�h����rPK�t�\��Ǐ�	�	'ply/__pycache__/ctokens.cpython-312.pycnu�[����

=Uii����gd�ZdZdZdZdZdZdZdZdZd	Z	d
Z
dZdZd
Z
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZd Z d!Z!d"Z"d#Z#d$Z$d%Z%d&Z&d'Z'd(Z(d)Z)d*Z*d+Z+d,Z,d-Z-d.Z.d/Z/d0Z0d1Z1d2Z2d3Z3d4�Z4d5�Z5y6)7)4�ID�TYPEID�INTEGER�FLOAT�STRING�	CHARACTER�PLUS�MINUS�TIMES�DIVIDE�MODULO�OR�AND�NOT�XOR�LSHIFT�RSHIFT�LOR�LAND�LNOT�LT�LE�GT�GE�EQ�NE�EQUALS�
TIMESEQUAL�DIVEQUAL�MODEQUAL�	PLUSEQUAL�
MINUSEQUAL�LSHIFTEQUAL�RSHIFTEQUAL�ANDEQUAL�XOREQUAL�OREQUAL�	INCREMENT�	DECREMENT�ARROW�TERNARY�LPAREN�RPAREN�LBRACKET�RBRACKET�LBRACE�RBRACE�COMMA�PERIOD�SEMI�COLON�ELLIPSISz\+�-z\*�/�%z\|�&�~z\^z<<z>>z\|\|z&&�!�<�>z<=z>=z==z!=�=z\*=z/=z%=z\+=z-=z<<=z>>=z&=z\|=z\^=z\+\+z--z->z\?z\(z\)z\[z\]z\{z\}�,z\.�;�:z\.\.\.z[A-Za-z_][A-Za-z0-9_]*z!\d+([uU]|[lL]|[uU][lL]|[lL][uU])?z?((\d+)(\.\d+)(e(\+|-)?(\d+))? | (\d+)e(\+|-)?(\d+))([lL]|[fF])?z\"([^\\\n]|(\\.))*?\"z(L)?\'([^\\\n]|(\\.))*?\'c�v�|jxj|jjd�z
c_|S)z/\*(.|\n)*?\*/�
)�lexer�lineno�value�count��ts �F/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/ply/ctokens.py�	t_COMMENTrKvs&���G�G�N�N�a�g�g�m�m�D�)�)�N��H�c�D�|jxjdz
c_|S)z//.*\n�)rDrErHs rJ�t_CPPCOMMENTrO|s���G�G�N�N�a��N��HrLN)6�tokens�t_PLUS�t_MINUS�t_TIMES�t_DIVIDE�t_MODULO�t_OR�t_AND�t_NOT�t_XOR�t_LSHIFT�t_RSHIFT�t_LOR�t_LAND�t_LNOT�t_LT�t_GT�t_LE�t_GE�t_EQ�t_NE�t_EQUALS�t_TIMESEQUAL�
t_DIVEQUAL�
t_MODEQUAL�t_PLUSEQUAL�t_MINUSEQUAL�
t_LSHIFTEQUAL�
t_RSHIFTEQUAL�
t_ANDEQUAL�	t_OREQUAL�
t_XOREQUAL�t_INCREMENT�t_DECREMENT�t_ARROW�	t_TERNARY�t_LPAREN�t_RPAREN�
t_LBRACKET�
t_RBRACKET�t_LBRACE�t_RBRACE�t_COMMA�t_PERIOD�t_SEMI�t_COLON�
t_ELLIPSIS�t_ID�	t_INTEGER�t_FLOAT�t_STRING�t_CHARACTERrKrO�rLrJ�<module>r�s-��
��D���������������������������������������������
��
������
��
��
��	��
��������	������
��
��������������
�!��
1�	�M��$��+��
�
rLPK�t�\���k����#ply/__pycache__/lex.cpython-312.pycnu�[����

=Ui���
��dZdZddlZddlZddlZddlZddlZddlZ	ejejfZ
ejd�ZGd�de�ZGd�de�ZGd�d	e�ZGd
�de�ZGd�d
�Zd�Zd�Zd�Zd�Zd�Zd�ZGd�de�Zdddddeej>�ddddf
d�Z dd�Z!d�Z"e"Z#y#e$ree
fZ
Y��wxYw)z3.10�Nz^[a-zA-Z0-9_]+$c��eZdZd�Zy)�LexErrorc�"�|f|_||_y�N)�args�text)�self�message�ss   �B/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/ply/lex.py�__init__zLexError.__init__:s���J��	���	�N)�__name__�
__module__�__qualname__r
�rrrr9s��rrc��eZdZd�Zd�Zy)�LexTokenc�d�d|j|j|j|jfzS)NzLexToken(%s,%r,%d,%d))�type�value�lineno�lexpos�r	s r�__str__zLexToken.__str__As&��&�$�)�)�T�Z�Z����d�k�k�)Z�Z�Zrc��t|�Sr)�strrs r�__repr__zLexToken.__repr__Ds���4�y�rN)rrrrrrrrrr@s
��[�rrc�,�eZdZd�Zd�Zd�Zd�ZeZeZy)�	PlyLoggerc��||_yr)�f)r	r"s  rr
zPlyLogger.__init__Ls	����rc�F�|jj||zdz�y)N�
�r"�write�r	�msgr�kwargss    r�criticalzPlyLogger.criticalOs�������c�D�j�D�(�)rc�L�|jjd||zzdz�y)Nz	WARNING: r$r%r's    r�warningzPlyLogger.warningRs �������[�C�$�J�/�$�6�7rc�L�|jjd||zzdz�y)NzERROR: r$r%r's    r�errorzPlyLogger.errorUs �������Y�#��*�-��4�5rN)	rrrr
r*r,r.�info�debugrrrr r Ks"���*�8�6��D��Err c��eZdZd�Zd�Zy)�
NullLoggerc��|Srr)r	�names  r�__getattribute__zNullLogger.__getattribute__^����rc��|Srr)r	rr)s   r�__call__zNullLogger.__call__ar6rN)rrrr5r8rrrr2r2]s���rr2c�b�eZdZd�Zdd�Zdd�Zd�Zd�Zd�Zd�Z	d	�Z
d
�Zd�Zd�Z
d
�Zd�ZeZy)�Lexerc�F�d|_d|_i|_i|_i|_d|_g|_d|_i|_i|_	i|_
d|_d|_d|_
d|_d|_d|_d|_d|_d|_d|_d|_d|_y)N�INITIALr��F)�lexre�	lexretext�
lexstatere�lexstateretext�lexstaterenames�lexstate�
lexstatestack�lexstateinfo�lexstateignore�lexstateerrorf�lexstateeoff�
lexreflags�lexdatar�lexlen�	lexerrorf�lexeoff�	lextokens�	lexignore�lexliterals�	lexmoduler�lexoptimizers rr
zLexer.__init__ts�����
������� ���!���!��
���� ��� ��� ��������������������������������������� ��rNc
��tj|�}|r�i}|jj�D]x\}}g}|D]T\}}g}	|D]H}
|
r|
ds|	j|
��|	jt	||
dj
�|
df��J�V|j	f�|||<�z||_i|_|jj�D](\}}t	||j
�|j|<�*||_|S�Nrr>)�copyrA�items�append�getattrrrHrR)r	�object�c�newtab�key�ritem�newre�cre�findex�	newfindexr"�efs            r�clonezLexer.clone�s���I�I�d�O����F�"�o�o�3�3�5�
��U���#(�K�C�� "�I�#�� ��!��%�,�,�Q�/�$�!�(�(�'�&�!�A�$�-�-�*H�!�A�$�)O�P�	$�$)����c�9�-�.�#��s��6�"�A�L�!�A���.�.�4�4�6���R�(/�����(D�� � ��%�7� �A�K��rc��t|tj�rtd��|j	d�d}t
jj||�dz}t|d�5}|jd|�dt�d��|jd	tt�z�|jd
ttt|j���z�|jdt|j �z�|jdt|j"�z�|jd
t|j$�z�i}|j&j)�D]\\}}g}	t+||j,||j.|�D]&\\}
}}}
|	j1|t3||
�f��(|	||<�^|jdt|�z�|jdt|j4�z�i}|j6j)�D]\}}|r|j8nd||<�|jdt|�z�i}|j:j)�D]\}}|r|j8nd||<�|jdt|�z�ddd�y#1swYyxYw)Nz&Won't overwrite existing lextab module�.���z.py�wz# z5.py. This file automatically created by PLY (version z). Don't edit!
z_tabversion   = %s
z_lextokens    = set(%s)
z_lexreflags   = %s
z_lexliterals  = %s
z_lexstateinfo = %s
z_lexstatere   = %s
z_lexstateignore = %s
z_lexstateerrorf = %s
z_lexstateeoff = %s
)�
isinstance�types�
ModuleType�IOError�split�os�path�join�openr&�__version__�repr�__tabversion__�tuple�sortedrOrJrQrFrArW�ziprBrCrX�_funcs_to_namesrGrHrrI)r	�lextab�	outputdir�
basetabmodule�filename�tf�tabre�	statename�lre�titem�pat�func�retext�renames�taberrrc�tabeofs                 r�writetabzLexer.writetab�sZ���f�e�.�.�/��B�C�C����S�)�"�-�
��7�7�<�<�	�=�9�E�A��
�(�C�
 �B��H�H�gt�wB�C�
D��H�H�+�d�>�.B�B�C��H�H�0�4��f�T�^�^�>T�8U�3V�V�W��H�H�+�d�4�?�?�.C�C�D��H�H�+�d�4�3C�3C�.D�D�E��H�H�+�d�4�3D�3D�.E�E�F��E�"&�/�/�"7�"7�"9��	�3���47��T�=P�=P�QZ�=[�]a�]q�]q�r{�]|�4}�0�K�S�$����L�L�&�/�$��*H�!I�J�5~�#(��i� �	#:�
�H�H�+�d�5�k�9�:��H�H�-��T�5H�5H�0I�I�J��F�!%�!4�!4�!:�!:�!<�
�	�2�35�B�K�K�4��y�!�"=��H�H�-��V��<�=��F�!%�!2�!2�!8�!8�!:�
�	�2�35�B�K�K�4��y�!�";��H�H�+�d�6�l�:�;�7!�
 �
 �s
�)IK�Kc	���t|tj�r|}n!td|z�tj
|}t
|dd�tk7rtd��|j|_
|j|_|j|_|jt|j�z|_|j"|_|j&|_i|_i|_|j.j1�D]l\}}g}g}|D]@\}}	|j3t5j6||j�t9|	|�f��B||j*|<||j,|<�ni|_|j<j1�D]\}}
||
|j:|<�i|_|j@j1�D]\}}
||
|j>|<�|jCd�y)N�	import %s�_tabversionz0.0zInconsistent PLY versionr<)"rirjrk�exec�sys�modulesrYrt�ImportError�
_lextokensrO�_lexreflagsrJ�_lexliteralsrQ�set�
lextokens_all�
_lexstateinforF�_lexstateignorerGrArB�_lexstatererWrX�re�compile�_names_to_funcsrH�_lexstateerrorfrI�
_lexstateeoff�begin)r	�tabfile�fdictryrr�r��txtitemr��	func_namercs           r�readtabz
Lexer.readtab�s����g�u�/�/�0��F���w�&�'��[�[��)�F��6�=�%�0�N�B��8�9�9�$�/�/���$�0�0���$�1�1���"�n�n�s�4�3C�3C�/D�D���$�2�2���$�4�4��� ��� ���$�0�0�6�6�8�N�I�s��E��G�"%���Y����b�j�j��f�.@�.@�A�?�S\�^c�Cd�e�f�#&�*/�D�O�O�I�&�-4�D���	�*�9�!���#�3�3�9�9�;�M�I�r�-2�2�Y�D���	�*�<����#�1�1�7�7�9�M�I�r�+0��9�D���i�(�:�	
�
�
�9�rc��|dd}t|t�std��||_d|_t|�|_y)Nr>zExpected a stringr)ri�StringTypes�
ValueErrorrKr�lenrL)r	rr[s   r�inputzLexer.input�s<��
�b�q�E���!�[�)��0�1�1��������!�f��rc�Z�||jvrtd��|j||_|j||_|j
j
|d�|_|jj
|d�|_	|jj
|d�|_||_y)NzUndefined stater=)
rAr�r?rBr@rG�getrPrHrMrIrNrD�r	�states  rr�zLexer.begins�������'��.�/�/��_�_�U�+��
��,�,�U�3����,�,�0�0���;����,�,�0�0���=����(�(�,�,�U�D�9�����
rc�p�|jj|j�|j|�yr)rErXrDr�r�s  r�
push_statezLexer.push_states&�����!�!�$�-�-�0��
�
�5�rc�V�|j|jj��yr)r�rE�poprs r�	pop_statezLexer.pop_states���
�
�4�%�%�)�)�+�,rc��|jSr)rDrs r�
current_statezLexer.current_state!s���}�}�rc�.�|xj|z
c_yr)r)r	�ns  r�skipz
Lexer.skip's�����q��rc��|j}|j}|j}|j}||k�r�|||vr|dz
}�|jD�]g\}}|j||�}|s�t
�}|j�|_|j|_	||_|j}	||	\}
|_|
s8|jr|j�|_|cS|j�}�n�|j�}||_
||_||_|
|�}|s|j}|j}�n�|jsj|j|j vrRt#d|
j$j&|
j$j(|
j*|jfz||d��|cS|||j,vrIt
�}|||_|j|_	|j|_||_|dz|_|S|j.r�t
�}|j|d|_|j|_	d|_||_
||_||_|j/|�}||jk(rt#d||z||d��|j}|s���|S||_t#d|||fz||d��||kr���|j0rQt
�}d|_d|_|j|_	||_||_
||_|j1|�}|S|dz|_|j�t3d��y)	Nr>z4%s:%d: Rule '%s' returned an unknown token type '%s'r.z&Scanning error. Illegal character '%s'z"Illegal character '%s' at index %d�eofr=z"No input string given with input())rrLrPrKr?�matchr�grouprr�	lastindexr�end�lexer�lexmatchrSr�r�__code__�co_filename�co_firstlinenorrQrMrN�RuntimeError)r	rrLrPrKr?�lexindexfunc�m�tok�ir��newtoks            r�tokenzLexer.token1s.���K�K���K�K���N�N�	��L�L���v�o��v��)�+��!����(,�z�z�#��|��K�K���0�����j���G�G�I��	�!�[�[��
�#��
��K�K��!-�a����c�h���x�x�&'�e�e�g���"�
�!"�����������!��	� !��
�$����c���� $���F� $���I���'�'��{�{�$�*<�*<�<�&�']� �M�M�5�5�t�}�}�7S�7S� �M�M�6�;�;�a8�(8�9@���9I�K�K��
�](2�b�6�?�d�&6�&6�6�"�*�C� '���C�I�!%���C�J�"�y�y�C�H�!'�C�J�"(�1�*�D�K��J��>�>�"�*�C� $���V�W� 5�C�I�!%���C�J�&�C�H� $�C�I�!'�C�J�"(�D�K�!�^�^�C�0�F�����,�&�'O�SZ�[a�Sb�'c�el�ms�mt�eu�v�v�!�[�[�F�!� �!�M�$����C�w�v��X^�F_�_�ah�io�ip�aq�r�r�i�v�o�l�<�<��*�C��C�H��C�I����C�J��C�J��C�I� �D�K��\�\�#�&�F��M��q�j����<�<���C�D�D�rc��|Srrrs r�__iter__zLexer.__iter__�r6rc�6�|j�}|�t�|Sr)r��
StopIteration)r	�ts  r�nextz
Lexer.next�s���J�J�L���9����rr)r=)rrrr
rdr�r�r�r�r�r�r�r�r�r�r��__next__rrrr:r:ssN��!�8�< <�J#�P���-���k�\���Hrr:c�0�t|d|j�S)N�regex)rY�__doc__)r�s r�
_get_regexr��s���4��$�,�,�/�/rc���tj|�}|jj�}|j|jk7r|j|j�|Sr)r��	_getframe�	f_globalsrV�f_locals�update)�levelsr"�ldicts   r�get_caller_module_dictr��sG���
�
�f��A�
�K�K����E��{�{�a�j�j� �
���Q�Z�Z� ��Lrc��g}t||�D]4\}}|r|dr|j||df��$|j|��6|SrU)rwrX)�funclist�namelist�resultr"r4s     rrxrx�sL��
�F��x��*���4���1���M�M�4��1��,�'��M�M�!��	+�
�Mrc��g}|D]7}|r"|dr|j||d|df��'|j|��9|SrU)rX)r�r�r�r�s    rr�r��sJ��
�F�
����1���M�M�5��1��;��!��-�.��M�M�!��	�
�Mrc���|sgSdj|�}	tj||�}dgt|jj��dzz}|dd}|jj
�D]~\}}	|j|d�}
t|
�tjtjfvr|
||f||	<|||	<�S|
��V|||	<|jd�dkDrd||	<�ud||f||	<��||fg|g|gfS#t$rYtt|�dz�}|dk(rd}t!|d||||�\}}
}t!||d|||�\}}}||z|
|z||zfcYSwxYw)N�|r>�ignore_r�NN�)rpr�r��max�
groupindex�valuesrWr�rrj�FunctionType�
MethodType�find�	Exception�intr��_form_master_re)�relist�reflagsr��toknamesr�r?r��
lexindexnamesr"r��handler��llistr��lnames�rlist�rre�rnamess                  rr�r��s�����	��H�H�V��E�9��
�
�5�'�*���v��U�%5�%5�%<�%<�%>�!?�!�!C�D��$�Q��
��$�$�*�*�,�D�A�q��Y�Y�q�$�'�F��F�|�� 2� 2�E�4D�4D�E�E�#)�8�A�;�"7��Q��#$�
�a� ��#�#$�
�a� ��6�6�)�$�q�(�&2�L��O�'+�X�a�[�&9�L��O�-���%�&���-��@�@���9���F��A�
�����6��A�,�V�B�Q�Z��%��R���s�F�,�V�A�B�Z��%��R���s�F��e��s�3�w�&��-�8�8�
9�s�B4D�4D�AE#�"E#c���d}|jd�}t|ddd�D]\}}||vs�|dk7s�ndkDrt|d|�}nd}d|vrt|�}dj||d�}||fS)Nr>�_�ANY)r<)rm�	enumeraterurp)r�names�nonstate�partsr��part�states�	tokennames        r�_statetokenrs����H�
�G�G�C�L�E��U�1�2�Y��*���4��u������+�	�1�u��u�Q�q�z�"��������u�������q�r��#�I��I��rc�P�eZdZd
d�Zd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
d
�Zd�Zd�Z
y)�LexerReflectNc���||_d|_g|_||_ddi|_t�|_d|_|�ttj�|_y||_y)Nr<�	inclusiveF)r��
error_func�tokensr��	stateinfor�r�r.r r��stderr�log)r	r�rr�s    rr
zLexerReflect.__init__/sT����
�������!���$�k�2����%�����
�36�;�)�C�J�J�/���C��rc��|j�|j�|j�|j�yr)�
get_tokens�get_literals�
get_states�	get_rulesrs r�get_allzLexerReflect.get_all:s,�����������������rc�z�|j�|j�|j�|jSr)�validate_tokens�validate_literals�validate_rulesr.rs r�validate_allzLexerReflect.validate_allAs0��������� ������z�z�rc�P�|jjdd�}|s#|jjd�d|_yt	|t
tf�s#|jjd�d|_y|s#|jjd�d|_y||_y)NrzNo token list is definedTztokens must be a list or tupleztokens is empty)r�r�rr.ri�listrur)r	rs  rr
zLexerReflect.get_tokensHs���������$�/����H�H�N�N�5�6��D�J���&�4��-�0��H�H�N�N�;�<��D�J����H�H�N�N�,�-��D�J����rc���i}|jD]_}tj|�s#|jj	d|�d|_||vr|jjd|�d||<�ay)NzBad token name '%s'TzToken '%s' multiply definedr>)r�_is_identifierr�rr.r,)r	�	terminalsr�s   rrzLexerReflect.validate_tokens\sb���	����A�!�'�'��*������4�a�8�!��
��I�~���� � �!>��B��I�a�L�
rc�n�|jjdd�|_|jsd|_yy)N�literalsr=)r�r�rrs rrzLexerReflect.get_literalsgs+���
�
���z�2�6��
��}�}��D�M�rc� �	|jD]M}t|t�rt|�dkDs�"|jjdt
|��d|_�Oy#t$r%|jjd�d|_YywxYw)Nr>z.Invalid literal %s. Must be a single characterTzIInvalid literals specification. literals must be a sequence of characters)rrir�r�rr.rs�	TypeError)r	r[s  rrzLexerReflect.validate_literalsmss��	��]�]��!�!�[�1�S��V�a�Z��H�H�N�N�#S�UY�Z[�U\�]�!%�D�J�#��
�	��H�H�N�N�f�g��D�J�	�s�-A�.A�+B
�B
c��|jjdd�|_|j�rRt|jtt
f�s#|jjd�d|_y|jD]�}t|t�rt|�dk7r-|jjdt|��d|_�N|\}}t|t�s-|jjdt|��d|_��|dk(s)|dk(s$|jjd	|�d|_��||jvr$|jjd
|�d|_��||j|<��yy)Nrz)states must be defined as a tuple or listTr�zMInvalid state specifier %s. Must be a tuple (statename,'exclusive|inclusive')zState name %s must be a stringr�	exclusivez:State type for state %s must be 'inclusive' or 'exclusive'zState '%s' already defined)r�r�rrirurrr.r�rsr�r	)r	rr4�	statetypes    rrzLexerReflect.get_statesxs/���j�j�n�n�X�t�4����;�;��d�k�k�E�4�=�9������J�K�!��
����A�%�a��/�3�q�6�Q�;������'v�x|�}~�x�A�%)��
� �&'�O�D�)�%�d�K�8������'G��d��T�%)��
� �%��4�	�[�8P������'c�ei�j�%)��
� ��t�~�~�-������'C�T�J�%)��
� �+4�D�N�N�4�(�%%�rc���|jD�cgc]
}|dddk(s�|��}}i|_i|_i|_i|_i|_i|_|jD] }g|j|<g|j|<�"t|�dk(r#|jjd�d|_
y|D�]�}|j|}t||j�\}}||j|<t|d�r�|dk(r|D]}||j
|<��c|dk(r|D]}||j|<��|d	k(r\|jj}|jj}|jjd
|||j �d|_
��|D]"}|j|j#||f��$��	t%|t&�r�|d	k(r:|D]}||j|<�d|vs��:|jj)d|���X|dk(r%|jjd
|�d|_
���|D]"}|j|j#||f��$���|jjd|�d|_
���|jj+�D]}|j-d����|jj+�D]}|j-d�d���ycc}w)Nr��t_rz+No rules of the form t_rulename are definedTr8r.r��ignorez,%s:%d: Rule '%s' must be defined as a string�\z#%s contains a literal backslash '\'�'Rule '%s' must be defined as a functionz&%s not defined as a function or stringc�4�|djjS�Nr>)r�r���xs r�<lambda>z(LexerReflect.get_rules.<locals>.<lambda>�s���1����!=�!=r)r]c��t|d�Sr))r�r*s rr,z(LexerReflect.get_rules.<locals>.<lambda>�s���Q�q�T�r)r]�reverse)r�r��funcsym�strsymr%�errorf�eoffr	r�rr.r�hasattrr�r�r�rrXrir�r,r��sort)	r	r"�tsymbolsrr�r�tokname�line�files	         rrzLexerReflect.get_rules�s���#�z�z�;�z�!�Q�r��U�d�]�A�z��;���
���������������	����A� �D�L�L��O��D�K�K��N� ��x�=�A���H�H�N�N�H�I��D�J���A��
�
�1�
�A�)�!�T�^�^�<�O�F�G�&�D�M�M�!���q�*�%��g�%�#��)*����A��$���%�#��'(��	�	�!��$���(��:�:�4�4�D��:�:�1�1�D��H�H�N�N�#Q�SW�Y]�_`�_i�_i�j�!%�D�J�#�����Q��.�.��1�v�6�$��A�{�+��h�&�#��)*����A��$��q�y����(�(�)O�QR�S���'��H�H�N�N�#L�a�P�!%�D�J�#�����A��-�-�q�!�f�5�$������G��K�!��
�G�L���$�$�&�A�
�F�F�=�F�>�'����#�#�%�A�
�F�F�*�D�F�9�&��{<s
�
K&�K&c
�
�|jD�]$}|j|D�]�\}}|jj}|jj}tj|�}|jj|�|j|}t|tj�rd}nd}|jj}	|	|kDr0|jjd|||j �d|_��|	|kr1|jjd|||j �d|_��t#|�s1|jjd|||j �d|_��N	t%j&d|�dt#|��d	�|j(�}
|
j+d
�r/|jjd|||j �d|_���|j,|D]�\}}
|j|}|dk(r$|jjd|�d|_�>||j.vr9|j1d�dkr%|jjd||�d|_��	t%j&d|�d|
�d	�|j(�}
|
j+d
�r#|jjd|�d|_��|j|s2|j,|s#|jjd|�d|_|j2j5|d�}|s��(|}|jj}|jj}tj|�}|jj|�t|tj�rd}nd}|jj}	|	|kDr/|jjd|||j �d|_|	|ks���|jjd|||j �d|_��'|jD]}|j7|��y#t$j$rp}|jjd|||j |�d
t#|�vr(|jjd|||j �d|_Yd}~���d}~wwxYw#t$j$rO}|jjd||�d
|
vr|jjd|�d|_Yd}~��Jd}~wwxYw)Nr�r>z'%s:%d: Rule '%s' has too many argumentsTz%%s:%d: Rule '%s' requires an argumentz2%s:%d: No regular expression defined for rule '%s'�(?P<�>�)r=z<%s:%d: Regular expression for rule '%s' matches empty stringz3%s:%d: Invalid regular expression for rule '%s'. %s�#z6%s:%d. Make sure '#' in rule '%s' is escaped with '\#'r.r'r�rz-Rule '%s' defined for an unspecified token %sz5Regular expression for rule '%s' matches empty stringz,Invalid regular expression for rule '%s'. %sz/Make sure '#' in rule '%s' is escaped with '\#'zNo rules defined for state '%s')r	r/r�r�r��inspect�	getmoduler��addr�rirjr��co_argcountrr.rr�r�r�r�r�r0rr�r1r��validate_module)r	r��fnamer"r7r8�moduler6�reqargs�nargsr[�er4�r�efuncs               rrzLexerReflect.validate_rules�sH���^�^�E�!�L�L��/���q��z�z�0�0���z�z�-�-�� �*�*�1�-����� � ��(��-�-��.���a��!1�!1�2��G��G��
�
�.�.���7�?��H�H�N�N�#L�d�TX�Z[�Zd�Zd�e�!%�D�J���7�?��H�H�N�N�#J�D�RV�XY�Xb�Xb�c�!%�D�J��!�!�}��H�H�N�N�#W�Y]�_c�ef�eo�eo�p�!%�D�J��	&��
�
�5�*�Q�-�#H�$�,�,�W�A��w�w�r�{������'e�gk�mq�st�s}�s}�~�%)��
��?0�N �;�;�u�-���a��-�-��-���g�%��H�H�N�N�#L�d�S�!%�D�J���$�+�+�-�'�,�,�y�2I�A�2M��H�H�N�N�#R�TX�Za�b�!%�D�J��	&��
�
�4��#;�T�\�\�J�A�����������'^�`d�e�%)��
��!.�.�<�<��&�t�{�{�5�/A������@�%�H�!��
��K�K�O�O�E�4�0�E�����z�z�0�0���z�z�-�-�� �*�*�1�-����� � ��(��a��!1�!1�2��G��G��
�
�.�.���7�?��H�H�N�N�#L�d�TX�Z[�Zd�Zd�e�!%�D�J��7�?��H�H�N�N�#J�D�RV�XY�Xb�Xb�c�!%�D�J�s$�v�l�l�F�� � ��(�#��q�x�x�&��H�H�N�N�#X�Z^�`d�fg�fp�fp�rs�t��j��m�+������'`�bf�hl�no�nx�nx�y�!%�D�J�J��	&��0�x�x�&��H�H�N�N�#Q�SW�YZ�[��a�x������'Y�[_�`�!%�D�J�J��	&�s4�/A0Q�7AS�S�+A%S�S�U�1AT;�;Uc���	tj|�\}}tjd�}tjd�}i}|dz
}|D]�}|j|�}|s|j|�}|re|j
d�}	|j|	�}
|
s|||	<n;tj|�}|jjd|||	|
�d|_
|dz
}��y#t$rYywxYw)Nz\s*def\s+(t_[a-zA-Z_0-9]*)\(z\s*(t_[a-zA-Z_0-9]*)\s*=r>z7%s:%d: Rule %s redefined. Previously defined on line %dT)r>�getsourcelinesrlr�r�r�r�r��
getsourcefilerr.)r	rD�lines�linen�fre�sre�	counthashr7r�r4�prevr|s            rrBzLexerReflect.validate_module@s���	�"�1�1�&�9�L�E�5��j�j�8�9���j�j�4�5���	�
��
���D��	�	�$��A���I�I�d�O����w�w�q�z�� �}�}�T�*���&+�I�d�O�&�4�4�V�<�H��H�H�N�N�#\�^f�hm�os�uy�z�!%�D�J��Q�J�E����	��	�s�C#�#	C/�.C/)Nr)rrrr
rrr
rrrrrrrBrrrrr.s=��H����(��	�5�>?:�D])�NrrFryc

��|�d}d}
ddi}t�}||_|	�ttj�}	|r|�ttj�}|r|}|rWt|�D�
cgc]}
|
t
||
�f��}}
t|�}
d|
vr/tj|
dj|
d<ntd�}
|
jd�}|rt|t�rd|vr|dz|z}t|
|	|�	�}|j�|s|j!�rt#d
��|r1|r/	|j%||
�|j&a|j(a|a|S|rT|j/d|j0�|j/d|j2�|j/d
|j4�t7�|_|j0D]}|j8j;|��t|j2t<t>f�r<tA|j2d��jC|j2�|_"n|j2|_"|j8t7|jD�z|_#|j4}i}|D]�}g}|jH|D]r\}}|jJjL}|jJjN}|jQd|�dtS|��d��|s�V|j/d|tS|�|��t|jT|D]4\}}|jQd|�d|�d��|s�!|j/d|||��6|||<��|r|j/d�|D]x}tW||||
|jX�\}}}||jZ|<||j\|<||j^|<|s�Rta|�D]\}}|j/d|||���z|jc�D]�\}} |dk7s�| dk(s�|jZ|je|jZd�|j\|je|j\d�|j^|je|j^d���||_3|jZd|_4|j\d|_5||_6|jn|_8|jpjdd�|_9|jt|_;|jtjdd�|_<|jxs|	j{d�|j||_?|j|jdd�|_@|jc�D]�\}!} | dk(rO|!|jtvr|	j{d|!�|!|jnvs�:|jrs�G|	j{d|!��Z| dk(s�`|!|jtvr)|jtjdd�|jt|!<|!|jnvs��|jnjdd�|jn|!<��|j&a|j(a|a|r�|r�|��t|t�j��r
|j}"n[d|vr|
d}"nQ|j�d�}#djC|#dd�}$t�d|$z�t
tj|$dd�}"t�j�j�|"�}	|j�||�|S|Scc}
w#t,$rY���wxYw#t�$r"}%|	j{d|�d|%���Yd}%~%|Sd}%~%wwxYw)Nryr<r�__file__rr��__package__rf)rr�zCan't build lexerzlex: tokens   = %rzlex: literals = %rzlex: states   = %rrr:r;r<z(lex: Adding rule %s -> '%s' (state '%s')z#lex: ==== MASTER REGEXS FOLLOW ====z"lex: state '%s' : regex[%d] = '%s'r=zNo t_error rule is definedr!z1No error rule is defined for exclusive state '%s'z2No ignore rule is defined for exclusive state '%s'rgr�zCouldn't write lextab module z. )Jr:rSr r�r
�dirrY�dictr�rTr�r�rirrrr�SyntaxErrorr�r�r�r�r�r/rrr	r�rOr@rrurrprQr�r/r�r�r�rXr�r0r�r�rArBrCr�rW�extendrFr?r@rJr%rGrPr1rHrMr,r2rIrNrjrkrmr�rnro�dirnamer�rl)&rDrZr0�optimizeryr��nowarnrz�debuglog�errorlogr�r	�lexobj�k�_items�pkg�linfor��regexsr��
regex_listrCr"r7r8r4rHr?�re_text�re_namesr�r�styper�srcfiler��pkgnamerGs&                                      r�lexrk_s����~���
�E��[�)�I�
�W�F�!�F�����S�Z�Z�(����� ����,�H�����36�v�;�?�;�a�1�g�f�a�(�)�;��?��V����U�"� #���E�,�,?� @� I� I�E�*��&�q�)���)�)�M�
"�C�
�z�&�#�&��f���3�Y��'�F�
��H�g�>�E�	�M�M�O�������1�2�2��F�	��N�N�6�5�)��L�L�E��L�L�E��E��M�
��
�
�*�E�L�L�9��
�
�*�E�N�N�;��
�
�*�E�O�O�<��u�F��
�\�\�������Q����%�.�.�4��-�0�4�T�%�.�.��"3�4�6�;�;�E�N�N�K���"�^�^���!�+�+�c�&�2D�2D�.E�E�F�����I�
�F����
��
�
�e�,�H�E�1��:�:�,�,�D��:�:�)�)�D����e�Z��]�C�D���
�
�H�%�Q[�\]�Q^�`e�f�-��|�|�E�*�G�D�!����d�A�6�7���
�
�H�$�PQ�SX�Y�+�
#��u�
�#�*
��
�
�;�<���#2�6�%�=�'�5�RW�R`�R`�#a� ��w��#(����%� �'.����e�$�(0����u�%��$�W�-���4��
�
�B�E�1�d�S�.�
�"���)���u��I��%�;�"6����e�$�+�+�F�,=�,=�i�,H�I��!�!�%�(�/�/��0E�0E�i�0P�Q��"�"�5�)�0�0��1G�1G�	�1R�S�	*�$�F���$�$�Y�/�F�L��,�,�Y�7�F���F��"�L�L�F���,�,�0�0��B�?�F��"�L�L�F���|�|�'�'�	�4�8�F��������5�6� �*�*�F���Z�Z�^�^�I�t�4�F�N��O�O�%���5��K������$�� � �!T�VW�X�����$��)9�)9�� � �!U�WX�Y�
�k�
!�����$�"'�,�,�"2�"2�9�d�"C����Q������$�"'�,�,�"2�"2�9�b�"A����Q��&�
�L�L�E��L�L�E��E��(���
�&�%�"2�"2�3� �/�/���f�$�#�J�/�G�"�L�L��-�E�!�h�h�u�S�b�z�2�G���w�.�/�%�c�k�k�'�&:�J��K�G�������0�I�	R��O�O�F�I�.��M�6�M��{@��<�	��	��x�	R����f�a�P�Q�Q��M��	R�s0�'\;�+-]�%]�	]
�]
�	];�]6�6];c�4�|s?	tjd}t|�}|j�}|j	�|r
|j}nt}||�|r
|j}nt}	|�}|sytjjd|j|j|j|jfz��Y#t
$r@tjjd�tjj�}Y��wxYw)Nr>z/Reading from standard input (type EOF to end):
z(%s,%r,%d,%d)
)r��argvrq�read�close�
IndexError�stdoutr&�stdinr�r�rrrr)r��datar|r"�_input�_tokenr�s       r�runmainrvs����	$��x�x��{�H��X��A��6�6�8�D�
�G�G�I�

�������
�4�L��������
��h�����
�
���*�c�h�h��	�	�3�:�:�s�z�z�-Z�Z�[�	���	$��J�J���O�P��9�9�>�>�#�D�	$�s�>C�AD�Dc����fd�}|S)Nc�R��t�d�rt��|_|S�|_|S)Nr8)r3r�r�)r"rHs �r�	set_regexzTOKEN.<locals>.set_regexBs-����1�j�!� ��m�A�G����A�G��rr)rHrys` r�TOKENrzAs�����rr�)$rrrtr�r�rjrVrnr>�
StringType�UnicodeTyper��AttributeErrorr�bytesr�rr�rrZrr r2r:r�r�rxr�r�rrr��VERBOSErkrvrz�Tokenrrr�<module>r�s��D����	�
���	����#�#�U�%6�%6�7�K�����.�/���y���v�����$���,u�u�H
0���� 9�P�2j�6�j�b	�D���h��B�J�J�����W[�x�@\�D�	���w ����,�K��s�C�	C�CPK�t�\d�sf��$ply/__pycache__/yacc.cpython-312.pycnu�[����

=Uik�
��ddlZddlZddlZddlZddlZddlZddlZdZdZ	dZ
dZdZdZ
dZdZd	ZdZej$ddkreZneZej,ZGd
�de�ZGd�d
e�ZGd�de�Zd�Zd�Zdada da!dZ"d�Z#d�Z$d�Z%d�Z&Gd�d�Z'Gd�d�Z(Gd�d�Z)ejTd�Z+Gd�de�Z,Gd �d!e�Z-Gd"�d#e�Z.d$�Z/Gd%�d&e�Z0Gd'�d(e�Z1Gd)�d*e�Z2Gd+�d,e�Z3d-�Z4d.�Z5Gd/�d0e�Z6Gd1�d2e3�Z7d3�Z8d4�Z9Gd5�d6e�Z:de
deddddeddddf
d7�Z;y)8�Nz3.10Tz
parser.out�parsetab�LALR�F�(c�,�eZdZd�Zd�ZeZd�Zd�ZeZy)�	PlyLoggerc��||_y�N)�f)�selfrs  �C/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/ply/yacc.py�__init__zPlyLogger.__init__ns	�����c�F�|jj||zdz�y)N�
�r�write�r�msg�args�kwargss    r
�debugzPlyLogger.debugqs�������c�D�j�D�(�)rc�L�|jjd||zzdz�y)Nz	WARNING: rrrs    r
�warningzPlyLogger.warningvs �������[�C�$�J�/�$�6�7rc�L�|jjd||zzdz�y)NzERROR: rrrs    r
�errorzPlyLogger.errorys �������Y�#��*�-��4�5rN)	�__name__�
__module__�__qualname__rr�inforr�critical�rr
rrms$���*��D�8�6��Hrrc��eZdZd�Zd�Zy)�
NullLoggerc��|Sr
r")r�names  r
�__getattribute__zNullLogger.__getattribute__�����rc��|Sr
r")rrrs   r
�__call__zNullLogger.__call__�r(rN)rrrr'r*r"rr
r$r$s���rr$c��eZdZy)�	YaccErrorN�rrrr"rr
r,r,����rr,c��t|�}d|vrt|�}t|�tkDr|dtdz}dt|�jt|�|fz}|S)Nrz ...z<%s @ 0x%x> (%s))�repr�len�resultlimit�typer�id)�r�repr_str�results   r
�
format_resultr8�s]���A�w�H��x����>��
�8�}�{�"��L�[�)�F�2��
�4��7�#3�#3�R��U�H�"E�
E�F��Mrc��t|�}d|vrt|�}t|�dkr|Sdt|�jt	|�fzS)Nr�z<%s @ 0x%x>)r0r1r3rr4)r5r6s  r
�format_stack_entryr;�sK���A�w�H��x����>��
�8�}�r������Q�� 0� 0�"�Q�%�8�8�8raPLY: Don't use global functions errok(), token(), and restart() in p_error().
Instead, invoke the methods on the associated parser instance:

    def p_error(p):
        ...
        # Use parser.errok(), parser.token(), parser.restart()
        ...

    parser = yacc.yacc()
c�H�tjt�t�Sr
)�warnings�warn�_warnmsg�_errokr"rr
�errokrA�����M�M�(���8�Orc�H�tjt�t�Sr
)r=r>r?�_restartr"rr
�restartrE�s���M�M�(���:�rc�H�tjt�t�Sr
)r=r>r?�_tokenr"rr
�tokenrH�rBrc��|ja|ja|ja||�}	bbb|S#t$rY|SwxYwr
)rAr@rHrGrErD�	NameError)�	errorfuncrH�parserr5s    r
�call_errorfuncrM�sS��
�\�\�F�
�\�\�F��~�~�H��%��A�
��F�H�
�H���
���H�
�s�3�	A�Ac��eZdZd�Zd�Zy)�
YaccSymbolc��|jSr
)r3�rs r
�__str__zYaccSymbol.__str__�s���y�y�rc��t|�Sr
��strrQs r
�__repr__zYaccSymbol.__repr__�s���4�y�rN)rrrrRrVr"rr
rOrO�s���rrOc�P�eZdZd
d�Zd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
d
�Zd�Zd�Z
y)�YaccProductionNc�<�||_||_d|_d|_yr
)�slice�stack�lexerrL)r�sr[s   r
rzYaccProduction.__init__�s����
���
���
���rc���t|t�r'|j|D�cgc]}|j��c}S|dk\r|j|jS|j|jScc}w�Nr)�
isinstancerZ�valuer[)r�nr]s   r
�__getitem__zYaccProduction.__getitem__�sa���a���%)�Z�Z��]�3�]��A�G�G�]�3�3�
�!�V��:�:�a�=�&�&�&��:�:�a�=�&�&�&��	4s�A/c�,�||j|_yr
�rZra)rrb�vs   r
�__setitem__zYaccProduction.__setitem__�s����
�
�1�
�rc�Z�|j||D�cgc]}|j��c}Scc}wr
re)r�i�jr]s    r
�__getslice__zYaccProduction.__getslice__�s(��!%���A�a��1��A�����1�1��1s�(c�,�t|j�Sr
)r1rZrQs r
�__len__zYaccProduction.__len__�s���4�:�:��rc�6�t|j|dd�S)N�linenor��getattrrZ�rrbs  r
rozYaccProduction.lineno����t�z�z�!�}�h��2�2rc�,�||j|_yr
)rZro)rrbros   r
�
set_linenozYaccProduction.set_linenos��%��
�
�1�
�rc�r�t|j|dd�}t|j|d|�}||fS)Nror�	endlinenorp)rrb�	startline�endlines    r
�linespanzYaccProduction.linespans9���D�J�J�q�M�8�Q�7�	��$�*�*�Q�-��i�@���'�!�!rc�6�t|j|dd�S)N�lexposrrprrs  r
r|zYaccProduction.lexposrsrc�r�t|j|dd�}t|j|d|�}||fS)Nr|r�	endlexposrp)rrb�startpos�endposs    r
�lexspanzYaccProduction.lexspans9���4�:�:�a�=�(�A�6������A���X�>�����rc��t�r
)�SyntaxErrorrQs r
rzYaccProduction.errors���rr
)rrrrrcrgrkrmrorurzr|r�rr"rr
rXrX�s9���'� �2��3�&�"�
3� �
rrXc�J�eZdZd�Zd�Zd�Zd�Zd�Zdd�Zdd�Z	dd	�Z
dd
�Zy)�LRParserc��|j|_|j|_|j|_||_|j�d|_y�NT)	�lr_productions�productions�	lr_action�action�lr_goto�gotorK�set_defaulted_states�errorok)r�lrtab�errorfs   r
rzLRParser.__init__s@�� �/�/����o�o����M�M��	�����!�!�#���rc��d|_yr�)r�rQs r
rAzLRParser.errok&s	����rc���|jdd�=|jdd�=t�}d|_|jj	|�|jj	d�y)N�$endr)�
statestack�symstackrOr3�append)r�syms  r
rEzLRParser.restart)sL���O�O�A���M�M�!���l������
�
���S�!������q�!rc���i|_|jj�D]H\}}t|j	��}t|�dk(s�.|ddks�7|d|j|<�Jy�N�r)�defaulted_statesr��items�list�valuesr1)r�state�actions�ruless    r
r�zLRParser.set_defaulted_states9s_�� "���"�k�k�/�/�1�N�E�7�����)�*�E��5�z�Q��5��8�a�<�/4�Q�x��%�%�e�,�2rc��i|_yr
)r�rQs r
�disable_defaulted_statesz!LRParser.disable_defaulted_states@s
�� "��rNc���|str>t|t�rttj
�}|j
|||||�S|r|j|||||�S|j|||||�Sr
)	�	yaccdevelr`�intr�sys�stderr�
parsedebug�parseopt�parseopt_notrack)r�inputr\r�tracking�	tokenfuncs      r
�parsezLRParser.parseCsi���I��%��%�!�#�*�*�-���?�?�5�%���)�L�L�
��=�=���u�h�	�J�J��(�(���u�h�	�R�Rrc
���d}g}|j}|j}	|j}
|j}t	d�}d}
|jd�|sddlm}|j}||_||_	|�|j|�|�
|j}n|}||_g}||_g}||_
||_d}|jd�t!�}d|_|j|�d}	|j%d�|j%d|�||vrP|s-|s|�}n|j'�}|st!�}d|_|j"}||j)|�}n||}|j%d||�|j%d	d
j+|D�cgc]}|j"��c}dd��dt-|���j/��|���|dkDrA|j|�|}|j%d|�|j|�d}|
r|
dz}
��2|dk�rG|
|}|j0}|j2}t!�}||_d|_|re|jd
|j,ddj+||dD�cgc]}t7|j4���c}�zdz|	|d|z
|�n'|jd
|j,g|	|d|�|r�||dz
d}||d<|rd|d}|j8|_|j:|_|d}t=|d|j8�|_t=|d|j:�|_ ||_!	||d�=||_"|jG|�||d�=|jdtI|d��|j|�|	|d|}|j|����|r"|j8|_|j:|_|g}||_!	||_"|jG|�|jdtI|d��|j|�|	|d|}|j|���|dk(r@|d}t=|dd�}|jdtI|��|jd�|S|���|jSdd
j+|D�cgc]}|j"��c}dd��dt-|���j/��|
dk(s
|jP�rtN}
d|_(|}|j"dk(rd}|jTrE|rtW|d�s||_||_"tY|jT||�} |jPr�| }d}���|rytW|d�r
|j8}!nd}!|!r/tZj\j_d|!|j"fz�nStZj\j_d|j"z�n&tZj\j_d�ytN}
t3|�dkr|j"dk7r
d}d}d}|dd�=��m|j"dk(ry|j"dk7r�|d}|j"dk(r>|r8t=|d|j8�|_t=|d |j:�|_ d}���t!�}d|_tW|d�r|j8x|_|_tW|d �r|j:x|_|_ ||_|j|�|}nI|j'�}|r"|j8|_|j:|_|j'�|d}���tad!��cc}wcc}w#tJ$r[|j|�|jM|dd�|j'�|d}d|_d|_|}tN}
d|_(Y��,wxYw#tJ$rG|j|�|j'�|d}d|_d|_|}tN}
d|_(Y���wxYwcc}w)"NrzPLY: PARSE DEBUG STARTr���lexr��zState  : %sz#Defaulted state %s: Reduce using %dzStack  : %s� z . z Action : Shift and goto state %sz3Action : Reduce rule [%s] with %s and goto state %d�[�,�]���rwr~zResult : %srFrazDone   : Returning %szPLY: PARSE DEBUG ENDzError  : %sr\ro�(yacc: Syntax error at line %d, token=%s
�yacc: Syntax error, token=%s� yacc: Parse error in input. EOF
r|�yacc: internal parser error!!!
)1r�r�r�r�rXr r�r�r\rLr�rHr�r�r[r�rOr3r�pop�get�joinrU�lstripr&r1rar;ror|rqrwr~rZr��callabler8r��extend�error_countr�rrK�hasattrrMr�r�r�RuntimeError)"rr�r\rr�r��	lookahead�lookaheadstackr�r��prodr��pslice�
errorcountr��	get_tokenr�r��errtokenr�r��ltype�t�xx�p�pname�plen�_v�targ�t1rbr7�tokros"                                  r
r�zLRParser.parsedebug\s6���	����+�+���)�)���"�"���0�0�� ��&���
�	�
�
�+�,����I�I�E������
����K�K��������I�!�I���
��
�$����� ��
������	���!���l�������������
�K�K��O��K�K�
�u�-��,�,� �)�$-�K�	�$2�$6�$6�$8�	�$�$.�L�	�)/�	��"�����E�N�&�&�u�-��$�U�+�����A�5�1�"�M�
�K�K�
�&)�h�h�(�/K�(�B����(�/K�A�B�/O�&P�RU�V_�R`�a�i�i�k�
m��}��q�5��%�%�a�(��E��K�K� B�A�F��O�O�I�.� $�I�"�"�a��
���q�5��a�R��A��F�F�E��E�E�D�%�,�C�$�C�H� $�C�I���
�
�#X�Z[�Z_�Z_�#&�s�x�x�X`�bf�af�ag�Xh�0i�Xh�RT�1C�B�H�H�1M�Xh�0i�'j�#j�kn�#n�#'�
�2�d�7�(;�#<�U�#C�E��
�
�#X�Z[�Z_�Z_�ac�#'�
�2��#7��#>�@�
�'���a���1��"%��Q��$�!%�a��B�)+���C�J�)+���C�J�!%�b��B�,3�B��R�Y�Y�,O�C�M�,3�B��R�Y�Y�,O�C�M�(,���1� (�$��� 0�).�D�J��J�J�v�.� *�D�5�6� 2�!�J�J�}�m�F�1�I�6N�O�$�O�O�C�0�$(��B��$8��$?�E�&�-�-�e�4�!�$�).���C�J�).���C�J�!$�u��(,���1�).�D�J��J�J�v�.�!�J�J�}�m�F�1�I�6N�O�$�O�O�C�0�$(��B��$8��$?�E�&�-�-�e�4�!���6� ���A�$�Q���6�F��J�J�6�
�f�8M�N��J�J�5�6�!�M��y����M�*-�(�(�h�3O�h��B�G�G�h�3O�PQ�PR�3S�*T�VY�Zc�Vd�e�m�m�o�q���?�d�l�l�!,�J�#(�D�L�(�H��}�}��.�#'���~�~�#�G�H�g�,F�-2�H�N�%*��
�,�T�^�^�X�t�L���<�<�),�I�'+�H�$�#�&�x��:�)2�)9�)9��)*��%� #�
�
� 0� 0�1\�`f�hp�hu�hu�_v�1v� w� #�
�
� 0� 0�1O�RZ�R_�R_�1_� `��J�J�,�,�-P�Q�"�"-�J��z�?�a�'�I�N�N�f�,D� $�I�#�H��E�&�q�)���>�>�V�+���>�>�W�,�"�2�,�C��x�x�7�*�$�,3�I�x����,T�C�M�,3�I�x����,T�C�M�$(�	� �#��A�$�A�F��y�(�3�1:�1A�1A�A���1�;��y�(�3�1:�1A�1A�A���1�;�'�A�G�"�)�)�)�4� !�I�"�,�,�.�C��+.�:�:�	�(�+.�:�:�	�(��N�N�$�&�r�N�E���A�B�B��u0L��F1j��R +�
1�*�1�1�)�<�$�O�O�D��2�J�7�&�N�N�,�$.�r�N�E�'.�C�H�(/�C�I�(+�I�)4�J�+0�D�L�
1��T +�	1�*�1�1�)�<�&�N�N�,�$.�r�N�E�'.�C�H�(/�C�I�(+�I�)4�J�+0�D�L�	1��64Ps:�^�^�*A/^"�
A#`	�a�"A `�`�	Aa�ac��d}g}|j}|j}	|j}
|j}t	d�}d}
|sddlm}|j}||_||_|�|j|�|�
|j}n|}||_
g}||_g}||_||_
d}|jd�t�}d|_|j|�d}	||vrP|s-|s|�}n|j#�}|st�}d|_|j }||j%|�}n||}|���|dkDr.|j|�|}|j|�d}|
r|
dz}
��|dk�r}|
|}|j&}|j(}t�}||_d|_|r�||dz
d}||d<|rd|d}|j,|_|j.|_|d}t1|d|j,�|_t1|d|j.�|_||_	||d�=||_|j;|�||d�=|j|�|	|d|}|j|����|r"|j,|_|j.|_|g}||_	||_|j;|�|j|�|	|d|}|j|���|dk(r|d}t1|d
d�}|S|��~|
dk(s
|jB�rt@}
d	|_!|}|j dk(rd}|jDrE|rtG|d�s||_||_tI|jD||�}|jBr�|}d}���|rytG|d�r
|j,}nd}|r/tJjLjOd
||j fz�nStJjLjOd|j z�n&tJjLjOd�yt@}
t)|�dkr|j dk7r
d}d}d}|dd�=��}|j dk(ry|j dk7r�|d}|j dk(r>|r8t1|d|j,�|_t1|d|j.�|_d}���t�}d|_tG|d�r|j,x|_|_tG|d�r|j.x|_|_||_|j|�|}nI|j#�}|r"|j,|_|j.|_|j#�|d}���tQd��#t<$r[|j|�|j?|dd�|j#�|d}d|_d|_|}t@}
d	|_!Y���wxYw#t<$rG|j|�|j#�|d}d|_d|_|}t@}
d	|_!Y��]wxYw)Nrr�r�r�r�rwr~rFrar\ror�r�r�r|r�))r�r�r�r�rXr�r�r\rLr�rHr�r�r[r�rOr3r�r�r&r1raror|rqrwr~rZr�r�r�r�r�r�rKr�rMr�r�rr�) rr�r\rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rbr7r�ros                                 r
r�zLRParser.parseopt�sI���	����+�+���)�)���"�"���0�0�� ��&���
����I�I�E������
����K�K��������I�!�I���
��
�$����� ��
������	���!���l��������������,�,� �)�$-�K�	�$2�$6�$6�$8�	�$�$.�L�	�)/�	��"�����E�N�&�&�u�-��$�U�+���}��q�5��%�%�a�(��E��O�O�I�.� $�I�"�"�a��
���q�5��a�R��A��F�F�E��E�E�D�%�,�C�$�C�H� $�C�I��'���a���1��"%��Q��$�!%�a��B�)+���C�J�)+���C�J�!%�b��B�,3�B��R�Y�Y�,O�C�M�,3�B��R�Y�Y�,O�C�M�(,���1� (�$��� 0�).�D�J��J�J�v�.� *�D�5�6� 2�$�O�O�C�0�$(��B��$8��$?�E�&�-�-�e�4�!�$�).���C�J�).���C�J�!$�u��(,���1�).�D�J��J�J�v�.�$�O�O�C�0�$(��B��$8��$?�E�&�-�-�e�4�!���6� ���A�$�Q���6�F�!�M��y���?�d�l�l�!,�J�#(�D�L�(�H��}�}��.�#'���~�~�#�G�H�g�,F�-2�H�N�%*��
�,�T�^�^�X�t�L���<�<�),�I�'+�H�$�#�&�x��:�)2�)9�)9��)*��%� #�
�
� 0� 0�1\�`f�hp�hu�hu�_v�1v� w� #�
�
� 0� 0�1O�RZ�R_�R_�1_� `��J�J�,�,�-P�Q�"�"-�J��z�?�a�'�I�N�N�f�,D� $�I�#�H��E�&�q�)���>�>�V�+���>�>�W�,�"�2�,�C��x�x�7�*�$�,3�I�x����,T�C�M�,3�I�x����,T�C�M�$(�	� �#��A�$�A�F��y�(�3�1:�1A�1A�A���1�;��y�(�3�1:�1A�1A�A���1�;�'�A�G�"�)�)�)�4� !�I�"�,�,�.�C��+.�:�:�	�(�+.�:�:�	�(��N�N�$�&�r�N�E���A�B�B��G +�
1�*�1�1�)�<�$�O�O�D��2�J�7�&�N�N�,�$.�r�N�E�'.�C�H�(/�C�I�(+�I�)4�J�+0�D�L�
1��N +�	1�*�1�1�)�<�&�N�N�,�$.�r�N�E�'.�C�H�(/�C�I�(+�I�)4�J�+0�D�L�	1�s(�)AV�+AW>�A W;�:W;�>AY�
Yc��
�d}g}|j}|j}	|j}
|j}t	d�}d}
|sddlm}|j}||_||_|�|j|�|�
|j}n|}||_
g}||_g}||_||_
d}|jd�t�}d|_|j|�d}	||vrP|s-|s|�}n|j#�}|st�}d|_|j }||j%|�}n||}|��D|dkDr.|j|�|}|j|�d}|
r|
dz}
��|dkr�|
|}|j&}|j(}t�}||_d|_|ri||dz
d}||d<||_	||d�=||_|j1|�||d�=|j|�|	|d|}|j|���6|g}||_	||_|j1|�|j|�|	|d|}|j|����|dk(r|d}t;|dd�}|S|�� |
dk(s
|j8�rt6}
d|_|}|j dk(rd}|j<rE|rt?|d	�s||_||_tA|j<||�}|j8r�|}d}��'|ryt?|d
�r
|jB}nd}|r/tDjFjId||j fz�nStDjFjId|j z�n&tDjFjId
�yt6}
t)|�dkr|j dk7r
d}d}d}|dd�=���|j dk(ry|j dk7r�|d}|j dk(rd}��)t�}d|_t?|d
�r|jBx|_!|_%t?|d�r|jLx|_&|_'||_|j|�|}n%|j#�}|j#�|d}���tQd��#t2$r[|j|�|j5|dd�|j#�|d}d|_d|_|}t6}
d|_Y���wxYw#t2$rG|j|�|j#�|d}d|_d|_|}t6}
d|_Y���wxYw)Nrr�r�r�r�rFrar\ror�r�r�r|r�))r�r�r�r�rXr�r�r\rLr�rHr�r�r[r�rOr3r�r�r&r1rarZr�r�r�r�r�r�rqrKr�rMror�r�rrwr|r~r�)rr�r\rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rbr7r�ros                               r
r�zLRParser.parseopt_notrack�s����	����+�+���)�)���"�"���0�0�� ��&���
����I�I�E������
����K�K��������I�!�I���
��
�$����� ��
������	���!���l��������������,�,� �)�$-�K�	�$2�$6�$6�$8�	�$�$.�L�	�)/�	��"�����E�N�&�&�u�-��$�U�+���}��q�5��%�%�a�(��E��O�O�I�.� $�I�"�"�a��
���q�5��a�R��A��F�F�E��E�E�D�%�,�C�$�C�H� $�C�I��'���a���1��"%��Q��(,���1� (�$��� 0�).�D�J��J�J�v�.� *�D�5�6� 2�$�O�O�C�0�$(��B��$8��$?�E�&�-�-�e�4�!�!$�u��(,���1�).�D�J��J�J�v�.�$�O�O�C�0�$(��B��$8��$?�E�&�-�-�e�4�!���6� ���A�$�Q���6�F�!�M��y���?�d�l�l�!,�J�#(�D�L�(�H��}�}��.�#'���~�~�#�G�H�g�,F�-2�H�N�%*��
�,�T�^�^�X�t�L���<�<�),�I�'+�H�$�#�&�x��:�)2�)9�)9��)*��%� #�
�
� 0� 0�1\�`f�hp�hu�hu�_v�1v� w� #�
�
� 0� 0�1O�RZ�R_�R_�1_� `��J�J�,�,�-P�Q�"�"-�J��z�?�a�'�I�N�N�f�,D� $�I�#�H��E�&�q�)���>�>�V�+���>�>�W�,�"�2�,�C��x�x�7�*�%)�	� �#��A�$�A�F��y�(�3�1:�1A�1A�A���1�;��y�(�3�1:�1A�1A�A���1�;�'�A�G�"�)�)�)�4� !�I�"�,�,�.�C��N�N�$�&�r�N�E���A�B�B��i +�
1�*�1�1�)�<�$�O�O�D��2�J�7�&�N�N�,�$.�r�N�E�'.�C�H�(/�C�I�(+�I�)4�J�+0�D�L�
1��D +�	1�*�1�1�)�<�&�N�N�,�$.�r�N�E�'.�C�H�(/�C�I�(+�I�)4�J�+0�D�L�	1�s(�AR.� AT�.A T�T�AU%�$U%)NNFFN)rrrrrArEr�r�r�r�r�r�r"rr
r�r�s8����"� 8�#�S�2OC�v
fC�d	NCrr�z^[a-zA-Z0-9_-]+$c�B�eZdZdZdd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
d
�Zy)�
ProductionrNc��||_t|�|_||_||_d|_||_||_||_t|j�|_	g|_
|jD],}||jvs�|jj|��.g|_d|_
|jr0|j�ddj|j���|_yd|jz|_y�N� -> r�z
%s -> <empty>)r&�tupler��number�funcr��file�line�precr1�usymsr��lr_items�lr_nextr�rU)	rr�r&r��
precedencer�r�r�r]s	         r
rzProduction.__init__s�����	��d���	������	���
���	���	�"��	���	�	�N�����
����A���
�
�"��
�
�!�!�!�$��
��
�����9�9�%)�Y�Y�������0C�D�D�H�&����2�D�Hrc��|jSr
rTrQs r
rRzProduction.__str__=����x�x�rc�$�dt|�zdzS)NzProduction(�)rTrQs r
rVzProduction.__repr__@s���s�4�y�(�3�.�.rc�,�t|j�Sr
)r1r�rQs r
rmzProduction.__len__Cs���4�9�9�~�rc��y�Nr�r"rQs r
�__nonzero__zProduction.__nonzero__Fs��rc� �|j|Sr
)r��r�indexs  r
rczProduction.__getitem__Is���y�y���rc�$�|t|j�kDryt||�}	t|j|dz|_	|j|dz
|_|S#t
tf$r
g|_Y�2wxYw#t
$rd|_Y|SwxYwr�)r1r��LRItem�	Prodnames�lr_after�
IndexError�KeyError�	lr_before)rrbr�s   r
�lr_itemzProduction.lr_itemMs����s�4�9�9�~����4��O��	�"�1�6�6�!�A�#�;�/�A�J�	��&�&��1��+�A�K����
�H�%�	��A�J�	���	��A�K���	�s#�A�A;�A8�7A8�;B�Bc�F�|jr||j|_yyr
�r�r��r�pdicts  r
�bindzProduction.bind]����9�9�!�$�)�)�,�D�M�r)��rightrNr�r)rrr�reducedrrRrVrmr�rcr�rr"rr
r�r�s/���G�3�<�/��� �
� -rr�c�$�eZdZd�Zd�Zd�Zd�Zy)�MiniProductionc�f�||_||_||_d|_||_||_||_yr
)r&r1r�r�r�r�rU)rrUr&r1r�r�r�s       r
rzMiniProduction.__init__fs3����	������	���
���	���	���rc��|jSr
rTrQs r
rRzMiniProduction.__str__or�rc� �d|jzS)NzMiniProduction(%s)rTrQs r
rVzMiniProduction.__repr__rs��#�d�h�h�.�.rc�F�|jr||j|_yyr
r�r�s  r
rzMiniProduction.bindvrrN)rrrrrRrVrr"rr
rres����/�-rrc��eZdZd�Zd�Zd�Zy)r�c�Z�|j|_t|j�|_|j|_||_i|_|jj
|d�t|j�|_t|j�|_|j|_	y)N�.)
r&r�r�r��lr_index�
lookaheads�insertr�r1r�)rr�rbs   r
rzLRItem.__init__�ss���&�&��	��q�v�v�,��	��(�(�����
�����	�	����C� ���	�	�*��	��d�i�i�.����'�'��
rc��|jr,|j�ddj|j���}|Sd|jz}|Sr�)r�r&r�)rr]s  r
rRzLRItem.__str__�s@���9�9�"�i�i����$�)�)�)<�=�A��� �$�)�)�+�A��rc�$�dt|�zdzS)NzLRItem(r�rTrQs r
rVzLRItem.__repr__�s���3�t�9�$�s�*�*rN)rrrrrRrVr"rr
r�r��s��	"��+rr�c�X�t|�dz
}|dk\r|||vr||S|dz}|dk\r�yr�)r1)�symbols�	terminalsris   r
�rightmost_terminalr�sD���G��q��A�
�q�&��1�:��"��1�:��	�Q����q�&�rc��eZdZy)�GrammarErrorNr-r"rr
rr�r.rrc�r�eZdZd�Zd�Zd�Zd�Zdd�Zdd�Zd�Z	d	�Z
d
�Zd�Zd�Z
d
�Zd�Zd�Zdd�Zd�Zy)�Grammarc���dg|_i|_i|_i|_|D]}g|j|<�g|jd<i|_i|_i|_i|_t�|_	d|_
y�Nr)�Productionsr��Prodmap�	Terminals�Nonterminals�First�Follow�
Precedence�set�UsedPrecedence�Start)rr�terms   r
rzGrammar.__init__�s���!�F�������������D�#%�D�N�N�4� ��#%����w�������
�������"�e�����
rc�,�t|j�Sr
)r1rrQs r
rmzGrammar.__len__�s���4�#�#�$�$rc� �|j|Sr
)rr�s  r
rczGrammar.__getitem__�s������&�&rc��|jdgk(sJd��||jvrtd|z��|dvrtd��||f|j|<y)Nz2Must call set_precedence() before add_production()z,Precedence already specified for terminal %r)�leftr�nonassocz:Associativity must be one of 'left','right', or 'nonassoc')rr#r)rr'�assoc�levels    r
�set_precedencezGrammar.set_precedence�sc�����D�6�)�_�+_�_�)��4�?�?�"��M�PT�T�U�U��5�5��[�\�\�!&�������rNc	�P�||jvrtd|||fz��|dk(rtd|||fz��tj|�std|||fz��t	|�D]�\}}|ddvrO	t|�}t
|�dkDrtd||||fz��||jvrg|j|<|||<�\tj|�r�r|d	k7s�xtd
||||fz��d	|vr�|dd	k(rtd||fz��|d
d	k7rtd||fz��|d}	|jj|	�}
|
std|||	fz��|jj|	�|d
d�=n2t||j�}	|jj|	d�}
|�d|��}||jvr<|j|}td|||fzd|j|jfzz��t
|j �}
||j"vrg|j"|<|D]j}||jvr|j|j%|
��0||j"vrg|j"|<|j"|j%|
��lt'|
|||
|||�}|j j%|�||j|<	|j(|j%|�y#t$rY��BwxYw#t*$r|g|j(|<YywxYw)Nz7%s:%d: Illegal rule name %r. Already defined as a tokenrz5%s:%d: Illegal rule name %r. error is a reserved wordz%s:%d: Illegal rule name %rrz'"r�zA%s:%d: Literal token %s in rule %r may only be a single characterz%precz!%s:%d: Illegal name %r in rule %rr�z+%s:%d: Syntax error. Nothing follows %%prec���zH%s:%d: Syntax error. %%prec can only appear at the end of a grammar rulez/%s:%d: Nothing known about the precedence of %rrr�z%s:%d: Duplicate rule %s. zPrevious definition at %s:%d)rr�_is_identifier�match�	enumerate�evalr1r�r#r�r%�addrrr�r�rr r�r�r�r�)r�prodname�symsr�r�r�rbr]�c�precname�prodprec�map�m�pnumberr�r�s                r
�add_productionzGrammar.add_production
s|���t�~�~�%��X�\`�bf�hp�[q�q�r�r��w���V�Z^�`d�fn�Yo�o�p�p��#�#�H�-��<��d�H�?U�U�V�V��d�O�D�A�q���t�u�}�
��Q��A��A���
�*�+n�,0�$��8�+D�,E�F�F�����.�,.����q�)��D��G��"�'�'��*�q�G�|�"�#F�$�PT�VW�Ya�Ib�#b�c�c�$�"�d�?��B�x�7�"�"�#P�TX�Z^�S_�#_�`�`��B�x�7�"�"�#m�$(�$�<�$0�1�1��B�x�H����*�*�8�4�H��"�#T�X\�^b�dl�Wm�#m�n�n��#�#�'�'��1��R�S�	�*�$����?�H����*�*�8�\�B�H�%�d�+���$�,�,�����S�!�A��;�t�T�1�o�M�=�������@P�P� Q�R�
R��t�'�'�(���4�,�,�,�*,�D���h�'��A��D�N�N�"����q�!�(�(��1��D�-�-�-�+-�D�%�%�a�(��!�!�!�$�+�+�G�4�
�
�w��$��$��d�K��������"�����S��	+��N�N�8�$�+�+�A�.��i#�����j�	+�()�s�D�N�N�8�$�	+�s%�5A
K9�L	�9	L�L�	L%�$L%c���|s|jdj}||jvrtd|z��t	dd|g�|jd<|j|jd�||_y)Nr�zstart symbol %s undefinedr�S')rr&r rr�r�r&)r�starts  r
�	set_startzGrammar.set_startasu����$�$�Q�'�,�,�E���)�)�)��:�U�B�C�C�(��D�5�'�:���������%� �'�'��*���
rc��������fd��t����jdjd��jD�cgc]	}|�vs�|��c}Scc}w)Nc���|�vry�j|��jj|g�D]}|jD]
}�|���yr
)r6r�r�r�)r]r�r5�mark_reachable_from�	reachablers   ���r
rFz5Grammar.find_unreachable.<locals>.mark_reachable_fromtsJ����I�~���M�M�!���^�^�'�'��2�.�����A�'��*� �/rr)r$rr�r )rr]rFrGs` @@r
�find_unreachablezGrammar.find_unreachableqsV���	+��E�	��D�,�,�Q�/�4�4�Q�7�8��,�,�C�,�a���0B��,�C�C��Cs�	A�Ac���i}|jD]}d||<�	d|d<|jD]}d||<�		d}|jj�D]8\}}|D].}|jD]}||r�	d}nd}|s�"||sd||<d}�8�:|sn�[g}	|j�D];\}}
|
r�	||jvr||jvr|dk7r�+|	j|��=|	S)NTr�Fr)rr r�r�r�r�)r�
terminatesr�rb�some_change�plr�r]�p_terminates�infiniter's           r
�infinite_cycleszGrammar.infinite_cycles�s���
����A� �J�q�M� �"�
�6��
�"�"�A�!�J�q�M�#���K��>�>�/�/�1���B��A��V�V��)�!�}�,1�L�!�$�(,��#�)�!�}�,0�J�q�M�*.�K��)�2�0��7�:��#�)�)�+�I�Q����D�N�N�*�q����/F�1�PW�<���O�O�A�&�,��rc���g}|jD]M}|s�|jD]9}||jvs�||jvs�!|dk7s�'|j	||f��;�O|Sr)rr�r�rr�)rr7r�r]s    r
�undefined_symbolszGrammar.undefined_symbols�s`�����!�!�A����V�V���D�N�N�*�q����/F�1�PW�<��M�M�1�a�&�)��	"��
rc��g}|jj�D]\}}|dk7s�|r�|j|��!|Sr)rr�r�)r�
unused_tokr]rfs    r
�unused_terminalszGrammar.unused_terminals�sA���
��N�N�(�(�*�D�A�q��G�|�A��!�!�!�$�+��rc��g}|jj�D]+\}}|r�	|j|d}|j|��-|Sr_)r r�r�r�)r�unused_prodr]rfr�s     r
�unused_ruleszGrammar.unused_rules�sP�����%�%�+�+�-�D�A�q���N�N�1�%�a�(���"�"�1�%�.��rc��g}|jD]C}||jvr�||jvr�!|j||j|df��E|Sr_)r#rr%r�)r�unused�termnames   r
�unused_precedencezGrammar.unused_precedence�sT�������H�����.�(�d�>Q�>Q�2Q��
�
�x�����)B�1�)E�F�G�(��
rc��g}|D];}d}|j|D] }|dk(rd}�||vs�|j|��"|r�:|S|jd�|S)NF�<empty>T)r!r�)r�betar7�x�x_produces_emptyrs      r
�_firstzGrammar._first	sv�����A�$���Z�Z��]���	�>�'+�$�����
�
�a�(�#� ����
�1�,
�M�M�)�$��
rc���|jr|jS|jD]}|g|j|<�dg|jd<|jD]}g|j|<�	d}|jD]h}|j|D]T}|j	|j
�D]4}||j|vs�|j|j
|�d}�6�V�j|s
	|jS��)Nr�TF)r!rr r�rar�r�)rr�rbrKr�rs      r
�
compute_firstzGrammar.compute_first,s����:�:��:�:�����A��C�D�J�J�q�M� �%�X��
�
�6��
�"�"�A��D�J�J�q�M�#���K��&�&������*�A�!�[�[����0���D�J�J�q�M�1� �J�J�q�M�0�0��3�*.�K�1�+�'����z�z��rc�X�|jr|jS|js|j�|jD]}g|j|<�|s|jdj
}dg|j|<	d}|jddD�]}t
|j�D]�\}}||jvs�|j|j|dzd�}d}|D]@}	|	dk7r1|	|j|vr |j|j|	�d}|	dk(s�?d}�B|s|t|j�dz
k(s��|j|j
D]4}	|	|j|vs�|j|j|	�d}�6����|s
	|jS��+)Nr�r�TFr])r"r!rcr rr&r4r�rar�r1)
rrB�k�didaddr�ri�B�fst�hasemptyrs
          r
�compute_followzGrammar.compute_followQs����;�;��;�;���z�z���� ��"�"�A��D�K�K��N�#���$�$�Q�'�,�,�E�$�X����E����F��%�%�a�b�)��%�a�f�f�-�D�A�q��D�-�-�-�"�k�k�!�&�&��1���,�7��#(��!$�A� �I�~�!�4�;�;�q�>�2I� $���A�� 5� 5�a� 8�)-�� �I�~�+/��"%�$�q�S����[��]�';�%)�[�[����%8��#$�D�K�K��N�#:�$(�K�K��N�$9�$9�!�$<�-1�F�&9�.�*�&���{�{��/rc��|jD]�}|}d}g}	|t|�kDrd}nIt||�}	|j|j|dz|_	|j|dz
|_||_	|sn|j|�|}|dz
}�}||_��y#ttf$r
g|_Y�]wxYw#t$r
d|_Y�[wxYw�Nrr�)rr1r�r�r�r�r�r�r�r�r�r�)rr��lastlririr��lris      r
�
build_lritemszGrammar.build_lritems�s����!�!�A��G��A��H���s�1�v�:��C� ��A�,�C�*�'+�~�~�c�h�h�q��s�m�'D���-�(+����1��
��
�#&���������$����Q���)�*"�A�J�3"��'��1�*�')���*��&�-�(,��
�-�s#�$B�B:�B7�6B7�:C
�C
)Nr�rr
)rrrrrmrcr/r?rCrHrOrQrTrWr[rarcrjror"rr
rr�sZ��!�H%�'�/�2K+�h� 
D�.7�@	�"��"� �F�J)�v"rrc��eZdZy)�VersionErrorNr-r"rr
rqrq�r.rrqc�$�eZdZd�Zd�Zd�Zd�Zy)�LRTablec�<�d|_d|_d|_d|_yr
)r�r�r��	lr_methodrQs r
rzLRTable.__init__�s��������"�����rc��t|tj�r|}n!td|z�tj
|}|jtk7rtd��|j|_
|j|_g|_
|jD]#}|jjt!|���%|j"|_|j&S)N�	import %s�&yacc table file version is out of date)r`�types�
ModuleType�execr��modules�_tabversion�__tabversion__rq�
_lr_actionr��_lr_gotor�r��_lr_productionsr�r�
_lr_methodru�
_lr_signature)r�modulerr�s    r
�
read_tablezLRTable.read_table�s����f�e�.�.�/��H���v�%�&��{�{�6�*�H����>�1��G�H�H�!�,�,����(�(��� ����)�)�A����&�&�~�q�'9�:�*�"�,�,����%�%�%rc�*�	ddl}tjj|�st�t
|d�}|j|�}|tk7rtd��|j|�|_
|j|�}|j|�|_|j|�|_|j|�}g|_
|D]#}|jjt|���%|j!�|S#t$rddl}Y��wxYw)Nr�rbrx)�cPickle�ImportError�pickle�os�path�exists�open�loadr~rqrur�r�r�r�r�close)r�filenamer��in_f�
tabversion�	signaturer�r�s        r
�read_picklezLRTable.read_pickle�s���	�$��w�w�~�~�h�'��
��H�d�#���[�[��&�
���'��G�H�H����T�*������T�*�	����T�*������T�*������T�*�� ����A����&�&�~�q�'9�:��	
�
�
�����-�	��	�s�D�
D�Dc�H�|jD]}|j|��yr
)r�r)rr�r�s   r
�bind_callableszLRTable.bind_callables�s���$�$�A�
�F�F�5�M�%rN)rrrrr�r�r�r"rr
rsrs�s���&�(�8rrsc
�l�i}|D]}d||<�	g}i}|D]}||dk(s�t|||||||��|Sr_)�traverse)�X�R�FP�Nr_r[�Fs       r
�digraphr�sT��
�A�
����!����E�
�A�
���Q�4�1�9��Q��5�!�Q��2�.��
�Hrc
��|j|�t|�}|||<||�||<||�}|D]c}	||	dk(rt|	||||||�t||||	�||<|j	|	g�D]}
|
||vs�||j|
�� �e|||k(r[t
||d<||||d<|j
�}||k7r.t
||d<||||d<|j
�}||k7r�-yyy)Nrr�)r�r1r��minr��MAXINTr�)r_r�r[r�r�r�r��d�rel�y�a�elements            r
r�r�s��	�L�L��O��E�
�A��A�a�D�
�a�5�A�a�D�
�A�$�C�
���Q�4�1�9��Q��5�!�Q��2�.��1�Q�4��1����!�����q�"��A���!��}��!����A���	�	��t�q�y���%��)����t��%��)���)�)�+����l�!�A�e�B�i�L��Q�4�A�e�B�i�L��i�i�k�G���l�	rc��eZdZy)�	LALRErrorNr-r"rr
r�r�)r.rr�c�r�eZdZdd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
d
�Zd�Zd�Z
d
�Zd�Zd�Zdd�Zdd�Zy)�LRGeneratedTableNc���|dvrtd|z��||_||_|s
t�}||_i|_i|_|j|_i|_	i|_
d|_d|_d|_
g|_g|_g|_|jj#�|jj%�|jj'�|j)�y)N)�SLRrzUnsupported method %sr)r��grammarrur$�logr�r�rr��
lr_goto_cache�lr0_cidhash�
_add_count�sr_conflict�rr_conflict�	conflicts�sr_conflicts�rr_conflictsrorcrj�lr_parse_table)rr��methodr�s    r
rzLRGeneratedTable.__init__4s�����(��3�f�<�=�=���������,�C���� ������&�2�2���������������������������	
���"�"�$����"�"�$����#�#�%����rc��|xjdz
c_|dd}d}|rfd}|D]\}|jD]K}t|dd�|jk(r�|j|j�|j|_d}�M�^|r�f|S)Nr�TF�	lr0_addedr)r�r�rqr�r�r�)r�I�Jrfrjr_s      r
�lr0_closurezLRGeneratedTable.lr0_closureYs������1���
�a�D������F������A��q�+�q�1�T�_�_�D� ��H�H�Q�Y�Y�'�"&�/�/�A�K�!�F�
$����rc��|jjt|�|f�}|r|S|jj|�}|si}||j|<g}|D]`}|j}|s�|j|k(s�"|jt|��}|si}||t|�<|j|�|}�b|jd�}|s|r|j
|�}||d<n||d<||jt|�|f<|S)Nr�)r�r�r4r�r�r�r�)	rr�r_�gr]�gsr�rb�s1s	         r
�lr0_gotozLRGeneratedTable.lr0_gotoss�����"�"�B�q�E�1�:�.����H�

���"�"�1�%����A�$%�D���q�!�
���A��	�	�A��Q�[�[�A�%��U�U�2�a�5�\����B�!�A�b��e�H��	�	�!�����
�E�E�&�M�����$�$�R�(����&�	���&�	�)*����B�q�E�1�:�&��rc��|j|jjdjg�g}d}|D]}||jt|�<|dz
}�!d}|t
|�kr�||}|dz
}i}|D]}|jD]}d||<�	�|D]`}|j||�}|rt|�|jvr�/t
|�|jt|�<|j|��b|t
|�kr��|Srl)
r�r�rr�r�r4r1r�r�r�)	r�Crir��asyms�iir]r_r�s	         r
�	lr0_itemszLRGeneratedTable.lr0_items�s��
�
�
�t�|�|�7�7��:�B�B�C�
D�E��
���A�&'�D���R��U�#�
��F�A��

���#�a�&�j��!��A�
��F�A��E������A�#�E�!�H�"�����M�M�!�Q�'���B�q�E�T�%5�%5�5��*-�a�&�� � ��A��'��������#�a�&�j�"�rc�L�t�}d}	|jjddD]_}|jdk(r|j	|j
��.|jD]}||vs��D|j	|j
��at|�|k(r	|St|�}��rl)r$r�rr1r6r&r�)r�nullable�num_nullabler�r�s     r
�compute_nullable_nonterminalsz.LRGeneratedTable.compute_nullable_nonterminals�s����5������\�\�-�-�a�b�1���5�5�A�:��L�L����(�����A���(�� ��L�L����(�2��8�}��,�����x�=�L�rc��g}t|�D]y\}}|D]o}|j|jdz
ks� ||j|jdzf}|d|jj
vs�Z||vs�_|j
|��q�{|Sr�)r4rr1r�r�r r�)rr��trans�statenor�r�r�s       r
�find_nonterminal_transitionsz-LRGeneratedTable.find_nonterminal_transitions�s�����'��l�N�G�U����:�:�����	�)� �!�&�&����A��"6�7�A���t�t�|�|�8�8�8��E�>�!�L�L��O��+��rc��i}|\}}g}|j|||�}|D]j}	|	j|	jdz
ks� |	j|	jdz}
|
|jj
vs�U|
|vs�Z|j
|
��l|dk(r:||jjdjdk(r|j
d�|S)Nr�rr�)r�rr1r�r�rr�r)rr�r�r��dr_setr�r��termsr�r�r�s           r
�dr_relationzLRGeneratedTable.dr_relation�s��������q����M�M�!�E�(�A�&���A��z�z�A�E�E�A�I�%��F�F�1�:�:�a�<�(������.�.�.���~����Q����A�:�!�t�|�|�7�7��:�?�?��B�B��L�L�� ��rc�8�g}|\}}|j|||�}|jjt|�d�}|D]S}	|	j|	j
dz
ks� |	j|	jdz}
|
|vs�A|j||
f��U|S)Nr�r�)r�r�r�r4rr1r�r�)rr�r��emptyr�r�r�r�rjr�r�s           r
�reads_relationzLRGeneratedTable.reads_relation	s��������q��M�M�!�E�(�A�&����� � ��A���+���A��z�z�A�E�E�A�I�%��F�F�1�:�:��>�*����:��J�J��1�v�&�	��
rc�
�i}i}i}|D]}d||<�	|D�]�\}}	g}
g}||D�]�}|j|	k7r�|j}
|}|
|jdz
kr�|
dz}
|j|
}||f|vrt|
dz}||jkrM|j||jj
vrn:|j||vrn(|dz}||jkr�M|j
||f�|j|||�}|jjt|�d�}|
|jdz
kr��||D]�}|j|jk7r�|j|jk7r�7d}||jkr8|j||j|dzk7r�k|dz}||jkr�8|
j
||f������|D]!}||vrg||<||j
||	f��#|
|||	f<���||fS)Nr�r�r)r&rr1r�r�rr�r�r�r�r4)rr�r�r��lookdict�includedict�dtransr�r�r��lookb�includesr�rrj�lir�r5ris                   r
�compute_lookback_includesz*LRGeneratedTable.compute_lookback_includesC	s1���������A��F�1�I���H�E�1��E��H��u�X���6�6�Q�;��
�:�:����������*�'�!�|�H����x�(�A��1�v��'�
&��\�� �1�5�5�j� �v�v�b�z�T�\�\�-C�-C�C� %� �v�v�b�z��9� %�!#�a��B�!�1�5�5�j�%�O�O�Q��F�3��
�
�a��d�A�.�A��(�(�,�,�R��U�B�7�A�-������*�2�1��A��v�v����'� ��u�u����~� ��A��a�j�j�.��6�6�!�9����q��s��3�!���E���a�j�j�.�
���a��V�,��E�^���K�'�%'�K��N��A��%�%�u�a�j�1��$)�H�e�Q�Z� �m�p��$�$rc�B�������fd�}���fd�}t|||�}|S)Nc�*���j�|��Sr
)r��r_r�r�rs ���r
�<lambda>z4LRGeneratedTable.compute_read_sets.<locals>.<lambda>�	s���t�'�'��1�h�7rc�*���j�|��Sr
)r�r�s ���r
r�z4LRGeneratedTable.compute_read_sets.<locals>.<lambda>�	s���t�*�*�1�a��:r�r�)rr��ntransr�r�r�r�s`` `   r
�compute_read_setsz"LRGeneratedTable.compute_read_sets�	s ���
7��
:���F�A�r�"���rc�8����fd�}�fd�}t|||�}|S)Nc����|Sr
r")r_�readsetss �r
r�z6LRGeneratedTable.compute_follow_sets.<locals>.<lambda>�	s	���x��{rc�(���j|g�Sr
)r�)r_�inclsetss �r
r�z6LRGeneratedTable.compute_follow_sets.<locals>.<lambda>�	s���x�|�|�A�r�*rr�)rr�r�r�r�r�r�s  ``   r
�compute_follow_setsz$LRGeneratedTable.compute_follow_sets�	s ���
"��
*���F�A�r�"���rc��|j�D]u\}}|D]k\}}||jvrg|j|<|j|g�}|D]2}||j|vs�|j|j|��4�m�wyr
)r�rr�r�)	r�	lookbacks�	followsetr��lbr�r�rr�s	         r
�add_lookaheadszLRGeneratedTable.add_lookaheads�	s���"���*�I�E�2����q�����,�*,�A�L�L��'��M�M�%��,���A�����U� 3�3����U�+�2�2�1�5��	�+rc���|j�}|j|�}|j|||�}|j|||�\}}|j	|||�}|j||�yr
)r�r�r�r�r�r�)rr�r�r�r��lookd�included�
followsetss        r
�add_lalr_lookaheadsz$LRGeneratedTable.add_lalr_lookaheads�	sz���5�5�7���1�1�!�4���)�)�!�U�H�=���8�8��E�8�L���x��-�-�e�X�x�H�
�	
���E�:�.rc
�
�|jj}|jj}|j}|j}|j
}i}|j
d|j�|j�}|jdk(r|j|�d}|D�]T}	g}
i}i}i}
|j
d�|j
d|�|j
d�|	D]}|j
d|j|��!|j
d�|	D�]�}|j|jdzk(�r�|jdk(rd|d	<||d	<�;|jdk(r|j|}n#|jj|j}|D�]N}|
j!||d
|j|fzf�|j#|�}|���|dkDr�|j#|d�\}}||jj$\}}||ks
||k(rq|dk(rl|j||<|||<|s2|s0|j
d
|�|j&j!||df�||jxj(dz
c_��||k(r|dk(rd||<��|r��|j
d|�|j&j!||df���1|dkr�||}||j}|j*|j*kDr^|j||<|||<||}}||jxj(dz
c_||jxj(dzc_n||}}|j,j!|||f�|j
d|||j||���
t/d|z��|j||<|||<||jxj(dz
c_��Q���|j}|j0|dz}||jj2vs��|j5|	|�}|j6j#t9|�d�}|dk\s��I|
j!||d|zf�|j#|�}|�� |dkDr||k7s���t/d|z��|dkr�|j#|d�\}}|||jj$\}}||kDs
||k(rj|dk(re|||jxj(dzc_|||<|||<|r��	|j
d|�|j&j!||df���;||k(r|dk(rd||<��L|r��P|r��T|j
d
|�|j&j!||df����t/d|z��|||<|||<���i}|
D]-\}}}||vs�|||us�|j
d||�d|||f<�/|j
d�d}|
D]6\}}}||vs�|||us�||f|vs�|j;d||�d}d|||f<�8|r|j;d�i} |	D]1}!|!j<D] }"|"|jj>vs�d| |"<�"�3| D]W}#|j5|	|#�}|j6j#t9|�d�}|dk\s�@||
|#<|j
d|#|��Y|||<|||<|
||<|dz
}��Wy)NzParsing method: %srrr�zstate %dz    (%d) %sr�rAr�zreduce using rule %d (%s)rr+z3  ! shift/reduce conflict for %s resolved as reduce�reducer,z2  ! shift/reduce conflict for %s resolved as shift�shiftz=  ! reduce/reduce conflict for %s resolved using rule %d (%s)zUnknown conflict in state %dr�zshift and go to state %dz Shift/shift conflict in state %drz    %-15s %sz  ! %-15s [ %s ]z"    %-30s shift and go to state %d) r�rr#r�r�r�r rur�r�r�r1rr&rr"r�r�r�r�rr�r�r�r�rr�r�r4rr�r )$rrr#r�r�r��actionpr��str��actlist�	st_action�
st_actionp�st_gotor��laheadsr�r5�sprec�slevel�rprec�rlevel�oldp�pp�chosenp�rejectprir�rj�	_actprintr=�not_used�nkeysr�r]rbs$                                    r
r�zLRGeneratedTable.lr_parse_table�	s���l�l�.�.���l�l�-�-�
������������������%�t�~�~�6�

�N�N����>�>�V�#��$�$�Q�'����A��G��I��J��G��H�H�R�L��H�H�Z��$��H�H�R�L����������!�4���H�H�R�L����u�u��
�
�Q��.��6�6�T�>�01�I�f�-�12�J�v�.� $�~�~��7�*+�,�,�r�*:��*.�,�,�*=�*=�a�f�f�*E��%,�� '����1�6Q�UV�U]�U]�_`�Ta�6a�/b� c�$-�M�M�!�$4��#$�=�'(�1�u�9C���q�,�8W�
��v�9D�A�H�H�8M�8R�8R�
��v�,2�V�O�&�F�BR�Y^�bh�Yh�<=�H�H�9�I�a�L�<=�J�q�M�39�&�03���9n�pq�0r�04�0A�0A�0H�0H�"�a�QY�IZ�0[�,7����,A�,I�,I�Q�,N�,I�.4��.>�U�j�EX�;?�I�a�L�4:�03���9m�op�0q�04�0A�0A�0H�0H�"�a�QX�IY�0Z�)*�Q��0;�A�2���-8����-B��+/�9�9�r�w�w�+>�<=�H�H�9�I�a�L�<=�J�q�M�?A�4�W�G�,7����,A�,I�,I�Q�,N�,I�,7����,D�,L�,L�PQ�,Q�,L�?C�R�W�G�(,�(9�(9�(@�(@�"�g�w�AW�(X�(+���1p�12�J�q�M�4H�4H�*�UV�-�)Y�/8�8V�Y[�8[�.\�(\�45�H�H�9�I�a�L�45�J�q�M�$/����$9�$A�$A�Q�$F�$A�i&-�l�J�J���F�F�1�Q�3�K������ 6� 6�6� $�
�
�a�� 3�A� $� 0� 0� 4� 4�R��U�B� ?�A� �A�v� '����1�6P�ST�6T�/U� V�$-�M�M�!�$4��#$�=�'(�1�u�+,��6�2;�<^�ac�<c�2d�,d�)*�Q��9C���q�,�8W�
��v�9D�J�q�M�DX�DX�8Y�8^�8^�
��v�,2�V�O�&�F�BR�Y^�bi�Yi�,7�
�1�
�8L�8L�,M�,U�,U�YZ�,Z�,U�;<�I�a�L�<=�J�q�M�39�03���9m�op�0q�04�0A�0A�0H�0H�"�a�QX�IY�0Z�.4��.>�U�j�EX�;?�I�a�L�4:�&�03���9n�pq�0r�04�0A�0A�0H�0H�"�a�QY�IZ�0[�/8�8V�Y[�8[�.\�(\�34�I�a�L�45�J�q�M�a�f�I�"���1�a��	�>��J�q�M�)������A�6�,-�	�1�a�&�)�	#�

�H�H�R�L��H�"���1�a��	�>��
�1�
�-� !�1�v��2��I�I�&8�!�Q�?�'(�H�01�I�q�!�f�-�
#���	�	�"�
��E������A��D�L�L�5�5�5�#'��a��"�����M�M�!�Q�'���$�$�(�(��A���3����6�!"�G�A�J��H�H�A�1�a�H��#�F�2�J�$�G�B�K��D��H��!�G�B�Irc�
�t|tj�rtd��|j	d�d}t
jj||�dz}	t|d�}|jdt
jj|��dt�d|j�d	|�d
�	�d}|�r>i}|jj�D]a\}	}
|
j�D]I\}}|j|�}
|
s	ggf}
|
||<|
dj!|	�|
dj!|��K�c|jd
�|j�D]w\}}|jd|z�|dD]}
|jd|
z��|jd�|dD]}
|jd|
z��|jd��y|jd�|jd�ne|jd�|jj�D]&\}}|jd|d�d|d�d|�d���(|jd�|�r>i}|j"j�D]a\}	}
|
j�D]I\}}|j|�}
|
s	ggf}
|
||<|
dj!|	�|
dj!|��K�c|jd�|j�D]w\}}|jd|z�|dD]}
|jd|
z��|jd�|dD]}
|jd|
z��|jd��y|jd�|jd�ne|jd�|j"j�D]&\}}|jd|d�d|d�d|�d���(|jd�|jd�|j$D]�}|j&rt|jd|j(|j*|j,|j&t
jj|j.�|j0fz���|jdt)|�|j*|j,fz���|jd�|j3�y#t$r}�d}~wwxYw)Nz"Won't overwrite existing tabmoduler
r�z.py�wz
# zD
# This file is automatically generated. Do not edit.
_tabversion = z

_lr_method = z

_lr_signature = z
    r�rz
_lr_action_items = {z%r:([z%r,z],[z]),z}
z�
_lr_action = {}
for _k, _v in _lr_action_items.items():
   for _x,_y in zip(_v[0],_v[1]):
      if not _x in _lr_action:  _lr_action[_x] = {}
      _lr_action[_x][_k] = _y
del _lr_action_items
z
_lr_action = { �(r�z):z
_lr_goto_items = {z�
_lr_goto = {}
for _k, _v in _lr_goto_items.items():
   for _x, _y in zip(_v[0], _v[1]):
       if not _x in _lr_goto: _lr_goto[_x] = {}
       _lr_goto[_x][_k] = _y
del _lr_goto_items
z
_lr_goto = { z_lr_productions = [
z  (%r,%r,%d,%r,%r,%d),
z  (%r,%r,%d,None,None,None),
z]
)r`ryrz�IOError�splitr�r�r�r�r�basenamer~rur�r�r�r�r�r�r�rUr&r1r�r�r�)r�	tabmodule�	outputdirr��basemodulenamer�r�smallerr�r]�ndr&rfrirer��es                 r
�write_tablezLRGeneratedTable.write_table�
s=���i��!1�!1�2��>�?�?�"����-�b�1���7�7�<�<�	�>�:�U�B��k	��X�s�#�A�
�G�G��7�7���H�%�~�t�~�~�y�R�
S��G����!�^�^�1�1�3�E�A�r�#%�8�8�:���a�!�I�I�d�O�� �!#�R��A�*+�E�$�K��!����A���!����A��
$.�4����0�1�!�K�K�M�D�A�q��G�G�G�a�K�(��q�T�������	�*�"��G�G�E�N��q�T�������	�*�"��G�G�E�N�*��������������+�,� �N�N�0�0�2�D�A�q��G�G�Q�q�T�1�Q�4��;�<�3���������!�\�\�/�/�1�E�A�r�#%�8�8�:���a�!�I�I�d�O�� �!#�R��A�*+�E�$�K��!����A���!����A��
$.�2����.�/�!�K�K�M�D�A�q��G�G�G�a�K�(��q�T�������	�*�"��G�G�E�N��q�T�������	�*�"��G�G�E�N�*��������������)�*� �L�L�.�.�0�D�A�q��G�G�Q�q�T�1�Q�4��;�<�1������
�G�G�+�,��(�(���6�6��G�G�6�!�%�%�������:;�&�&�"�'�'�BR�BR�ST�SY�SY�BZ�\]�\b�\b�:d�d�e��G�G�<��A�����PQ�PU�PU�?V�V�W�)�
�G�G�E�N�
�G�G�I���	���	�s�RS9�9	T�T�Tc�X�	ddl}t|d�5}|j	t
|t�|j	|j|t�|j	||t�|j	|j|t�|j	|j|t�g}|jD]�}|jrq|j|j|j|j|jt j"j%|j&�|j(f���|jt|�|j|jdddf���|j	||t�ddd�y#t$rddl}Y���wxYw#1swYyxYw)Nr�wb)r�r�r�r��dumpr~�pickle_protocolrur�r�r�r�r�rUr&r1r�r�rr�r�)rr�r�r��outf�outpr�s       r
�pickle_tablezLRGeneratedTable.pickle_table s0��	�$��(�D�
!�T��K�K���o�>��K�K�����o�>��K�K�	�4��9��K�K�����o�>��K�K����d�O�<��D��(�(���6�6��K�K����������q�v�v�r�w�w�?O�?O�PQ�PV�PV�?W�YZ�Y_�Y_� `�a��K�K��Q���������d�D� I�J�	)�

�K�K��d�O�4�"�
!���	��	��
!�
!�s�F�E1F �
F�F� F))rN)r�r�)r�)rrrrr�r�r�r�r�r�r�r�r�r�r�r�r�rr r"rr
r�r�3s\��!�J�4 �F�p�:	�(�2
�VB%�`�,�$	6�$/�0y�Bq�t5rr�c���tj|�}|jj�}|j|jk7r|j|j�|Sr
)r��	_getframe�	f_globals�copy�f_locals�update)�levelsr�ldicts   r
�get_caller_module_dictr)CsG���
�
�f��A�
�K�K����E��{�{�a�j�j� �
���Q�Z�Z� ��Lrc	��g}|j�}d}|}|D]}}|dz
}|j�}|s�	|ddk(r|std||fz��|}	|dd}
n+|d}	|	}|dd}
|d}|dk7r|dk7rtd||fz��|j|||	|
f��|S#t$r�t$r td	|||j�fz��wxYw)
Nr�r�|z%s:%d: Misplaced '|'��:z::=z!%s:%d: Syntax error. Expected ':'z%s:%d: Syntax error in rule %r)�
splitlinesrr�r��	Exception�strip)�docr�r�r��pstrings�lastp�dline�psr�r7r8�assigns            r
�
parse_grammarr7Os���G��~�~��H��E��E���
��
���H�H�J����	\���t�s�{��%�&<��e�}�&L�M�M� �����u���Q�4�� ���1�2����1����S�=�V�u�_�%�&I�T�SX�M�&Y�Z�Z��N�N�D�%��4�8�9�)�4�N���	���	\��>�$��r�x�x�z�AZ�Z�[�[�	\�s�A"B�2C
c�h�eZdZdd�Zd�Zd�Zd�Zd�Zd�Zd�Z	d	�Z
d
�Zd�Zd�Z
d
�Zd�Zd�Zd�Zy)�
ParserReflectNc���||_d|_d|_d|_t	�|_g|_d|_|�ttj�|_y||_y)NF)r�rB�
error_func�tokensr$r|r�rrr�r�r�)rr�r�s   r
rzParserReflect.__init__ysQ����
���
��������%��������
��;� ����,�D�H��D�Hrc��|j�|j�|j�|j�|j	�yr
)�	get_start�get_error_func�
get_tokens�get_precedence�get_pfunctionsrQs r
�get_allzParserReflect.get_all�s:���������������������rc���|j�|j�|j�|j�|j	�|j�|jSr
)�validate_start�validate_error_func�validate_tokens�validate_precedence�validate_pfunctions�validate_modulesrrQs r
�validate_allzParserReflect.validate_all�sT������� � �"������ � �"�� � �"������z�z�rc
��g}	|jr|j|j�|jrG|jdj|jD�cgc]}dj|���c}��|jr*|jdj|j��|j
D]}|ds�	|j|d��	dj|�Scc}w#ttf$rY�'wxYw)Nr�r�r)rBr�r�r�r<�pfuncs�	TypeError�
ValueError)r�partsr�rs    r
r�zParserReflect.signature�s�����	��z�z����T�Z�Z�(��y�y����R�W�W�$�)�)�%D�)�Q�b�g�g�a�j�)�%D�E�F��{�{����S�X�X�d�k�k�2�3��[�[���Q�4��L�L��1��&�!�
�w�w�u�~���&E���:�&�	��	�s+�AC6�C1�3AC6�	C6�1C6�6D�Dc	��tjd�}|jD]�}	tj|�\}}i}t
|�D]|\}}|dz
}|j|�}|s�|jd�}|j|�}	|	s|||<�Itj|�}
|jjd|
|||	��~��y#t
$rY��wxYw)Nz\s*def\s+(p_[a-zA-Z_0-9]*)\(r�z;%s:%d: Function %s redefined. Previously defined on line %d)
�re�compiler|�inspect�getsourcelinesrr4r3�groupr��
getsourcefiler�r)r�frer��lines�linen�	counthashr�r=r&�prevr�s           r
rJzParserReflect.validate_modules�s����j�j�8�9���l�l�F�
�&�5�5�f�=���u��I�(��/���t���
���I�I�d�O����7�7�1�:�D�$�=�=��.�D��*/�	�$��#*�#8�#8��#@�����(�(�)f�)1�5�$��F� 0�#���
��
�s�C
�
	C�Cc�D�|jjd�|_y)NrB)r�r�rBrQs r
r>zParserReflect.get_start�s���Z�Z�^�^�G�,��
rc��|j�7t|jt�s|jj	d�yyy)Nz'start' must be a string)rBr`�string_typesr�rrQs r
rEzParserReflect.validate_start�s5���:�:�!��d�j�j�,�7������9�:�8�"rc�D�|jjd�|_y)N�p_error)r�r�r;rQs r
r?zParserReflect.get_error_func�s���*�*�.�.��3��rc��|j�r9t|jtj�rd}nJt|jtj�rd}n#|j
j
d�d|_y|jjj}|jjj}tj|j�}|jj|�|jjj|z
}|dk7r%|j
j
d||�d|_yyy)Nrr�z2'p_error' defined, but is not a function or methodTz$%s:%d: p_error() requires 1 argument)r;r`ry�FunctionType�
MethodTyper�r�__code__�co_firstlineno�co_filenamerT�	getmoduler|r6�co_argcount)r�ismethod�eline�efiler��argcounts      r
rFz!ParserReflect.validate_error_func�s����?�?��$�/�/�5�+=�+=�>����D�O�O�U�-=�-=�>��������S�T�!��
���O�O�,�,�;�;�E��O�O�,�,�8�8�E��&�&�t���7�F��L�L���V�$����/�/�;�;�h�F�H��1�}������E�u�e�T�!��
��!rc�N�|jjd�}|s#|jjd�d|_yt	|t
tf�s#|jjd�d|_y|s#|jjd�d|_y||_y)Nr<zNo token list is definedTztokens must be a list or tupleztokens is empty)r�r�r�rr`r�r�r<)rr<s  r
r@zParserReflect.get_tokens�s���������)����H�H�N�N�5�6��D�J���&�4��-�0��H�H�N�N�;�<��D�J����H�H�N�N�,�-��D�J����rc��d|jvr#|jjd�d|_yt�}|jD]3}||vr|jj	d|�|j|��5y)Nrz.Illegal token name 'error'. Is a reserved wordTzToken %r multiply defined)r<r�rr$rr6)rrrbs   r
rGzParserReflect.validate_tokenssf���d�k�k�!��H�H�N�N�K�L��D�J���E�	����A��I�~���� � �!<�a�@��M�M�!��rc�D�|jjd�|_y)Nr�)r�r�r�rQs r
rAzParserReflect.get_precedences���J�J�N�N�<�0��	rc���g}|j�r^t|jttf�s#|jjd�d|_yt
|j�D�]\}}t|ttf�s$|jjd�d|_yt|�dkr%|jjd|�d|_y|d}t|t�s$|jjd�d|_y|ddD]N}t|t�s%|jjd	�d|_y|j|||dzf��P��||_
y)
Nz"precedence must be a list or tupleTzBad precedence tabler,z?Malformed precedence entry %s. Must be (assoc, term, ..., term)rz)precedence associativity must be a stringr�z precedence items must be strings)r�r`r�r�r�rr4r1r_r��preclist)rrrr.r�r-r's      r
rHz!ParserReflect.validate_precedences'�����9�9��d�i�i�$���7������C�D�!��
��%�d�i�i�0���q�!�!�d�E�]�3��H�H�N�N�#9�:�!%�D�J���q�6�A�:��H�H�N�N�#d�fg�h�!%�D�J���!���!�%��6��H�H�N�N�#N�O�!%�D�J���a�b�E�D�%�d�L�9������'I�J�%)��
���O�O�T�5�%��'�$:�;�"�1�*!��
rc��g}|jj�D]�\}}|jd�r|dk(r�t|tj
tjf�s�Ht|d|jj�}tj|�}|j||||jf���|jd���||_y)N�p_rarfc�8�|dt|d�|d|dfS)Nrr�r,rrT)�
p_functions r
r�z.ParserReflect.get_pfunctions.<locals>.<lambda>Ds(���q�M��
�1�
���q�M��q�M�	1r)�key)r�r��
startswithr`ryrcrdrqrerfrTrhr��__doc__�sortrM)r�p_functionsr&�itemr�r�s      r
rBzParserReflect.get_pfunctions7s������*�*�*�*�,�J�D�$��?�?�4�(�D�I�,=���$��!3�!3�U�5E�5E� F�G��t�%5�t�}�}�7S�7S�T�� �*�*�4�0���"�"�D�&�$����#E�F�
-�	�����	�
"��rc��g}t|j�dk(r#|jjd�d|_y|jD�]W\}}}}t	j
|�}|j|}t|tj�rd}nd}|jj|kDr0|jjd|||j�d|_��|jj|kr0|jjd|||j�d|_��|js*|jjd|||j���	t|||�}	|	D]}
|j!||
f��	|j&j)|���Z|jj+�D�]p\}}
|j-d	�r+t|
tj.tjf�r�C|j-d
�r�U|j-d	�r!|dk7r|jjd|�t|
tj.�r|
jjdk(s?t|
tj�s��|
j0jjdk(s��|
js��	|
jj3d
�}|ddk(rF|jjd|
jj4|
jj6|���s||_y#t"$r6}|jjt%|��d|_Yd}~���d}~wwxYw#t8$rY���wxYw)Nrz+no rules of the form p_rulename are definedTr,r�z%%s:%d: Rule %r has too many argumentsz#%s:%d: Rule %r requires an argumentzA%s:%d: No documentation string specified in function %r (ignored)rt�t_raz%r not defined as a functionr�r-z9%s:%d: Possible grammar rule %r defined without p_ prefix)r1rMr�rrTrWr�r`ryrdrerirryrr7r�r�rUr|r6r�rxrc�__func__rrgrfr�r�)rr�r�r�r&r1r�r��reqargs�parsed_gr�rrbrfs              r
rIz!ParserReflect.validate_pfunctionsLs������t�{�{��q� ��H�H�N�N�H�I��D�J��'+�{�{�#�D�&�$���(�(��0�D��:�:�d�#�D��$�� 0� 0�1������}�}�(�(�7�2������F��d�TX�Ta�Ta�b�!��
����*�*�W�4������D�d�D�RV�R_�R_�`�!��
��\�\���� � �!d�!%�t�T�]�]�<�&�,�S�$��=�H�%������a�y�1�&���� � ��(�7(3�@�J�J�$�$�&�D�A�q��|�|�D�!�j��U�5G�5G��IY�IY�4Z�&[���|�|�D�!���|�|�D�!�a�9�n���� � �!?��C��A�u�1�1�2�q�z�z�7M�7M�QR�7R��q�%�"2�"2�3��
�
�8K�8K�8W�8W�[\�8\��9�9���i�i�o�o�c�2���q�6�S�=� �H�H�,�,�-h�-.�Z�Z�-C�-C�Q�Z�Z�E^�E^�`a�c��'�$����;#�&��H�H�N�N�3�q�6�*�!%�D�J�J��&��4&����s+�'L;�A)M=�;	M:�+M5�5M:�=	N
�	N
r
)rrrrrCrKr�rJr>rEr?rFr@rGrArHrBrIr"rr
r9r9xsN������6F�2-�;�4�"�,�(�1�!�>"�*:rr9c

���|�t}|rd}|�ttj�}|rWt	|�D�
cgc]}
|
t||
�f��}}
t
|�}d|vr/tj|dj|d<ntd�}|	��t|tj�r
|j}n[d|vr|d}nQ|jd�}dj|dd�}td|z�ttj|dd�}t j"j%|�}	|j'd	�}|rt|t(�rd|vr|dz|z}|�||d
<t+||��}|j-�|j.rt1d��|j3�}	t5�}|r|j7|�}n|j9|�}|s||k(r@	|j;|j<�t?||j@�}|jBa!|S|
�A|r5	ttMt j"j|	|�d��}
n
tQ�}
|
jSdtT�d}|jW�rt1d��|j@s|jGd�tY|jZ�}|j\D]\}}}	|j_|||��|jbD]"\}} | \}!}"}#}$	|je|#|$||!|"��$	|�|jg|jh�n|jg|�|rt1d��|jk�}%|%D]/\}&}'|j/d|'jl|'jn|&�d}�1|jq�}(|(r^|
jSd�|
jSd�|
jSd�|(D]&}|jGd|�|
jSd|��(|rc|
jSd�|
jSd�|
jSd�ts|jt�D]\})}*|
jSd|)|*��|jw�}+|+D]4}'|jGd|'jl|'jn|'jx��6t{|(�dk(r|jGd�t{|(�dkDr|jGdt{|(��t{|+�dk(r|jGd �t{|+�dkDr|jGd!t{|+��|�r[|
jSd�|
jSd"�|
jSd�t}|j~�},|,j��|,D]H}|
jSd#|d$j|j~|D�-cgc]
}-t)|-���c}-���J|
jSd�|
jSd%�|
jSd�t}|j��}.|.j��|.D]H}/|
jSd#|/d$j|j�|/D�-cgc]
}-t)|-���c}-���J|
jSd�|rT|j��}0|0D]}1|jGd&|1��|j��}2|2D]}3|j/d'|3�d}�|j��}4|4D]\}}|j/d(||�d}�|rt1d��|r|j�d)|�t�|||
�}|r�t{|j��}5|5dk(r|jGd*�n|5dkDr|jGd+|5�t{|j��}6|6dk(r|jGd,�n|6dkDr|jGd-|6�|�r~|j�s
|j��re|
jGd�|
jGd.�|
jGd�|j�D]\}7}8}9|
jGd/|8|7|9��t��}:|j�D]�\}7};}<|7t�|;�t�|<�f|:vr�!|
jGd0|7|;�|
jGd1|<|7�|jGd0|7|;�|jGd1|<|7�|:j�|7t�|;�t�|<�f���g}=|j�D]M\}7};}<|<j�r�|<|=vs�|
jGd2|<�|jGd2|<�|=j�|<��O|r	|j�||	|�|r	|j�||�|j;|j<�t?||j@�}|jBa!|Scc}
w#tD$r}|jGd
|�Yd}~���d}~wwxYw#tH$r%}|jGt)|��Yd}~��d}~wtJ$rY��wxYw#tN$r,}|jGd|�d|���tQ�}
Yd}~��d}~wwxYw#t`$r}|jGd|�Yd}~���d}~wwxYw#t`$r}|j/d|�d}Yd}~���d}~wwxYw#t`$r'}|j/t)|��d}Yd}~���d}~wwxYwcc}-wcc}-w#tN$r"}|jGd3|�d|���Yd}~���d}~wwxYw#tN$r"}|jGd3|�d|���Yd}~���d}~wwxYw)4Nr�__file__rr,r
r�rwr��__package__rB)r�zUnable to build parserz.There was a problem loading the table file: %rrzCouldn't open z. z5Created by PLY version %s (http://www.dabeaz.com/ply)Fz no p_error() function is definedz%sTz;%s:%d: Symbol %r used, but not defined as a token or a rulezUnused terminals:zToken %r defined, but not usedz    %srzRule %-5d %sz$%s:%d: Rule %r defined, but not usedr�zThere is 1 unused tokenzThere are %d unused tokenszThere is 1 unused rulezThere are %d unused rulesz'Terminals, with rules where they appearz
%-20s : %sr�z*Nonterminals, with rules where they appearzSymbol %r is unreachablez)Infinite recursion detected for symbol %rz0Precedence rule %r defined for unknown symbol %rzGenerating %s tablesz1 shift/reduce conflictz%d shift/reduce conflictsz1 reduce/reduce conflictz%d reduce/reduce conflictsz
Conflicts:z7shift/reduce conflict for %s in state %d resolved as %sz;reduce/reduce conflict in state %d resolved using rule (%s)zrejected rule (%s) in state %dzRule (%s) is never reducedzCouldn't create )P�
tab_modulerr�r��dirrq�dictr|r�r)r`ryrzrr�r{r�r��dirnamer�rUr9rCrr,r�rsr�r�r�r�r�r;r�r/rrqr�r�rr$r �__version__rKrr<rrr/rr�r?rCrBrQr�r�rTr4rrWr&r1r�rrzr rHrOr[rr�r�r�r$r4r6rr�rr )>r�rr�rrB�check_recursion�optimize�write_tables�	debugfiler�debuglog�errorlog�
picklefilere�_itemsr��srcfilerP�pkgname�pkg�pinfor��lr�read_signaturerLr�errorsr�r'r-r.�funcname�gramr�r�r7r8rQr�r�rTrbr�rWr�r]�nonterms�nonterm�unreachable�urN�inf�unused_prec�num_sr�num_rrr�r��
resolution�already_reported�rule�rejected�warned_nevers>                                                              r
�yaccr��st
�����	�������S�Z�Z�(���36�v�;�?�;�a�1�g�f�a�(�)�;��?��V����U�"� #���E�,�,?� @� I� I�E�*��&�q�)����
�i��!1�!1�2��(�(�G��)�#��
�+��!����,���(�(�5��"�:�.���[�7�*�+�!�#�+�+�g�"6�
�B�G���G�G�O�O�G�,�	��)�)�M�
"�C�
�z�)�S�)��i���c�	�I�-�I�

����g��
�%�X�.�E�	�M�M�O��{�{��0�1�1����!�I�
�
�Y����^�^�J�7�N��]�]�9�5�N���)�3�
V��!�!�%�+�+�.�!�"�e�&6�&6�7�������
����
(�$�T�"�'�'�,�,�y�)�*L�c�%R�S��
"�|�H��M�M�I�;�W�
�F�
�����0�1�1�������;�<��e�l�l�#�G�$�n�n���e�U�	&��"�"�4���6�-� �-�-���$�%)�"��d�H�d�	��"�"�8�T�8�T�4�H�(���=����e�k�k�*����e�$�
��0�1�1� �1�1�3��&�	��T����T�VZ�V_�V_�ae�aj�aj�lo�p���'��/�/�1����
�
�b���
�
�)�*��
�
�b��$�D����=�t�D��M�M�(�D�)�%�

��
�
�b���
�
�i� ��
�
�b���g�1�1�2�D�A�q��M�M�.�!�Q�/�3��'�'�)�L������?����D�I�I�W[�W`�W`�a������!����2�3�
���q� ����5�s�;K�7L�M�
�<��A�����1�2�
�<��1�����4�c�,�6G�H���
�
�b���
�
�?�@��
�
�b���W�&�&�'��
�
�
���D��M�M�,��c�h�h��HY�HY�Z^�H_�7`�H_�1��A��H_�7`�.a�b��	�
�
�b���
�
�B�C��
�
�b����,�,�-���
�
���G��M�M�,�����7�K_�K_�`g�Kh�:i�Kh�a�3�q�6�Kh�:i�1j�k� ��
�
�b����.�.�0���A����7��;���*�*�,���C��N�N�F��L��F���+�+�-�K�"���e����I�5�RV�W���#���0�1�1�
����-�v�6�	�'�6�8�	4�B���R�_�_�%���Q�;����6�7�
�a�Z����8�&�A��R�_�_�%���Q�;����7�8�
�a�Z����9�6�B�
�"�/�/�R�_�_����������&������&(�o�o�"�E�3�
����V�Y\�^c�eo�p�'6��5��%'�_�_�!�E�4���r�$�x��H��.�2B�B�����Z�\a�cg�h����=�x��O����Z�\a�cg�h����=�x��O�� � �%��D��2�h�<�!@�A�&5���%'�_�_�!�E�4���#�#���)E�� � �!=�x�H�� � �!=�x�H��#�#�H�-�	&5��	H��N�N�9�i��;�
�	I��O�O�J�	�2�
���e�k�k�"�
�b�%�*�*�
+�F��L�L�E��M��K@��z�
V�� � �!Q�ST�U�U��
V���!�����Q�� � ���
��
���
(�� � �9�a�!H�I�%�<���
(��0�	&����T�1�%�%��	&���	��N�N�4��#��F��	�������s�1�v�������h8a��;j��P�	H�����A�F�G�G��	H���	I�����Q�G�H�H��	I�s��g�*6h�!>g�%3h?�i7�j �#/k�k>�?l�.l�l6�	h�#g;�5h�;h�h�	h<�h,�,h<�;h<�?	i4�!i/�/i4�7	j�j�j� 	k�)k�k�	k;�k6�6k;�	l3�l.�.l3�6	m!�?m�m!)<rRryr��os.pathr�rT�base64r=r�r~�	yaccdebug�
debug_filer��
default_lrr�r�r2r�version_info�
basestringr_rU�maxsizer��objectrr$r/r,r8r;r@rGrDr?rArErHrMrOrXr�rSr2r�rr�rrrrqrsr�r�r�r�r)r7r9r�r"rr
�<module>r�s���|
��
���
�������	��
��
��
����	��������A�����L��L�	�������$���	�	�	��9�
��	
����	�����


�:�� ,�,�hZC�ZC�L����/�0��4B-��B-�P-�V�-�\+�V�+�6� 	�9�	�e"�f�e"�^	�9�	�9�f�9�h	
�"�.	�	�	�5�w�5�`� �RN�F�N�l�i��
�RV���D�J��$��$�XrPK�t�\n	�܌�$ply/__pycache__/ygen.cpython-312.pycnu�[����

=Ui���@�ddlZddlZd�Zd�Zd�Zedk(re�yy)�Nc���t|�}d|z}d|z}|D]&\}}|j�j|�s�&n|D]&\}}|j�j|�s�&ndzfS)Nz
#--! %s-startz#--! %s-end�)�	enumerate�strip�
startswith�endswith)�lines�tag�srclines�	start_tag�end_tag�start_index�line�	end_indexs        �C/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/ply/ygen.py�get_source_ranger
s~�����H��#�%�I��c�!�G�%���T��:�:�<�"�"�9�-��&�$��	�4��:�:�<� � ��)��$�
�!�O�Y�'�'�c��g}d}d|z}|D]9}|j�j|�r|}�&|s�)|j|��;|S)NTz#--! %s)rr�append)r	r
�filtered_lines�include�tag_textrs      r�filter_sectionrsS���N��G��3��H����:�:�<�"�"�8�,�!�k�G�
��!�!�$�'�	�
�rc�4�tjjt�}t	j
tjj
|d�tjj
|d��ttjj
|d�d�5}|j�}ddd�td�\}}t|d�\}}t|d�\}}|||}	t|	d�}
t|
d�}|||||
||||D�cgc]}|j�d	z��}}ttjj
|d�d
�5}|j|�ddd�td�y#1swY��xYwcc}w#1swY�&xYw)Nzyacc.pyzyacc.py.bak�r�
parsedebug�parseoptzparseopt-notrack�DEBUG�TRACKING�
�wzUpdated yacc.py)�os�path�dirname�__file__�shutil�copy2�join�open�	readlinesrr�rstrip�
writelines�print)
r$�fr	�parse_start�	parse_end�parseopt_start�parseopt_end�parseopt_notrack_start�parseopt_notrack_end�
orig_lines�parseopt_lines�parseopt_notrack_linesrs
             r�mainr8'sU���g�g�o�o�h�'�G�
�L�L������g�y�1�2�7�7�<�<���3W�X�	
�b�g�g�l�l�7�I�.��	4�����
��
5�.�e�\�B��K��#3�E�:�#F� �N�L�3C�E�K]�3^�0��0��{�9�-�J�$�J��8�N�,�N�J�G��:P�E�
 �!5�6�)7�E�.��&�,1�2�E�D�T�[�[�]�4�
�E�E�2�	
�b�g�g�l�l�7�I�.��	4��	���U��
5�
�
��1
5�	4��(
3�	4�	4�s� E=�F	�F�=F�F�__main__)�os.pathr"r&rrr8�__name__�rr�<module>r=s0���
�
(�	��:�z���F�rPK�t�\�����$__pycache__/__init__.cpython-312.pycnu�[����

=Uif��D�gd�ZdZddlZddlmZddlmZd	d�Z		d
d�Zy))�c_lexer�c_parser�c_astz2.23�N)�check_output�)�CParserc��|g}t|t�r||z
}n|dk7r||gz
}||gz
}	t|d��}|S#t$r}t	dd|zz��d}~wwxYw)ae Preprocess a file using cpp.

        filename:
            Name of the file you want to preprocess.

        cpp_path:
        cpp_args:
            Refer to the documentation of parse_file for the meaning of these
            arguments.

        When successful, returns the preprocessed file's contents.
        Errors from cpp will be printed out.
    �T)�universal_newlineszAUnable to invoke 'cpp'.  Make sure its path was passed correctly
zOriginal error: %sN)�
isinstance�listr�OSError�RuntimeError)�filename�cpp_path�cpp_args�	path_list�text�es      �C/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/__init__.py�preprocess_filers����
�I��(�D�!��X��	�	�R���h�Z��	�
�(���I�(��I�$�?���K���(��8�
!�A�
%�'�(�	(��(�s�
;�	A�A�Ac���|rt|||�}n0tj||��5}|j�}ddd�|�
t	�}|j|�S#1swY�'xYw)aD Parse a C file using pycparser.

        filename:
            Name of the file you want to parse.

        use_cpp:
            Set to True if you want to execute the C pre-processor
            on the file prior to parsing it.

        cpp_path:
            If use_cpp is True, this is the path to 'cpp' on your
            system. If no path is provided, it attempts to just
            execute 'cpp', so it must be in your PATH.

        cpp_args:
            If use_cpp is True, set this to the command line arguments strings
            to cpp. Be careful with quotes - it's best to pass a raw string
            (r'') here. For example:
            r'-I../utils/fake_libc_include'
            If several arguments are required, pass a list of strings.

        encoding:
            Encoding to use for the file to parse

        parser:
            Optional parser object to be used instead of the default CParser

        When successful, an AST is returned. ParseError can be
        thrown if the file doesn't parse successfully.

        Errors from cpp will be printed out.
    )�encodingN)r�io�open�readr�parse)r�use_cpprr�parserrr�fs        r�
parse_filer!3s^��D��x��8�<��
�W�W�X��
1�Q��6�6�8�D�2��~�����<�<��h�'�'�2�
1�s�A�A()�cppr
)Fr"r
NN)	�__all__�__version__r�
subprocessrrrrr!��r�<module>r(s/��+����	�#���BBD�%)�*(r'PK�t�\@��0�0$__pycache__/_ast_gen.cpython-312.pycnu�[����

=Ui;)��D�ddlmZGd�de�ZGd�de�ZdZdZy)	�)�Templatec�"�eZdZdd�Zdd�Zd�Zy)�ASTCodeGeneratorc��||_|j|�D��cgc]\}}t||���c}}|_ycc}}w)zN Initialize the code generator from a configuration
            file.
        N)�cfg_filename�
parse_cfgfile�NodeCfg�node_cfg)�selfr�name�contentss    �C/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/_ast_gen.py�__init__zASTCodeGenerator.__init__sJ��)���$(�$6�$6�|�$D�F�$D� ��x�!��x�0�$D�F��
��Fs�<Nc���tt�j|j��}|tz
}|j
D]}||j
�dzz
}�|j|�y)z< Generates the code into file, an open file buffer.
        )rz

N)r�_PROLOGUE_COMMENT�
substituter�_PROLOGUE_CODEr
�generate_source�write)r�file�srcr
s    r�generatezASTCodeGenerator.generatesg���(�)�4�4��*�*�5�,��	�~����
�
�H��8�+�+�-��6�6�C�&�	
�
�
�3��c	#��K�t|d�5}|D]�}|j�}|r|jd�r�'|jd�}|jd�}|jd�}|dks
||ks||krt	d|�d|�d	���|d
|}||dz|}|r-|jd�D�	cgc]}	|	j���c}	ng}
||
f����	d
d
d
�y
cc}	w#1swYy
xYw�w)ze Parse the configuration file and yield pairs of
            (name, contents) for each node.
        �r�#�:�[�]�zInvalid line in z:
�
N�,)�open�strip�
startswith�find�RuntimeError�split)r�filename�f�line�colon_i�
lbracket_i�
rbracket_ir�val�v�vallists           rrzASTCodeGenerator.parse_cfgfile%s������(�C�
 �A����z�z�|���t���s�3���)�)�C�.��!�Y�Y�s�^�
�!�Y�Y�s�^�
��Q�;�*��"7�:��;S�&�h�PT�'U�V�V��H�W�~���:��>�*�5��AD�c�i�i��n�=�n��1�7�7�9�n�=�"���G�m�#��!�
 ��>�!�
 �s/�
C.�B C"�/C�
C"�	C.�C"�"C+�'C.)z
_c_ast.cfg)N)�__name__�
__module__�__qualname__rrr�rrrrs��F�
�$rrc�4�eZdZdZd�Zd�Zd�Zd�Zd�Zd�Z	y)	r	z� Node configuration.

        name: node name
        contents: a list of contents - attributes and child nodes
        See comment at the top of the configuration file for details.
    c��||_g|_g|_g|_g|_|D]�}|jd�}|jj
|�|jd�r|jj
|��\|jd�r|jj
|���|jj
|���y)N�*z**)r�all_entries�attr�child�	seq_child�rstrip�append�endswith)rrr
�entry�clean_entrys     rrzNodeCfg.__init__Bs�����	������	���
�����E��,�,�s�+�K����#�#�K�0��~�~�d�#����%�%�k�2�����$��
�
�!�!�+�.��	�	� � ��'�rc��|j�}|d|j�zz
}|d|j�zz
}|d|j�zz
}|S)Nr!)�	_gen_init�
_gen_children�	_gen_iter�_gen_attr_names�rrs  rrzNodeCfg.generate_sourceTsY���n�n����t�d�(�(�*�*�*���t�d�n�n�&�&�&���t�d�*�*�,�,�,���
rc�6�d|jz}|jrHdj|j�}djd�|jD��}|dz
}d|z}nd}d}|d|zz
}|d	|zz
}|jd
gzD]}|d|�d|�d
�z
}�|S)Nzclass %s(Node):
z, c3�>K�|]}dj|����y�w)z'{0}'N)�format)�.0�es  r�	<genexpr>z$NodeCfg._gen_init.<locals>.<genexpr>`s����J�9I�A�g�n�n�Q�/�9I�s�z, 'coord', '__weakref__'z(self, %s, coord=None)z'coord', '__weakref__'z(self, coord=None)z    __slots__ = (%s)
z    def __init__%s:
�coordz
        self.z = r!)rr9�join)rr�args�slots�arglistrs      rrCzNodeCfg._gen_init[s���!�D�I�I�-������9�9�T�-�-�.�D��I�I�J��9I�9I�J�J�E��/�/�E�.��5�G�,�E�*�G��'�%�/�/���&��0�0���$�$��y�0�D��t�T�:�:�C�1��
rc���d}|jrR|dz
}|jD]}|dt|��zz
}�|jD]}|dt|��zz
}�|dz
}|S|dz
}|S)Nz    def children(self):
z        nodelist = []
zV        if self.%(child)s is not None: nodelist.append(("%(child)s", self.%(child)s))
�r;zu        for i, child in enumerate(self.%(child)s or []):
            nodelist.append(("%(child)s[%%d]" %% i, child))
z        return tuple(nodelist)
z        return ()
�r9r;�dictr<�rrr;r<s    rrDzNodeCfg._gen_childrenos���)������,�,�C������H��5�)�+�+��$�"�^�^�	��T��9�-�/�/��,�
�5�5�C��
�
�(�(�C��
rc��d}|jre|jD]}|dt|��zz
}�|jD]}|dt|��zz
}�|js|js|dz
}|S|dz
}|S)Nz    def __iter__(self):
zH        if self.%(child)s is not None:
            yield self.%(child)s
rTzE        for child in (self.%(child)s or []):
            yield child
z        return
        yield
rUrWs    rrEzNodeCfg._gen_iter�s���)����������9�=A��=N�P�P��$�
"�^�^�	��0�48�y�4I�K�K��,�
�J�J�$�.�.��&�'���
�	
�"�
#�C��
rc�V�ddjd�|jD��zdz}|S)Nz    attr_names = (�c3�&K�|]	}d|z���y�w)z%r, Nr5)rK�nms  rrMz*NodeCfg._gen_attr_names.<locals>.<genexpr>�s����,M�9�R�V�b�[�9�s��))rOr:rGs  rrFzNodeCfg._gen_attr_names�s*��"�R�W�W�,M�4�9�9�,M�%M�M�PS�S���
rN)
r2r3r4�__doc__rrrCrDrErFr5rrr	r	:s%���(�$��(�0�6rr	a�#-----------------------------------------------------------------
# ** ATTENTION **
# This code was automatically generated from the file:
# $cfg_filename
#
# Do not modify it directly. Modify the configuration file and
# run the generator again.
# ** ** *** ** **
#
# pycparser: c_ast.py
#
# AST Node classes.
#
# Eli Bendersky [https://eli.thegreenplace.net/]
# License: BSD
#-----------------------------------------------------------------

a3
import sys

def _repr(obj):
    """
    Get the representation of an object, with dedicated pprint-like format for lists.
    """
    if isinstance(obj, list):
        return '[' + (',\n '.join((_repr(e).replace('\n', '\n ') for e in obj))) + '\n]'
    else:
        return repr(obj)

class Node(object):
    __slots__ = ()
    """ Abstract base class for AST nodes.
    """
    def __repr__(self):
        """ Generates a python representation of the current node
        """
        result = self.__class__.__name__ + '('

        indent = ''
        separator = ''
        for name in self.__slots__[:-2]:
            result += separator
            result += indent
            result += name + '=' + (_repr(getattr(self, name)).replace('\n', '\n  ' + (' ' * (len(name) + len(self.__class__.__name__)))))

            separator = ','
            indent = '\n ' + (' ' * len(self.__class__.__name__))

        result += indent + ')'

        return result

    def children(self):
        """ A sequence of all children that are Nodes
        """
        pass

    def show(self, buf=sys.stdout, offset=0, attrnames=False, nodenames=False, showcoord=False, _my_node_name=None):
        """ Pretty print the Node and all its attributes and
            children (recursively) to a buffer.

            buf:
                Open IO buffer into which the Node is printed.

            offset:
                Initial offset (amount of leading spaces)

            attrnames:
                True if you want to see the attribute names in
                name=value pairs. False to only see the values.

            nodenames:
                True if you want to see the actual node names
                within their parents.

            showcoord:
                Do you want the coordinates of each Node to be
                displayed.
        """
        lead = ' ' * offset
        if nodenames and _my_node_name is not None:
            buf.write(lead + self.__class__.__name__+ ' <' + _my_node_name + '>: ')
        else:
            buf.write(lead + self.__class__.__name__+ ': ')

        if self.attr_names:
            if attrnames:
                nvlist = [(n, getattr(self,n)) for n in self.attr_names]
                attrstr = ', '.join('%s=%s' % nv for nv in nvlist)
            else:
                vlist = [getattr(self, n) for n in self.attr_names]
                attrstr = ', '.join('%s' % v for v in vlist)
            buf.write(attrstr)

        if showcoord:
            buf.write(' (at %s)' % self.coord)
        buf.write('\n')

        for (child_name, child) in self.children():
            child.show(
                buf,
                offset=offset + 2,
                attrnames=attrnames,
                nodenames=nodenames,
                showcoord=showcoord,
                _my_node_name=child_name)


class NodeVisitor(object):
    """ A base NodeVisitor class for visiting c_ast nodes.
        Subclass it and define your own visit_XXX methods, where
        XXX is the class name you want to visit with these
        methods.

        For example:

        class ConstantVisitor(NodeVisitor):
            def __init__(self):
                self.values = []

            def visit_Constant(self, node):
                self.values.append(node.value)

        Creates a list of values of all the constant nodes
        encountered below the given node. To use it:

        cv = ConstantVisitor()
        cv.visit(node)

        Notes:

        *   generic_visit() will be called for AST nodes for which
            no visit_XXX method was defined.
        *   The children of nodes for which a visit_XXX was
            defined will not be visited - if you need this, call
            generic_visit() on the node.
            You can use:
                NodeVisitor.generic_visit(self, node)
        *   Modeled after Python's own AST visiting facilities
            (the ast module of Python 3.0)
    """

    _method_cache = None

    def visit(self, node):
        """ Visit a node.
        """

        if self._method_cache is None:
            self._method_cache = {}

        visitor = self._method_cache.get(node.__class__.__name__, None)
        if visitor is None:
            method = 'visit_' + node.__class__.__name__
            visitor = getattr(self, method, self.generic_visit)
            self._method_cache[node.__class__.__name__] = visitor

        return visitor(node)

    def generic_visit(self, node):
        """ Called if no explicit visitor function exists for a
            node. Implements preorder visiting of the node.
        """
        for c in node:
            self.visit(c)

N)�stringr�objectrr	rrr5rr�<module>ras8���'$�v�'$�Tj�f�j�\��(U�rPK�t�\	�J��)__pycache__/_build_tables.cpython-312.pycnu�[����

=Ui?����ddlZddlZddgejddddlmZed�Zej
edd��ddlm	Z	e	jd	d
d	��ej�ddlZddl
Z
ddlZy)�N�.z..)�ASTCodeGeneratorz
_c_ast.cfgzc_ast.py�w)�c_parserTF)�lex_optimize�
yacc_debug�
yacc_optimize)�	importlib�sys�path�_ast_genr�ast_gen�generate�open�	pycparserr�CParser�invalidate_caches�lextab�yacctab�c_ast���H/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/_build_tables.py�<module>rs{�� �
��d������1�
�&�
�<�
(������j�#�&�'�����������	����
��rPK�t�\��*o��*__pycache__/ast_transforms.cpython-312.pycnu�[����

=Ui;��(�ddlmZd�Zd�Zd�Zd�Zy)�)�c_astc�v�t|tj�sJ�t|jtj�s|Stjg|jj
�}d}|jjxsgD]�}t|tjtjf�rA|jj|�t||j�|jd}�n|�|jj|���|jj|���||_|S)a� The 'case' statements in a 'switch' come out of parsing with one
        child node, so subsequent statements are just tucked to the parent
        Compound. Additionally, consecutive (fall-through) case statements
        come out messy. This is a peculiarity of the C grammar. The following:

            switch (myvar) {
                case 10:
                    k = 10;
                    p = k + 1;
                    return 10;
                case 20:
                case 30:
                    return 20;
                default:
                    break;
            }

        Creates this tree (pseudo-dump):

            Switch
                ID: myvar
                Compound:
                    Case 10:
                        k = 10
                    p = k + 1
                    return 10
                    Case 20:
                        Case 30:
                            return 20
                    Default:
                        break

        The goal of this transform is to fix this mess, turning it into the
        following:

            Switch
                ID: myvar
                Compound:
                    Case 10:
                        k = 10
                        p = k + 1
                        return 10
                    Case 20:
                    Case 30:
                        return 20
                    Default:
                        break

        A fixed AST node is returned. The argument may be modified.
    N���)�
isinstancer�Switch�stmt�Compound�coord�block_items�Case�Default�append�_extract_nested_case�stmts)�switch_node�new_compound�	last_case�childs    �I/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/ast_transforms.py�fix_switch_casesr
s��f�k�5�<�<�0�0�0��k�&�&����7����>�>�"�k�&6�&6�&<�&<�=�L��I�
�"�"�.�.�4�"�4���e�e�j�j�%�-�-�8�9�

�$�$�+�+�E�2� ���(@�(@�A�$�0�0��4�I�� ��(�(�/�/��6����&�&�u�-�5�"$�K����c���t|jdtjtjf�r9|j|jj
��t|d|�yy)z� Recursively extract consecutive Case statements that are made nested
        by the parser and add them to the stmts_list.
    �rN)rrrrr
r�popr)�	case_node�
stmts_lists  rrrcsS���)�/�/�!�$�u�z�z�5�=�=�&A�B����)�/�/�-�-�/�0��Z��^�Z�8�Crc�~�	t|�\}}|sn�|}t|tj�s(	|j}t|tj�s�(d|jvr)d|jvr|jjd�|j�|j|_|S#t
$r|cYSwxYw)aK Atomic specifiers like _Atomic(type) are unusually structured,
        conferring a qualifier upon the contained type.

        This function fixes a decl with atomic specifiers to have a sane AST
        structure, by removing spurious Typename->TypeDecl pairs and attaching
        the _Atomic qualifier in the right place.
    �_Atomic)
�_fix_atomic_specifiers_oncerr�TypeDecl�type�AttributeError�qualsr�declname�name)�decl�found�typs   r�fix_atomic_specifiersr)ls����1�$�7���e�����C���e�n�n�-�	��(�(�C���e�n�n�-�
�C�I�I��)�4�:�:�"=��
�
���)�$�
�|�|���y�y����K���	��K�	�s�B.�.B<�;B<c��|}d}|j}|�=t|tj�rd|jvrn	|}|}|j}|��=t|tj�sJ�|j|_d|jjvr%|jjjd�|dfS#t
$r|dfcYSwxYw)z� Performs one 'fix' round of atomic specifiers.
        Returns (modified_decl, found) where found is True iff a fix was made.
    NrFT)r!rr�Typenamer#r"r r)r&�parent�grandparent�nodes    rrr�s����F��K��9�9�D�
�
��d�E�N�N�+�	�T�Z�Z�0G��	� �K��F��9�9�D�
�
��f�e�n�n�-�-�-��y�y�K����	�	���'��	�	�����y�)���:����	���;��		�s�B>�>
C�
CN)�rrrr)r�rr�<module>r1s!���S�l9��@rPK�t�\R�����!__pycache__/c_ast.cpython-312.pycnu�[����

=Ui�z��t�ddlZd�ZGd�de�ZGd�de�ZGd�de�ZGd	�d
e�ZGd�de�ZGd
�de�ZGd�de�Z	Gd�de�Z
Gd�de�ZGd�de�ZGd�de�Z
Gd�de�ZGd�de�ZGd�de�ZGd�d e�ZGd!�d"e�ZGd#�d$e�ZGd%�d&e�ZGd'�d(e�ZGd)�d*e�ZGd+�d,e�ZGd-�d.e�ZGd/�d0e�ZGd1�d2e�ZGd3�d4e�ZGd5�d6e�ZGd7�d8e�ZGd9�d:e�ZGd;�d<e�ZGd=�d>e�Z Gd?�d@e�Z!GdA�dBe�Z"GdC�dDe�Z#GdE�dFe�Z$GdG�dHe�Z%GdI�dJe�Z&GdK�dLe�Z'GdM�dNe�Z(GdO�dPe�Z)GdQ�dRe�Z*GdS�dTe�Z+GdU�dVe�Z,GdW�dXe�Z-GdY�dZe�Z.Gd[�d\e�Z/Gd]�d^e�Z0Gd_�d`e�Z1Gda�dbe�Z2Gdc�dde�Z3Gde�dfe�Z4Gdg�dhe�Z5y)i�Nc�t�t|t�rddjd�|D��zdzSt|�S)z[
    Get the representation of an object, with dedicated pprint-like format for lists.
    �[z,
 c3�RK�|]}t|�jdd����!y�w)�
�
 N)�_repr�replace)�.0�es  �@/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/c_ast.py�	<genexpr>z_repr.<locals>.<genexpr>s"����"N�#�Q�5��8�#3�#3�D�%�#@�#�s�%'z
])�
isinstance�list�join�repr)�objs rrrs8���#�t���f�k�k�"N�#�"N�O�P�SX�X�X��C�y��c�F�eZdZdZ	d�Zd�Zejdddddfd�Zy)�Node�c��|jjdz}d}d}|jddD]�}||z
}||z
}||dztt	||��jdddt
|�t
|jj�zzz�zz
}d	}d
dt
|jj�zz}��||dzz
}|S)z? Generates a python representation of the current node
        �(�N����=rz
  � �,r�))�	__class__�__name__�	__slots__r�getattrr	�len)�self�result�indent�	separator�names     r�__repr__z
Node.__repr__"s������(�(�3�.�����	��N�N�3�B�'�D��i��F��f��F��d�S�j�E�'�$��*=�$>�$F�$F�t�V�WZ�^a�bf�^g�jm�nr�n|�n|�oF�oF�kG�_G�XH�NI�%J�K�
K�F��I��c�C����(?�(?�$@�@�A�F�
(�	�&�3�,����
rc��y)z3 A sequence of all children that are Nodes
        Nr�r$s r�childrenz
Node.children5s��	
rrFNc	���d|z}|r4|�2|j||jjzdz|zdz�n+|j||jjzdz�|jr�|r>|jD�cgc]}|t	||�f��}	}djd�|	D��}
n;|jD�cgc]}t	||���}}djd�|D��}
|j|
�|r|jd	|jz�|jd
�|j�D]\}}
|
j||dz||||���!ycc}wcc}w)
a� Pretty print the Node and all its attributes and
            children (recursively) to a buffer.

            buf:
                Open IO buffer into which the Node is printed.

            offset:
                Initial offset (amount of leading spaces)

            attrnames:
                True if you want to see the attribute names in
                name=value pairs. False to only see the values.

            nodenames:
                True if you want to see the actual node names
                within their parents.

            showcoord:
                Do you want the coordinates of each Node to be
                displayed.
        rNz <z>: z: z, c3�&K�|]	}d|z���y�w)z%s=%sNr)r
�nvs  rr
zNode.show.<locals>.<genexpr>Ys����#B�6�R�G�b�L�6���c3�&K�|]	}d|z���y�w)z%sNr)r
�vs  rr
zNode.show.<locals>.<genexpr>\s����#<�e��D�1�H�e�r0z (at %s)r�)�offset�	attrnames�	nodenames�	showcoord�
_my_node_name)	�writerr �
attr_namesr"r�coordr,�show)r$�bufr4r5r6r7r8�lead�n�nvlist�attrstr�vlist�
child_name�childs              rr<z	Node.show:sJ��,�V�|����2��I�I�d�T�^�^�4�4�4�d�:�]�J�U�R�S��I�I�d�T�^�^�4�4�4�d�:�;��?�?��8<���H��1�1�g�d�1�o�.���H��)�)�#B�6�#B�B��37�?�?�C�?�a���q�)�?��C��)�)�#<�e�#<�<���I�I�g����I�I�j�4�:�:�-�.��	�	�$��#'�=�=�?��Z���J�J����z�#�#�#�(�

�
*�$3��I��Ds�E#�E()	r �
__module__�__qualname__r!r)r,�sys�stdoutr<rrrrrs0���I���&
�
�z�z�!�u��Y^�nr�0*rrc� �eZdZdZdZd�Zd�Zy)�NodeVisitora- A base NodeVisitor class for visiting c_ast nodes.
        Subclass it and define your own visit_XXX methods, where
        XXX is the class name you want to visit with these
        methods.

        For example:

        class ConstantVisitor(NodeVisitor):
            def __init__(self):
                self.values = []

            def visit_Constant(self, node):
                self.values.append(node.value)

        Creates a list of values of all the constant nodes
        encountered below the given node. To use it:

        cv = ConstantVisitor()
        cv.visit(node)

        Notes:

        *   generic_visit() will be called for AST nodes for which
            no visit_XXX method was defined.
        *   The children of nodes for which a visit_XXX was
            defined will not be visited - if you need this, call
            generic_visit() on the node.
            You can use:
                NodeVisitor.generic_visit(self, node)
        *   Modeled after Python's own AST visiting facilities
            (the ast module of Python 3.0)
    Nc�B�|j�i|_|jj|jjd�}|�Sd|jjz}t	|||j
�}||j|jj<||�S)z Visit a node.
        N�visit_)�
_method_cache�getrr r"�
generic_visit)r$�node�visitor�methods    r�visitzNodeVisitor.visit�s������%�!#�D���$�$�(�(����)@�)@�$�G���?����� 7� 7�7�F��d�F�D�,>�,>�?�G�:A�D���t�~�~�6�6�7��t�}�rc�4�|D]}|j|��y)zy Called if no explicit visitor function exists for a
            node. Implements preorder visiting of the node.
        N)rS)r$rP�cs   rrOzNodeVisitor.generic_visit�s���A��J�J�q�M�r)r rErF�__doc__rMrSrOrrrrJrJms���B�M�
�rrJc�(�eZdZdZdd�Zd�Zd�ZdZy)�	ArrayDecl)�type�dim�	dim_qualsr;�__weakref__Nc�<�||_||_||_||_y�N)rYrZr[r;)r$rYrZr[r;s     r�__init__zArrayDecl.__init__�s����	����"�����
rc��g}|j�|jd|jf�|j�|jd|jf�t|�S)NrYrZ)rY�appendrZ�tuple�r$�nodelists  rr,zArrayDecl.children�sM�����9�9� �(�/�/�6�4�9�9�2E�"F��8�8�����%����1B�!C��X��rc#�vK�|j�|j��|j�|j��yy�wr^)rYrZr+s r�__iter__zArrayDecl.__iter__�s1�����9�9� ��)�)�O��8�8���(�(�N� ���79)r[r^�r rErFr!r_r,rfr:rrrrXrX�s��D�I����!�JrrXc�(�eZdZdZdd�Zd�Zd�ZdZy)�ArrayRef)r(�	subscriptr;r\Nc�.�||_||_||_yr^)r(rkr;)r$r(rkr;s    rr_zArrayRef.__init__�s����	�"�����
rc��g}|j�|jd|jf�|j�|jd|jf�t|�S)Nr(rk)r(rarkrbrcs  rr,zArrayRef.children�sM�����9�9� �(�/�/�6�4�9�9�2E�"F��>�>�%�x����T�^�^�7T�'U��X��rc#�vK�|j�|j��|j�|j��yy�wr^)r(rkr+s rrfzArrayRef.__iter__�s2�����9�9� ��)�)�O��>�>�%��.�.� �&�rgrr^rhrrrrjrj�s��=�I��
�!��Jrrjc�(�eZdZdZdd�Zd�Zd�ZdZy)�
Assignment)�op�lvalue�rvaluer;r\Nc�<�||_||_||_||_yr^)rqrrrsr;)r$rqrrrsr;s     rr_zAssignment.__init__�s�������������
rc��g}|j�|jd|jf�|j�|jd|jf�t|�S)Nrrrs)rrrarsrbrcs  rr,zAssignment.children�sM�����;�;�"�H�O�O�X�t�{�{�4K�$L��;�;�"�H�O�O�X�t�{�{�4K�$L��X��rc#�vK�|j�|j��|j�|j��yy�wr^)rrrsr+s rrfzAssignment.__iter__�s3�����;�;�"��+�+���;�;�"��+�+��#�rg�rqr^rhrrrrprp�s��B�I�����Jrrpc�(�eZdZdZdd�Zd�Zd�ZdZy)�Alignas)�	alignmentr;r\Nc� �||_||_yr^)rzr;)r$rzr;s   rr_zAlignas.__init__�s��"�����
rc�n�g}|j�|jd|jf�t|�S)Nrz)rzrarbrcs  rr,zAlignas.children�s/�����>�>�%�x����T�^�^�7T�'U��X��rc#�BK�|j�|j��yy�wr^)rzr+s rrfzAlignas.__iter__�s�����>�>�%��.�.� �&���rr^rhrrrryry�s��5�I���
!��Jrryc�(�eZdZdZdd�Zd�Zd�ZdZy)�BinaryOp)rq�left�rightr;r\Nc�<�||_||_||_||_yr^)rqr�r�r;)r$rqr�r�r;s     rr_zBinaryOp.__init__�s�������	���
���
rc��g}|j�|jd|jf�|j�|jd|jf�t|�S)Nr�r�)r�rar�rbrcs  rr,zBinaryOp.children�M�����9�9� �(�/�/�6�4�9�9�2E�"F��:�:�!�8�?�?�G�T�Z�Z�3H�#I��X��rc#�vK�|j�|j��|j�|j��yy�wr^)r�r�r+s rrfzBinaryOp.__iter__�2�����9�9� ��)�)�O��:�:�!��*�*��"�rgrwr^rhrrrr�r��s��?�I�����Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Break�r;r\Nc��||_yr^�r;�r$r;s  rr_zBreak.__init__�	����
rc��y�Nrrr+s rr,zBreak.children���rc#�K�y�wr^rr+s rrfzBreak.__iter__�	�������rr^rhrrrr�r����(�I�����Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Case)�expr�stmtsr;r\Nc�.�||_||_||_yr^)r�r�r;)r$r�r�r;s    rr_z
Case.__init__�����	���
���
rc���g}|j�|jd|jf�t|jxsg�D]\}}|jd|z|f��t	|�S)Nr��	stmts[%d])r�ra�	enumerater�rb�r$rd�irDs    rr,z
Case.children$s`�����9�9� �(�/�/�6�4�9�9�2E�"F�!�$�*�*�"2��3�H�A�u��O�O�[�1�_�e�4�5�4��X��rc#�rK�|j�|j��|jxsgD]}|���y�wr^)r�r��r$rDs  rrfz
Case.__iter__+s4�����9�9� ��)�)�O��j�j�&�B�&�E��K�'���57rr^rhrrrr�r�s��9�I��
���Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Cast)�to_typer�r;r\Nc�.�||_||_||_yr^)r�r�r;)r$r�r�r;s    rr_z
Cast.__init__5s�������	���
rc��g}|j�|jd|jf�|j�|jd|jf�t|�S)Nr�r�)r�rar�rbrcs  rr,z
Cast.children:sM�����<�<�#�X�_�_�i����5N�%O��9�9� �(�/�/�6�4�9�9�2E�"F��X��rc#�vK�|j�|j��|j�|j��yy�wr^)r�r�r+s rrfz
Cast.__iter__@s2�����<�<�#��,�,���9�9� ��)�)�O�!�rgrr^rhrrrr�r�3s��;�I��
���Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Compound)�block_itemsr;r\Nc� �||_||_yr^)r�r;)r$r�r;s   rr_zCompound.__init__J���&�����
rc��g}t|jxsg�D]\}}|jd|z|f��t|�S)Nzblock_items[%d])r�r�rarbr�s    rr,zCompound.childrenN�F����!�$�"2�"2�"8�b�9�H�A�u��O�O�.��2�E�:�;�:��X��rc#�>K�|jxsgD]}|���y�wr^)r�r�s  rrfzCompound.__iter__T�#�����&�&�,�"�,�E��K�-���rr^rhrrrr�r�H���7�I�����Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�CompoundLiteral)rY�initr;r\Nc�.�||_||_||_yr^)rYr�r;)r$rYr�r;s    rr_zCompoundLiteral.__init__\�����	���	���
rc��g}|j�|jd|jf�|j�|jd|jf�t|�S)NrYr�)rYrar�rbrcs  rr,zCompoundLiteral.childrena�M�����9�9� �(�/�/�6�4�9�9�2E�"F��9�9� �(�/�/�6�4�9�9�2E�"F��X��rc#�vK�|j�|j��|j�|j��yy�wr^)rYr�r+s rrfzCompoundLiteral.__iter__g�1�����9�9� ��)�)�O��9�9� ��)�)�O�!�rgrr^rhrrrr�r�Z���8�I��
���Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Constant)rY�valuer;r\Nc�.�||_||_||_yr^)rYr�r;)r$rYr�r;s    rr_zConstant.__init__qr�rc��g}t|�Sr^�rbrcs  rr,zConstant.childrenv������X��rc#�K�y�wr^rr+s rrfzConstant.__iter__zr�r�)rYr�r^rhrrrr�r�os��9�I��
��%�Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Continuer�Nc��||_yr^r�r�s  rr_zContinue.__init__�r�rc��yr�rr+s rr,zContinue.children�r�rc#�K�y�wr^rr+s rrfzContinue.__iter__�r�r�rr^rhrrrr�r��r�rr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Decl)
r(�quals�align�storage�funcspecrYr��bitsizer;r\Nc
��||_||_||_||_||_||_||_||_|	|_yr^)	r(r�r�r�r�rYr�r�r;)
r$r(r�r�r�r�rYr�r�r;s
          rr_z
Decl.__init__�sA����	���
���
���� ��
���	���	������
rc��g}|j�|jd|jf�|j�|jd|jf�|j�|jd|jf�t	|�S)NrYr�r�)rYrar�r�rbrcs  rr,z
Decl.children�sk�����9�9� �(�/�/�6�4�9�9�2E�"F��9�9� �(�/�/�6�4�9�9�2E�"F��<�<�#�X�_�_�i����5N�%O��X��rc#�K�|j�|j��|j�|j��|j�|j��yy�wr^)rYr�r�r+s rrfz
Decl.__iter__�sE�����9�9� ��)�)�O��9�9� ��)�)�O��<�<�#��,�,��$���AA)r(r�r�r�r�r^rhrrrr�r��s��t�I�	���E�Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�DeclList)�declsr;r\Nc� �||_||_yr^)r�r;)r$r�r;s   rr_zDeclList.__init__������
���
rc��g}t|jxsg�D]\}}|jd|z|f��t|�S�Nz	decls[%d]�r�r�rarbr�s    rr,zDeclList.children��B����!�$�*�*�"2��3�H�A�u��O�O�[�1�_�e�4�5�4��X��rc#�>K�|jxsgD]}|���y�wr^�r�r�s  rrfzDeclList.__iter__��!�����j�j�&�B�&�E��K�'�r�rr^rhrrrr�r�����1�I�����Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Default)r�r;r\Nc� �||_||_yr^)r�r;)r$r�r;s   rr_zDefault.__init__�r�rc��g}t|jxsg�D]\}}|jd|z|f��t|�S)Nr�)r�r�rarbr�s    rr,zDefault.children�r�rc#�>K�|jxsgD]}|���y�wr^)r�r�s  rrfzDefault.__iter__�r�r�rr^rhrrrr�r��r�rr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�DoWhile��cond�stmtr;r\Nc�.�||_||_||_yr^�r�r�r;�r$r�r�r;s    rr_zDoWhile.__init__�r�rc��g}|j�|jd|jf�|j�|jd|jf�t|�S�Nr�r��r�rar�rbrcs  rr,zDoWhile.children�r�rc#�vK�|j�|j��|j�|j��yy�wr^�r�r�r+s rrfzDoWhile.__iter__�r�rgrr^rhrrrr�r��r�rr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�
EllipsisParamr�Nc��||_yr^r�r�s  rr_zEllipsisParam.__init__�r�rc��yr�rr+s rr,zEllipsisParam.children�r�rc#�K�y�wr^rr+s rrfzEllipsisParam.__iter__�r�r�rr^rhrrrr�r��r�rr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�EmptyStatementr�Nc��||_yr^r�r�s  rr_zEmptyStatement.__init__�r�rc��yr�rr+s rr,zEmptyStatement.children�r�rc#�K�y�wr^rr+s rrfzEmptyStatement.__iter__�r�r�rr^rhrrrr�r��r�rr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Enum)r(�valuesr;r\Nc�.�||_||_||_yr^)r(rr;)r$r(rr;s    rr_z
Enum.__init__s����	������
rc�n�g}|j�|jd|jf�t|�S)Nr)rrarbrcs  rr,z
Enum.childrens/�����;�;�"�H�O�O�X�t�{�{�4K�$L��X��rc#�BK�|j�|j��yy�wr^)rr+s rrfz
Enum.__iter__
s�����;�;�"��+�+��#�r~�r(r^rhrrrrrs��:�I��
�
��Jrrc�(�eZdZdZdd�Zd�Zd�ZdZy)�
Enumerator)r(r�r;r\Nc�.�||_||_||_yr^)r(r�r;)r$r(r�r;s    rr_zEnumerator.__init__r�rc�n�g}|j�|jd|jf�t|�S)Nr�)r�rarbrcs  rr,zEnumerator.childrens/�����:�:�!�8�?�?�G�T�Z�Z�3H�#I��X��rc#�BK�|j�|j��yy�wr^)r�r+s rrfzEnumerator.__iter__s�����:�:�!��*�*��"�r~rr^rhrrrrrs��9�I��
�
��Jrrc�(�eZdZdZdd�Zd�Zd�ZdZy)�EnumeratorList)�enumeratorsr;r\Nc� �||_||_yr^)rr;)r$rr;s   rr_zEnumeratorList.__init__'r�rc��g}t|jxsg�D]\}}|jd|z|f��t|�S)Nzenumerators[%d])r�rrarbr�s    rr,zEnumeratorList.children+r�rc#�>K�|jxsgD]}|���y�wr^)rr�s  rrfzEnumeratorList.__iter__1r�r�rr^rhrrrr
r
%r�rr
c�(�eZdZdZdd�Zd�Zd�ZdZy)�ExprList��exprsr;r\Nc� �||_||_yr^�rr;�r$rr;s   rr_zExprList.__init__9r�rc��g}t|jxsg�D]\}}|jd|z|f��t|�S�Nz	exprs[%d]�r�rrarbr�s    rr,zExprList.children=r�rc#�>K�|jxsgD]}|���y�wr^�rr�s  rrfzExprList.__iter__Cr�r�rr^rhrrrrr7r�rrc�(�eZdZdZdd�Zd�Zd�ZdZy)�FileAST)�extr;r\Nc� �||_||_yr^)r r;)r$r r;s   rr_zFileAST.__init__Ks�������
rc��g}t|jxsg�D]\}}|jd|z|f��t|�S)Nzext[%d])r�r rarbr�s    rr,zFileAST.childrenOsA����!�$�(�(�.�b�1�H�A�u��O�O�Y��]�E�2�3�2��X��rc#�>K�|jxsgD]}|���y�wr^)r r�s  rrfzFileAST.__iter__Us�����h�h�n�"�n�E��K�%�r�rr^rhrrrrrIs��/�I�����Jrrc�(�eZdZdZdd�Zd�Zd�ZdZy)�For)r�r��nextr�r;r\Nc�J�||_||_||_||_||_yr^)r�r�r&r�r;)r$r�r�r&r�r;s      rr_zFor.__init__]s%����	���	���	���	���
rc�d�g}|j�|jd|jf�|j�|jd|jf�|j�|jd|jf�|j�|jd|jf�t|�S)Nr�r�r&r�)r�rar�r&r�rbrcs  rr,zFor.childrends������9�9� �(�/�/�6�4�9�9�2E�"F��9�9� �(�/�/�6�4�9�9�2E�"F��9�9� �(�/�/�6�4�9�9�2E�"F��9�9� �(�/�/�6�4�9�9�2E�"F��X��rc#��K�|j�|j��|j�|j��|j�|j��|j�|j��yy�wr^)r�r�r&r�r+s rrfzFor.__iter__lsW�����9�9� ��)�)�O��9�9� ��)�)�O��9�9� ��)�)�O��9�9� ��)�)�O�!�s�A+A-rr^rhrrrr%r%[s��H�I�����Jrr%c�(�eZdZdZdd�Zd�Zd�ZdZy)�FuncCall)r(�argsr;r\Nc�.�||_||_||_yr^)r(r,r;)r$r(r,r;s    rr_zFuncCall.__init__zr�rc��g}|j�|jd|jf�|j�|jd|jf�t|�S)Nr(r,)r(rar,rbrcs  rr,zFuncCall.childrenr�rc#�vK�|j�|j��|j�|j��yy�wr^)r(r,r+s rrfzFuncCall.__iter__�r�rgrr^rhrrrr+r+xr�rr+c�(�eZdZdZdd�Zd�Zd�ZdZy)�FuncDecl)r,rYr;r\Nc�.�||_||_||_yr^)r,rYr;)r$r,rYr;s    rr_zFuncDecl.__init__�r�rc��g}|j�|jd|jf�|j�|jd|jf�t|�S)Nr,rY)r,rarYrbrcs  rr,zFuncDecl.children�r�rc#�vK�|j�|j��|j�|j��yy�wr^)r,rYr+s rrfzFuncDecl.__iter__�r�rgrr^rhrrrr1r1�r�rr1c�(�eZdZdZdd�Zd�Zd�ZdZy)�FuncDef)�decl�param_decls�bodyr;r\Nc�<�||_||_||_||_yr^)r7r8r9r;)r$r7r8r9r;s     rr_zFuncDef.__init__�s����	�&�����	���
rc�.�g}|j�|jd|jf�|j�|jd|jf�t|jxsg�D]\}}|jd|z|f��t|�S)Nr7r9zparam_decls[%d])r7rar9r�r8rbr�s    rr,zFuncDef.children�s������9�9� �(�/�/�6�4�9�9�2E�"F��9�9� �(�/�/�6�4�9�9�2E�"F�!�$�"2�"2�"8�b�9�H�A�u��O�O�.��2�E�:�;�:��X��rc#�K�|j�|j��|j�|j��|jxsgD]}|���y�wr^)r7r9r8r�s  rrfzFuncDef.__iter__�sI�����9�9� ��)�)�O��9�9� ��)�)�O��&�&�,�"�,�E��K�-�s�AArr^rhrrrr6r6�s��G�I�����Jrr6c�(�eZdZdZdd�Zd�Zd�ZdZy)�Goto�r(r;r\Nc� �||_||_yr^�r(r;�r$r(r;s   rr_z
Goto.__init__������	���
rc��g}t|�Sr^r�rcs  rr,z
Goto.children�r�rc#�K�y�wr^rr+s rrfz
Goto.__iter__�r�r�rr^rhrrrr>r>����0�I�����Jrr>c�(�eZdZdZdd�Zd�Zd�ZdZy)�IDr?Nc� �||_||_yr^rArBs   rr_zID.__init__�rCrc��g}t|�Sr^r�rcs  rr,zID.children�r�rc#�K�y�wr^rr+s rrfzID.__iter__�r�r�rr^rhrrrrHrH�rFrrHc�(�eZdZdZdd�Zd�Zd�ZdZy)�IdentifierType)�namesr;r\Nc� �||_||_yr^)rNr;)r$rNr;s   rr_zIdentifierType.__init__�r�rc��g}t|�Sr^r�rcs  rr,zIdentifierType.children�r�rc#�K�y�wr^rr+s rrfzIdentifierType.__iter__�r�r�)rNr^rhrrrrMrM�s��1�I�����JrrMc�(�eZdZdZdd�Zd�Zd�ZdZy)�If�r��iftrue�iffalser;r\Nc�<�||_||_||_||_yr^�r�rUrVr;�r$r�rUrVr;s     rr_zIf.__init__������	���������
rc��g}|j�|jd|jf�|j�|jd|jf�|j�|jd|jf�t	|�S�Nr�rUrV�r�rarUrVrbrcs  rr,zIf.children��k�����9�9� �(�/�/�6�4�9�9�2E�"F��;�;�"�H�O�O�X�t�{�{�4K�$L��<�<�#�X�_�_�i����5N�%O��X��rc#�K�|j�|j��|j�|j��|j�|j��yy�wr^�r�rUrVr+s rrfzIf.__iter__��F�����9�9� ��)�)�O��;�;�"��+�+���<�<�#��,�,��$�r�rr^rhrrrrSrS����E�I�����JrrSc�(�eZdZdZdd�Zd�Zd�ZdZy)�InitListrNc� �||_||_yr^rrs   rr_zInitList.__init__r�rc��g}t|jxsg�D]\}}|jd|z|f��t|�Srrr�s    rr,zInitList.childrenr�rc#�>K�|jxsgD]}|���y�wr^rr�s  rrfzInitList.__iter__r�r�rr^rhrrrrdrdr�rrdc�(�eZdZdZdd�Zd�Zd�ZdZy)�Label)r(r�r;r\Nc�.�||_||_||_yr^)r(r�r;)r$r(r�r;s    rr_zLabel.__init__r�rc�n�g}|j�|jd|jf�t|�S)Nr�)r�rarbrcs  rr,zLabel.children�/�����9�9� �(�/�/�6�4�9�9�2E�"F��X��rc#�BK�|j�|j��yy�wr^)r�r+s rrfzLabel.__iter__#������9�9� ��)�)�O�!�r~rr^rhrrrriris��8�I��
�
��Jrric�(�eZdZdZdd�Zd�Zd�ZdZy)�NamedInitializer)r(r�r;r\Nc�.�||_||_||_yr^)r(r�r;)r$r(r�r;s    rr_zNamedInitializer.__init__+r�rc���g}|j�|jd|jf�t|jxsg�D]\}}|jd|z|f��t	|�S)Nr�zname[%d])r�rar�r(rbr�s    rr,zNamedInitializer.children0s_�����9�9� �(�/�/�6�4�9�9�2E�"F�!�$�)�)�/�r�2�H�A�u��O�O�Z�!�^�U�3�4�3��X��rc#�rK�|j�|j��|jxsgD]}|���y�wr^)r�r(r�s  rrfzNamedInitializer.__iter__7s2�����9�9� ��)�)�O��i�i�o�2�o�E��K�&�r�rr^rhrrrrprp)s��8�I��
���Jrrpc�(�eZdZdZdd�Zd�Zd�ZdZy)�	ParamList)�paramsr;r\Nc� �||_||_yr^)rvr;)r$rvr;s   rr_zParamList.__init__A��������
rc��g}t|jxsg�D]\}}|jd|z|f��t|�S)Nz
params[%d])r�rvrarbr�s    rr,zParamList.childrenEsC����!�$�+�+�"3��4�H�A�u��O�O�\�A�-�u�5�6�5��X��rc#�>K�|jxsgD]}|���y�wr^)rvr�s  rrfzParamList.__iter__Ks!�����k�k�'�R�'�E��K�(�r�rr^rhrrrruru?s��2�I�����Jrruc�(�eZdZdZdd�Zd�Zd�ZdZy)�PtrDecl)r�rYr;r\Nc�.�||_||_||_yr^)r�rYr;)r$r�rYr;s    rr_zPtrDecl.__init__Ss����
���	���
rc�n�g}|j�|jd|jf�t|�S�NrY�rYrarbrcs  rr,zPtrDecl.childrenXrlrc#�BK�|j�|j��yy�wr^�rYr+s rrfzPtrDecl.__iter__]rnr~)r�r^rhrrrr|r|Qs��9�I��
�
��Jrr|c�(�eZdZdZdd�Zd�Zd�ZdZy)�Return)r�r;r\Nc� �||_||_yr^)r�r;)r$r�r;s   rr_zReturn.__init__erCrc�n�g}|j�|jd|jf�t|�S�Nr��r�rarbrcs  rr,zReturn.childrenirlrc#�BK�|j�|j��yy�wr^�r�r+s rrfzReturn.__iter__nrnr~rr^rhrrrr�r�cs��0�I���
��Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�StaticAssert)r��messager;r\Nc�.�||_||_||_yr^)r�r�r;)r$r�r�r;s    rr_zStaticAssert.__init__vs����	������
rc��g}|j�|jd|jf�|j�|jd|jf�t|�S)Nr�r�)r�rar�rbrcs  rr,zStaticAssert.children{sM�����9�9� �(�/�/�6�4�9�9�2E�"F��<�<�#�X�_�_�i����5N�%O��X��rc#�vK�|j�|j��|j�|j��yy�wr^)r�r�r+s rrfzStaticAssert.__iter__�s2�����9�9� ��)�)�O��<�<�#��,�,��$�rgrr^rhrrrr�r�ts��;�I��
���Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Struct�r(r�r;r\Nc�.�||_||_||_yr^�r(r�r;�r$r(r�r;s    rr_zStruct.__init__�r�rc��g}t|jxsg�D]\}}|jd|z|f��t|�Sr�r�r�s    rr,zStruct.children�r�rc#�>K�|jxsgD]}|���y�wr^r�r�s  rrfzStruct.__iter__�r�r�rr^rhrrrr�r�����9�I��
���Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�	StructRef)r(rY�fieldr;r\Nc�<�||_||_||_||_yr^)r(rYr�r;)r$r(rYr�r;s     rr_zStructRef.__init__�s����	���	���
���
rc��g}|j�|jd|jf�|j�|jd|jf�t|�S)Nr(r�)r(rar�rbrcs  rr,zStructRef.children�r�rc#�vK�|j�|j��|j�|j��yy�wr^)r(r�r+s rrfzStructRef.__iter__�r�rgr�r^rhrrrr�r��s��A�I�����Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Switchr�Nc�.�||_||_||_yr^r�r�s    rr_zSwitch.__init__�r�rc��g}|j�|jd|jf�|j�|jd|jf�t|�Sr�r�rcs  rr,zSwitch.children�r�rc#�vK�|j�|j��|j�|j��yy�wr^r�r+s rrfzSwitch.__iter__�r�rgrr^rhrrrr�r��r�rr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�	TernaryOprTNc�<�||_||_||_||_yr^rXrYs     rr_zTernaryOp.__init__�rZrc��g}|j�|jd|jf�|j�|jd|jf�|j�|jd|jf�t	|�Sr\r]rcs  rr,zTernaryOp.children�r^rc#�K�|j�|j��|j�|j��|j�|j��yy�wr^r`r+s rrfzTernaryOp.__iter__�rar�rr^rhrrrr�r��rbrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�TypeDecl)�declnamer�r�rYr;r\Nc�J�||_||_||_||_||_yr^)r�r�r�rYr;)r$r�r�r�rYr;s      rr_zTypeDecl.__init__�s%�� ��
���
���
���	���
rc�n�g}|j�|jd|jf�t|�Srr�rcs  rr,zTypeDecl.children�rlrc#�BK�|j�|j��yy�wr^r�r+s rrfzTypeDecl.__iter__�rnr~)r�r�r�r^rhrrrr�r��s��N�I���
�2�Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Typedef)r(r�r�rYr;r\Nc�J�||_||_||_||_||_yr^)r(r�r�rYr;)r$r(r�r�rYr;s      rr_zTypedef.__init__�s%����	���
������	���
rc�n�g}|j�|jd|jf�t|�Srr�rcs  rr,zTypedef.children�rlrc#�BK�|j�|j��yy�wr^r�r+s rrfzTypedef.__iter__rnr~)r(r�r�r^rhrrrr�r��s��L�I���
�0�Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Typename)r(r�r�rYr;r\Nc�J�||_||_||_||_||_yr^)r(r�r�rYr;)r$r(r�r�rYr;s      rr_zTypename.__init__
s%����	���
���
���	���
rc�n�g}|j�|jd|jf�t|�Srr�rcs  rr,zTypename.childrenrlrc#�BK�|j�|j��yy�wr^r�r+s rrfzTypename.__iter__rnr~)r(r�r�r^rhrrrr�r�s��J�I���
�.�Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�UnaryOp)rqr�r;r\Nc�.�||_||_||_yr^)rqr�r;)r$rqr�r;s    rr_zUnaryOp.__init__s�������	���
rc�n�g}|j�|jd|jf�t|�Sr�r�rcs  rr,zUnaryOp.children#rlrc#�BK�|j�|j��yy�wr^r�r+s rrfzUnaryOp.__iter__(rnr~rwr^rhrrrr�r�s��6�I��
�
��Jrr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Unionr�Nc�.�||_||_||_yr^r�r�s    rr_zUnion.__init__0r�rc��g}t|jxsg�D]\}}|jd|z|f��t|�Sr�r�r�s    rr,zUnion.children5r�rc#�>K�|jxsgD]}|���y�wr^r�r�s  rrfzUnion.__iter__;r�r�rr^rhrrrr�r�.r�rr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Whiler�Nc�.�||_||_||_yr^r�r�s    rr_zWhile.__init__Cr�rc��g}|j�|jd|jf�|j�|jd|jf�t|�Sr�r�rcs  rr,zWhile.childrenHr�rc#�vK�|j�|j��|j�|j��yy�wr^r�r+s rrfzWhile.__iter__Nr�rgrr^rhrrrr�r�Ar�rr�c�(�eZdZdZdd�Zd�Zd�ZdZy)�Pragma)�stringr;r\Nc� �||_||_yr^)r�r;)r$r�r;s   rr_zPragma.__init__Xrxrc��g}t|�Sr^r�rcs  rr,zPragma.children\r�rc#�K�y�wr^rr+s rrfzPragma.__iter__`r�r�)r�r^rhrrrr�r�Vs��2�I�����Jrr�)6rGr�objectrrJrXrjrpryr�r�r�r�r�r�r�r�r�r�r�r�r�r�rrr
rrr%r+r1r6r>rHrMrSrdrirprur|r�r�r�r�r�r�r�r�r�r�r�r�r�rrr�<module>r�sy��&��L*�6�L*�^8�&�8�t!��!�,�t��*���,�d��"�t��,�D���4��,�4��*�t��$�d��*%�t�%�"�t��E�4�E�<�t��$�d��$�d��*�D���T���4��$���$�T��$�t��$�d��$�$��:�t��*�t��*�d��4�4�� ��� �T�� ���2�t��$�D��$�t��,���$�d��$�T��"�4��*�T��&���,�T��*���22�t�2�(0�d�0�(.�t�.�(�d��$�D��&�D��*�T�rPK�t�\�b�bubu'__pycache__/c_generator.cpython-312.pycnu�[����

=Ui~E��&�ddlmZGd�de�Zy)�)�c_astc��eZdZdZd^d�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
�Zd�Z
d�Zid
d�dd�dd�dd�dd�dd�dd�dd�dd�dd�dd�dd �d!d �d"d#�d$d#�d%d&�d'd&�d(d&i�Zd)�Zd*�Zd+�Zd,�Zd^d-�Zd.�Zd/�Zd0�Zd1�Zd2�Zd3�Zd4�Zd5�Zd6�Zd7�Zd8�Zd9�Z d:�Z!d;�Z"d<�Z#d=�Z$d>�Z%d?�Z&d@�Z'dA�Z(dB�Z)dC�Z*dD�Z+dE�Z,dF�Z-dG�Z.dH�Z/dI�Z0dJ�Z1dK�Z2dL�Z3dM�Z4dN�Z5dO�Z6dP�Z7dQ�Z8dR�Z9dS�Z:dT�Z;dU�Z<d^dV�Z=dW�Z>gdXfdY�Z?dZ�Z@d[�ZAd\�ZBy])_�
CGeneratorz� Uses the same visitor pattern as c_ast.NodeVisitor, but modified to
        return a value from each visit method, using string accumulation in
        generic_visit.
    c� �d|_||_y)z� Constructs C-code generator

            reduce_parentheses:
                if True, eliminates needless parentheses on binary operators
        �N)�indent_level�reduce_parentheses)�selfr	s  �F/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/c_generator.py�__init__zCGenerator.__init__s�����"4���c� �d|jzS�N� )r)r
s r�_make_indentzCGenerator._make_indents���T�&�&�&�&r
c�n�d|jjz}t|||j�|�S)N�visit_)�	__class__�__name__�getattr�
generic_visit)r
�node�methods   r�visitzCGenerator.visits2���D�N�N�3�3�3��8�w�t�V�T�%7�%7�8��>�>r
c�Z��|�ydj�fd�|j�D��S)N�c3�F�K�|]\}}�j|����y�w�N�r)�.0�c_name�cr
s   �r�	<genexpr>z+CGenerator.generic_visit.<locals>.<genexpr>'s�����J�/�Y�V�Q�4�:�:�a�=�/�s�!)�join�children)r
rs` rrzCGenerator.generic_visit#s&����<���7�7�J�$�-�-�/�J�J�Jr
c��|jSr)�value�r
�ns  r�visit_ConstantzCGenerator.visit_Constant)s���w�w�r
c��|jSr��namer(s  r�visit_IDzCGenerator.visit_ID,s���v�v�
r
c�F�d}|jr|d|jzz
}|S)Nz#pragmar)�string)r
r)�rets   r�visit_PragmazCGenerator.visit_Pragma/s%�����8�8��3����>�!�C��
r
c��|j|j�}|dz|j|j�zdzS)N�[�])�_parenthesize_unless_simpler-r�	subscript)r
r)�arrrefs   r�visit_ArrayRefzCGenerator.visit_ArrayRef5s7���1�1�!�&�&�9����|�d�j�j����5�5��;�;r
c��|j|j�}||jz|j|j�zSr)r6r-�typer�field)r
r)�srefs   r�visit_StructRefzCGenerator.visit_StructRef9s6���/�/����7���a�f�f�}�t�z�z�!�'�'�2�2�2r
c��|j|j�}|dz|j|j�zdzS)N�(�))r6r-r�args)r
r)�frefs   r�visit_FuncCallzCGenerator.visit_FuncCall=s7���/�/����7���c�z�D�J�J�q�v�v�.�.��4�4r
c��|jdk(rd|j|j�zS|j|j�}|jdk(rd|zS|jdk(rd|zS|j�|��S)N�sizeofz
sizeof(%s)zp++z%s++zp--z%s--)�opr�exprr6)r
r)�operands   r�
visit_UnaryOpzCGenerator.visit_UnaryOpAsw���4�4�8�� �$�*�*�Q�V�V�"4�4�4��6�6�q�v�v�>�G��t�t�u�}���'�'��������'�'�!"���w�/�/r
z||rz&&r�|��^��&�z==�z!=�>�z>=�<z<=z>>�z<<�+��-�*�	�/�%c�����j�j��fd��}�j�j��fd��}|�d�j�d|��S)Nc�����j|�xs]�jxrOt|tj�xr3�j
|j�j
�jk\Sr��_is_simple_noder	�
isinstancer�BinaryOp�precedence_maprG��dr)r
s ��r�<lambda>z+CGenerator.visit_BinaryOp.<locals>.<lambda>ksd���4�/�/��2�M��-�-�M�*�Q����2O�M��)�)�!�$�$�/�4�3F�3F�q�t�t�3L�L�Nr
c�����j|�xs]�jxrOt|tj�xr3�j
|j�j
�jkDSrr_rds ��rrfz+CGenerator.visit_BinaryOp.<locals>.<lambda>wsd���4�/�/��2�L��-�-�L�*�Q����2O�L��)�)�!�$�$�/�$�2E�2E�a�d�d�2K�K�Mr
r)�_parenthesize_if�left�rightrG)r
r)�lval_str�rval_strs``  r�visit_BinaryOpzCGenerator.visit_BinaryOp_sV����(�(�
�F�F�
N�O���(�(�
�G�G�
M�N��
&�q�t�t�X�6�6r
c��|j|jd��}|j|j��d|j�d|��S)Nc�6�t|tj�Sr)rar�
Assignment)r)s rrfz-CGenerator.visit_Assignment.<locals>.<lambda>s��j��E�4D�4D�&Er
r)rh�rvaluer�lvaluerG)r
r)rls   r�visit_AssignmentzCGenerator.visit_Assignment|s=���(�(��H�H�E�G��"�Z�Z����1�1�4�4��B�Br
c�8�dj|j�Sr)r$�namesr(s  r�visit_IdentifierTypezCGenerator.visit_IdentifierType�s���x�x���� � r
c��t|tj�rd|j|�zdzSt|tjtj
f�rd|j|�zdzS|j|�S)N�{�}r@rA)rar�InitListr�ExprList�Compoundr(s  r�_visit_exprzCGenerator._visit_expr�se���a����(�����A��&��,�,�
��E�N�N�E�N�N�;�
<�����A��&��,�,��:�:�a�=� r
c��|r|jn|j|�}|jr!|d|j|j�zz
}|jr!|d|j|j�zz
}|S)Nz : � = )r-�_generate_decl�bitsizer�initr})r
r)�no_type�ss    r�
visit_DeclzCGenerator.visit_Decl�sh���A�F�F�4�#6�#6�q�#9���9�9�a�5�4�:�:�a�i�i�#8�8�8�a��6�6�
���)�)�!�&�&�1�1�1�A��r
c�����j|jd�}t|j�dkDr-|ddj�fd�|jddD��zz
}|S)Nrr�, c3�D�K�|]}�j|d�����y�w)T)r�N)r��r �declr
s  �rr#z,CGenerator.visit_DeclList.<locals>.<genexpr>�s&�����"=�0;��#'�/�/�$��/�"E�0;�s� )r�decls�lenr$�r
r)r�s`  r�visit_DeclListzCGenerator.visit_DeclList�sa����J�J�q�w�w�q�z�"���q�w�w�<�!��
���	�	�"=�01������"=�=�=�
=�A��r
c��d}|jr!|dj|j�dzz
}||j|j�z
}|S)Nrr)�storager$�_generate_typer;r�s   r�
visit_TypedefzCGenerator.visit_Typedef�sG�����9�9�a�3�8�8�A�I�I�.��4�4�a�	�T�
 �
 ����
(�(���r
c��d|j|jd��zdz}|dz|j|j�zS)Nr@F��
emit_declnamerAr)r��to_typer6rHr�s   r�
visit_CastzCGenerator.visit_Cast�sC���$�%�%�a�i�i�u�%�E�E��K���3�w��9�9�!�&�&�A�A�Ar
c��g}|jD]"}|j|j|���$dj|�S�Nr���exprs�appendr}r$�r
r)�visited_subexprsrHs    r�visit_ExprListzCGenerator.visit_ExprList��?�����G�G�D��#�#�D�$4�$4�T�$:�;���y�y�)�*�*r
c��g}|jD]"}|j|j|���$dj|�Sr�r�r�s    r�visit_InitListzCGenerator.visit_InitList�r�r
c�(�|j|d��S)N�enumr,��_generate_struct_union_enumr(s  r�
visit_EnumzCGenerator.visit_Enum�s���/�/���/�?�?r
c�V�dj|j|j��S)Nz_Alignas({}))�formatr�	alignmentr(s  r�
visit_AlignaszCGenerator.visit_Alignas�s ���$�$�T�Z�Z����%<�=�=r
c��|js+dj|j�|j��Sdj|j�|j|j	|j���S)Nz{indent}{name},
)�indentr-z{indent}{name} = {value},
)r�r-r')r'r�rr-rr(s  r�visit_EnumeratorzCGenerator.visit_Enumerator�sq���w�w�&�-�-��(�(�*��V�V�.��
�
1�7�7��(�(�*��V�V��j�j����)�8��
r
c����j|j�}d�_�j|j�}|jr5dj�fd�|jD��}|dz|zdz|zdzS|dz|zdzS)Nr�;
c3�@�K�|]}�j|����y�wrr)r �pr
s  �rr#z+CGenerator.visit_FuncDef.<locals>.<genexpr>�s�����!G��A�$�*�*�Q�-�����
)rr�r�body�param_declsr$)r
r)r�r��knrdeclss`    r�
visit_FuncDefzCGenerator.visit_FuncDef�s�����z�z�!�&�&�!������z�z�!�&�&�!���=�=��z�z�!G����!G�G�H��$�;��)�E�1�D�8�4�?�?��$�;��%��,�,r
c��d}|jD]z}t|tj�r||j	|�z
}�2t|tj
�r||j	|�dzz
}�d||j	|�dzz
}�||S)Nrr�r�)�extrar�FuncDefr�Pragma)r
r)r�r�s    r�
visit_FileASTzCGenerator.visit_FileAST�sx�����5�5�C��#�u�}�}�-��T�Z�Z��_�$���C����.��T�Z�Z��_�t�+�+���T�Z�Z��_�u�,�,��
��r
c����j�dz}�xjdz
c_|jr'|dj�fd�|jD��z
}�xjdzc_|�j�dzz
}|S)N�{
rLrc3�@�K�|]}�j|����y�wr��_generate_stmt)r �stmtr
s  �rr#z,CGenerator.visit_Compound.<locals>.<genexpr>�s�����M�}�t��,�,�T�2�}�r�z}
)rr�block_itemsr$r�s`  r�visit_CompoundzCGenerator.visit_Compound�sy�������%�'�����Q����=�=�
����M�q�}�}�M�M�M�A����Q���	�T�
�
�
 �5�
(�(���r
c��d|j|j�zdz|j|j�zdzS)Nr@z){ry)rr;r�r(s  r�visit_CompoundLiteralz CGenerator.visit_CompoundLiteral�s6���T�Z�Z����'�'�$�.����A�F�F�1C�C�c�I�Ir
c��y)N�;�r(s  r�visit_EmptyStatementzCGenerator.visit_EmptyStatement�s��r
c�L��dj�fd�|jD��S)Nr�c3�@�K�|]}�j|����y�wrr)r �paramr
s  �rr#z-CGenerator.visit_ParamList.<locals>.<genexpr>�s�����A��u����E�*��r�)r$�paramsr(s` r�visit_ParamListzCGenerator.visit_ParamList�s����y�y�A����A�A�Ar
c�j�d}|jr!|d|j|j�zz
}|dzS)N�returnrr�)rHrr�s   r�visit_ReturnzCGenerator.visit_Return�s2�����6�6�1��d�j�j����0�0�0�1��3�w�r
c��y)Nzbreak;r�r(s  r�visit_BreakzCGenerator.visit_Break�s��r
c��y)Nz	continue;r�r(s  r�visit_ContinuezCGenerator.visit_Continue�s��r
c���d|j|j�zdz}|d|j|j�zdzz
}|d|j|j�zdzz
}|S)Nr@z) ? z) : rA)r}�cond�iftrue�iffalser�s   r�visit_TernaryOpzCGenerator.visit_TernaryOp�sk��
�4�#�#�A�F�F�+�
+�f�
4��	�S�4�#�#�A�H�H�-�
-��
6�6��	�S�4�#�#�A�I�I�.�
.��
4�4���r
c�,�d}|jr||j|j�z
}|dz
}||j|jd��z
}|jr6||j�dzz
}||j|jd��z
}|S)Nzif (�)
T��
add_indentzelse
)r�rr�r�r�rr�s   r�visit_IfzCGenerator.visit_Ifs������6�6�1��
�
�1�6�6�*�*�1�	�U�
��	�T�
 �
 ����d�
 �
;�;���9�9�
��"�"�$�x�/�/�A�
��$�$�Q�Y�Y�4�$�@�@�A��r
c�p�d}|jr||j|j�z
}|dz
}|jr!|d|j|j�zz
}|dz
}|jr!|d|j|j�zz
}|dz
}||j	|j
d��z
}|S)Nzfor (r�rr�Tr�)r�rr��nextr�r�r�s   r�	visit_ForzCGenerator.visit_For
s������6�6�1��
�
�1�6�6�*�*�1�	�S����6�6�1��d�j�j����0�0�0�1�	�S����6�6�1��d�j�j����0�0�0�1�	�U�
��	�T�
 �
 ����D�
 �
9�9���r
c��d}|jr||j|j�z
}|dz
}||j|jd��z
}|S)N�while (r�Tr�)r�rr�r�r�s   r�visit_WhilezCGenerator.visit_WhilesP�����6�6�1��
�
�1�6�6�*�*�1�	�U�
��	�T�
 �
 ����D�
 �
9�9���r
c���d}||j|jd��z
}||j�dzz
}|jr||j	|j�z
}|dz
}|S)Nzdo
Tr�r�z);)r�r�rr�rr�s   r�
visit_DoWhilezCGenerator.visit_DoWhilesh����	�T�
 �
 ����D�
 �
9�9��	�T�
�
�
 �9�
,�,���6�6�1��
�
�1�6�6�*�*�1�	�T�	���r
c��d}||j|j�z
}|jr#|dz
}||j|j�z
}|dz
}|S)Nz_Static_assert(�,rA)rr��messager�s   r�visit_StaticAssertzCGenerator.visit_StaticAssert$sS����	�T�Z�Z����
����9�9�
��H�A�
����A�I�I�&�&�A�	�S����r
c��d|j|j�zdz}||j|jd��z
}|S)Nzswitch (r�Tr�)rr�r�r�r�s   r�visit_SwitchzCGenerator.visit_Switch-sA������A�F�F�+�+�e�3��	�T�
 �
 ����D�
 �
9�9���r
c��d|j|j�zdz}|jD]}||j|d��z
}�|S)Nzcase �:
Tr�)rrH�stmtsr��r
r)r�r�s    r�
visit_CasezCGenerator.visit_Case2sK���d�j�j����(�(�5�0���G�G�D�
��$�$�T�d�$�;�;�A���r
c�X�d}|jD]}||j|d��z
}�|S)Nz	default:
Tr�)r�r�r�s    r�
visit_DefaultzCGenerator.visit_Default8s4�����G�G�D�
��$�$�T�d�$�;�;�A���r
c�X�|jdz|j|j�zS)Nr�)r-r�r�r(s  r�visit_LabelzCGenerator.visit_Label>s$���v�v��~�� 3� 3�A�F�F� ;�;�;r
c�&�d|jzdzS)Nzgoto r�r,r(s  r�
visit_GotozCGenerator.visit_GotoAs�������#�%�%r
c��y)Nz...r�r(s  r�visit_EllipsisParamzCGenerator.visit_EllipsisParamDs��r
c�&�|j|d�S)N�structr�r(s  r�visit_StructzCGenerator.visit_StructGs���/�/��8�<�<r
c�8�|j|j�Sr)r�r;r(s  r�visit_TypenamezCGenerator.visit_TypenameJs���"�"�1�6�6�*�*r
c�&�|j|d�S)N�unionr�r(s  r�visit_UnionzCGenerator.visit_UnionMs���/�/��7�;�;r
c��d}|jD]I}t|tj�r|d|jzz
}�0|d|j	|�zdzz
}�K|d|j|j�zz
}|S)Nr�.r4r5r)r-rar�IDrr}rH)r
r)r�r-s    r�visit_NamedInitializerz!CGenerator.visit_NamedInitializerPsw�����F�F�D��$����)��S�4�9�9�_�$���S�4�:�:�d�+�+�c�1�1��	�
	
�U�T�%�%�a�f�f�-�
-�-���r
c�$�|j|�Sr�r�r(s  r�visit_FuncDeclzCGenerator.visit_FuncDeclZs���"�"�1�%�%r
c�(�|j|d��S�NFr�r
r(s  r�visit_ArrayDeclzCGenerator.visit_ArrayDecl]����"�"�1�E�"�:�:r
c�(�|j|d��Sr
r
r(s  r�visit_TypeDeclzCGenerator.visit_TypeDecl`rr
c�(�|j|d��Sr
r
r(s  r�
visit_PtrDeclzCGenerator.visit_PtrDeclcrr
c��|dvr|j}|j}n7|dk(sJ�|j�dn|jj}|j}|dz|j
xsdz}|�h|dz
}||j
�z
}|xjdz
c_|dz
}|||�z
}|xjdzc_||j
�d	zz
}|S)
zq Generates code for structs, unions, and enums. name should be
            'struct', 'union', or 'enum'.
        )r�rr�Nrrr�rLr�ry)r��_generate_struct_union_body�values�enumerators�_generate_enum_bodyr-rr)r
r)r-�members�
body_functionr�s      rr�z&CGenerator._generate_struct_union_enumfs����&�&��g�g�G� �<�<�M��6�>�!�>��h�h�.�d�A�H�H�4H�4H�G� �4�4�M��3�J�!�&�&�,�B�'����
��I�A�
��"�"�$�$�A�����"��
��J�A�
��w�'�'�A�����"��
��"�"�$�s�*�*�A��r
c�8��dj�fd�|D��S)Nrc3�@�K�|]}�j|����y�wrr�r�s  �rr#z9CGenerator._generate_struct_union_body.<locals>.<genexpr>s�����E�W�T�t�*�*�4�0�W�r��r$�r
rs` rrz&CGenerator._generate_struct_union_body~s����w�w�E�W�E�E�Er
c�D��dj�fd�|D��dddzS)Nrc3�@�K�|]}�j|����y�wrr)r r'r
s  �rr#z1CGenerator._generate_enum_body.<locals>.<genexpr>�s�����>�g�U�t�z�z�%�(�g�r����r�rrs` rrzCGenerator._generate_enum_body�s$����w�w�>�g�>�>�s��C�d�J�Jr
c��t|�}|r|xjdz
c_|j�}|r|xjdzc_|tjtj
tjtjtjtjtjtjtjtjtjtjtj f
vr||j#|�zdzS|tj$fvr|j#|�S|tj&fvr||j#|�zS||j#|�zdzS)z� Generation from a statement node. This method exists as a wrapper
            for individual visit_* methods to handle different treatment of
            some statements in this context.
        rLr�r�)r;rrr�Declrp�Cast�UnaryOprb�	TernaryOp�FuncCall�ArrayRef�	StructRef�Constantr�Typedefr{rr|�If)r
r)r��typr�s     rr�zCGenerator._generate_stmt�s��
�1�g���t�(�(�A�-�(��"�"�$���t�(�(�A�-�(���
�
�E�,�,�e�j�j�%�-�-����������������������5�=�=����	 � ��D�J�J�q�M�)�E�1�1�
�U�^�^�%�
%�
�:�:�a�=� �
�U�X�X�K�
��D�J�J�q�M�)�)��D�J�J�q�M�)�D�0�0r
c�T�d}|jrdj|j�dz}|jr!|dj|j�dzz
}|jr$||j	|jd�dzz
}||j|j�z
}|S)z& Generation from a Decl node.
        rrr)�funcspecr$r��alignrr�r;r�s   rr�zCGenerator._generate_decl�s���
���:�:�3�8�8�A�J�J�/�#�5�q��9�9�a�3�8�8�A�I�I�.��4�4�a��7�7�A����A�G�G�A�J�/�#�5�5�A�	�T�
 �
 ����
(�(���r
Tc��t|�}|tjk(�r�d}|jr!|dj	|j�dzz
}||j|j�z
}|jr|r|jnd}t|�D�]d\}}t|tj�r�|dk7r(t||dz
tj�rd|zdz}|dz
}|jr!|dj	|j�dzz
}||j|j�dzz
}��t|tj�rS|dk7r(t||dz
tj�rd|zdz}|d|j|j�zdzz
}��t|tj�s��+|jr)d	dj	|j��|rd|znd��}��`d
|z}��g|r|d|zz
}|S|tjk(r|j!|j�S|tj"k(r|j%|j|��S|tj&k(rdj	|j(�dzS|tjtjtjfvr"|j%|j||gz|��S|j|�S)z� Recursive generation from a type node. n is the type node.
            modifiers collects the PtrDecl, ArrayDecl and FuncDecl modifiers
            encountered on the way down to a TypeDecl, to allow proper
            generation from it.
        rrrrr@rAr4r5z* rYr�)r;r�TypeDecl�qualsr$r�declname�	enumeratera�	ArrayDecl�PtrDecl�	dim_quals�dim�FuncDeclrBr#r��Typenamer��IdentifierTyperu)	r
r)�	modifiersr�r-r��nstr�i�modifiers	         rr�zCGenerator._generate_type�s����1�g���%�.�.� ��A��w�w��S�X�X�a�g�g�.��4�4��
����A�F�F�#�#�A�!"���
�1�:�:�2�D�
 )��3���8��h����8��Q��"�9�Q��U�#3�U�]�]�C�#&��:��#3�D��C�K�D��)�)������);�);� <�s� B�B���D�J�J�x�|�|�4�s�:�:�D���%�.�.�9��Q��"�9�Q��U�#3�U�]�]�C�#&��:��#3�D��C�$�*�*�X�]�]�";�;�c�A�A�D���%�-�-�8��~�~�+.�8�8�H�N�N�+C�9=�3��:�2�+E� G�� #�T�z��' 4�(�Q�#��*�_�Q��H�
�E�J�J�
��&�&�q�v�v�.�.�
�E�N�N�
"��&�&�q�v�v�}�&�M�M�
�E�(�(�
(��8�8�A�G�G�$�s�*�*�
�U�_�_�e�m�m�U�^�^�D�
D��&�&�q�v�v�y�A�3��7D�'�F�
F��:�:�a�=� r
c�H�|j|�}||�rd|zdzS|S)z� Visits 'n' and returns its string representation, parenthesized
            if the condition function applied to the node returns True.
        r@rA)r})r
r)�	conditionr�s    rrhzCGenerator._parenthesize_if�s.��
���Q����Q�<���7�S�=� ��Hr
c�.���j|�fd��S)z. Common use case for _parenthesize_if
        c�(���j|�Sr)r`)rer
s �rrfz8CGenerator._parenthesize_unless_simple.<locals>.<lambda>�s���d�6J�6J�1�6M�2Mr
)rhr(s` rr6z&CGenerator._parenthesize_unless_simple�s����$�$�Q�(M�N�Nr
c��t|tjtjtjtj
tjf�S)z~ Returns True for nodes that are "simple" - i.e. nodes that always
            have higher precedence than operators.
        )rarr*rr(r)r'r(s  rr`zCGenerator._is_simple_node�s9���!�e�n�n�e�h�h����#�o�o�u�~�~�?�@�	@r
N)F)Cr�
__module__�__qualname__�__doc__rrrrr*r.r2r9r>rDrJrcrmrsrvr}r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrrrr�rrr�r�r�rhr6r`r�r
rrrs.���	5�'�?�K����<�3�5�0�
�	
�a�
�	
�a�	
�
	�Q�
�	�Q�

�	�Q�
�	
�a�
��q�
�	�Q�
��a�
��a�
�"&�q�
�	
�a�
��q�
�	�Q�
��Q�
�	�Q�
��Q�
��Q�
�N�7�:C�!�!����B�+�+�@�>��-�	��J��B��
����	�����
��<�&��=�+�<��&�;�;�;��0F�K�1�<�+-�d�3!�j�O�
@r
rN)rr�objectrr�r
r�<module>rJs���j@��j@r
PK�t�\�hV�FGFG#__pycache__/c_lexer.cpython-312.pycnu�[����

=Ui@E��:�ddlZddlmZddlmZGd�de�Zy)�N�)�lex)�TOKENc��eZdZdZd�Zd�Zd�Zd�Zd�Zd�Z	d�Z
d	�Zd
ZdZ
iZeD]Zeeej!�<�e
D],Zeeedd
j#�ed
dj!�z<�.ee
zdzZdZdZdZdZdZdZdezdzezdzZdezZeezezZeezezZdZdZdZdZ dZ!dZ"dZ#d e zd!ze!zd!ze"zd"zZ$d#Z%d$e$zdzZ&d%e&zd%zZ'd&e'zZ(d'e'zZ)d(e'zZ*d)e'zZ+d%e&zd*zZ,d+e&zd,ze&zd-zZ-d+e&zd.ze#zd/zZ.d0e%zdzZ/d1e/zd2zZ0d&e0zZ1d'e0zZ2d(e0zZ3d)e0zZ4d1e/zd3ze#ze/zd2zZ5d4Z6d5Z7d6e7zdze6zd7ze6zd8zZ8d9Z9d:ezd;zezd<zezd=zZ:d>ezd>zezd!ze:zdze9zd?zZ;d@Z<dA�Z=e>e0�dB��Z?e>e�dC��Z@dD�ZAdE�ZBdFZCdG�ZDdH�ZEdI�ZFdFZGdJ�ZHdK�ZIdFZJdL�ZKdMZLdNZMdOZNdPZOdQZPdRZQdSZRdTZSdUZTdVZUdWZVdXZWdYZXdZZYd[ZZd\Z[d]Z\d^Z]d_Z^d`Z_daZ`dbZadcZbddZcdeZddfZedgZfdhZgdiZhdjZidkZjdlZkdmZldnZmdoZndpZodqZpdrZqdsZrdtZsduZtdvZudwZvdxZwe>dy�dz��Zxe>d{�d|��Zye0Zze>e8�d}��Z{e>e;�d~��Z|e>e�d��Z}e>e�d���Z~e>e�d���Ze>e�d���Z�e>e�d���Z�e>e�d���Z�e>e�d���Z�e>e,�d���Z�e>e'�d���Z�e>e(�d���Z�e>e)�d���Z�e>e*�d���Z�e>e+�d���Z�e>e-�d���Z�e>e.�d���Z�e>e1�d���Z�e>e2�d���Z�e>e3�d���Z�e>e4�d���Z�e>e5�d���Z�e>e�d���Z�d��Z�y)��CLexera A lexer for the C language. After building it, set the
        input text with input(), and call token() to get new
        tokens.

        The public attribute filename can be set to an initial
        filename, but the lexer will update it upon #line
        directives.
    c��||_||_||_||_d|_d|_t
jd�|_t
jd�|_	y)ab Create a new Lexer.

            error_func:
                An error function. Will be called with an error
                message, line and column as arguments, in case of
                an error during lexing.

            on_lbrace_func, on_rbrace_func:
                Called when an LBRACE or RBRACE is encountered
                (likely to push/pop type_lookup_func's scope)

            type_lookup_func:
                A type lookup function. Given a string, it must
                return True IFF this string is a name of a type
                that was defined with a typedef earlier.
        �Nz([ \t]*line\W)|([ \t]*\d+)z[ \t]*pragma\W)
�
error_func�on_lbrace_func�on_rbrace_func�type_lookup_func�filename�
last_token�re�compile�line_pattern�pragma_pattern)�selfr
rrr
s     �B/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/c_lexer.py�__init__zCLexer.__init__sY��$%���,���,��� 0�����
����
�J�J�'D�E��� �j�j�):�;���c�<�tjdd|i|��|_y)z� Builds the lexer from the specification. Must be
            called after the lexer object is created.

            This method exists separately, because the PLY
            manual warns against calling lex.lex inside
            __init__
        �objectN�)r�lexer)r�kwargss  r�buildzCLexer.build9s���W�W�3�D�3�F�3��
rc�&�d|j_y)z? Resets the internal line number counter of the lexer.
        rN)r�lineno�rs r�reset_linenozCLexer.reset_linenoCs����
�
�rc�:�|jj|�y�N)r�input)r�texts  rr$zCLexer.inputHs���
�
����rc�X�|jj�|_|jSr#)r�tokenrr s rr'zCLexer.tokenKs ���*�*�*�*�,������rc��|jjjdd|j�}|j|z
S)z3 Find the column of the token in its line.
        �
r)r�lexdata�rfind�lexpos)rr'�last_crs   r�find_tok_columnzCLexer.find_tok_columnOs5���*�*�$�$�*�*�4��E�L�L�A���|�|�g�%�%rc��|j|�}|j||d|d�|jjd�y)Nrr)�_make_tok_locationr
r�skip)r�msgr'�locations    r�_errorz
CLexer._errorZs:���*�*�5�1������X�a�[�(�1�+�6��
�
����rc�<�|j|j|�fSr#)rr.)rr's  rr0zCLexer._make_tok_location_s�����d�2�2�5�9�:�:r)$�AUTO�BREAK�CASE�CHAR�CONST�CONTINUE�DEFAULT�DO�DOUBLE�ELSE�ENUM�EXTERN�FLOAT�FOR�GOTO�IF�INLINE�INT�LONG�REGISTER�OFFSETOF�RESTRICT�RETURN�SHORT�SIGNED�SIZEOF�STATIC�STRUCT�SWITCH�TYPEDEF�UNION�UNSIGNED�VOID�VOLATILE�WHILE�__INT128)	�_BOOL�_COMPLEX�	_NORETURN�
_THREAD_LOCAL�_STATIC_ASSERT�_ATOMIC�_ALIGNOF�_ALIGNAS�_PRAGMAN�)D�ID�TYPEID�
INT_CONST_DEC�
INT_CONST_OCT�
INT_CONST_HEX�
INT_CONST_BIN�INT_CONST_CHAR�FLOAT_CONST�HEX_FLOAT_CONST�
CHAR_CONST�WCHAR_CONST�U8CHAR_CONST�
U16CHAR_CONST�
U32CHAR_CONST�STRING_LITERAL�WSTRING_LITERAL�U8STRING_LITERAL�U16STRING_LITERAL�U32STRING_LITERAL�PLUS�MINUS�TIMES�DIVIDE�MOD�OR�AND�NOT�XOR�LSHIFT�RSHIFT�LOR�LAND�LNOT�LT�LE�GT�GE�EQ�NE�EQUALS�
TIMESEQUAL�DIVEQUAL�MODEQUAL�	PLUSEQUAL�
MINUSEQUAL�LSHIFTEQUAL�RSHIFTEQUAL�ANDEQUAL�XOREQUAL�OREQUAL�PLUSPLUS�
MINUSMINUS�ARROW�CONDOP�LPAREN�RPAREN�LBRACKET�RBRACKET�LBRACE�RBRACE�COMMA�PERIOD�SEMI�COLON�ELLIPSIS�PPHASH�PPPRAGMA�PPPRAGMASTRz[a-zA-Z_$][0-9a-zA-Z_$]*z0[xX]z[0-9a-fA-F]+z0[bB]z[01]+zD(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?z(0z)|([1-9][0-9]*�)z0[0-7]*z0[0-7]*[89]z\/\*z\/\/z,([a-wyzA-Z._~!=&\^\-\\?'"]|x(?![0-9a-fA-F]))z(\d+)(?!\d)z(x[0-9a-fA-F]+)(?![0-9a-fA-F])z#([\\][^a-zA-Z._~^!=&\^\-\\?'"x0-9])z(\\(�|z))z(\\[0-9a-zA-Z._~!=&\^\-\\?'"])z
([^'\\\n]|�'�L�u8�u�Uz{2,4}'z('z*\n)|('z*$)z[^'
]+')|('')|('z	[^'\n]*')z
([^"\\\n]|�"z*"�*z([eE][-+]?[0-9]+)z([0-9]*\.[0-9]+)|([0-9]+\.)z((((z
?)|([0-9]+z
))[FfLl]?)z([pP][+-]?[0-9]+)z(((z)?\.z)|(z\.))�(z[FfLl]?)))�ppline�	exclusive)�pppragmar�c��|jj|jj|jj��r*|jjd�dx|_|_y|jj|jj|jj��r|jjd�yd|_	|S)z[ \t]*\#)�posr�Nr�r�)
r�matchrr*r,�begin�pp_line�pp_filenamer�type�r�ts  r�t_PPHASHzCLexer.t_PPHASH&s������"�"�1�7�7�?�?������"�G�
�G�G�M�M�(�#�.2�2�D�L�4�+�
�
 �
 �
&�
&�q�w�w���A�G�G�N�N�
&�
K�
�G�G�M�M�*�%��A�F��Hrc��|j�|jd|�y|jjd�j	d�|_y)Nz$filename before line number in #liner�)r�r4�value�lstrip�rstripr�r�s  r�t_ppline_FILENAMEzCLexer.t_ppline_FILENAME4s;���<�<���K�K�>��B� �w�w�~�~�c�2�9�9�#�>�D�rc�@�|j�|j|_yyr#)r�r�r�s  r�t_ppline_LINE_NUMBERzCLexer.t_ppline_LINE_NUMBER;s���<�<���7�7�D�L�
rc��|j�|jd|�nAt|j�|j_|j
�|j
|_|jjd�y)�\nNzline number missing in #line�INITIAL)r�r4�intrrr�rr�r�s  r�t_ppline_NEWLINEzCLexer.t_ppline_NEWLINEDsY���<�<���K�K�6��:� #�D�L�L� 1�D�J�J�����+� $� 0� 0��
�	���
�
�i� rc��y)�lineNrr�s  r�t_ppline_PPLINEzCLexer.t_ppline_PPLINEPs��rz 	c�(�|jd|�y)Nzinvalid #line directive�r4r�s  r�t_ppline_errorzCLexer.t_ppline_errorVs�����-�q�1rc�x�|jxjdz
c_|jjd�y)r�rr�N)rrr�r�s  r�t_pppragma_NEWLINEzCLexer.t_pppragma_NEWLINE\s$��	�����!���	���
�
�i� rc��|S)�pragmarr�s  r�t_pppragma_PPPRAGMAzCLexer.t_pppragma_PPPRAGMAa����rc��d|_|S)z.+r�)r�r�s  r�t_pppragma_STRzCLexer.t_pppragma_STRgs������rc�(�|jd|�y)Nzinvalid #pragma directiver�r�s  r�t_pppragma_errorzCLexer.t_pppragma_errorls�����/��3rc�t�|jxj|jjd�z
c_y)z\n+r)N)rrr��countr�s  r�	t_NEWLINEzCLexer.t_NEWLINEus!��	�����!�'�'�-�-��-�-�rz\+�-z\*�/�%z\|�&�~z\^z<<z>>z\|\|z&&�!�<�>z<=z>=z==z!=�=z\*=z/=z%=z\+=z-=z<<=z>>=z&=z\|=z\^=z\+\+z--z->z\?z\(z\)z\[z\]�,z\.�;�:z\.\.\.z\{c�&�|j�|Sr#)rr�s  r�t_LBRACEzCLexer.t_LBRACE���������rz\}c�&�|j�|Sr#)rr�s  r�t_RBRACEzCLexer.t_RBRACE�r�rc��|Sr#rr�s  r�
t_FLOAT_CONSTzCLexer.t_FLOAT_CONST�r�rc��|Sr#rr�s  r�t_HEX_FLOAT_CONSTzCLexer.t_HEX_FLOAT_CONST�r�rc��|Sr#rr�s  r�t_INT_CONST_HEXzCLexer.t_INT_CONST_HEX�r�rc��|Sr#rr�s  r�t_INT_CONST_BINzCLexer.t_INT_CONST_BIN�r�rc�,�d}|j||�y)NzInvalid octal constantr��rr�r2s   r�t_BAD_CONST_OCTzCLexer.t_BAD_CONST_OCT�s��&�����C��rc�,�d}|j||�y�NzKComments are not supported, see https://github.com/eliben/pycparser#3using.r�r�s   r�t_UNSUPPORTED_C_STYLE_COMMENTz$CLexer.t_UNSUPPORTED_C_STYLE_COMMENT����[�����C��rc�,�d}|j||�yr�r�r�s   r�t_UNSUPPORTED_CXX_STYLE_COMMENTz&CLexer.t_UNSUPPORTED_CXX_STYLE_COMMENT�r�rc��|Sr#rr�s  r�t_INT_CONST_OCTzCLexer.t_INT_CONST_OCT�r�rc��|Sr#rr�s  r�t_INT_CONST_DECzCLexer.t_INT_CONST_DEC�r�rc��|Sr#rr�s  r�t_INT_CONST_CHARzCLexer.t_INT_CONST_CHAR�r�rc��|Sr#rr�s  r�t_CHAR_CONSTzCLexer.t_CHAR_CONST�r�rc��|Sr#rr�s  r�
t_WCHAR_CONSTzCLexer.t_WCHAR_CONST�r�rc��|Sr#rr�s  r�t_U8CHAR_CONSTzCLexer.t_U8CHAR_CONSTr�rc��|Sr#rr�s  r�t_U16CHAR_CONSTzCLexer.t_U16CHAR_CONSTr�rc��|Sr#rr�s  r�t_U32CHAR_CONSTzCLexer.t_U32CHAR_CONSTr�rc�,�d}|j||�y)NzUnmatched 'r�r�s   r�t_UNMATCHED_QUOTEzCLexer.t_UNMATCHED_QUOTEs�������C��rc�F�d|jz}|j||�y)NzInvalid char constant %s)r�r4r�s   r�t_BAD_CHAR_CONSTzCLexer.t_BAD_CHAR_CONSTs��(�1�7�7�2�����C��rc��|Sr#rr�s  r�t_WSTRING_LITERALzCLexer.t_WSTRING_LITERALr�rc��|Sr#rr�s  r�t_U8STRING_LITERALzCLexer.t_U8STRING_LITERALr�rc��|Sr#rr�s  r�t_U16STRING_LITERALzCLexer.t_U16STRING_LITERAL!r�rc��|Sr#rr�s  r�t_U32STRING_LITERALzCLexer.t_U32STRING_LITERAL%r�rc�,�d}|j||�y)Nz#String contains invalid escape coder�r�s   r�t_BAD_STRING_LITERALzCLexer.t_BAD_STRING_LITERAL+s��3�����C��rc��|jj|jd�|_|jdk(r"|j	|j�rd|_|S)Nrdre)�keyword_map�getr�r�r
r�s  r�t_IDzCLexer.t_ID0sH���!�!�%�%�a�g�g�t�4����6�6�T�>�d�3�3�A�G�G�<��A�F��rc�^�dt|jd�z}|j||�y)NzIllegal character %sr)�reprr�r4r�s   r�t_errorzCLexer.t_error7s'��$�t�A�G�G�A�J�'7�7�����C��r)��__name__�
__module__�__qualname__�__doc__rrr!r$r'r.r4r0�keywords�keywords_newr�keyword�lower�upper�tokens�
identifier�
hex_prefix�
hex_digits�
bin_prefix�
bin_digits�integer_suffix_opt�decimal_constant�octal_constant�hex_constant�bin_constant�bad_octal_constant�unsupported_c_style_comment�unsupported_cxx_style_comment�
simple_escape�decimal_escape�
hex_escape�
bad_escape�escape_sequence�escape_sequence_start_in_string�cconst_char�
char_const�wchar_const�u8char_const�
u16char_const�
u32char_const�multicharacter_constant�unmatched_quote�bad_char_const�string_char�string_literal�wstring_literal�u8string_literal�u16string_literal�u32string_literal�bad_string_literal�
exponent_part�fractional_constant�floating_constant�binary_exponent_part�hex_fractional_constant�hex_floating_constant�statesr�rr�r�r�r��t_ppline_ignorer�r�r��t_pppragma_ignorer�r��t_ignorer��t_PLUS�t_MINUS�t_TIMES�t_DIVIDE�t_MOD�t_OR�t_AND�t_NOT�t_XOR�t_LSHIFT�t_RSHIFT�t_LOR�t_LAND�t_LNOT�t_LT�t_GT�t_LE�t_GE�t_EQ�t_NE�t_EQUALS�t_TIMESEQUAL�
t_DIVEQUAL�
t_MODEQUAL�t_PLUSEQUAL�t_MINUSEQUAL�
t_LSHIFTEQUAL�
t_RSHIFTEQUAL�
t_ANDEQUAL�	t_OREQUAL�
t_XOREQUAL�
t_PLUSPLUS�t_MINUSMINUS�t_ARROW�t_CONDOP�t_LPAREN�t_RPAREN�
t_LBRACKET�
t_RBRACKET�t_COMMA�t_PERIOD�t_SEMI�t_COLON�
t_ELLIPSISr�r��t_STRING_LITERALr�r�r�r�r�r�r�rrrrr	rr
rrrrrrrrr!r$rrrrrs����<�B4��
��&��
;��H�
�L��K���'.��G�M�M�O�$�� ��AH��G�B�Q�K�%�%�'�'�!�"�+�*;�*;�*=�=�>� ���
$�;(�;�F�F-�J��J��J��J��J�a���.�.�/?�?�@R�R�SV�V���1�1�N��j�(�);�;�L��j�(�);�;�L�&��#*��$+�!�8H�M�'�N�6�J�;�J�!�-�/��3�N�B�3�F�z�Q�RV�V�O�
'L�#�#�O�3�C�7�K��[���$�J��j�.�K��
�?�L��
�N�M��
�N�M�!�+�o�h�6���;�&�z�1�+�=�e�C�O��{�*�+B�B�:�M�N^�^�N�$�$C�C�C�G�K���_�T�)�N��.�(�O��N�*���N�*���N�*���[���,�Z�7��C�D�H��-�M�<���2�2�3�6�}�D�\�Q�R_�_�`l�l��3��#�J�.�{�:�:�E�e�K�J�V�Wb�b���
�N�3�.�z�9�#�=�>U�U�VY�Y�Zn�n�oy�y��
�F�	��>��?��?�������
!�
��O�2�!�
����
4��H�.�
 �F��G��G��H��E��D��E��E��E��H��H�!�E��F��F��D��D��D��D��D��D��H� �L��J��J� �K��L� �M� �M��J� �I� �J�"�J��L� �G� �H� �H��H��J��J��G��H��F��G�#�J��5�\�����5�\����&��������� �!��"���<������<������������&�'��(���(�)��*���>������������"�#��$���:������;������<������=������=������?������>������?�����������������������
�������:�����rr)r�plyr�ply.lexrrrrrr�<module>r�s��
���j�V�jrPK�t�\c�-�YY$__pycache__/c_parser.cpython-312.pycnu�[����

=Ui�&��p�ddlmZddlmZddlmZddlmZmZm	Z	m
Z
ddlmZm
Z
e
Gd�de��Zy)	�)�yacc)�c_ast)�CLexer)�	PLYParser�
ParseError�
parameterized�template)�fix_switch_cases�fix_atomic_specifiersc��eZdZdedddddfd�Zd�d�Zd�Zd	�Zd
�Zd�Z	d�Z
d
�Zd�Zd�Z
d�Zd�Zd�Zd�Zd�d�Zd�d�Zd�Zd�ZdZd�Zd�Zd�Zd�Zd�Zd�Zd�Zd �Zd!�Zd"�Z d#�Z!d$�Z"d%�Z#d&�Z$d'�Z%d(�Z&d)�Z'd*�Z(d+�Z)d,�Z*d-�Z+d.�Z,d/�Z-d0�Z.d1�Z/d2�Z0d3�Z1d4�Z2d5�Z3d6�Z4d7�Z5d8�Z6d9�Z7d:�Z8d;�Z9d<�Z:d=�Z;d>�Z<d?�Z=d@�Z>dA�Z?dB�Z@dC�ZAdD�ZBdE�ZCdF�ZDdG�ZEdH�ZFdI�ZGdJ�ZHdK�ZIdL�ZJdM�ZKdN�ZLdO�ZMdP�ZNdQ�ZOdR�ZPdS�ZQdT�ZRdU�ZSdV�ZTdW�ZUdX�ZVdY�ZWeXdZd[d\�d]��ZYeXdZd[d\�d^��ZZeXdZd[d\�d_��Z[eXdZd[�d`��Z\eXdZd[d\�da��Z]eXdZd[d\�db��Z^eXdZd[d\�dc��Z_eXdZd[d\�dd��Z`de�Zadf�Zbdg�Zcdh�Zddi�Zedj�Zfdk�Zgdl�Zhdm�Zidn�Zjdo�Zkdp�Zldq�Zmdr�Znds�Zodt�Zpdu�Zqdv�Zrdw�Zsdx�Ztdy�Zudz�Zvd{�Zwd|�Zxd}�Zyd~�Zzd�Z{d��Z|d��Z}d��Z~d��Zd��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�d��Z�y�)��CParserTzpycparser.lextabzpycparser.yacctabF�c��||j|j|j|j��|_|jj|||��|jj|_gd�}|D]}	|j|	��tj|d||||��|_	t�g|_d|_y)a Create a new CParser.

            Some arguments for controlling the debug/optimization
            level of the parser are provided. The defaults are
            tuned for release/performance mode.
            The simple rules for using them are:
            *) When tweaking CParser/CLexer, set these to False
            *) When releasing a stable parser, set to True

            lex_optimize:
                Set to False when you're modifying the lexer.
                Otherwise, changes in the lexer won't be used, if
                some lextab.py file exists.
                When releasing with a stable lexer, set to True
                to save the re-generation of the lexer table on
                each run.

            lexer:
                Set this parameter to define the lexer to use if
                you're not using the default CLexer.

            lextab:
                Points to the lex table that's used for optimized
                mode. Only if you're modifying the lexer and want
                some tests to avoid re-generating the table, make
                this point to a local lex table file (that's been
                earlier generated with lex_optimize=True)

            yacc_optimize:
                Set to False when you're modifying the parser.
                Otherwise, changes in the parser won't be used, if
                some parsetab.py file exists.
                When releasing with a stable parser, set to True
                to save the re-generation of the parser table on
                each run.

            yacctab:
                Points to the yacc table that's used for optimized
                mode. Only if you're modifying the parser, make
                this point to a local yacc table file

            yacc_debug:
                Generate a parser.out file that explains how yacc
                built the parsing table from the grammar.

            taboutputdir:
                Set this parameter to control the location of generated
                lextab and yacctab files.
        )�
error_func�on_lbrace_func�on_rbrace_func�type_lookup_func)�optimize�lextab�	outputdir)�abstract_declarator�assignment_expression�declaration_list�declaration_specifiers_no_type�designation�
expression�identifier_list�init_declarator_list�id_init_declarator_list�initializer_list�parameter_type_list�block_item_list�type_qualifier_list�struct_declarator_list�translation_unit_or_empty)�module�start�debugr�	tabmodulerN)
�_lex_error_func�_lex_on_lbrace_func�_lex_on_rbrace_func�_lex_type_lookup_func�clex�build�tokens�_create_opt_ruler�cparser�dict�_scope_stack�_last_yielded_token)
�self�lex_optimize�lexerr�
yacc_optimize�yacctab�
yacc_debug�taboutputdir�rules_with_opt�rules
          �C/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/c_parser.py�__init__zCParser.__init__s���t��+�+��3�3��3�3�!�7�7�	9��	�	
�	�	���!��"�	�	$��i�i�&�&���
��"#�D��!�!�$�'�#��y�y��-��"��"�
$��� "�V�H���$(�� �c���||j_|jj�t�g|_d|_|jj||j|��S)a  Parses C code and returns an AST.

            text:
                A string containing the C source code

            filename:
                Name of the file being parsed (for meaningful
                error messages)

            debug:
                Debug flag to YACC
        N)�inputr8r()r.�filename�reset_linenor3r4r5r2�parse)r6�textrDr(s    r?rFz
CParser.parse�s]��&��	�	���	�	��� �!�V�H���#'�� ��|�|�!�!���i�i��"��	rAc�J�|jjt��y�N)r4�appendr3�r6s r?�_push_scopezCParser._push_scope�s����� � ���(rAc�l�t|j�dkDsJ�|jj�y)Nr)�lenr4�poprKs r?�
_pop_scopezCParser._pop_scope�s-���4�$�$�%��)�)�)������rAc��|jdj|d�s|jd|z|�d|jd|<y)zC Add a new typedef name (ie a TYPEID) to the current scope
        ���Tz;Typedef %r previously declared as non-typedef in this scopeN�r4�get�_parse_error�r6�name�coords   r?�_add_typedef_namezCParser._add_typedef_name�sT��� � ��$�(�(��t�4���� �"&�'�(-�
/�'+����"��d�#rAc��|jdj|d�r|jd|z|�d|jd|<y)ze Add a new object, function, or enum member name (ie an ID) to the
            current scope
        rRFz;Non-typedef %r previously declared as typedef in this scopeNrSrVs   r?�_add_identifierzCParser._add_identifier�sT�����R� �$�$�T�5�1���� �"&�'�(-�
/�',����"��d�#rAc�f�t|j�D]}|j|�}|��|cSy)z8 Is *name* a typedef-name in the current scope?
        F)�reversedr4rT)r6rW�scope�in_scopes    r?�_is_type_in_scopezCParser._is_type_in_scope�s7���d�/�/�0�E��y�y���H��#�H�_�	1�
rAc�H�|j||j||��yrI)rU�_coord)r6�msg�line�columns    r?r*zCParser._lex_error_func�s�����#�t�{�{�4��8�9rAc�$�|j�yrI)rLrKs r?r+zCParser._lex_on_lbrace_func�s�����rAc�$�|j�yrI)rPrKs r?r,zCParser._lex_on_rbrace_func�s�����rAc�(�|j|�}|S)z� Looks up types that were previously defined with
            typedef.
            Passed to the lexer for recognizing identifiers that
            are types.
        )r`)r6rW�is_types   r?r-zCParser._lex_type_lookup_func�s���(�(��.���rAc�.�|jjS)z� We need access to yacc's lookahead token in certain cases.
            This is the last token yacc requested from the lexer, so we
            ask the lexer.
        )r.�
last_tokenrKs r?�_get_yacc_lookahead_tokenz!CParser._get_yacc_lookahead_token�s��
�y�y�#�#�#rAc�|�|}|}|jr|j}|jr�t|tj�r	||_|S|}t|jtj�s1|j}t|jtj�s�1|j|_||_|S)z� Tacks a type modifier on a declarator, and returns
            the modified declarator.

            Note: the declarator and modifier may be modified
        )�type�
isinstancer�TypeDecl)r6�decl�modifier�
modifier_head�
modifier_tail�	decl_tails      r?�_type_modify_declzCParser._type_modify_decl�s���!�
� �
�� � �)�.�.�M�� � ��d�E�N�N�+�!%�M���O�
�I� �������@�%�N�N�	�!�������@�"+���M��*�I�N��KrAc��|}t|tj�s'|j}t|tj�s�'|j|_|jdd|_|D]R}t|tj�r�t|�dkDr|jd|j��I||_|cS|sit|jtj�s|jd|j�tjdg|j��|_|Stj|D��cgc]}|jD]}|���c}}|dj��|_|Scc}}w)z- Fixes a declaration. Modifies decl.
        Nrz Invalid multiple types specifiedzMissing type in declaration�int�rX�)
rorrprn�declnamerW�quals�IdentifierTyperNrUrX�FuncDecl�names)r6rq�typenamern�tn�idrWs       r?�_fix_decl_name_typezCParser._fix_decl_name_type+s;��
���T�5�>�>�2��9�9�D��T�5�>�>�2��M�M��	��Z�Z��]��
��B��b�%�"6�"6�7��x�=�1�$��%�%�:�B�H�H�F�!#�D�I��K����d�i�i����8��!�!�5�t�z�z�C��,�,��G��*�*�&�D�I����,�,� (�>��"�R�X�X�T��X���>��q�k�'�'�)�D�I����?s�?E7
c��|xstggggg��}|r||j|�|S||jd|�|S)a� Declaration specifiers are represented by a dictionary
            with the entries:
            * qual: a list of type qualifiers
            * storage: a list of storage type qualifiers
            * type: a list of type specifiers
            * function: a list of function specifiers
            * alignment: a list of alignment specifiers

            This method is given a declaration specifier, and a
            new specifier of a given kind.
            If `append` is True, the new specifier is added to the end of
            the specifiers list, otherwise it's added at the beginning.
            Returns the declaration specifier, with the new
            specifier incorporated.
        )�qual�storagern�function�	alignmentrz)r3rJ�insert)r6�declspec�newspec�kindrJ�specs      r?�_add_declaration_specifierz"CParser._add_declaration_specifierWsS�� �X�4�R��"�r�UW�X�����J���g�&���
��J���a��)��rAc
�n�d|dv}g}|djd���n�|dd��t|d�dksBt|dd	j�d
k7s$|j|dd	jd�s8d}|dD]}t	|d�s�|j
}n|j
d
|�tj|dd	jddd|d|dd	j
��|dd<|dd	=n�t|ddtjtjtjtjf�su|dd}t|tj�s'|j}t|tj�s�'|j� |dd	jd|_|dd	=|D�]l}	|	d�J�|r1tj d|d|d|	d|	dj
��}
nXtj"d|d|d|d|d|	d|	jd�|	jd�|	dj
��	}
t|
jtjtjtjtjf�r|
}n|j%|
|d�}|rO|r'|j'|j(|j
�n&|j+|j(|j
�t-|�}|j/|���o|S)z� Builds a list of declarations all sharing the given specifiers.
            If typedef_namespace is true, each declared name is added
            to the "typedef namespace", which also includes objects,
            functions, and enum constants.
        �typedefr�rz�bitsizeNrqrn�rRr�?rXzInvalid declarationr��r{rnr|�alignrXr�)rWr|r�rnrXr��init�	rWr|r�r��funcspecrnr�r�rX)rTrNrr`�hasattrrXrUrrpro�Enum�Struct�Unionr}rnr{�Typedef�Declr�rYrWr[rrJ)r6r��decls�typedef_namespace�
is_typedef�declarationsrX�t�decls_0_tailrq�declaration�
fixed_decls            r?�_build_declarationszCParser._build_declarationsps%���$�y�/�1�
�����8�<�<�	�"�.���1�X�f�
�
%��4��<� �1�$��D��L��,<�,B�,B�(C�q�(H��.�.�t�F�|�B�/?�/E�/E�a�/H�I����f��A��q�'�*� !�����&��!�!�"7��?� %�~�~��f��b�)�/�/��2����;�'��6�l�2�&�,�,� .�E�!�H�V���V��R� ��E�!�H�V�,��
�
�E�L�L�%�+�+�u�7K�7K�/M�N� ��8�F�+�L� ��u�~�~�>�+�0�0��!��u�~�~�>��$�$�,�(,�V��R�(8�(>�(>�q�(A��%���L��$��D���<�+�+�+��#�m�m���v�,� ��O��f���v�,�,�,�.��$�j�j���v�,��{�+� ��O�!�*�-��f�����&�)� �H�H�Y�/��v�,�,�,�	.���+�*�*��J�J����e�k�k��(�(�-*�+�)�
�!�5�5�k�4��<�P�
�!���*�*�:�?�?�J�<L�<L�M��(�(����*�:J�:J�K�.�z�:�J����
�+�K�N�rAc���d|dvr|jd|j�|j|t|d��gd��d}t	j
||||j�	�S)
z' Builds a function definition.
        r�r�zInvalid typedefN�rqr�T�r�r�r�rz)rq�param_decls�bodyrX)rUrXr�r3r�FuncDef)r6r�rqr�r�r�s      r?�_build_function_definitionz"CParser._build_function_definition�sz����Y��'����/����<��.�.���T��-�.�"�/�$�%&�'��
�}�}��#���*�*�	�	rAc�L�|dk(rtjStjS)z` Given a token (either STRUCT or UNION), selects the
            appropriate AST class.
        �struct)rr�r�)r6�tokens  r?�_select_struct_union_classz"CParser._select_struct_union_class�s ���H���<�<���;�;�rA)
)�left�LOR)r��LAND)r��OR)r��XOR)r��AND)r��EQ�NE)r��GT�GE�LT�LE)r��RSHIFT�LSHIFT)r��PLUS�MINUS)r��TIMES�DIVIDE�MODc�v�|d�tjg�|d<ytj|d�|d<y)zh translation_unit_or_empty   : translation_unit
                                        | empty
        rNrz)r�FileAST�r6�ps  r?�p_translation_unit_or_emptyz#CParser.p_translation_unit_or_empty�s5��
�Q�4�<��=�=��$�A�a�D��=�=��1��&�A�a�DrAc��|d|d<y)z4 translation_unit    : external_declaration
        rrzN�r�s  r?�p_translation_unit_1zCParser.p_translation_unit_1�����t��!�rAc�B�|dj|d�|d|d<y)zE translation_unit    : translation_unit external_declaration
        rr�rzN)�extendr�s  r?�p_translation_unit_2zCParser.p_translation_unit_2s%��	
�!����A�a�D����t��!�rAc��|dg|d<y)z7 external_declaration    : function_definition
        rrzNr�r�s  r?�p_external_declaration_1z CParser.p_external_declaration_1����!��v��!�rAc��|d|d<y)z/ external_declaration    : declaration
        rrzNr�r�s  r?�p_external_declaration_2z CParser.p_external_declaration_2�����t��!�rAc��|dg|d<y)zi external_declaration    : pp_directive
                                    | pppragma_directive
        rrzNr�r�s  r?�p_external_declaration_3z CParser.p_external_declaration_3s���!��v��!�rAc��g|d<y)z( external_declaration    : SEMI
        rzNr�r�s  r?�p_external_declaration_4z CParser.p_external_declaration_4%s
����!�rAc��|d|d<y)z1 external_declaration    : static_assert
        rrzNr�r�s  r?�p_external_declaration_5z CParser.p_external_declaration_5*r�rAc���t|�dk(r/tj|dd|j|d��g|d<ytj|d|d|j|d��g|d<y)z� static_assert           : _STATIC_ASSERT LPAREN constant_expression COMMA unified_string_literal RPAREN
                                    | _STATIC_ASSERT LPAREN constant_expression RPAREN
        ��Nrrz)rNr�StaticAssert�_token_coordr�s  r?�p_static_assert_declarationz#CParser.p_static_assert_declaration/sk���q�6�Q�;��&�&�q��t�T�4�3D�3D�Q��3J�K�L�A�a�D��&�&�q��t�Q�q�T�4�3D�3D�Q��3J�K�L�A�a�DrAc�H�|jd|j|d��y)z  pp_directive  : PPHASH
        zDirectives not supported yetrN)rUr�r�s  r?�p_pp_directivezCParser.p_pp_directive8s%��	
���8��+�+�A�q�1�	3rAc�B�t|�dk(r-tj|d|j|d��|d<yt|�dk(r-tj|d|j|d��|d<ytjd|j|d��|d<y)z� pppragma_directive      : PPPRAGMA
                                    | PPPRAGMA PPPRAGMASTR
                                    | _PRAGMA LPAREN unified_string_literal RPAREN
        r�r�r�rzrrN)rNr�Pragmar�r�s  r?�p_pppragma_directivezCParser.p_pppragma_directiveCs���
�q�6�Q�;��<�<��!��d�&7�&7��1�&=�>�A�a�D�
��V�q�[��<�<��!��d�&7�&7��1�&=�>�A�a�D��<�<��D�$5�$5�a��$;�<�A�a�DrAc�R�t|�dk(r
|dg|d<y|d|dgz|d<y)z� pppragma_directive_list : pppragma_directive
                                    | pppragma_directive_list pppragma_directive
        r�rrzN�rNr�s  r?�p_pppragma_directive_listz!CParser.p_pppragma_directive_listO�3���Q��1���!��v��!��!�A�$�!�A�$��-��!�rAc��tgggtjdg|j|d���gg��}|j	||d|d|d��|d<y	)
zU function_definition : id_declarator declaration_list_opt compound_statement
        rxrry�r�r�r�rnr�r�r��r�rqr�r�rzN)r3rr}r�r��r6r�r�s   r?�p_function_definition_1zCParser.p_function_definition_1Wsv�������&�&��w�-1�->�->�q�!�-D�F�G��
���.�.���1���!���1��	/���!�rAc�P�|d}|j||d|d|d��|d<y)zl function_definition : declaration_specifiers id_declarator declaration_list_opt compound_statement
        rr�r��r�rzN)r�r�s   r?�p_function_definition_2zCParser.p_function_definition_2is>����t���.�.���1���!���1��	/���!�rAc��|d|d<y)a_ statement   : labeled_statement
                        | expression_statement
                        | compound_statement
                        | selection_statement
                        | iteration_statement
                        | jump_statement
                        | pppragma_directive
                        | static_assert
        rrzNr�r�s  r?�p_statementzCParser.p_statementxs����t��!�rAc��t|�dk(r5tj|d|dgz|j|d���|d<y|d|d<y)z} pragmacomp_or_statement     : pppragma_directive_list statement
                                        | statement
        r�rr���block_itemsrXrzN)rNr�Compoundr�r�s  r?�p_pragmacomp_or_statementz!CParser.p_pragmacomp_or_statement�sQ���q�6�Q�;��>�>��a�D�!�A�$��K��'�'��1�-�/�A�a�D��Q�4�A�a�DrAc��|d}|d��|d}tjtjtjf}t	|�dk(rKt|d|�r<tjd|d|d|d|d	|ddd|dj�
�	g}n8|j|tdd��gd�
�}n|j||dd�
�}||d<y)z� decl_body : declaration_specifiers init_declarator_list_opt
                      | declaration_specifiers_no_type id_init_declarator_list_opt
        rr�Nrnrzr�r�r�r�r�r�Tr�)
rr�r�r�rNror�rXr�r3)r6r�r��ty�s_u_or_er�s      r?�p_decl_bodyzCParser.p_decl_body�s�����t��
�Q�4�<�
�f��B����e�k�k�5�:�:�>�H��2�w�!�|�
�2�a�5�(� ;������v�,��{�+� ��O�!�*�-��A��� ��Q�%�+�+�	'�	(��"�0�0���T��5�6�&*�1�,���,�,����d�"&�-�(�E�
��!�rAc��|d|d<y)z& declaration : decl_body SEMI
        rrzNr�r�s  r?�
p_declarationzCParser.p_declarationr�rAc�N�t|�dk(r	|d|d<y|d|dz|d<y)zj declaration_list    : declaration
                                | declaration_list declaration
        r�rrzNr�r�s  r?�p_declaration_listzCParser.p_declaration_list	s/���1�v��{�q��t��!���!��q��t���!�rAc�<�|j|d|dd�|d<y)z] declaration_specifiers_no_type  : type_qualifier declaration_specifiers_no_type_opt
        r�rr�rzN�r�r�s  r?�"p_declaration_specifiers_no_type_1z*CParser.p_declaration_specifiers_no_type_1�$���.�.�q��t�Q�q�T�6�B��!�rAc�<�|j|d|dd�|d<y)zf declaration_specifiers_no_type  : storage_class_specifier declaration_specifiers_no_type_opt
        r�rr�rzNrr�s  r?�"p_declaration_specifiers_no_type_2z*CParser.p_declaration_specifiers_no_type_2s$���.�.�q��t�Q�q�T�9�E��!�rAc�<�|j|d|dd�|d<y)za declaration_specifiers_no_type  : function_specifier declaration_specifiers_no_type_opt
        r�rr�rzNrr�s  r?�"p_declaration_specifiers_no_type_3z*CParser.p_declaration_specifiers_no_type_3s$���.�.�q��t�Q�q�T�:�F��!�rAc�<�|j|d|dd�|d<y)z_ declaration_specifiers_no_type  : atomic_specifier declaration_specifiers_no_type_opt
        r�rrnrzNrr�s  r?�"p_declaration_specifiers_no_type_4z*CParser.p_declaration_specifiers_no_type_4%rrAc�<�|j|d|dd�|d<y)zb declaration_specifiers_no_type  : alignment_specifier declaration_specifiers_no_type_opt
        r�rr�rzNrr�s  r?�"p_declaration_specifiers_no_type_5z*CParser.p_declaration_specifiers_no_type_5*�$���.�.�q��t�Q�q�T�;�G��!�rAc�@�|j|d|ddd��|d<y)zI declaration_specifiers  : declaration_specifiers type_qualifier
        rr�r�T�rJrzNrr�s  r?�p_declaration_specifiers_1z"CParser.p_declaration_specifiers_1/�)���.�.�q��t�Q�q�T�6�$�.�O��!�rAc�@�|j|d|ddd��|d<y)zR declaration_specifiers  : declaration_specifiers storage_class_specifier
        rr�r�TrrzNrr�s  r?�p_declaration_specifiers_2z"CParser.p_declaration_specifiers_24s)���.�.�q��t�Q�q�T�9�T�.�R��!�rAc�@�|j|d|ddd��|d<y)zM declaration_specifiers  : declaration_specifiers function_specifier
        rr�r�TrrzNrr�s  r?�p_declaration_specifiers_3z"CParser.p_declaration_specifiers_39s)���.�.�q��t�Q�q�T�:�d�.�S��!�rAc�@�|j|d|ddd��|d<y)zS declaration_specifiers  : declaration_specifiers type_specifier_no_typeid
        rr�rnTrrzNrr�s  r?�p_declaration_specifiers_4z"CParser.p_declaration_specifiers_4>rrAc�6�|jd|dd�|d<y)z2 declaration_specifiers  : type_specifier
        Nrrnrzrr�s  r?�p_declaration_specifiers_5z"CParser.p_declaration_specifiers_5C� ���.�.�t�Q�q�T�6�B��!�rAc�@�|j|d|ddd��|d<y)zQ declaration_specifiers  : declaration_specifiers_no_type type_specifier
        rr�rnTrrzNrr�s  r?�p_declaration_specifiers_6z"CParser.p_declaration_specifiers_6HrrAc�@�|j|d|ddd��|d<y)zN declaration_specifiers  : declaration_specifiers alignment_specifier
        rr�r�TrrzNrr�s  r?�p_declaration_specifiers_7z"CParser.p_declaration_specifiers_7Ms)���.�.�q��t�Q�q�T�;�t�.�T��!�rAc��|d|d<y)a storage_class_specifier : AUTO
                                    | REGISTER
                                    | STATIC
                                    | EXTERN
                                    | TYPEDEF
                                    | _THREAD_LOCAL
        rrzNr�r�s  r?�p_storage_class_specifierz!CParser.p_storage_class_specifierR�����t��!�rAc��|d|d<y)zR function_specifier  : INLINE
                                | _NORETURN
        rrzNr�r�s  r?�p_function_specifierzCParser.p_function_specifier\r�rAc�`�tj|dg|j|d���|d<y)a+ type_specifier_no_typeid  : VOID
                                      | _BOOL
                                      | CHAR
                                      | SHORT
                                      | INT
                                      | LONG
                                      | FLOAT
                                      | DOUBLE
                                      | _COMPLEX
                                      | SIGNED
                                      | UNSIGNED
                                      | __INT128
        rryrzN�rr}r�r�s  r?�p_type_specifier_no_typeidz"CParser.p_type_specifier_no_typeidbs-���#�#�Q�q�T�F�$�2C�2C�A�q�2I�J��!�rAc��|d|d<y)z� type_specifier  : typedef_name
                            | enum_specifier
                            | struct_or_union_specifier
                            | type_specifier_no_typeid
                            | atomic_specifier
        rrzNr�r�s  r?�p_type_specifierzCParser.p_type_specifierrs����t��!�rAc�N�|d}|jjd�||d<y)z= atomic_specifier  : _ATOMIC LPAREN type_name RPAREN
        r��_AtomicrzN)r|rJ)r6r��typs   r?�p_atomic_specifierzCParser.p_atomic_specifier|s(����d���	�	����#���!�rAc��|d|d<y)z� type_qualifier  : CONST
                            | RESTRICT
                            | VOLATILE
                            | _ATOMIC
        rrzNr�r�s  r?�p_type_qualifierzCParser.p_type_qualifier�s����t��!�rAc�R�t|�dk(r|d|dgz|d<y|dg|d<y)z� init_declarator_list    : init_declarator
                                    | init_declarator_list COMMA init_declarator
        r�rr�rzNr�r�s  r?�p_init_declarator_listzCParser.p_init_declarator_list��3��!$�A��!��q��t�q��t�f�}��!��!�A�$���!�rAc�P�t|dt|�dkDr|dnd��|d<y)zb init_declarator : declarator
                            | declarator EQUALS initializer
        rr�r�Nr�rz�r3rNr�s  r?�p_init_declaratorzCParser.p_init_declarator��(����1��S��V�a�Z�Q�q�T�T�C��!�rAc�R�t|�dk(r|d|dgz|d<y|dg|d<y)z� id_init_declarator_list    : id_init_declarator
                                       | id_init_declarator_list COMMA init_declarator
        r�rr�rzNr�r�s  r?�p_id_init_declarator_listz!CParser.p_id_init_declarator_list�r4rAc�P�t|dt|�dkDr|dnd��|d<y)zn id_init_declarator : id_declarator
                               | id_declarator EQUALS initializer
        rr�r�Nr�rzr6r�s  r?�p_id_init_declaratorzCParser.p_id_init_declarator�r8rAc�@�|j|d|ddd��|d<y)zY specifier_qualifier_list    : specifier_qualifier_list type_specifier_no_typeid
        rr�rnTrrzNrr�s  r?�p_specifier_qualifier_list_1z$CParser.p_specifier_qualifier_list_1�rrAc�@�|j|d|ddd��|d<y)zO specifier_qualifier_list    : specifier_qualifier_list type_qualifier
        rr�r�TrrzNrr�s  r?�p_specifier_qualifier_list_2z$CParser.p_specifier_qualifier_list_2�rrAc�6�|jd|dd�|d<y)z4 specifier_qualifier_list  : type_specifier
        Nrrnrzrr�s  r?�p_specifier_qualifier_list_3z$CParser.p_specifier_qualifier_list_3�rrAc�8�t|dgg|dgg��|d<y)zH specifier_qualifier_list  : type_qualifier_list type_specifier
        rr�r�rzN�r3r�s  r?�p_specifier_qualifier_list_4z$CParser.p_specifier_qualifier_list_4�s$����1���R�q��t�f�r�R��!�rAc�2�tg|dgggg��|d<y)z9 specifier_qualifier_list  : alignment_specifier
        rr�rzNrDr�s  r?�p_specifier_qualifier_list_5z$CParser.p_specifier_qualifier_list_5�s �����!��v�r��R�P��!�rAc�<�|j|d|dd�|d<y)zR specifier_qualifier_list  : specifier_qualifier_list alignment_specifier
        rr�r�rzNrr�s  r?�p_specifier_qualifier_list_6z$CParser.p_specifier_qualifier_list_6�rrAc�n�|j|d�}||dd|j|d���|d<y)z{ struct_or_union_specifier   : struct_or_union ID
                                        | struct_or_union TYPEID
        rr�N�rWr�rXrz)r�r��r6r��klasss   r?�p_struct_or_union_specifier_1z%CParser.p_struct_or_union_specifier_1�s@���/�/��!��5����1����#�#�A�q�)�+��!�rAc���|j|d�}t|�dk(r|dg|j|d���|d<y|d|d|j|d���|d<y)z� struct_or_union_specifier : struct_or_union brace_open struct_declaration_list brace_close
                                      | struct_or_union brace_open brace_close
        rr�Nr�rKrzr��r�rNr�rLs   r?�p_struct_or_union_specifier_2z%CParser.p_struct_or_union_specifier_2�sq���/�/��!��5���q�6�Q�;�����'�'��1�-�/�A�a�D�
����d��'�'��1�-�/�A�a�DrAc���|j|d�}t|�dk(r"||dg|j|d���|d<y||d|d|j|d���|d<y)a� struct_or_union_specifier   : struct_or_union ID brace_open struct_declaration_list brace_close
                                        | struct_or_union ID brace_open brace_close
                                        | struct_or_union TYPEID brace_open struct_declaration_list brace_close
                                        | struct_or_union TYPEID brace_open brace_close
        rr�r�rKrzr�NrPrLs   r?�p_struct_or_union_specifier_3z%CParser.p_struct_or_union_specifier_3�sy���/�/��!��5���q�6�Q�;���q�T���'�'��1�-�/�A�a�D�
��q�T���d��'�'��1�-�/�A�a�DrAc��|d|d<y)zF struct_or_union : STRUCT
                            | UNION
        rrzNr�r�s  r?�p_struct_or_unionzCParser.p_struct_or_union�r�rAc�^�t|�dk(r
|dxsg|d<y|d|dxsgz|d<y)z� struct_declaration_list     : struct_declaration
                                        | struct_declaration_list struct_declaration
        r�rrzNr�r�s  r?�p_struct_declaration_listz!CParser.p_struct_declaration_lists:���q�6�Q�;��Q�4�:�2�A�a�D��Q�4�1�Q�4�:�2�&�A�a�DrAc�t�|d}d|dvsJ�|d�|j||d��}n�t|d�dk(rY|dd}t|tj�r|}ntj
|�}|j|t
|�	�g��}n|j|t
dd�
�g��}||d<y)zW struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI
        rr�r�r�N�r�r�rnrz�rqr�)r�rNror�Noder}r3)r6r�r�r��node�	decl_types      r?�p_struct_declaration_1zCParser.p_struct_declaration_1
s�����t����Y��/�/�/��Q�4���,�,����d�-��E���f��
�!�
#���<��?�D��$��
�
�+� �	�!�0�0��6�	��,�,����+�,�-�.�E��,�,����D�1�2�-�4�E���!�rAc��d|d<y)z# struct_declaration : SEMI
        Nrzr�r�s  r?�p_struct_declaration_2zCParser.p_struct_declaration_20s
����!�rAc��|dg|d<y)z1 struct_declaration : pppragma_directive
        rrzNr�r�s  r?�p_struct_declaration_3zCParser.p_struct_declaration_35r�rAc�R�t|�dk(r|d|dgz|d<y|dg|d<y)z� struct_declarator_list  : struct_declarator
                                    | struct_declarator_list COMMA struct_declarator
        r�rr�rzNr�r�s  r?�p_struct_declarator_listz CParser.p_struct_declarator_list:r4rAc��|ddd�|d<y)z( struct_declarator : declarator
        rN�rqr�rzr�r�s  r?�p_struct_declarator_1zCParser.p_struct_declarator_1Cs���!���.��!�rAc��t|�dkDr|d|dd�|d<ytjdddd�|dd�|d<y)z� struct_declarator   : declarator COLON constant_expression
                                | COLON constant_expression
        r�rrfrzNr�)rNrrpr�s  r?�p_struct_declarator_2zCParser.p_struct_declarator_2HsG���q�6�A�:��a�D�Q�q�T�2�A�a�D�!�N�N�4��t�T�B�q�QR�t�T�A�a�DrAc�^�tj|dd|j|d��|d<y)zM enum_specifier  : ENUM ID
                            | ENUM TYPEID
        r�Nrrz�rr�r�r�s  r?�p_enum_specifier_1zCParser.p_enum_specifier_1Qs+���z�z�!�A�$��d�&7�&7��1�&=�>��!�rAc�^�tjd|d|j|d��|d<y)zG enum_specifier  : ENUM brace_open enumerator_list brace_close
        Nr�rrzrkr�s  r?�p_enum_specifier_2zCParser.p_enum_specifier_2Ws+���z�z�$��!��d�&7�&7��1�&=�>��!�rAc�d�tj|d|d|j|d��|d<y)z� enum_specifier  : ENUM ID brace_open enumerator_list brace_close
                            | ENUM TYPEID brace_open enumerator_list brace_close
        r�r�rrzNrkr�s  r?�p_enum_specifier_3zCParser.p_enum_specifier_3\s/���z�z�!�A�$��!��d�&7�&7��1�&=�>��!�rAc��t|�dk(r+tj|dg|dj�|d<yt|�dk(r	|d|d<y|djj|d�|d|d<y)z� enumerator_list : enumerator
                            | enumerator_list COMMA
                            | enumerator_list COMMA enumerator
        r�rrzr�N)rNr�EnumeratorListrX�enumeratorsrJr�s  r?�p_enumerator_listzCParser.p_enumerator_listbst��
�q�6�Q�;��'�'��1����!��
�
�;�A�a�D�
��V�q�[��Q�4�A�a�D�
�a�D���#�#�A�a�D�)��Q�4�A�a�DrAc�\�tj|d|j|d��|d<y)z� alignment_specifier  : _ALIGNAS LPAREN type_name RPAREN
                                 | _ALIGNAS LPAREN constant_expression RPAREN
        r�rrzN)r�Alignasr�r�s  r?�p_alignment_specifierzCParser.p_alignment_specifieros)���}�}�Q�q�T�4�#4�#4�Q��#:�;��!�rAc�&�t|�dk(r+tj|dd|j|d��}n-tj|d|d|j|d��}|j	|j
|j�||d<y)zR enumerator  : ID
                        | ID EQUALS constant_expression
        r�rNr�rz)rNr�
Enumeratorr�r[rWrX)r6r��
enumerators   r?�p_enumeratorzCParser.p_enumeratorus����q�6�Q�;��)�)��!��d��)�)�!�Q�/�1�J��)�)��!��a��d��)�)�!�Q�/�1�J�	
���Z�_�_�j�.>�.>�?���!�rAc��|d|d<y)zQ declarator  : id_declarator
                        | typeid_declarator
        rrzNr�r�s  r?�p_declaratorzCParser.p_declarator�r�rA)r��ID)�typeid�TYPEID)�typeid_noparenr�c��|d|d<y)z1 xxx_declarator  : direct_xxx_declarator
        rrzNr�r�s  r?�p_xxx_declarator_1zCParser.p_xxx_declarator_1�r�rAc�:�|j|d|d�|d<y)z9 xxx_declarator  : pointer direct_xxx_declarator
        r�rrzN�rvr�s  r?�p_xxx_declarator_2zCParser.p_xxx_declarator_2�s"���%�%�a��d�A�a�D�1��!�rAc
�d�tj|dddd|j|d���|d<y)z' direct_xxx_declarator   : yyy
        rNr�rz)rrpr�r�s  r?�p_direct_xxx_declarator_1z!CParser.p_direct_xxx_declarator_1�s6���~�~��q�T�����#�#�A�q�)�+��!�rAc��|d|d<y)z@ direct_xxx_declarator   : LPAREN xxx_declarator RPAREN
        r�rzNr�r�s  r?�p_direct_xxx_declarator_2z!CParser.p_direct_xxx_declarator_2�r�rAc���t|�dkDr|dngxsg}tjdt|�dkDr|dn|d||dj��}|j	|d|��|d<y)	z} direct_xxx_declarator   : direct_xxx_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        r�r�Nr�r�rn�dim�	dim_qualsrX�rqrrrz)rNr�	ArrayDeclrXrv)r6r�r|�arrs    r?�p_direct_xxx_declarator_3z!CParser.p_direct_xxx_declarator_3�su���Q��!���1���2����o�o���A���
��!���!����A�$�*�*�	���%�%�1�Q�4�#�%�>��!�rAc�&�|d|dfD�cgc]}t|t�r|n|g��}}|D��cgc]
}|D]}|�|���}}}tjd|d||dj��}|j|d|��|d<ycc}wcc}}w)	z� direct_xxx_declarator   : direct_xxx_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET
                                    | direct_xxx_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET
        r�r�Nr�rr�r�rz)ro�listrr�rXrv)r6r��item�listed_quals�sublistr�r�r�s        r?�p_direct_xxx_declarator_4z!CParser.p_direct_xxx_declarator_4�s����1��a��d��%�#��!+�4�� 6��T�F�B�#�	�%�)5�!��g�'�$����'�T��	�!��o�o���!����A�$�*�*�	���%�%�1�Q�4�#�%�>��!���%��!s
�B�B
c
���tjdtj|d|j|d��|d�|dng|dj��}|j|d|��|d<y)zi direct_xxx_declarator   : direct_xxx_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET
        Nr�r�rr�r�rz�rr�r~r�rXrv�r6r�r�s   r?�p_direct_xxx_declarator_5z!CParser.p_direct_xxx_declarator_5�sp���o�o������1��t�0�0��A�6�7���d�.�a��d�B��A�$�*�*�	���%�%�1�Q�4�#�%�>��!�rAc��tj|dd|dj��}|j�jdk(ri|j
�]|j
jD]D}t|tj�rn(|j|j|j��F|j|d|��|d<y)z� direct_xxx_declarator   : direct_xxx_declarator LPAREN parameter_type_list RPAREN
                                    | direct_xxx_declarator LPAREN identifier_list_opt RPAREN
        r�Nr��argsrnrX�LBRACEr�rz)rr~rXrlrnr��paramsro�
EllipsisParamr[rWrv)r6r��func�params    r?�p_direct_xxx_declarator_6z!CParser.p_direct_xxx_declarator_6�s���
�~�~��1����A�$�*�*��� �)�)�+�0�0�H�<��y�y�$�!�Y�Y�-�-�E�!�%��)<�)<�=�u��(�(����U�[�[�A�.��%�%�1�Q�4�$�%�?��!�rAc��|j|d�}tj|dxsgd|��}t|�dkDr:|d}|j�|j}|j��||_|d|d<y||d<y)zm pointer : TIMES type_qualifier_list_opt
                    | TIMES type_qualifier_list_opt pointer
        rr�N)r|rnrXr�rz)r�r�PtrDeclrNrn)r6r�rX�nested_type�	tail_types     r?�	p_pointerzCParser.p_pointer�s����!�!�!�Q�'�� �m�m�!�A�$�*�"�4�u�M���q�6�A�:��!��I��.�.�,�%�N�N�	��.�.�,�(�I�N��Q�4�A�a�D��A�a�DrAc�R�t|�dk(r
|dg|d<y|d|dgz|d<y)zs type_qualifier_list : type_qualifier
                                | type_qualifier_list type_qualifier
        r�rrzNr�r�s  r?�p_type_qualifier_listzCParser.p_type_qualifier_listr�rAc��t|�dkDrA|djjtj|j|d���|d|d<y)zn parameter_type_list : parameter_list
                                | parameter_list COMMA ELLIPSIS
        r�rr�rzN)rNr�rJrr�r�r�s  r?�p_parameter_type_listzCParser.p_parameter_type_listsJ���q�6�A�:�
�a�D�K�K���u�2�2�4�3D�3D�Q��3J�K�L���t��!�rAc���t|�dk(r+tj|dg|dj�|d<y|djj|d�|d|d<y)zz parameter_list  : parameter_declaration
                            | parameter_list COMMA parameter_declaration
        r�rrzr�N�rNr�	ParamListrXr�rJr�s  r?�p_parameter_listzCParser.p_parameter_list#�X���q�6�Q�;��?�?�A�a�D�6�1�Q�4�:�:�6�A�a�D�
�a�D�K�K���q��t�$��Q�4�A�a�DrAc��|d}|ds,tjdg|j|d���g|d<|j|t	|d��g��d|d<y	)
z� parameter_declaration   : declaration_specifiers id_declarator
                                    | declaration_specifiers typeid_noparen_declarator
        rrnrxryr�rZrYrzN)rr}r�r�r3r�s   r?�p_parameter_declaration_1z!CParser.p_parameter_declaration_17ss����t���F�|�!�0�0�%���'�'��1�-�/�0�D��L��'�'���Q�q�T�?�#�(�%�%&�(��!�rAc�.�|d}|ds,tjdg|j|d���g|d<t|d�dkDrht|ddj�dk(rJ|j|ddjd�r&|j
|t|dd�	�g�
�d}natjd|dd|dxstjdddd�|j|d��
�}|d}|j||�}||d<y)zR parameter_declaration   : declaration_specifiers abstract_declarator_opt
        rrnrxryrRrzr�Nr�rYrr��rWr|r�rnrX)rr}r�rNrr`r�r3�Typenamerpr�)r6r�r�rqr�s     r?�p_parameter_declaration_2z!CParser.p_parameter_declaration_2Cs0����t���F�|�!�0�0�%���'�'��1�-�/�0�D��L��t�F�|��q� �S��f��b�)9�)?�)?�%@�A�%E��&�&�t�F�|�B�'7�'=�'=�a�'@�A��+�+���Q�q�T��5�6�,�8�89�;�D��>�>���6�l���q�T�C�U�^�^�D�$��d�C��'�'��1�-�/�D��F�|�H��+�+�D�(�;�D���!�rAc���t|�dk(r+tj|dg|dj�|d<y|djj|d�|d|d<y)ze identifier_list : identifier
                            | identifier_list COMMA identifier
        r�rrzr�Nr�r�s  r?�p_identifier_listzCParser.p_identifier_listcr�rAc��|d|d<y)z- initializer : assignment_expression
        rrzNr�r�s  r?�p_initializer_1zCParser.p_initializer_1mr�rAc�r�|d�*tjg|j|d��|d<y|d|d<y)z� initializer : brace_open initializer_list_opt brace_close
                        | brace_open initializer_list COMMA brace_close
        r�Nrrz)r�InitListr�r�s  r?�p_initializer_2zCParser.p_initializer_2rs;��
�Q�4�<��>�>�"�d�&7�&7��1�&=�>�A�a�D��Q�4�A�a�DrAc�T�t|�dk(rN|d�|dntj|d|d�}tj|g|dj�|d<y|d�|dntj|d|d�}|dj
j
|�|d|d<y)z� initializer_list    : designation_opt initializer
                                | initializer_list COMMA designation_opt initializer
        r�rNr�rzr�)rNr�NamedInitializerr�rX�exprsrJ)r6r�r�s   r?�p_initializer_listzCParser.p_initializer_list{s����q�6�Q�;��Q�4�<�1�Q�4�U�-C�-C�A�a�D�!�A�$�-O�D��>�>�4�&�!�A�$�*�*�5�A�a�D��Q�4�<�1�Q�4�U�-C�-C�A�a�D�!�A�$�-O�D�
�a�D�J�J���d�#��Q�4�A�a�DrAc��|d|d<y)z. designation : designator_list EQUALS
        rrzNr�r�s  r?�
p_designationzCParser.p_designation�r�rAc�R�t|�dk(r
|dg|d<y|d|dgz|d<y)z_ designator_list : designator
                            | designator_list designator
        r�rrzNr�r�s  r?�p_designator_listzCParser.p_designator_list�r�rAc��|d|d<y)zi designator  : LBRACKET constant_expression RBRACKET
                        | PERIOD identifier
        r�rzNr�r�s  r?�p_designatorzCParser.p_designator�r�rAc���tjd|ddddd|dxstjdddd�|j|d���}|j	||dd�|d<y)	zH type_name   : specifier_qualifier_list abstract_declarator_opt
        rrr�Nr�r�rnrz)rr�rpr�r�)r6r�r�s   r?�p_type_namezCParser.p_type_name�sr���>�>���A�$�v�,�q�/���1��?�����d�D�$�?��#�#�A�q�)�+���'�'��!�A�$�v�,�?��!�rAc�f�tjdddd�}|j||d��|d<y)z+ abstract_declarator     : pointer
        Nrr�rz)rrprv)r6r��	dummytypes   r?�p_abstract_declarator_1zCParser.p_abstract_declarator_1�s;���N�N�4��t�T�:�	��%�%���q�T�&���!�rAc�:�|j|d|d�|d<y)zF abstract_declarator     : pointer direct_abstract_declarator
        r�rrzNr�r�s  r?�p_abstract_declarator_2zCParser.p_abstract_declarator_2�s"���%�%�a��d�A�a�D�1��!�rAc��|d|d<y)z> abstract_declarator     : direct_abstract_declarator
        rrzNr�r�s  r?�p_abstract_declarator_3zCParser.p_abstract_declarator_3�r�rAc��|d|d<y)zA direct_abstract_declarator  : LPAREN abstract_declarator RPAREN r�rzNr�r�s  r?�p_direct_abstract_declarator_1z&CParser.p_direct_abstract_declarator_1������t��!�rAc��tjd|dg|dj��}|j|d|��|d<y)zn direct_abstract_declarator  : direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET
        Nr�rr�r�rz)rr�rXrvr�s   r?�p_direct_abstract_declarator_2z&CParser.p_direct_abstract_declarator_2�sI���o�o���!����A�$�*�*�	���%�%�1�Q�4�#�%�>��!�rAc	���t|�dkDr|dngxsg}tjtjdddd�t|�dkDr|dn|d||j	|d���|d<y)zk direct_abstract_declarator  : LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
        r�r�Nr�rr�rz)rNrr�rpr�)r6r�r|s   r?�p_direct_abstract_declarator_3z&CParser.p_direct_abstract_declarator_3�sl���Q��!���1���2����������d�D�$�7��A���
��!���!����#�#�A�q�)�	+��!�rAc
���tjdtj|d|j|d��g|dj��}|j|d|��|d<y)zZ direct_abstract_declarator  : direct_abstract_declarator LBRACKET TIMES RBRACKET
        Nr�rr�r�rzr�r�s   r?�p_direct_abstract_declarator_4z&CParser.p_direct_abstract_declarator_4�sa���o�o������1��t�0�0��A�6�7���A�$�*�*�	���%�%�1�Q�4�#�%�>��!�rAc
���tjtjdddd�tj|d|j	|d��g|j	|d���|d<y)z? direct_abstract_declarator  : LBRACKET TIMES RBRACKET
        Nr�rr�rz)rr�rpr~r�r�s  r?�p_direct_abstract_declarator_5z&CParser.p_direct_abstract_declarator_5�sZ���������d�D�$�7�����1��t�0�0��A�6�7���#�#�A�q�)�	+��!�rAc��tj|dd|dj��}|j|d|��|d<y)zh direct_abstract_declarator  : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN
        r�Nrr�r�rz)rr~rXrv)r6r�r�s   r?�p_direct_abstract_declarator_6z&CParser.p_direct_abstract_declarator_6�sF���~�~��1����A�$�*�*���
�%�%�1�Q�4�$�%�?��!�rAc	��tj|dtjdddd�|j|d���|d<y)zM direct_abstract_declarator  : LPAREN parameter_type_list_opt RPAREN
        r�Nrr�rz)rr~rpr�r�s  r?�p_direct_abstract_declarator_7z&CParser.p_direct_abstract_declarator_7�s?���~�~��1������d�D�$�7��#�#�A�q�)�+��!�rAc	�,�|d|dfD�cgc]}t|t�r|n|g��}}|D��cgc]
}|D]}|�|���}}}tjtjdddd�|d||j|d���|d<ycc}wcc}}w)z� direct_abstract_declarator  : LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET
                                         | LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET
        r�r�Nr�rr�rz)ror�rr�rpr�)r6r�r�r�r�r�r|s       r?�p_direct_abstract_declarator_8z&CParser.p_direct_abstract_declarator_8�s���
�1��a��d��%�#��!+�4�� 6��T�F�B�#�	�%�%1�!�\�'�g�d����g��\��!��������d�D�$�7��!����#�#�A�q�)�	+��!���	%��!s
�B�Bc�N�t|dt�r	|d|d<y|dg|d<y)zG block_item  : declaration
                        | statement
        rrzN)ror�r�s  r?�p_block_itemzCParser.p_block_items,��"�!�A�$��-�q��t��!��A�a�D�6��!�rAc�`�t|�dk(s	|ddgk(r	|d|d<y|d|dz|d<y)z_ block_item_list : block_item
                            | block_item_list block_item
        r�Nrrzr�r�s  r?�p_block_item_listzCParser.p_block_item_lists;��
�A��!��q��t��v�~�q��t��!��A�a�D�1�Q�4�K��!�rAc�^�tj|d|j|d���|d<y)zA compound_statement : brace_open block_item_list_opt brace_close r�rr�rzN)rr�r�r�s  r?�p_compound_statement_1zCParser.p_compound_statement_1s+���~�~��!���#�#�A�q�)�+��!�rAc�d�tj|d|d|j|d��|d<y)z6 labeled_statement : ID COLON pragmacomp_or_statement rr�rzN)r�Labelr�r�s  r?�p_labeled_statement_1zCParser.p_labeled_statement_1#�-���{�{�1�Q�4��1��t�'8�'8��A�'>�?��!�rAc�f�tj|d|dg|j|d��|d<y)zL labeled_statement : CASE constant_expression COLON pragmacomp_or_statement r�r�rrzN)r�Caser�r�s  r?�p_labeled_statement_2zCParser.p_labeled_statement_2's/���z�z�!�A�$��1����(9�(9�!�Q�(?�@��!�rAc�^�tj|dg|j|d��|d<y)z; labeled_statement : DEFAULT COLON pragmacomp_or_statement r�rrzN)r�Defaultr�r�s  r?�p_labeled_statement_3zCParser.p_labeled_statement_3+s)���}�}�a��d�V�T�%6�%6�q�!�%<�=��!�rAc	��tj|dtj|j|d��|j|d��|d<y)z labeled_statement : ID COLON rrzN)rr��EmptyStatementr�r�s  r?�p_labeled_statement_4zCParser.p_labeled_statement_4/sD���{�{�1�Q�4��!5�!5�d�6G�6G��1�6M�!N�PT�Pa�Pa�bc�ef�Pg�h��!�rAc	��tj|dtj|j|d��g|j|d��|d<y)z4 labeled_statement : CASE constant_expression COLON r�rrzN)rr�r�r�r�s  r?�p_labeled_statement_5zCParser.p_labeled_statement_53sG���z�z�!�A�$��!5�!5�d�6G�6G��1�6M�!N� O�QU�Qb�Qb�cd�fg�Qh�i��!�rAc��tjtj|j|d��g|j|d��|d<y)z# labeled_statement : DEFAULT COLON rrzN)rr�r�r�r�s  r?�p_labeled_statement_6zCParser.p_labeled_statement_67s@���}�}�e�2�2�4�3D�3D�Q��3J�K�L�d�N_�N_�`a�cd�Ne�f��!�rAc	�f�tj|d|dd|j|d��|d<y)zK selection_statement : IF LPAREN expression RPAREN pragmacomp_or_statement r�r�Nrrz�r�Ifr�r�s  r?�p_selection_statement_1zCParser.p_selection_statement_1;s/���x�x��!��a��d�D�$�*;�*;�A�q�*A�B��!�rAc	�l�tj|d|d|d|j|d��|d<y)zZ selection_statement : IF LPAREN expression RPAREN statement ELSE pragmacomp_or_statement r�r��rrzNr�r�s  r?�p_selection_statement_2zCParser.p_selection_statement_2?s3���x�x��!��a��d�A�a�D�$�*;�*;�A�q�*A�B��!�rAc
�v�ttj|d|d|j|d���|d<y)zO selection_statement : SWITCH LPAREN expression RPAREN pragmacomp_or_statement r�r�rrzN)r
r�Switchr�r�s  r?�p_selection_statement_3zCParser.p_selection_statement_3Cs6������Q�q�T�1�Q�4��):�):�1�a�)@�A�C��!�rAc�d�tj|d|d|j|d��|d<y)zN iteration_statement : WHILE LPAREN expression RPAREN pragmacomp_or_statement r�r�rrzN)r�Whiler�r�s  r?�p_iteration_statement_1zCParser.p_iteration_statement_1Hr�rAc�d�tj|d|d|j|d��|d<y)zV iteration_statement : DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI r�r�rrzN)r�DoWhiler�r�s  r?�p_iteration_statement_2zCParser.p_iteration_statement_2Ls-���}�}�Q�q�T�1�Q�4��):�):�1�a�)@�A��!�rAc
�t�tj|d|d|d|d|j|d��|d<y)zx iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement r�r�r�	rrzN)r�Forr�r�s  r?�p_iteration_statement_3zCParser.p_iteration_statement_3Ps9���y�y��1��q��t�Q�q�T�1�Q�4��1B�1B�1�a�1H�I��!�rAc
��tjtj|d|j|d��|d|d|d|j|d��|d<y)zp iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement r�rr���rzN)rr�DeclListr�r�s  r?�p_iteration_statement_4zCParser.p_iteration_statement_4TsU���y�y�����!��d�.?�.?��1�.E�F��1��q��t�Q�q�T�4�+<�+<�Q��+B�D��!�rAc�\�tj|d|j|d��|d<y)z  jump_statement  : GOTO ID SEMI r�rrzN)r�Gotor�r�s  r?�p_jump_statement_1zCParser.p_jump_statement_1Ys'���z�z�!�A�$�� 1� 1�!�Q� 7�8��!�rAc�T�tj|j|d��|d<y)z jump_statement  : BREAK SEMI rrzN)r�Breakr�r�s  r?�p_jump_statement_2zCParser.p_jump_statement_2]s!���{�{�4�,�,�Q��2�3��!�rAc�T�tj|j|d��|d<y)z! jump_statement  : CONTINUE SEMI rrzN)r�Continuer�r�s  r?�p_jump_statement_3zCParser.p_jump_statement_3as!���~�~�d�/�/��1�5�6��!�rAc�|�tjt|�dk(r|dnd|j|d��|d<y)z\ jump_statement  : RETURN expression SEMI
                            | RETURN SEMI
        r�r�Nrrz)r�ReturnrNr�r�s  r?�p_jump_statement_4zCParser.p_jump_statement_4es6���|�|�C��F�a�K�A�a�D�T�4�;L�;L�Q�PQ�;R�S��!�rAc�p�|d�)tj|j|d��|d<y|d|d<y)z, expression_statement : expression_opt SEMI rNr�rz)rr�r�r�s  r?�p_expression_statementzCParser.p_expression_statementks9���Q�4�<��'�'��(9�(9�!�Q�(?�@�A�a�D��Q�4�A�a�DrAc��t|�dk(r	|d|d<yt|dtj�s*tj|dg|dj�|d<|dj
j
|d�|d|d<y)zn expression  : assignment_expression
                        | expression COMMA assignment_expression
        r�rrzr�N)rNror�ExprListrXr�rJr�s  r?�p_expressionzCParser.p_expressionrsw���q�6�Q�;��Q�4�A�a�D��a��d�E�N�N�3��~�~�q��t�f�a��d�j�j�9��!��
�a�D�J�J���a��d�#��Q�4�A�a�DrAc��|d|d<y)z: assignment_expression : LPAREN compound_statement RPAREN r�rzNr�r�s  r?�#p_parenthesized_compound_expressionz+CParser.p_parenthesized_compound_expressionr�rAc�`�tj|dg|j|d���|d<y)z typedef_name : TYPEID rryrzNr(r�s  r?�p_typedef_namezCParser.p_typedef_name�s+���#�#�Q�q�T�F�$�2C�2C�A�q�2I�J��!�rAc��t|�dk(r	|d|d<ytj|d|d|d|dj�|d<y)z� assignment_expression   : conditional_expression
                                    | unary_expression assignment_operator assignment_expression
        r�rrzr�N)rNr�
AssignmentrXr�s  r?�p_assignment_expressionzCParser.p_assignment_expression�sJ���q�6�Q�;��Q�4�A�a�D��#�#�A�a�D�!�A�$��!��a��d�j�j�A�A�a�DrAc��|d|d<y)a� assignment_operator : EQUALS
                                | XOREQUAL
                                | TIMESEQUAL
                                | DIVEQUAL
                                | MODEQUAL
                                | PLUSEQUAL
                                | MINUSEQUAL
                                | LSHIFTEQUAL
                                | RSHIFTEQUAL
                                | ANDEQUAL
                                | OREQUAL
        rrzNr�r�s  r?�p_assignment_operatorzCParser.p_assignment_operator�s����t��!�rAc��|d|d<y)z. constant_expression : conditional_expression rrzNr�r�s  r?�p_constant_expressionzCParser.p_constant_expression�r�rAc��t|�dk(r	|d|d<ytj|d|d|d|dj�|d<y)z� conditional_expression  : binary_expression
                                    | binary_expression CONDOP expression COLON conditional_expression
        r�rrzr�r�N)rNr�	TernaryOprXr�s  r?�p_conditional_expressionz CParser.p_conditional_expression�sH���q�6�Q�;��Q�4�A�a�D��?�?�1�Q�4��1��q��t�Q�q�T�Z�Z�@�A�a�DrAc��t|�dk(r	|d|d<ytj|d|d|d|dj�|d<y)ak binary_expression   : cast_expression
                                | binary_expression TIMES binary_expression
                                | binary_expression DIVIDE binary_expression
                                | binary_expression MOD binary_expression
                                | binary_expression PLUS binary_expression
                                | binary_expression MINUS binary_expression
                                | binary_expression RSHIFT binary_expression
                                | binary_expression LSHIFT binary_expression
                                | binary_expression LT binary_expression
                                | binary_expression LE binary_expression
                                | binary_expression GE binary_expression
                                | binary_expression GT binary_expression
                                | binary_expression EQ binary_expression
                                | binary_expression NE binary_expression
                                | binary_expression AND binary_expression
                                | binary_expression OR binary_expression
                                | binary_expression XOR binary_expression
                                | binary_expression LAND binary_expression
                                | binary_expression LOR binary_expression
        r�rrzr�N)rNr�BinaryOprXr�s  r?�p_binary_expressionzCParser.p_binary_expression�sH��*�q�6�Q�;��Q�4�A�a�D��>�>�!�A�$��!��a��d�A�a�D�J�J�?�A�a�DrAc��|d|d<y)z$ cast_expression : unary_expression rrzNr�r�s  r?�p_cast_expression_1zCParser.p_cast_expression_1�r�rAc�d�tj|d|d|j|d��|d<y)z; cast_expression : LPAREN type_name RPAREN cast_expression r�r�rrzN)r�Castr�r�s  r?�p_cast_expression_2zCParser.p_cast_expression_2�s-���z�z�!�A�$��!��d�&7�&7��1�&=�>��!�rAc��|d|d<y)z* unary_expression    : postfix_expression rrzNr�r�s  r?�p_unary_expression_1zCParser.p_unary_expression_1�r�rAc�^�tj|d|d|dj�|d<y)z� unary_expression    : PLUSPLUS unary_expression
                                | MINUSMINUS unary_expression
                                | unary_operator cast_expression
        rr�rzN�r�UnaryOprXr�s  r?�p_unary_expression_2zCParser.p_unary_expression_2�s*��
�}�}�Q�q�T�1�Q�4��1����4��!�rAc��tj|dt|�dk(r|dn|d|j|d��|d<y)z� unary_expression    : SIZEOF unary_expression
                                | SIZEOF LPAREN type_name RPAREN
                                | _ALIGNOF LPAREN type_name RPAREN
        rr�r�rzN)rr@rNr�r�s  r?�p_unary_expression_3zCParser.p_unary_expression_3�sD��
�}�}�
�a�D���F�a�K�A�a�D�Q�q�T����a��#�%��!�rAc��|d|d<y)z� unary_operator  : AND
                            | TIMES
                            | PLUS
                            | MINUS
                            | NOT
                            | LNOT
        rrzNr�r�s  r?�p_unary_operatorzCParser.p_unary_operator�r$rAc��|d|d<y)z* postfix_expression  : primary_expression rrzNr�r�s  r?�p_postfix_expression_1zCParser.p_postfix_expression_1�r�rAc�^�tj|d|d|dj�|d<y)zG postfix_expression  : postfix_expression LBRACKET expression RBRACKET rr�rzN)r�ArrayRefrXr�s  r?�p_postfix_expression_2zCParser.p_postfix_expression_2�s(���~�~�a��d�A�a�D�!�A�$�*�*�5��!�rAc�~�tj|dt|�dk(r|dnd|dj�|d<y)z� postfix_expression  : postfix_expression LPAREN argument_expression_list RPAREN
                                | postfix_expression LPAREN RPAREN
        rr�r�Nrz)r�FuncCallrNrXr�s  r?�p_postfix_expression_3zCParser.p_postfix_expression_3�s6���~�~�a��d�C��F�a�K�A�a�D�T�1�Q�4�:�:�N��!�rAc��tj|d|j|d��}tj|d|d||dj�|d<y)z� postfix_expression  : postfix_expression PERIOD ID
                                | postfix_expression PERIOD TYPEID
                                | postfix_expression ARROW ID
                                | postfix_expression ARROW TYPEID
        r�rr�rzN)rr~r��	StructRefrX)r6r��fields   r?�p_postfix_expression_4zCParser.p_postfix_expression_4sM������1��t�0�0��A�6�7�����q��t�Q�q�T�5�!�A�$�*�*�=��!�rAc�d�tjd|dz|d|dj�|d<y)z{ postfix_expression  : postfix_expression PLUSPLUS
                                | postfix_expression MINUSMINUS
        r�r�rrzNr?r�s  r?�p_postfix_expression_5zCParser.p_postfix_expression_5	s.���}�}�S�1�Q�4�Z��1��q��t�z�z�:��!�rAc�B�tj|d|d�|d<y)z� postfix_expression  : LPAREN type_name RPAREN brace_open initializer_list brace_close
                                | LPAREN type_name RPAREN brace_open initializer_list COMMA brace_close
        r�r�rzN)r�CompoundLiteralr�s  r?�p_postfix_expression_6zCParser.p_postfix_expression_6s"���$�$�Q�q�T�1�Q�4�0��!�rAc��|d|d<y)z" primary_expression  : identifier rrzNr�r�s  r?�p_primary_expression_1zCParser.p_primary_expression_1r�rAc��|d|d<y)z  primary_expression  : constant rrzNr�r�s  r?�p_primary_expression_2zCParser.p_primary_expression_2r�rAc��|d|d<y)zp primary_expression  : unified_string_literal
                                | unified_wstring_literal
        rrzNr�r�s  r?�p_primary_expression_3zCParser.p_primary_expression_3r�rAc��|d|d<y)z0 primary_expression  : LPAREN expression RPAREN r�rzNr�r�s  r?�p_primary_expression_4zCParser.p_primary_expression_4#r�rAc���|j|d�}tjtj|d|�tj|d|dg|�|�|d<y)za primary_expression  : OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPAREN
        rr�r�rzN)r�rrLr~r$)r6r�rXs   r?�p_primary_expression_5zCParser.p_primary_expression_5'sV���!�!�!�Q�'���~�~�e�h�h�q��t�U�3�#�n�n�a��d�A�a�D�\�5�A�#�%��!�rAc�V�t|�dk(r	|d|d<yt|�dk(r2tj|d|d|d|dj�|d<yt|�dk(r.tj|d|d|dj�|d<ytdt|�z��)	z� offsetof_member_designator : identifier
                                         | offsetof_member_designator PERIOD identifier
                                         | offsetof_member_designator LBRACKET expression RBRACKET
        r�rrzr�r�r�z$Unexpected parsing state. len(p): %uN)rNrrOrXrI�NotImplementedErrorr�s  r?�p_offsetof_member_designatorz$CParser.p_offsetof_member_designator/s���
�q�6�Q�;��Q�4�A�a�D�
��V�q�[��?�?�1�Q�4��1��q��t�Q�q�T�Z�Z�@�A�a�D�
��V�q�[��>�>�!�A�$��!��a��d�j�j�9�A�a�D�%�&L�s�ST�v�&U�V�VrAc���t|�dk(r+tj|dg|dj�|d<y|djj|d�|d|d<y)z� argument_expression_list    : assignment_expression
                                        | argument_expression_list COMMA assignment_expression
        r�rrzr�N)rNrr$rXr�rJr�s  r?�p_argument_expression_listz"CParser.p_argument_expression_list=sX���q�6�Q�;��>�>�1�Q�4�&�!�A�$�*�*�5�A�a�D�
�a�D�J�J���a��d�#��Q�4�A�a�DrAc�\�tj|d|j|d��|d<y)z identifier  : ID rrzN)rr~r�r�s  r?�p_identifierzCParser.p_identifierGs'���x�x��!��d�/�/��1�5�6��!�rAc��d}d}|dddD]}|dvr|dz
}�
|dvs�|dz
}�d}|dkDrtd��|d	kDrtd
��d|zd|zz}tj|d
z|d|j|d��|d<y)z� constant    : INT_CONST_DEC
                        | INT_CONST_OCT
                        | INT_CONST_HEX
                        | INT_CONST_BIN
                        | INT_CONST_CHAR
        rzr���N��l�L)�u�Urz.Constant cannot have more than one u/U suffix.r�z.Constant cannot have more than two l/L suffix.z	unsigned zlong rx)�
ValueErrorr�Constantr�)r6r��uCount�lCount�xr��prefixs       r?�p_constant_1zCParser.p_constant_1Ks��������1��b�c��A��J���!����j���!���	�

���A�:��N�O�
O�
�a�Z��N�O�
O��v�%��&�(8�8���~�~��U�N�A�a�D�$�"3�"3�A�q�"9�;��!�rAc��|dddvrd}n|dddvrd}nd}tj||d|j|d��|d<y	)
zM constant    : FLOAT_CONST
                        | HEX_FLOAT_CONST
        rrR)�f�F�floatrjzlong double�doublerzN�rrpr�)r6r�r�s   r?�p_constant_2zCParser.p_constant_2bs]��
�Q�4��8�z�!��A�
�q�T�"�X��
#��A��A��~�~�
�q��t�T�&�&�q�!�,�.��!�rAc�^�tjd|d|j|d��|d<y)z� constant    : CHAR_CONST
                        | WCHAR_CONST
                        | U8CHAR_CONST
                        | U16CHAR_CONST
                        | U32CHAR_CONST
        �charrrzNr{r�s  r?�p_constant_3zCParser.p_constant_3ps.���~�~��A�a�D�$�+�+�A�q�1�3��!�rAc���t|�dk(r.tjd|d|j|d��|d<y|djdd|dddz|d_|d|d<y)z~ unified_string_literal  : STRING_LITERAL
                                    | unified_string_literal STRING_LITERAL
        r��stringrrzNrR)rNrrpr��valuer�s  r?�p_unified_string_literalz CParser.p_unified_string_literalsp���q�6�Q�;��>�>��!�A�$�� 1� 1�!�Q� 7�9�A�a�D��1����C�R��1�Q�4���8�3�A�a�D�J��Q�4�A�a�DrAc���t|�dk(r.tjd|d|j|d��|d<y|djj�dd|dddz|d_|d|d<y)a unified_wstring_literal : WSTRING_LITERAL
                                    | U8STRING_LITERAL
                                    | U16STRING_LITERAL
                                    | U32STRING_LITERAL
                                    | unified_wstring_literal WSTRING_LITERAL
                                    | unified_wstring_literal U8STRING_LITERAL
                                    | unified_wstring_literal U16STRING_LITERAL
                                    | unified_wstring_literal U32STRING_LITERAL
        r�r�rrzNrR)rNrrpr�r��rstripr�s  r?�p_unified_wstring_literalz!CParser.p_unified_wstring_literal�sz���q�6�Q�;��>�>��!�A�$�� 1� 1�!�Q� 7�9�A�a�D��1����*�*�,�S�b�1�A�a�D���H�<�A�a�D�J��Q�4�A�a�DrAc�V�|d|d<|jd|jd��y)z  brace_open  :   LBRACE
        rrzN��
set_lineno�linenor�s  r?�p_brace_openzCParser.p_brace_open��'����t��!��	���Q������$rAc�V�|d|d<|jd|jd��y)z  brace_close :   RBRACE
        rrzNr�r�s  r?�
p_brace_closezCParser.p_brace_close�r�rAc��d|d<y)zempty : Nrzr�r�s  r?�p_emptyzCParser.p_empty�s����!�rAc	��|rT|jd|jz|j|j|jj|����y|jd|jj�y)Nz
before: %s)r�rezAt end of input)rUr�rbr�r.�find_tok_columnrDr�s  r?�p_errorzCParser.p_error�si��
�����q�w�w�&����1�8�8�#'�9�9�#<�#<�Q�#?��A�
B�

���/����1C�1C�DrAN)rF)F)��__name__�
__module__�__qualname__rr@rFrLrPrYr[r`r*r+r,r-rlrvr�r�r�r�r��
precedencer�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr	rr
rrrrrrrr!r#r&r)r+r/r1r3r7r:r<r>r@rBrErGrIrNrQrSrUrWr^r`rbrdrgrirlrnrprtrwr{r}rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrrrrrr r"r%r'r)r,r.r0r3r6r8r;r=rArCrErGrJrMrQrSrVrXrZr\r^r`rcrergrur|rr�r�r�r�r�r�r�rAr?r
r
s�����%��'���m(�^�0)� �+�,��:����$�R!�d*�X�2W�r�"��J�('����
�
��
�
M�3�
=�8��$	�
�n	�(,�z�4�C�
F�
G�C�
H�
P�
S�
T�
P�
C�
P�
U�
��K� ���8�D�8�D�P�
P�
C�
S�
Q�
H�	+�/�$/�&�'�$�L�
�
8�/�
U�?�?�
?��<�� ��<�!5�7S�T��U��
�<�!5�7S�T�2�U�2�
�<�!5�7S�T�+�U�+��<�!5�6��7��
�<�!5�7S�T�?�U�?��<�!5�7S�T�?�U�?�*�<�!5�7S�T�	?�U�	?��<�!5�7S�T�@�U�@�8�<8���(
(��@��
�
��8��
@��2�
��	?�+�	?�+�@�+�+�":�H�+�@�A�>�i�j�g�C�C�C�
@�B�J�D�
9�4�7�T����K�B�
��A�@�4�?��5�%���6�O�>�;�1�����%�W��7�;�..�3�	��"%�%��
ErAr
N)�plyrrr�c_lexerr�	plyparserrrrr	�ast_transformsr
rr
r�rAr?�<module>r�s:�����E�E�C�
�cE�i�cE�
�cErAPK�t�\<Y�--"__pycache__/lextab.cpython-312.pycnu�[����

=UiH"��r�dZed�ZdZdZdddd�Zdgd�fgd	gd
�fgdgd�fgd�Zd
d
d
d�Zdddd�ZiZ	y)z3.10)q�AND�ANDEQUAL�ARROW�AUTO�BREAK�CASE�CHAR�
CHAR_CONST�COLON�COMMA�CONDOP�CONST�CONTINUE�DEFAULT�DIVEQUAL�DIVIDE�DO�DOUBLE�ELLIPSIS�ELSE�ENUM�EQ�EQUALS�EXTERN�FLOAT�FLOAT_CONST�FOR�GE�GOTO�GT�HEX_FLOAT_CONST�ID�IF�INLINE�INT�
INT_CONST_BIN�INT_CONST_CHAR�
INT_CONST_DEC�
INT_CONST_HEX�
INT_CONST_OCT�LAND�LBRACE�LBRACKET�LE�LNOT�LONG�LOR�LPAREN�LSHIFT�LSHIFTEQUAL�LT�MINUS�
MINUSEQUAL�
MINUSMINUS�MOD�MODEQUAL�NE�NOT�OFFSETOF�OR�OREQUAL�PERIOD�PLUS�	PLUSEQUAL�PLUSPLUS�PPHASH�PPPRAGMA�PPPRAGMASTR�RBRACE�RBRACKET�REGISTER�RESTRICT�RETURN�RPAREN�RSHIFT�RSHIFTEQUAL�SEMI�SHORT�SIGNED�SIZEOF�STATIC�STRING_LITERAL�STRUCT�SWITCH�TIMES�
TIMESEQUAL�TYPEDEF�TYPEID�
U16CHAR_CONST�U16STRING_LITERAL�
U32CHAR_CONST�U32STRING_LITERAL�U8CHAR_CONST�U8STRING_LITERAL�UNION�UNSIGNED�VOID�VOLATILE�WCHAR_CONST�WHILE�WSTRING_LITERAL�XOR�XOREQUAL�_ALIGNAS�_ALIGNOF�_ATOMIC�_BOOL�_COMPLEX�	_NORETURN�_PRAGMA�_STATIC_ASSERT�
_THREAD_LOCAL�__INT128�@��	inclusive�	exclusive)�INITIAL�ppline�pppragmaa)
(?P<t_PPHASH>[ \t]*\#)|(?P<t_NEWLINE>\n+)|(?P<t_LBRACE>\{)|(?P<t_RBRACE>\})|(?P<t_FLOAT_CONST>((((([0-9]*\.[0-9]+)|([0-9]+\.))([eE][-+]?[0-9]+)?)|([0-9]+([eE][-+]?[0-9]+)))[FfLl]?))|(?P<t_HEX_FLOAT_CONST>(0[xX]([0-9a-fA-F]+|((([0-9a-fA-F]+)?\.[0-9a-fA-F]+)|([0-9a-fA-F]+\.)))([pP][+-]?[0-9]+)[FfLl]?))|(?P<t_INT_CONST_HEX>0[xX][0-9a-fA-F]+(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|(?P<t_INT_CONST_BIN>0[bB][01]+(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|(?P<t_BAD_CONST_OCT>0[0-7]*[89])|(?P<t_UNSUPPORTED_C_STYLE_COMMENT>\/\*)|(?P<t_UNSUPPORTED_CXX_STYLE_COMMENT>\/\/)|(?P<t_INT_CONST_OCT>0[0-7]*(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|(?P<t_INT_CONST_DEC>(0(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|([1-9][0-9]*(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?))|(?P<t_INT_CONST_CHAR>'([^'\\\n]|(\\(([a-wyzA-Z._~!=&\^\-\\?'"]|x(?![0-9a-fA-F]))|(\d+)(?!\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F])))){2,4}')|(?P<t_CHAR_CONST>'([^'\\\n]|(\\(([a-wyzA-Z._~!=&\^\-\\?'"]|x(?![0-9a-fA-F]))|(\d+)(?!\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))')|(?P<t_WCHAR_CONST>L'([^'\\\n]|(\\(([a-wyzA-Z._~!=&\^\-\\?'"]|x(?![0-9a-fA-F]))|(\d+)(?!\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))')|(?P<t_U8CHAR_CONST>u8'([^'\\\n]|(\\(([a-wyzA-Z._~!=&\^\-\\?'"]|x(?![0-9a-fA-F]))|(\d+)(?!\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))')|(?P<t_U16CHAR_CONST>u'([^'\\\n]|(\\(([a-wyzA-Z._~!=&\^\-\\?'"]|x(?![0-9a-fA-F]))|(\d+)(?!\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))')|(?P<t_U32CHAR_CONST>U'([^'\\\n]|(\\(([a-wyzA-Z._~!=&\^\-\\?'"]|x(?![0-9a-fA-F]))|(\d+)(?!\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))')|(?P<t_UNMATCHED_QUOTE>('([^'\\\n]|(\\(([a-wyzA-Z._~!=&\^\-\\?'"]|x(?![0-9a-fA-F]))|(\d+)(?!\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))*\n)|('([^'\\\n]|(\\(([a-wyzA-Z._~!=&\^\-\\?'"]|x(?![0-9a-fA-F]))|(\d+)(?!\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))*$))|(?P<t_BAD_CHAR_CONST>('([^'\\\n]|(\\(([a-wyzA-Z._~!=&\^\-\\?'"]|x(?![0-9a-fA-F]))|(\d+)(?!\d)|(x[0-9a-fA-F]+)(?![0-9a-fA-F]))))[^'
]+')|('')|('([\\][^a-zA-Z._~^!=&\^\-\\?'"x0-9])[^'\n]*'))|(?P<t_WSTRING_LITERAL>L"([^"\\\n]|(\\[0-9a-zA-Z._~!=&\^\-\\?'"]))*")|(?P<t_U8STRING_LITERAL>u8"([^"\\\n]|(\\[0-9a-zA-Z._~!=&\^\-\\?'"]))*")|(?P<t_U16STRING_LITERAL>u"([^"\\\n]|(\\[0-9a-zA-Z._~!=&\^\-\\?'"]))*")|(?P<t_U32STRING_LITERAL>U"([^"\\\n]|(\\[0-9a-zA-Z._~!=&\^\-\\?'"]))*")|(?P<t_BAD_STRING_LITERAL>"([^"\\\n]|(\\[0-9a-zA-Z._~!=&\^\-\\?'"]))*([\\][^a-zA-Z._~^!=&\^\-\\?'"x0-9])([^"\\\n]|(\\[0-9a-zA-Z._~!=&\^\-\\?'"]))*")|(?P<t_ID>[a-zA-Z_$][0-9a-zA-Z_$]*)|(?P<t_STRING_LITERAL>"([^"\\\n]|(\\[0-9a-zA-Z._~!=&\^\-\\?'"]))*")|(?P<t_ELLIPSIS>\.\.\.)|(?P<t_LOR>\|\|)|(?P<t_PLUSPLUS>\+\+)|(?P<t_LSHIFTEQUAL><<=)|(?P<t_OREQUAL>\|=)|(?P<t_PLUSEQUAL>\+=)|(?P<t_RSHIFTEQUAL>>>=)|(?P<t_TIMESEQUAL>\*=)|(?P<t_XOREQUAL>\^=)|(?P<t_ANDEQUAL>&=)|(?P<t_ARROW>->)|(?P<t_CONDOP>\?)|(?P<t_DIVEQUAL>/=)|(?P<t_EQ>==)|(?P<t_GE>>=)|(?P<t_LAND>&&)|(?P<t_LBRACKET>\[)|(?P<t_LE><=)|(?P<t_LPAREN>\()|(?P<t_LSHIFT><<)|(?P<t_MINUSEQUAL>-=)|(?P<t_MINUSMINUS>--)|(?P<t_MODEQUAL>%=)|(?P<t_NE>!=)|(?P<t_OR>\|)|(?P<t_PERIOD>\.)|(?P<t_PLUS>\+)|(?P<t_RBRACKET>\])|(?P<t_RPAREN>\))|(?P<t_RSHIFT>>>)|(?P<t_TIMES>\*)|(?P<t_XOR>\^)|(?P<t_AND>&)|(?P<t_COLON>:)|(?P<t_COMMA>,)|(?P<t_DIVIDE>/)|(?P<t_EQUALS>=)|(?P<t_GT>>)|(?P<t_LNOT>!)|(?P<t_LT><)|(?P<t_MINUS>-)|(?P<t_MOD>%)|(?P<t_NOT>~)|(?P<t_SEMI>;))�N)�t_PPHASHrC)�	t_NEWLINE�NEWLINE)�t_LBRACEr+)�t_RBRACErF)�
t_FLOAT_CONSTrNNNNNNNNN)�t_HEX_FLOAT_CONSTr NNNNNNN)�t_INT_CONST_HEXr(NNNNNNN)�t_INT_CONST_BINr%NNNNNNN)�t_BAD_CONST_OCT�
BAD_CONST_OCT)�t_UNSUPPORTED_C_STYLE_COMMENT�UNSUPPORTED_C_STYLE_COMMENT)�t_UNSUPPORTED_CXX_STYLE_COMMENT�UNSUPPORTED_CXX_STYLE_COMMENT)�t_INT_CONST_OCTr)NNNNNNN)�t_INT_CONST_DECr'NNNNNNNNNNNNNNNN)�t_INT_CONST_CHARr&NNNNNN)�t_CHAR_CONSTr	NNNNNN)�
t_WCHAR_CONSTrdNNNNNN)�t_U8CHAR_CONSTr^NNNNNN)�t_U16CHAR_CONSTrZNNNNNN)�t_U32CHAR_CONSTr\NNNNNN)�t_UNMATCHED_QUOTE�UNMATCHED_QUOTENNNNNNNNNNNNNN)�t_BAD_CHAR_CONST�BAD_CHAR_CONSTNNNNNNNNNN)�t_WSTRING_LITERALrfNN)�t_U8STRING_LITERALr_NN)�t_U16STRING_LITERALr[NN)�t_U32STRING_LITERALr]NN)�t_BAD_STRING_LITERAL�BAD_STRING_LITERALNNNNN)�t_IDr!)NrSNN)Nr)Nr0)NrB)Nr3)Nr>)NrA)NrM)NrW)Nrh)Nr)Nr)Nr)Nr)Nr)Nr)Nr*)Nr,)Nr-)Nr1)Nr2)Nr6)Nr7)Nr9)Nr:)Nr=)Nr?)Nr@)NrG)NrK)NrL)NrV)Nrg)Nr)Nr
)Nr)Nr)Nr)Nr)Nr.)Nr4)Nr5)Nr8)Nr;)NrNa*(?P<t_ppline_FILENAME>"([^"\\\n]|(\\[0-9a-zA-Z._~!=&\^\-\\?'"]))*")|(?P<t_ppline_LINE_NUMBER>(0(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?)|([1-9][0-9]*(([uU]ll)|([uU]LL)|(ll[uU]?)|(LL[uU]?)|([uU][lL])|([lL][uU]?)|[uU])?))|(?P<t_ppline_NEWLINE>\n)|(?P<t_ppline_PPLINE>line))N)�t_ppline_FILENAME�FILENAMENN)�t_ppline_LINE_NUMBER�LINE_NUMBERNNNNNNNNNNNNNNNN)�t_ppline_NEWLINEr|)�t_ppline_PPLINE�PPLINEzQ(?P<t_pppragma_NEWLINE>\n)|(?P<t_pppragma_PPPRAGMA>pragma)|(?P<t_pppragma_STR>.+))N)�t_pppragma_NEWLINEr|)�t_pppragma_PPPRAGMArD)�t_pppragma_STR�STRz 	�t_error�t_ppline_error�t_pppragma_errorN)
�_tabversion�set�
_lextokens�_lexreflags�_lexliterals�
_lexstateinfo�_lexstatere�_lexstateignore�_lexstateerrorf�
_lexstateeoff���A/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/lextab.py�<module>r�s������y�z�
�����'�;�K�X�
�N9�P9Lb�Mb�Nb�\bSg�UgSk�[bTk�ZbUk�ekyl�{ldn�dken�ckfn�gn��#�u�%�H��'�3C�Qc�d���
r�PK�t�\n�����%__pycache__/plyparser.cpython-312.pycnu�[����

=Ui��`�ddlZGd�de�ZGd�de�ZGd�de�Zd�Zd	�Zd
�Zy)�Nc�"�eZdZdZdZdd�Zd�Zy)�Coordz� Coordinates of a syntactic element. Consists of:
            - File name
            - Line number
            - (optional) column number, for the Lexer
    )�file�line�column�__weakref__Nc�.�||_||_||_y�N�rrr)�selfrrrs    �D/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/plyparser.py�__init__zCoord.__init__s����	���	����c�x�|j�d|j��}|jr|d|jzz
}|S)N�:z:%sr)r�strs  r
�__str__z
Coord.__str__s2�����D�I�I�.���;�;��u�t�{�{�2�2���
rr
)�__name__�
__module__�__qualname__�__doc__�	__slots__rr�rr
rr
s���
:�I��
rrc��eZdZy)�
ParseErrorN)rrrrrr
rrs�rrc�&�eZdZd�Zdd�Zd�Zd�Zy)�	PLYParserc��|dz}d�}|�d|��|_d|z|_t|j|j|�y)z� Given a rule name, creates an optional ply.yacc rule
            for it. The name of the optional rule is
            <rulename>_opt
        �_optc��|d|d<y)N�rr)r�ps  r
�optrulez+PLYParser._create_opt_rule.<locals>.optrule*s���Q�4�A�a�Drz : empty
| zp_%sN)rr�setattr�	__class__)r�rulename�optnamer#s    r
�_create_opt_rulezPLYParser._create_opt_rule#sD��
�V�#��	�18��B���!�G�+�������� 0� 0�'�:rNc�F�t|jj||��S)Nr)r�clex�filename)r�linenors   r
�_coordzPLYParser._coord1s"����Y�Y�'�'����	rc��|jjjjdd|j|��}|dkrd}|j|�|z
}|j	|j|�|�S)z� Returns the coordinates for the YaccProduction object 'p' indexed
            with 'token_idx'. The coordinate includes the 'lineno' and
            'column'. Both follow the lex semantic, starting from 1.
        �
r���)�lexer�lexdata�rfind�lexposr-r,)rr"�	token_idx�last_crrs     r
�_token_coordzPLYParser._token_coord7sh��
�'�'�-�-�'�'�-�-�d�A�q�x�x�	�7J�K���Q�;��G��(�(�9�%��1���{�{�1�8�8�I�.��7�7rc�"�t|�d|����)Nz: )r)r�msg�coords   r
�_parse_errorzPLYParser._parse_errorBs���U�C�0�1�1rr
)rrrr(r-r7r;rrr
rr"s��;��	8�2rrc����fd�}|S)a� Decorator to create parameterized rules.

    Parameterized rule methods must be named starting with 'p_' and contain
    'xxx', and their docstrings may contain 'xxx' and 'yyy'. These will be
    replaced by the given parameter tuples. For example, ``p_xxx_rule()`` with
    docstring 'xxx_rule  : yyy' when decorated with
    ``@parameterized(('id', 'ID'))`` produces ``p_id_rule()`` with the docstring
    'id_rule  : ID'. Using multiple tuples produces multiple rules.
    c����|_|Sr
)�_params)�	rule_func�paramss �r
�decoratezparameterized.<locals>.decoratePs���"�	���rr)r@rAs` r
�
parameterizedrBFs�����Orc��d}t|�D]s}|jd�s�t||�}t|d�s�.t	||�|j
�
t
||��S|r�Vtjdtd��d}�u|S)z� Class decorator to generate rules from parameterized rule templates.

    See `parameterized` for more information on parameterized rules.
    F�p_r>z@parsing methods must have __doc__ for pycparser to work properly�)�
stacklevelT)
�dir�
startswith�getattr�hasattr�delattrr�_create_param_rules�warnings�warn�RuntimeWarning)�cls�issued_nodoc_warning�	attr_name�methods    r
�templaterTVs���
!����X�	�����%��S�)�,�F��v�y�)���Y�'��>�>�-�'��V�4�-��M�M�Z�&�#$�&�,0�(�)�*�Jrc�
���jD]s\}}�fd�}�jjd|�jd|�|_�jjd|�|_t	||j|��uy)a Create ply.yacc rules based on a parameterized rule function

    Generates new methods (one per each pair of parameters) based on the
    template rule function `func`, and attaches them to `cls`. The rule
    function's parameters must be accessible via its `_params` attribute.
    c����||�yr
r)rr"�funcs  �r
�
param_rulez'_create_param_rules.<locals>.param_rule}s�����q�Mr�xxx�yyyN)r>r�replacerr$)rPrWrYrZrXs `   r
rLrLtsq����L�L���S�	�"�\�\�1�1�%��=�E�E�e�S�Q�
��"�m�m�3�3�E�3�?�
��	��Z�(�(�*�5�!r)	rM�objectr�	ExceptionrrrBrTrLrrr
�<module>r^s<����F��$"��!�!2��!2�H
� �<6rPK�t�\j�@#����#__pycache__/yacctab.cpython-312.pycnu�[����

=Ui@��P�dZdZdZidgd�gd�f�dgd�gd�f�d	gd
�gd�f�dgd
�gd�f�dgd
�gd�f�dgd�gd�f�dgd�gd�f�dgd�gd�f�dgd�gd�f�dgd�gd�f�d gd!�gd"�f�d#gd$�gd%�f�d&gd$�gd'�f�d(gd$�gd)�f�d*gd$�gd+�f�d,gd$�gd-�f�d.gd$�gd/�f�id0gd$�gd1�f�d2gd$�gd3�f�d4gd$�gd5�f�d6gd$�gd7�f�d8gd$�gd9�f�d:gd$�gd;�f�d<gd=�gd>�f�d?gd@�gdA�f�dBgd@�gdC�f�dDgd@�gdE�f�dFgdG�gdH�f�dIgdG�gdJ�f�dKgdL�gdM�f�dNgdG�gdO�f�dPgdG�gdQ�f�dRgdG�gdS�f�dTgdG�gdU�f��idVgdG�gdW�f�dXgdY�gdZ�f�d[gd!�gd\�f�d]gd!�gd^�f�d_gd`�gda�f�dbgdc�gdd�f�degdf�gdg�f�dhgdf�gdi�f�djgdf�gdk�f�dlgdf�gdm�f�dngdo�gdp�f�dqgdf�gdr�f�dsgdf�gdt�f�dugdf�gdv�f�dwgdf�gdx�f�dygdf�gdz�f�d{gdf�gd|�f��id}gd~�gd�f�d�gd~�gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f��id�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�gd��gd��f�d�d�gd�gf�d�gd��gd��f�d�gd¢gdâf�d�gdŢgdƢf�d�gdȢgdɢf�d�gdˢgd̢f��id�gd΢gdϢf�d�gdѢgdҢf�d�gdԢgdբf�d�gdעgdآf�d�gdעgdڢf�d�gdעgdܢf�d�gdעgdޢf�d�gdעgd�f�d�gdעgd�f�d�gdעgd�f�d�gdעgd�f�d�gdעgd�f�d�gdעgd�f�d�gdעgd�f�d�gdעgd�f�d�gdעgd�f�d�gdעgd�f��gdעgd�fgd�gd��fgd�gd��fgd�gd��fgd�gd��fgd�gd��fgd�gd��fgd�gd��fgd�gd��fgd�gd��fgd�gd��fd�g�dgf�d��ZiZej�D]/\ZZee�de�d�D]\Z	Z
e	evriee	<e
ee	e<��1[i�d�dg�dgf��d�dg�dgf��dg�d�g�d	�f��d
�d�dg�d�dgf��d
�d�dg�d�dgf��dg�d�g�d�f��d�d�dg�d�dgf��dg�d�g�d�f��dg�d�g�d�f��dg�d�g�d�f��dg�d�g�d�f��d g�d�g�d!�f��d"g�d#�g�d$�f��d%g�d&�g�d'�f��d(g�d)�g�d*�f��d+g�d,�g�d-�f��d.g�d,�g�d/�f�i�d0g�d1�g�d2�f��d3g�d4�g�d5�f��d6g�d7�g�d8�f��d9g�d:�g�d;�f��d<g�d4�g�d=�f��d>g�d4�g�d?�f��d@g�d4�g�dA�f��dBg�dC�g�dD�f��dEg�d4�g�dF�f��dG�dH�dIg�dJ�dKgf��dL�dH�dIg�dM�dMgf��dN�dO�dPg�dQ�dQgf��dR�dO�dPg�dS�dSgf��dTg�dU�g�dV�f��dWg�dX�g�dY�f��dZg�d[�g�d\�f��d]g�d^�g�d_�f��i�d`g�da�g�db�f��dc�dd�deg�df�dfgf��dg�dd�deg�dh�dhgf��di�dd�deg�dj�djgf��dkg�dl�g�dm�f��dng�do�g�dp�f��dqg�dr�g�ds�f��dtg�du�g�dv�f��dwg�dx�g�dy�f��dzg�d{�g�d|�f��d}g�d~�g�d�f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��i�d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d�g�d��g�d��f��d��d�g�d�gf��d��d�g�d�gf��i�d��d��d�g�d��d�gf��d�g�d��g�d¢f��d�g�d��g�dĢf��d�g�d��g�dƢf��d�g�d��g�dȢf��d�g�d��g�dʢf��d�g�d��g�d̢f��d�g�d΢g�dϢf��d�g�dѢg�dҢf��d�g�dԢg�dբf��d�g�dעg�dآf��d�g�dڢg�dۢf��dܐd�g�d�gf��dߐdݐd�g�d�d�gf��d�dݐd�g�d�d�gf��d�g�d�g�d�f��d�g�d�g�d�f���d�g�d�gf�d�g�d�gf�d�d�g�d�d�gfg�d�g�d�fg�d�g�d��f�d�g�d�gf�d�g�d�gf�d��d�g�d��d�gfg�d��g�d��fg�d��g�d��fg�d��g�d�fg�d�g�d�f�dg�dgfg�d�g�d�f�dg�dgf�d	��ZiZej�D]/\ZZee�de�d�D]\Z	Z
e	evriee	<e
ee	e<��1[g�d
�Z
�y(z3.10�LALRaUtranslation_unit_or_emptyleftLORleftLANDleftORleftXORleftANDleftEQNEleftGTGELTLEleftRSHIFTLSHIFTleftPLUSMINUSleftTIMESDIVIDEMODAUTO BREAK CASE CHAR CONST CONTINUE DEFAULT DO DOUBLE ELSE ENUM EXTERN FLOAT FOR GOTO IF INLINE INT LONG REGISTER OFFSETOF RESTRICT RETURN SHORT SIGNED SIZEOF STATIC STRUCT SWITCH TYPEDEF UNION UNSIGNED VOID VOLATILE WHILE __INT128 _BOOL _COMPLEX _NORETURN _THREAD_LOCAL _STATIC_ASSERT _ATOMIC _ALIGNOF _ALIGNAS _PRAGMA ID TYPEID INT_CONST_DEC INT_CONST_OCT INT_CONST_HEX INT_CONST_BIN INT_CONST_CHAR FLOAT_CONST HEX_FLOAT_CONST CHAR_CONST WCHAR_CONST U8CHAR_CONST U16CHAR_CONST U32CHAR_CONST STRING_LITERAL WSTRING_LITERAL U8STRING_LITERAL U16STRING_LITERAL U32STRING_LITERAL PLUS MINUS TIMES DIVIDE MOD OR AND NOT XOR LSHIFT RSHIFT LOR LAND LNOT LT LE GT GE EQ NE EQUALS TIMESEQUAL DIVEQUAL MODEQUAL PLUSEQUAL MINUSEQUAL LSHIFTEQUAL RSHIFTEQUAL ANDEQUAL XOREQUAL OREQUAL PLUSPLUS MINUSMINUS ARROW CONDOP LPAREN RPAREN LBRACKET RBRACKET LBRACE RBRACE COMMA PERIOD SEMI COLON ELLIPSIS PPHASH PPPRAGMA PPPRAGMASTRabstract_declarator_opt : empty
| abstract_declaratorassignment_expression_opt : empty
| assignment_expressionblock_item_list_opt : empty
| block_item_listdeclaration_list_opt : empty
| declaration_listdeclaration_specifiers_no_type_opt : empty
| declaration_specifiers_no_typedesignation_opt : empty
| designationexpression_opt : empty
| expressionid_init_declarator_list_opt : empty
| id_init_declarator_listidentifier_list_opt : empty
| identifier_listinit_declarator_list_opt : empty
| init_declarator_listinitializer_list_opt : empty
| initializer_listparameter_type_list_opt : empty
| parameter_type_liststruct_declarator_list_opt : empty
| struct_declarator_listtype_qualifier_list_opt : empty
| type_qualifier_list direct_id_declarator   : ID
         direct_id_declarator   : LPAREN id_declarator RPAREN
         direct_id_declarator   : direct_id_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
         direct_id_declarator   : direct_id_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET
                                    | direct_id_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET
         direct_id_declarator   : direct_id_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET
         direct_id_declarator   : direct_id_declarator LPAREN parameter_type_list RPAREN
                                    | direct_id_declarator LPAREN identifier_list_opt RPAREN
         direct_typeid_declarator   : TYPEID
         direct_typeid_declarator   : LPAREN typeid_declarator RPAREN
         direct_typeid_declarator   : direct_typeid_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
         direct_typeid_declarator   : direct_typeid_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET
                                    | direct_typeid_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET
         direct_typeid_declarator   : direct_typeid_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET
         direct_typeid_declarator   : direct_typeid_declarator LPAREN parameter_type_list RPAREN
                                    | direct_typeid_declarator LPAREN identifier_list_opt RPAREN
         direct_typeid_noparen_declarator   : TYPEID
         direct_typeid_noparen_declarator   : direct_typeid_noparen_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
         direct_typeid_noparen_declarator   : direct_typeid_noparen_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET
                                    | direct_typeid_noparen_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET
         direct_typeid_noparen_declarator   : direct_typeid_noparen_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKET
         direct_typeid_noparen_declarator   : direct_typeid_noparen_declarator LPAREN parameter_type_list RPAREN
                                    | direct_typeid_noparen_declarator LPAREN identifier_list_opt RPAREN
         id_declarator  : direct_id_declarator
         id_declarator  : pointer direct_id_declarator
         typeid_declarator  : direct_typeid_declarator
         typeid_declarator  : pointer direct_typeid_declarator
         typeid_noparen_declarator  : direct_typeid_noparen_declarator
         typeid_noparen_declarator  : pointer direct_typeid_noparen_declarator
         translation_unit_or_empty   : translation_unit
                                        | empty
         translation_unit    : external_declaration
         translation_unit    : translation_unit external_declaration
         external_declaration    : function_definition
         external_declaration    : declaration
         external_declaration    : pp_directive
                                    | pppragma_directive
         external_declaration    : SEMI
         external_declaration    : static_assert
         static_assert           : _STATIC_ASSERT LPAREN constant_expression COMMA unified_string_literal RPAREN
                                    | _STATIC_ASSERT LPAREN constant_expression RPAREN
         pp_directive  : PPHASH
         pppragma_directive      : PPPRAGMA
                                    | PPPRAGMA PPPRAGMASTR
                                    | _PRAGMA LPAREN unified_string_literal RPAREN
         pppragma_directive_list : pppragma_directive
                                    | pppragma_directive_list pppragma_directive
         function_definition : id_declarator declaration_list_opt compound_statement
         function_definition : declaration_specifiers id_declarator declaration_list_opt compound_statement
         statement   : labeled_statement
                        | expression_statement
                        | compound_statement
                        | selection_statement
                        | iteration_statement
                        | jump_statement
                        | pppragma_directive
                        | static_assert
         pragmacomp_or_statement     : pppragma_directive_list statement
                                        | statement
         decl_body : declaration_specifiers init_declarator_list_opt
                      | declaration_specifiers_no_type id_init_declarator_list_opt
         declaration : decl_body SEMI
         declaration_list    : declaration
                                | declaration_list declaration
         declaration_specifiers_no_type  : type_qualifier declaration_specifiers_no_type_opt
         declaration_specifiers_no_type  : storage_class_specifier declaration_specifiers_no_type_opt
         declaration_specifiers_no_type  : function_specifier declaration_specifiers_no_type_opt
         declaration_specifiers_no_type  : atomic_specifier declaration_specifiers_no_type_opt
         declaration_specifiers_no_type  : alignment_specifier declaration_specifiers_no_type_opt
         declaration_specifiers  : declaration_specifiers type_qualifier
         declaration_specifiers  : declaration_specifiers storage_class_specifier
         declaration_specifiers  : declaration_specifiers function_specifier
         declaration_specifiers  : declaration_specifiers type_specifier_no_typeid
         declaration_specifiers  : type_specifier
         declaration_specifiers  : declaration_specifiers_no_type type_specifier
         declaration_specifiers  : declaration_specifiers alignment_specifier
         storage_class_specifier : AUTO
                                    | REGISTER
                                    | STATIC
                                    | EXTERN
                                    | TYPEDEF
                                    | _THREAD_LOCAL
         function_specifier  : INLINE
                                | _NORETURN
         type_specifier_no_typeid  : VOID
                                      | _BOOL
                                      | CHAR
                                      | SHORT
                                      | INT
                                      | LONG
                                      | FLOAT
                                      | DOUBLE
                                      | _COMPLEX
                                      | SIGNED
                                      | UNSIGNED
                                      | __INT128
         type_specifier  : typedef_name
                            | enum_specifier
                            | struct_or_union_specifier
                            | type_specifier_no_typeid
                            | atomic_specifier
         atomic_specifier  : _ATOMIC LPAREN type_name RPAREN
         type_qualifier  : CONST
                            | RESTRICT
                            | VOLATILE
                            | _ATOMIC
         init_declarator_list    : init_declarator
                                    | init_declarator_list COMMA init_declarator
         init_declarator : declarator
                            | declarator EQUALS initializer
         id_init_declarator_list    : id_init_declarator
                                       | id_init_declarator_list COMMA init_declarator
         id_init_declarator : id_declarator
                               | id_declarator EQUALS initializer
         specifier_qualifier_list    : specifier_qualifier_list type_specifier_no_typeid
         specifier_qualifier_list    : specifier_qualifier_list type_qualifier
         specifier_qualifier_list  : type_specifier
         specifier_qualifier_list  : type_qualifier_list type_specifier
         specifier_qualifier_list  : alignment_specifier
         specifier_qualifier_list  : specifier_qualifier_list alignment_specifier
         struct_or_union_specifier   : struct_or_union ID
                                        | struct_or_union TYPEID
         struct_or_union_specifier : struct_or_union brace_open struct_declaration_list brace_close
                                      | struct_or_union brace_open brace_close
         struct_or_union_specifier   : struct_or_union ID brace_open struct_declaration_list brace_close
                                        | struct_or_union ID brace_open brace_close
                                        | struct_or_union TYPEID brace_open struct_declaration_list brace_close
                                        | struct_or_union TYPEID brace_open brace_close
         struct_or_union : STRUCT
                            | UNION
         struct_declaration_list     : struct_declaration
                                        | struct_declaration_list struct_declaration
         struct_declaration : specifier_qualifier_list struct_declarator_list_opt SEMI
         struct_declaration : SEMI
         struct_declaration : pppragma_directive
         struct_declarator_list  : struct_declarator
                                    | struct_declarator_list COMMA struct_declarator
         struct_declarator : declarator
         struct_declarator   : declarator COLON constant_expression
                                | COLON constant_expression
         enum_specifier  : ENUM ID
                            | ENUM TYPEID
         enum_specifier  : ENUM brace_open enumerator_list brace_close
         enum_specifier  : ENUM ID brace_open enumerator_list brace_close
                            | ENUM TYPEID brace_open enumerator_list brace_close
         enumerator_list : enumerator
                            | enumerator_list COMMA
                            | enumerator_list COMMA enumerator
         alignment_specifier  : _ALIGNAS LPAREN type_name RPAREN
                                 | _ALIGNAS LPAREN constant_expression RPAREN
         enumerator  : ID
                        | ID EQUALS constant_expression
         declarator  : id_declarator
                        | typeid_declarator
         pointer : TIMES type_qualifier_list_opt
                    | TIMES type_qualifier_list_opt pointer
         type_qualifier_list : type_qualifier
                                | type_qualifier_list type_qualifier
         parameter_type_list : parameter_list
                                | parameter_list COMMA ELLIPSIS
         parameter_list  : parameter_declaration
                            | parameter_list COMMA parameter_declaration
         parameter_declaration   : declaration_specifiers id_declarator
                                    | declaration_specifiers typeid_noparen_declarator
         parameter_declaration   : declaration_specifiers abstract_declarator_opt
         identifier_list : identifier
                            | identifier_list COMMA identifier
         initializer : assignment_expression
         initializer : brace_open initializer_list_opt brace_close
                        | brace_open initializer_list COMMA brace_close
         initializer_list    : designation_opt initializer
                                | initializer_list COMMA designation_opt initializer
         designation : designator_list EQUALS
         designator_list : designator
                            | designator_list designator
         designator  : LBRACKET constant_expression RBRACKET
                        | PERIOD identifier
         type_name   : specifier_qualifier_list abstract_declarator_opt
         abstract_declarator     : pointer
         abstract_declarator     : pointer direct_abstract_declarator
         abstract_declarator     : direct_abstract_declarator
         direct_abstract_declarator  : LPAREN abstract_declarator RPAREN  direct_abstract_declarator  : direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKET
         direct_abstract_declarator  : LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKET
         direct_abstract_declarator  : direct_abstract_declarator LBRACKET TIMES RBRACKET
         direct_abstract_declarator  : LBRACKET TIMES RBRACKET
         direct_abstract_declarator  : direct_abstract_declarator LPAREN parameter_type_list_opt RPAREN
         direct_abstract_declarator  : LPAREN parameter_type_list_opt RPAREN
         direct_abstract_declarator  : LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKET
                                         | LBRACKET type_qualifier_list STATIC assignment_expression RBRACKET
         block_item  : declaration
                        | statement
         block_item_list : block_item
                            | block_item_list block_item
         compound_statement : brace_open block_item_list_opt brace_close  labeled_statement : ID COLON pragmacomp_or_statement  labeled_statement : CASE constant_expression COLON pragmacomp_or_statement  labeled_statement : DEFAULT COLON pragmacomp_or_statement  labeled_statement : ID COLON  labeled_statement : CASE constant_expression COLON  labeled_statement : DEFAULT COLON  selection_statement : IF LPAREN expression RPAREN pragmacomp_or_statement  selection_statement : IF LPAREN expression RPAREN statement ELSE pragmacomp_or_statement  selection_statement : SWITCH LPAREN expression RPAREN pragmacomp_or_statement  iteration_statement : WHILE LPAREN expression RPAREN pragmacomp_or_statement  iteration_statement : DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMI  iteration_statement : FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement  iteration_statement : FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN pragmacomp_or_statement  jump_statement  : GOTO ID SEMI  jump_statement  : BREAK SEMI  jump_statement  : CONTINUE SEMI  jump_statement  : RETURN expression SEMI
                            | RETURN SEMI
         expression_statement : expression_opt SEMI  expression  : assignment_expression
                        | expression COMMA assignment_expression
         assignment_expression : LPAREN compound_statement RPAREN  typedef_name : TYPEID  assignment_expression   : conditional_expression
                                    | unary_expression assignment_operator assignment_expression
         assignment_operator : EQUALS
                                | XOREQUAL
                                | TIMESEQUAL
                                | DIVEQUAL
                                | MODEQUAL
                                | PLUSEQUAL
                                | MINUSEQUAL
                                | LSHIFTEQUAL
                                | RSHIFTEQUAL
                                | ANDEQUAL
                                | OREQUAL
         constant_expression : conditional_expression  conditional_expression  : binary_expression
                                    | binary_expression CONDOP expression COLON conditional_expression
         binary_expression   : cast_expression
                                | binary_expression TIMES binary_expression
                                | binary_expression DIVIDE binary_expression
                                | binary_expression MOD binary_expression
                                | binary_expression PLUS binary_expression
                                | binary_expression MINUS binary_expression
                                | binary_expression RSHIFT binary_expression
                                | binary_expression LSHIFT binary_expression
                                | binary_expression LT binary_expression
                                | binary_expression LE binary_expression
                                | binary_expression GE binary_expression
                                | binary_expression GT binary_expression
                                | binary_expression EQ binary_expression
                                | binary_expression NE binary_expression
                                | binary_expression AND binary_expression
                                | binary_expression OR binary_expression
                                | binary_expression XOR binary_expression
                                | binary_expression LAND binary_expression
                                | binary_expression LOR binary_expression
         cast_expression : unary_expression  cast_expression : LPAREN type_name RPAREN cast_expression  unary_expression    : postfix_expression  unary_expression    : PLUSPLUS unary_expression
                                | MINUSMINUS unary_expression
                                | unary_operator cast_expression
         unary_expression    : SIZEOF unary_expression
                                | SIZEOF LPAREN type_name RPAREN
                                | _ALIGNOF LPAREN type_name RPAREN
         unary_operator  : AND
                            | TIMES
                            | PLUS
                            | MINUS
                            | NOT
                            | LNOT
         postfix_expression  : primary_expression  postfix_expression  : postfix_expression LBRACKET expression RBRACKET  postfix_expression  : postfix_expression LPAREN argument_expression_list RPAREN
                                | postfix_expression LPAREN RPAREN
         postfix_expression  : postfix_expression PERIOD ID
                                | postfix_expression PERIOD TYPEID
                                | postfix_expression ARROW ID
                                | postfix_expression ARROW TYPEID
         postfix_expression  : postfix_expression PLUSPLUS
                                | postfix_expression MINUSMINUS
         postfix_expression  : LPAREN type_name RPAREN brace_open initializer_list brace_close
                                | LPAREN type_name RPAREN brace_open initializer_list COMMA brace_close
         primary_expression  : identifier  primary_expression  : constant  primary_expression  : unified_string_literal
                                | unified_wstring_literal
         primary_expression  : LPAREN expression RPAREN  primary_expression  : OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPAREN
         offsetof_member_designator : identifier
                                         | offsetof_member_designator PERIOD identifier
                                         | offsetof_member_designator LBRACKET expression RBRACKET
         argument_expression_list    : assignment_expression
                                        | argument_expression_list COMMA assignment_expression
         identifier  : ID  constant    : INT_CONST_DEC
                        | INT_CONST_OCT
                        | INT_CONST_HEX
                        | INT_CONST_BIN
                        | INT_CONST_CHAR
         constant    : FLOAT_CONST
                        | HEX_FLOAT_CONST
         constant    : CHAR_CONST
                        | WCHAR_CONST
                        | U8CHAR_CONST
                        | U16CHAR_CONST
                        | U32CHAR_CONST
         unified_string_literal  : STRING_LITERAL
                                    | unified_string_literal STRING_LITERAL
         unified_wstring_literal : WSTRING_LITERAL
                                    | U8STRING_LITERAL
                                    | U16STRING_LITERAL
                                    | U32STRING_LITERAL
                                    | unified_wstring_literal WSTRING_LITERAL
                                    | unified_wstring_literal U8STRING_LITERAL
                                    | unified_wstring_literal U16STRING_LITERAL
                                    | unified_wstring_literal U32STRING_LITERAL
         brace_open  :   LBRACE
         brace_close :   RBRACE
        empty : z$end)����������	�
���@�Z�[�������c�)���ri���i����������������������������������������������������������!�������SEMI(0rrrrr	r
rrr
��
rr������������ �!�"�#�&�'�(�)�*�+�,�-�.�/�0�1�2�3�4�5�6�7�8�9�:�;�<r�E�F�G�H�I�J�K�L�M�N�O�Q�S�T�U�V�W�X�Yrr�a�b�c�d�e�f�g�h�i�j�k�l�n�o�p�u�v�w�y�z�{�|r������������������������������������������r��������������������������������������������������r����r�r�#�$�%�'�(�)�,�-�.�/�7�8�F�G�J�M�N�O�P�Q�R�S�T�U�V�W�X�Y�Z�\�]�a�br�d�e�f�h�i�q�r�s�t�u�v�w�x�y������������������������������������������������������������������������r�������������������.�/�0�1�2�4�7�9�B�C�F�K�L�N�P�Q�R(0rrrrrrrr r!rrr"r#����rrr������rr��������������������
����������������������������������������z����}����|����{������������������������r$rrrRr`�K������������������i����r`i��i���y����w����J�����������r%r&�������������r���������i����rRi�i��u����s����������W����V�������k����j���r�r'rrk������������������������������������������������������������������������������������������������r�r�r��h����a���r(r�^����]����o����m�����r�#����%����$���������������������������r�r���rr�r�r��
����	���r�r)�����x����v����<���r*���r+�����������������������������������������t����r����U���r��f���r��d����i����`���r�q����p����l���i��i���\����Z����n����~����O����N���r,�"���r�������������r������rr ��������r!���������������������������������������������������������������������������������������������T����S����g����e����_����X���� �������������������������r3r�������������;��������������r-������������������������[����Y�������rrrr�5�:������������������r�r����������D��������rrE������������rr���������PPHASH)rrrrr	r
rrr
rrrrrrrrrrrr)rrrrrrrr r!r"r#r$r%r&r'r(r)r*r+r,r-�PPPRAGMA)Prrrrr	r
rrr
rrrrrr|rrr�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr�r�r�rr�r�r�r�r�r�r�r�r�r�rrrrrrr r!rr/r0r1r2r9r:r;r<r=rArDrErFrGrHrI)Prrrrrrrr r!r"r#r$r%r&r�rr'rrrrr�r(r�r�rr�r�r�r�r�r�r�r�r�r�r�rr)r*r+rrr�r,r�rrr�rr�r�r�r�r�rrrrr
rrr
r-rrrrr!r�r�r"r#rr(r)rrr*r+�_PRAGMA)P�r/rrrrrr r!r"r#r$r%r&r�r/r'r/r/r/r/r�r(r�r�r/r�r�r�r�r�r�r�r�r�r�r�r/r)r*r+r/r/r�r,r�r/r/r�r/r�r�r�r�r�rrr/rr
rrr
r-rr/r/r/r!r�r�r"r#r/r(r)r/r/r*r+�_STATIC_ASSERT)Errrrr	r
rrr
rrrrrr|rr�rr�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr�r�r�r�r�r�r�r�r�r�rrrrrr r!rr/r0r1r2r9r:r;r<r=rArDrErFrGrHrI)E�r1rrrrrr r!r"r#r$r%r&r�r'r1r(r1r�r�r�r�r�r�r�r�r�r�r�r1r)r*r+r,r�r1r1r�r1r�r�r�r�r�rr1rr
rrr
r-rr1r1r1r!r�r�r"r#r1r(r)r1r1r*r+�ID((rrrrr	r
rrr
r/rr��r2r3r4r5r6r7r8r:�r;r<r=r>r?�$�%r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrV�>�?rrWrXrYrZr\r]r^r_r`�Prb�Rrr�^�_�`rkrlrmrnrorprqrsrx�q�r�s�tryrzr{�xr|r}r~�~rr��������������������������������r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�����r���r�r����rr��
������������������� �!�"�&�*�2�5�6�:�>�B�Cr��K�Lr�r�r�r�r�r��[r�r�r�r�rr�r�r�r��j�m�n�or�r�r�r�r�r�r��z�{�|�}�~����������������������������rrrr����rrr��rrrr r!������r�������	�
�r/r0r1r2�r3���#�$�%r9r:r;r<r=r�8�:�;rAr$rDrErFrGrHrI((r9r9rrrrrr r!r9r"r#r9r9rrrrKrLr9rrNrrOrPrQrRrSrzr}rTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirj�c����b���r$r9r9rRr`rlrmrnrorpr9r`r9r%r&r�rr�rwrxryrrzr{r|rRr�I����������G���r�r�r���r�r�r�r�r'r�r9r�rr�r�����������������r�r�r�r���������r�rr�r9r9r��H����F���r�r�r�r(r9r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r)rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr
r�r�r�r�r�r�r9r9rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r���������������������������������������������r���r�r�r�r�r�r�rr�r9r�rr�r�r�rrrr9r�rr�rr�r
rr�rr
r�7���rr-r�r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r�r(r)r�r�r*r+�LPAREN(wrrrrr	r
rrr
r/rrr/r3r1r1r4r2r3r4r5r6r7r8r9r:r5r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrV�=rrWrXrYrZr\r]r^r_r`r:rbr;rhrirrr<r=rjrkrlrmrnrorprqrs�mrxr?r@rArBryrzr{r|r}r~rDrr�r�rErFrGr�r�rIr�rJrKrLrMr�rNrOrPrQ�r�r�rRrSr�r�r��r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rTrUrVrWrXrYrZr[r�rr�r�r���r�r�r�r�r�r�r�r�r�r�r�r�r�r^��r_����r���r�rr�rarbrcrdrr�rrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryr�r�r|r}r�r�r�r�r~rr�r�r�r��?r�r��D�Er�r�r�r�r�r�r�r�r�r�r��_�`r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r
rrr
rrr��r�r�r�r�r�r�rrrrr�r�rrrr���rrrr r!r�r�r$r%r�rr�r'r(r�r+r,r�r�r����r�r�r�r/r0r1r2r�r3r�r�r6r7r�r�r��&�'�(�+�,�-r9r:r;r<r=rr?r�r@r��<�=�@�ArAr$rC�I�JrDrErFrGrHrI(wr3r3rrrrrr r!r;r"r#�\r3r<r>r3rrrrKrLr3rrMrNrrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_�}rarbrcrdrerfrgrhrirjrDr$r;r3rRr�rlrmrnrorpr;r`r;rHrur%r&rIrr>rwrxryrrzr{r|rRr�rr�r�r�r�r�r�r�r�r�r�rIr'r_rHr;r_rr�r�r_r�r�r�r�r�ryr|r|rIr}�+r�r�r�r�r�r�r��0r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r_rr�r�r;r_r�r�r�r(r;r�r�r�r_r�r�r�r�r�r�r�r�r�r�r�r�rIr�r_r�r�r_r�r_r)r�rr_rr�r*r�r+r_rIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIrIr_r_r�r�r_r_r�r�r�r�r�r_r_r�r�r�r�r�r������r�rIr�r�r�r�r�r�rIr�r�r�r�r�r�r,r�r_r_r�r_r_r_r_r_r�r�r_r�r�r�r_r�r�r�r�r�r�r�r�r�r�r�r�r_r�rIr�r_r_r�r�rIr�r�r�r�r�r�r�r�r�rrr�r_rr�r_r�rrrr;rIrr_rrIr�r
rr_rr
rr�rrrr-rIrrr_rrr_rr��.����(����*���r_r_r�rr_r_r_r_r_r_r�rrr�r_r_���������,����-����+����)���r!r�r�r"r#r_r%rr&r_���������'����&���r_r_r'��������r(r)r_r_r*r+�TIMES([rrrrr	r
rrr
r/rrr3r2r3r4r5r6r7r8r:r5r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrrWrXrYrZr\r]r^r_r`rbr;rrr<r=rkrlrmrnrorprqrsrxr?r@rArBryrzr{r|r}r~rDrr�rErFrGr�rIr�r�r�rJrKrLrMr�r�rNrOrPrQr�r�rRrSr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rTrUrVrWrXrYr[r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r^r_r�r�r�rrarbrcrdrr�rrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryr�r�r�r|r�r�r�r}r�r�r�r�r~rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrrrrrr	r
rrr
rr�r�r�r�r�rrrrr�r�rrrr�rrrr r!r�r�r&r�rr�r'r(r�r)r*r�r�r�r�r�r�r/r0r1r2r�r3r�r�r�r�r�r9r:r;r<r=rr?r�r@r�rAr$rCrDrErFrGrHrI([r5r5rrrrrr r!r5r"r#r5rrrrKrLr5rrNrrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$r5r5rRr`rlrmrnrorpr`r5r%r&rJrrwrxryrrzr{r|rRrr5r�r�r�r�r�r�r�r�r�rJr'rJr5rJrr�rJr�rfr�r�r�r�r�r�r�rJrJrJrJr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r~rr�r5r5rJr�r�r(r5r�r�r5rJr�r�r�r�r�r�r�r�r�r�r�r�rJrJrJrJr�r)rr�rr�r*r�r+rJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJrJr�r�r�rJr�r�r�rJr�r�r�r�r�rJrJr5��r�rJr�r�r�r�r�r�rJr�r�r5r�r�r,r�rJrJr�rJrJrJrJrJr�r�rJr�r�r�rJr�r�r�r�r�r�r�r�r�r�r�r�rJr�rJr�rJrJrJr�r�r�r�rfrfrfrfrfrfrfrfrfrfrfrfrfrfrfr�r�r�r�r�rrJrr�r�r�rrrr5rJrrJrrJr
rrJrr
rr�rrr-rJrrrJrrr�rr�rJrJr�rrJrJrJrJrJrJr�r�rJrJr!r�r�r"r#rJr%rr&rJrJrJr'r(r)rJrJr*r+�TYPEID)�rrrrr	r
rrr
�r/rrr1r2r3r4r5r6r7r8r9r:r5r;r<r=r>r?r6r7r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVr8r9r�C�DrWrXrYrZr[r\r]r^r_r`r:rbr;rrr>rjrkrlrmrnrorprqrsrxr?r@rArBryrzr{r|r}r~rr�rDrr��rErHr�rIrW�rXrZr[r�r�r�r�r�rr�r�r�r���r�r�r�r�r�r�r�r�r�r�r�r�r�r_rrrrzr{r|r}rrr�r��9r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�rrr�rrrrrrr�rrrrrr r!rr+r,r/r9r:r;r<r=rDrErHrI)�r?r?rrrrrr r!r?rir"r#rJrrrrKrLr?rrMrNrrOrPrQrRrSr{r~rTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr�r�r$r?���rir?rRr`r?rlrmrnrorprir`rir%r&r?rvrwrxryrrzr{r|rRrr�r�r�r�r�r�r�r�r�r�r?r?r?r'r?���rir?r�r?r�r?rir�r�r?r?r?r�r�r(rir�r�r�r?r�r?r�r�r�r�r�r�r�r�r�r�r�r?r)r*r+rrr?r?r?r?r�r�r?r�r?r�r?r�r?r�r�r�r�r�r�r�r�r?r�r�r,r�r�r�r�r�r�r?r�r�r�r�r�r?r?r�rrrrrirrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�ENUM)�rrrrr	r
rrr
rrrr1r2r3r4r7r8r9r:r>rLrMrNrOrPrQrRrSrTrUrVrrrrXrYrZr[rrr>rjrkrlrmrnrorprxrBryr|rr�rDrr�rrHr�rIrr[r�r�r�r�rr�r�rr�r�r�r�r�r�r�r�r�r�r�r�r_rrrr|r}rrr�r�rr�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�rrr�rrrrrrrr r!rr+r,r/r9r:r;r<r=rDrErHrI)�r6r6rrrrrr r!r6r"r#rJrrrr6rrMrNrr`rarbrcrdrerfrgrhrirjr$r6rr6rr`r6r%r&r6rvrwrxryrrzr{rr�r�r�r6r6r6r'r6rr6r�r6r6r�r6r6r6r�r(r�r�r6r6r�r�r�r�r�r�r�r�r�r�r�r6r)r*r+r6r6r6r6r�r�r6r6r6r6r�r�r6r�r�r,r�r�r�r�r�r�r6r�r�r�r�r�r6r6rrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�VOID)�rrrrr	r
rrr
rr/rrr1r2r3r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrrrrWrXrYrZr[r\r]r^r_r`rbrrr>rjrkrlrmrnrorprqrsrxrBryrzr{r|r}r~rr�rDrr�rrHr�rIrWrr[r�r�r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r_rrrr|r}rrr�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�rrr�rrrrrrrrrrrr r!rr+r,r/r9r:r;r<r=rDrErHrI)�r@r@rrrrrr r!r@r@r"r#rJrrrrKrLr@rrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$r@rr@r@rRr`r@rlrmrnrorpr`r%r&r@rvrwrxryrrzr{r|rRrr�r�r�r�r�r�r�r@r@r@r'r@rr@r�r@r@r@r�r@r@r@r�r�r(r@r�r�r�r@r�r@r@r�r�r�r�r�r�r�r�r�r�r�r@r)r*r+r@r@r@r@r�r�r@r@r�r@r�r@r�r�r�r�r�r�r�r�r@r�r�r,r�r�r�r�r�r�r@r�r�r�r�r�r@r@r�rrrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�_BOOL)�rArArrrrrr r!rArAr"r#rJrrrrKrLrArrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rArrArArRr`rArlrmrnrorpr`r%r&rArvrwrxryrrzr{r|rRrr�r�r�r�r�r�r�rArArAr'rArrAr�rArArAr�rArArAr�r�r(rAr�r�r�rAr�rArAr�r�r�r�r�r�r�r�r�r�r�rAr)r*r+rArArArAr�r�rArAr�rAr�rAr�r�r�r�r�r�r�r�rAr�r�r,r�r�r�r�r�r�rAr�r�r�r�r�rArAr�rrrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�CHAR)�rBrBrrrrrr r!rBrBr"r#rJrrrrKrLrBrrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rBrrBrBrRr`rBrlrmrnrorpr`r%r&rBrvrwrxryrrzr{r|rRrr�r�r�r�r�r�r�rBrBrBr'rBrrBr�rBrBrBr�rBrBrBr�r�r(rBr�r�r�rBr�rBrBr�r�r�r�r�r�r�r�r�r�r�rBr)r*r+rBrBrBrBr�r�rBrBr�rBr�rBr�r�r�r�r�r�r�r�rBr�r�r,r�r�r�r�r�r�rBr�r�r�r�r�rBrBr�rrrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�SHORT)�rCrCrrrrrr r!rCrCr"r#rJrrrrKrLrCrrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rCrrCrCrRr`rCrlrmrnrorpr`r%r&rCrvrwrxryrrzr{r|rRrr�r�r�r�r�r�r�rCrCrCr'rCrrCr�rCrCrCr�rCrCrCr�r�r(rCr�r�r�rCr�rCrCr�r�r�r�r�r�r�r�r�r�r�rCr)r*r+rCrCrCrCr�r�rCrCr�rCr�rCr�r�r�r�r�r�r�r�rCr�r�r,r�r�r�r�r�r�rCr�r�r�r�r�rCrCr�rrrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�INT)�rDrDrrrrrr r!rDrDr"r#rJrrrrKrLrDrrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rDrrDrDrRr`rDrlrmrnrorpr`r%r&rDrvrwrxryrrzr{r|rRrr�r�r�r�r�r�r�rDrDrDr'rDrrDr�rDrDrDr�rDrDrDr�r�r(rDr�r�r�rDr�rDrDr�r�r�r�r�r�r�r�r�r�r�rDr)r*r+rDrDrDrDr�r�rDrDr�rDr�rDr�r�r�r�r�r�r�r�rDr�r�r,r�r�r�r�r�r�rDr�r�r�r�r�rDrDr�rrrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�LONG)�rErErrrrrr r!rErEr"r#rJrrrrKrLrErrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rErrErErRr`rErlrmrnrorpr`r%r&rErvrwrxryrrzr{r|rRrr�r�r�r�r�r�r�rErErEr'rErrEr�rErErEr�rErErEr�r�r(rEr�r�r�rEr�rErEr�r�r�r�r�r�r�r�r�r�r�rEr)r*r+rErErErEr�r�rErEr�rEr�rEr�r�r�r�r�r�r�r�rEr�r�r,r�r�r�r�r�r�rEr�r�r�r�r�rErEr�rrrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�FLOAT)�rFrFrrrrrr r!rFrFr"r#rJrrrrKrLrFrrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rFrrFrFrRr`rFrlrmrnrorpr`r%r&rFrvrwrxryrrzr{r|rRrr�r�r�r�r�r�r�rFrFrFr'rFrrFr�rFrFrFr�rFrFrFr�r�r(rFr�r�r�rFr�rFrFr�r�r�r�r�r�r�r�r�r�r�rFr)r*r+rFrFrFrFr�r�rFrFr�rFr�rFr�r�r�r�r�r�r�r�rFr�r�r,r�r�r�r�r�r�rFr�r�r�r�r�rFrFr�rrrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�DOUBLE)�rGrGrrrrrr r!rGrGr"r#rJrrrrKrLrGrrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rGrrGrGrRr`rGrlrmrnrorpr`r%r&rGrvrwrxryrrzr{r|rRrr�r�r�r�r�r�r�rGrGrGr'rGrrGr�rGrGrGr�rGrGrGr�r�r(rGr�r�r�rGr�rGrGr�r�r�r�r�r�r�r�r�r�r�rGr)r*r+rGrGrGrGr�r�rGrGr�rGr�rGr�r�r�r�r�r�r�r�rGr�r�r,r�r�r�r�r�r�rGr�r�r�r�r�rGrGr�rrrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�_COMPLEX)�rHrHrrrrrr r!rHrHr"r#rJrrrrKrLrHrrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rHrrHrHrRr`rHrlrmrnrorpr`r%r&rHrvrwrxryrrzr{r|rRrr�r�r�r�r�r�r�rHrHrHr'rHrrHr�rHrHrHr�rHrHrHr�r�r(rHr�r�r�rHr�rHrHr�r�r�r�r�r�r�r�r�r�r�rHr)r*r+rHrHrHrHr�r�rHrHr�rHr�rHr�r�r�r�r�r�r�r�rHr�r�r,r�r�r�r�r�r�rHr�r�r�r�r�rHrHr�rrrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�SIGNED)�rIrIrrrrrr r!rIrIr"r#rJrrrrKrLrIrrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rIrrIrIrRr`rIrlrmrnrorpr`r%r&rIrvrwrxryrrzr{r|rRrr�r�r�r�r�r�r�rIrIrIr'rIrrIr�rIrIrIr�rIrIrIr�r�r(rIr�r�r�rIr�rIrIr�r�r�r�r�r�r�r�r�r�r�rIr)r*r+rIrIrIrIr�r�rIrIr�rIr�rIr�r�r�r�r�r�r�r�rIr�r�r,r�r�r�r�r�r�rIr�r�r�r�r�rIrIr�rrrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�UNSIGNED)�rJrJrrrrrr r!rJrJr"r#rJrrrrKrLrJrrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rJrrJrJrRr`rJrlrmrnrorpr`r%r&rJrvrwrxryrrzr{r|rRrr�r�r�r�r�r�r�rJrJrJr'rJrrJr�rJrJrJr�rJrJrJr�r�r(rJr�r�r�rJr�rJrJr�r�r�r�r�r�r�r�r�r�r�rJr)r*r+rJrJrJrJr�r�rJrJr�rJr�rJr�r�r�r�r�r�r�r�rJr�r�r,r�r�r�r�r�r�rJr�r�r�r�r�rJrJr�rrrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�__INT128)�rKrKrrrrrr r!rKrKr"r#rJrrrrKrLrKrrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rKrrKrKrRr`rKrlrmrnrorpr`r%r&rKrvrwrxryrrzr{r|rRrr�r�r�r�r�r�r�rKrKrKr'rKrrKr�rKrKrKr�rKrKrKr�r�r(rKr�r�r�rKr�rKrKr�r�r�r�r�r�r�r�r�r�r�rKr)r*r+rKrKrKrKr�r�rKrKr�rKr�rKr�r�r�r�r�r�r�r�rKr�r�r,r�r�r�r�r�r�rKr�r�r�r�r�rKrKr�rrrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�_ATOMIC)�rrrrr	r
rrr
rr/rrr1r2r3r4r5r6r7r8r9r:r5r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrrrrWrXrYrZr[r\r]r^r_r`rbrrr=r>rjrkrlrmrnrorprqrsrxrArBryrzr{r|r}r~rr�rDrr�rrGrHr�rIrUrVrWrr[r�r�r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r_rrcrdrrr|r}rrr�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�rrr�r�r�r�rrrrrrrrrrrr r!rr+r,r�r�r/r9r:r;r<r=rDrErHrI)�rLrLrrrrrr r!rZrbr"r#rJrZrZrZrKrLr�rZrMrNrbrOrPrQrZrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rZrrbr�rZr`rZrlrmrnrorpr`r%r&rbrLrvrwrxryrZrzr{r|rRrrbr�r�r�r�r�r�r�rLrLrLr'rZrrbrLr�rLrbrbrbr�r�rLrLrLr�r�r(rbr�r�r�rZr�rbrZr�r�r�r�r�r�r�r�r�r�r�rLr)rbrbr*r+rLrLrLrLr�r�rLrLrbr�rLr�rLr�r�r�r�r�r�r�r�rLr�r�r,r�r�r�r�r�r�rZr�r�r�r�r�rbrLrbrbrLr�rrrrrrrr
r�rr
r-rrrbrbrr!r�r�r"r#r(r)r*r+�CONST)�rrrrr	r
rrr
rr/rrr1r2r3r4r5r6r8r9r:r5r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrrrrWrYrZr[r\r]r^r_r`rbrrr=r>rjrnrqrsrArBrzr{r|r}r~rr�rDrr�rrGrHr�rIrUrVrWr[r�r�r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r_rrcrdrrr|r}rrr�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�rrr�r�r�r�rrrrrrrrrrrr r!rr+r,r�r�r/r9r:r;r<r=rDrErHrI)�rMrMrrrrrr r!rMrMr"r#rJrMrMrMrKrLrMrMrNrMrOrPrQrMrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rMrrMrMr`rMrlrmrnrorpr`r%r&rMrMrvrMr|rRrMr�r�r�r�r�r�rMrMrMr'rMrrMrMr�rMrMrMrMr�rMrMrMr�r�r(rMr�r�r�rMr�rMrMr�r�r�r�r�r�r�r�r�r�r�rMr)rMrMr*r+rMrMrMrMr�r�rMrMrMr�rMr�rMr�r�r�r�r�r�r�r�rMr�r�r,r�r�r�r�r�r�rMr�r�r�r�r�rMrMrMrMrMr�rrrrrrrr
r�rr
r-rrrMrMrr!r�r�r"r#r(r)r*r+�RESTRICT)�rNrNrrrrrr r!rNrNr"r#rJrNrNrNrKrLrNrMrNrNrOrPrQrNrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rNrrNrNr`rNrlrmrnrorpr`r%r&rNrNrvrNr|rRrNr�r�r�r�r�r�rNrNrNr'rNrrNrNr�rNrNrNrNr�rNrNrNr�r�r(rNr�r�r�rNr�rNrNr�r�r�r�r�r�r�r�r�r�r�rNr)rNrNr*r+rNrNrNrNr�r�rNrNrNr�rNr�rNr�r�r�r�r�r�r�r�rNr�r�r,r�r�r�r�r�r�rNr�r�r�r�r�rNrNrNrNrNr�rrrrrrrr
r�rr
r-rrrNrNrr!r�r�r"r#r(r)r*r+�VOLATILE)�rOrOrrrrrr r!rOrOr"r#rJrOrOrOrKrLrOrMrNrOrOrPrQrOrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rOrrOrOr`rOrlrmrnrorpr`r%r&rOrOrvrOr|rRrOr�r�r�r�r�r�rOrOrOr'rOrrOrOr�rOrOrOrOr�rOrOrOr�r�r(rOr�r�r�rOr�rOrOr�r�r�r�r�r�r�r�r�r�r�rOr)rOrOr*r+rOrOrOrOr�r�rOrOrOr�rOr�rOr�r�r�r�r�r�r�r�rOr�r�r,r�r�r�r�r�r�rOr�r�r�r�r�rOrOrOrOrOr�rrrrrrrr
r�rr
r-rrrOrOrr!r�r�r"r#r(r)r*r+�AUTO)�rrrrr	r
rrr
rr/rrr1r2r3r4r5r6r8r9r:r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrrrrWrYrZr[r\r]r^r_r`rbrrr>rjrnrqrsrzr{r|r}r~rr�rrHr�rWr�rr�r�r�r�r�r�r�r�r�r�r�r�rrrr�r�rr�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�rrr�rrrrrrrrrrr r!rr+r,r/r9r:r;r<r=rDrErHrI)�rPrPrrrrrr r!rPrPr"r#rJrPrPrPrKrLrPrMrNrOrPrQrPrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rPrrPrPr`rPrlrmrnrorpr`r%r&rPrvrPr|rRr�r�r�r�r�r'rPrrPr�rPr�r(rPr�r�r�r�r�r�r�r�r�r�r�r)r*r+r�r�rPrPr�r�r�r�r�rPr�r�r,r�r�r�r�r�r�rPr�r�r�r�r�rPrPr�rrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�REGISTER)�rQrQrrrrrr r!rQrQr"r#rJrQrQrQrKrLrQrMrNrOrPrQrQrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rQrrQrQr`rQrlrmrnrorpr`r%r&rQrvrQr|rRr�r�r�r�r�r'rQrrQr�rQr�r(rQr�r�r�r�r�r�r�r�r�r�r�r)r*r+r�r�rQrQr�r�r�r�r�rQr�r�r,r�r�r�r�r�r�rQr�r�r�r�r�rQrQr�rrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�STATIC)�rrrrr	r
rrr
rr/rrr1r2r3r4r5r6r8r9r:r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrrrrWrYrZr[r\r]r^r_r`rbrrr=r>rjrnrqrsrBrzr{r|r}r~rr�rrGrHr�rVrWr[r�rr�r�r�r�r�r�r�r�r�r�r�r�rrdrrr�r�rr�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�rrr�r�r�rrrrrrrrrrr r!rr+r,r�r/r9r:r;r<r=rDrErHrI)�r:r:rrrrrr r!r:r:r"r#rJr:r:r:rKrLr:rMrNrOrPrQr:rSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$r:rr:r:r`r:rlrmrnrorpr`r%r&rUr:rvr:r|rRr�r�r�r�r�r�r'r:rrcr:r�r�r:r�r�r(r:r�r�r�r�r�r�r�r�r�r�r�r)r�r*r+r�r�r:r:r�r�r�r�r�r�r:r�r�r,r�r�r�r�r�r�r:r�r�r�r�r�r�r:r�r:r�rrrrrrr
r�rr
r-rrr�rr!r�r�r"r#r(r)r*r+�EXTERN)�rRrRrrrrrr r!rRrRr"r#rJrRrRrRrKrLrRrMrNrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rRrrRrRr`rRrlrmrnrorpr`r%r&rRrvrRr|rRr�r�r�r�r�r'rRrrRr�rRr�r(rRr�r�r�r�r�r�r�r�r�r�r�r)r*r+r�r�rRrRr�r�r�r�r�rRr�r�r,r�r�r�r�r�r�rRr�r�r�r�r�rRrRr�rrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�TYPEDEF)�rSrSrrrrrr r!rSrSr"r#rJrSrSrSrKrLrSrMrNrOrPrQrSrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rSrrSrSr`rSrlrmrnrorpr`r%r&rSrvrSr|rRr�r�r�r�r�r'rSrrSr�rSr�r(rSr�r�r�r�r�r�r�r�r�r�r�r)r*r+r�r�rSrSr�r�r�r�r�rSr�r�r,r�r�r�r�r�r�rSr�r�r�r�r�rSrSr�rrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�
_THREAD_LOCAL)�rTrTrrrrrr r!rTrTr"r#rJrTrTrTrKrLrTrMrNrOrPrQrTrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rTrrTrTr`rTrlrmrnrorpr`r%r&rTrvrTr|rRr�r�r�r�r�r'rTrrTr�rTr�r(rTr�r�r�r�r�r�r�r�r�r�r�r)r*r+r�r�rTrTr�r�r�r�r�rTr�r�r,r�r�r�r�r�r�rTr�r�r�r�r�rTrTr�rrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�INLINE)�rUrUrrrrrr r!rUrUr"r#rJrUrUrUrKrLrUrMrNrOrPrQrUrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rUrrUrUr`rUrlrmrnrorpr`r%r&rUrvrUr|rRr�r�r�r�r�r'rUrrUr�rUr�r(rUr�r�r�r�r�r�r�r�r�r�r�r)r*r+r�r�rUrUr�r�r�r�r�rUr�r�r,r�r�r�r�r�r�rUr�r�r�r�r�rUrUr�rrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�	_NORETURN)�rVrVrrrrrr r!rVrVr"r#rJrVrVrVrKrLrVrMrNrOrPrQrVrSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$rVrrVrVr`rVrlrmrnrorpr`r%r&rVrvrVr|rRr�r�r�r�r�r'rVrrVr�rVr�r(rVr�r�r�r�r�r�r�r�r�r�r�r)r*r+r�r�rVrVr�r�r�r�r�rVr�r�r,r�r�r�r�r�r�rVr�r�r�r�r�rVrVr�rrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�_ALIGNAS)�rrrrr	r
rrr
rr/rrr1r2r3r4r5r6r8r9r:r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrLrMrNrOrPrQrRrSrTrUrVrrrrWrYrZr[r\r]r^r_r`rbrrr>rjrnrqrsrzr{r|r}r~rr�rDrr�rrHr�rIrWr�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r_rrrr|r}rrr�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�rrr�rrrrrrrrrrrr r!rr+r,r/r9r:r;r<r=rDrErHrI)�r�r�rrrrrr r!r�r�r"r#rJr�r�r�rKrLr�rMrNrOrPrQr�rSrTrUrVrWrXrYrZr[r\r]r^r_r`rarbrcrdrerfrgrhrirjr$r�rr�r�r`r�rlrmrnrorpr`r%r&r�rvr�r|rRr�r�r�r�r�r�r�r�r'r�rr�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r)r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�STRUCT)�r8r8rrrrrr r!r8r"r#rJrrrr8rrMrNrr`rarbrcrdrerfrgrhrirjr$r8rr8rr`r8r%r&r8rvrwrxryrrzr{rr�r�r�r8r8r8r'r8rr8r�r8r8r�r8r8r8r�r(r�r�r8r8r�r�r�r�r�r�r�r�r�r�r�r8r)r*r+r8r8r8r8r�r�r8r8r8r8r�r�r8r�r�r,r�r�r�r�r�r�r8r�r�r�r�r�r8r8rrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�UNION)�r9r9rrrrrr r!r9r"r#rJrrrr9rrMrNrr`rarbrcrdrerfrgrhrirjr$r9rr9rr`r9r%r&r9rvrwrxryrrzr{rr�r�r�r9r9r9r'r9rr9r�r9r9r�r9r9r9r�r(r�r�r9r9r�r�r�r�r�r�r�r�r�r�r�r9r)r*r+r9r9r9r9r�r�r9r9r9r9r�r�r9r�r�r,r�r�r�r�r�r�r9r�r�r�r�r�r9r9rrrrr
r�rr
r-rrrr!r�r�r"r#r(r)r*r+�LBRACE)crrr1r9r6r7r8r9�A�Brrr[rrrjrzr{r|r}r~r�r�rFr�rYrr�r�r�r�r�r�r�r�r�r�r�r�r_r�rarrr�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr�rrr r!r�r�r�r�r)r+r,r/r0r1r2r�r�r9r:r;r<r=r�rArDrErFrGrHrI)crr#rJrMr|r|r�r�r|i����i����rrr%r&rvr|r|r�r|r|r|rr|r|r�r|r(r|r�r�r�r�r�r�r�r�r�r�r�r|r|rr*r+r�r�r,r�r|r|r�r|r�r�r�r�r�r�r|r�r|r�r�rr|rr|r
rrr
rr�rr-r|r|rrrr|r|r|r|r�r!r�r�r"r#rr|r(r)r|r|r*r+�RBRACE)�rrrr|rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�����r�r�r�r�r�rr�r���r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rarr�rr�r�r�r�r�r�r�r�r�r��H�Ir�r�r�r�rr�r�r�r�r�r�r�r�r���r�r�r�r�r�r�r�r�r�r�rrrrrrrrrr	r
rrr
r����rrrrrrrr r!r"r#r���r&rr'r(r)r*r/r5�r8r9r:r;r<r=�6r?r�r@rCrDrErHrI)�r#r%r&r�rrr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�R����M���rrrr�r(r�r�r���i����r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr*r�r+r�r�r�r�r�r�r�r�r�r�rr�Q���rrr�r,r�r�r�r�r�r�r�r�r�ri��i��r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��P����L���rrrrrr
r�rr
rrr�9���rr-rrrrrrrr r!r�r�r"r#�8���r%rr&r'r(r)r*r+�CASE)8rrrr|r�rr�r�r�r�r�r�r�r�r�r�r�r�r�rrrr�r�r�r�r�r�r�r�r�r�rrrrrr r!rr/r0r1r2r9r:r;r<r=rArDrErFrGrHrI)8r#r%r&r�r^r(r^r�r�r�r�r�r�r�r�r�r�r�r^r*r+r,r�r^r^r�r^r�r�r�r�r�rr^rr
rrr
r-rr^r^r^r!r�r�r"r#r^r(r)r^r^r*r+�DEFAULT)8r#r%r&r���r(rWr�r�r�r�r�r�r�r�r�r�r�rWr*r+r,r�rWrWr�rWr�r�r�r�r�rrWrr
rrr
r-rrWrWrWr!r�r�r"r#rWr(r)rWrWr*r+�IF)8r#r%r&r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r*r+r,r�r�r�r�r�r�r�r�r�r�rr�rr
rrr
r-rr�r�r�r!r�r�r"r#r�r(r)r�r�r*r+�SWITCH)8r#r%r&r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r*r+r,r�r�r�r�r�r�r�r�r�r�rr�rr
rrr
r-rr�r�r�r!r�r�r"r#r�r(r)r�r�r*r+�WHILE)9rrrr|r�rr�r�r�r�r�r�r�r�r�r�r�r�r�rrrr�r�r�r��pr�r�r�r�r�r�rrrrrr r!rr/r0r1r2r9r:r;r<r=rArDrErFrGrHrI)9r#r%r&r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r*r+r,r�r�r�r�r�r�r�r�r�r�r�rr�rr
rrr
r-rr�r�r�r!r�r�r"r#r�r(r)r�r�r*r+�DO)8r#r%r&r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r*r+r,r�r�r�r�r�r�r�r�r�r�rr�rr
rrr
r-rr�r�r�r!r�r�r"r#r�r(r)r�r�r*r+�FOR)8r#r%r&r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r*r+r,r�r�r�r�r�r�r�r�r�r�rr�rr
rrr
r-rr�r�r�r!r�r�r"r#r�r(r)r�r�r*r+�GOTO)8r#r%r&r�r`r(r`r�r�r�r�r�r�r�r�r�r�r�r`r*r+r,r�r`r`r�r`r�r�r�r�r�rr`rr
rrr
r-rr`r`r`r!r�r�r"r#r`r(r)r`r`r*r+�BREAK)8r#r%r&r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r*r+r,r�r�r�r�r�r�r�r�r�r�rr�rr
rrr
r-rr�r�r�r!r�r�r"r#r�r(r)r�r�r*r+�CONTINUE)8r#r%r&r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r*r+r,r�r�r�r�r�r�r�r�r�r�rr�rr
rrr
r-rr�r�r�r!r�r�r"r#r�r(r)r�r�r*r+�RETURN)8r#r%r&r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r*r+r,r�r�r�r�r�r�r�r�r�r�rr�rr
rrr
r-rr�r�r�r!r�r�r"r#r�r(r)r�r�r*r+�PLUSPLUS)�rrMrNrOrbrrr<r=r@rArBr|rDr�rFrGr�rIr�rJrKrLrMr�rNrOrPrQr�r�rRrSr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rTrUrVrYr[rr�r�r�r�r�r�r�r�r�r�r�r�r�r^r_r�r�rarbrcrdrr�rrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryr�r�r|r}r�r�r�r�r~rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r
rrr
rr�r�r�r�r�r�rrrr�rrrr r!r�r�r�rr�r'r(r�r�r�r�r�r�r�r/r0r1r2r�r3r�r�r�r�r�r9r:r;r<r=rr?r�r@r�rAr$rCrDrErFrGrHrI)�r#rarbrcr`r%r&rNrr�r�r�r�rNrNrNrr�rNr�r�r�r�r�r�rNrNrNrNr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rNrr�rNr�r(rNr�r�r�r�r�r�r�r�r�r�r�r�rNrNrNrNrrNrr�r*r�r+rNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNrNr�r�rNrNr�r�r�r�r�rNrNrrNrNr,r�rNrNr�rNrNrNrNrNr�r�rNr�r�r�rNr�r�r�r�r�r�r�r�r�r�r�r�rNr�rNr�rNrNrNr�r�r�r�r�r�rrNrr�rNrNrrNrrNr
rrNrr
rr�rr-rNrrrNrNrr�rNrNr�rrNrNrNrNrNrNr�r�rNrNr!r�r�r"r#rNr%rr&rNrNrNr'r(r)rNrNr*r+�
MINUSMINUS)�r#rarbrcr`r%r&rOrr�r�r�r�rOrOrOrr�rOr�r�r�r�r�r�rOrOrOrOr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rOrr�rOr�r(rOr�r�r�r�r�r�r�r�r�r�r�r�rOrOrOrOrrOrr�r*r�r+rOrOrOrOrOrOrOrOrOrOrOrOrOrOrOrOrOrOrOrOrOr�r�rOrOr�r�r�r�r�rOrOrrOrOr,r�rOrOr�rOrOrOrOrOr�r�rOr�r�r�rOr�r�r�r�r�r�r�r�r�r�r�r�rOr�rOr�rOrOrOr�r�r�r�r�r�rrOrr�rOrOrrOrrOr
rrOrr
rr�rr-rOrrrOrOrr�rOrOr�rrOrOrOrOrOrOr�r�rOrOr!r�r�r"r#rOr%rr&rOrOrOr'r(r)rOrOr*r+�SIZEOF)�rrMrNrOrbrrr<r=r@rArBr|rDr�rFrGrIrJrKrLrMrNrOrPrQrRrSrTrUrVrYr[rr�r�r�r�r�r�r�r�r�r�r�r�r^r_r�r�rarbrcrdrrrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryr|r}r~rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr�rrrr r!r�r�r�rr�r�r�r�r�r�r�r�r/r0r1r2r�r3r�r�r�r�r�r9r:r;r<r=rr�r�rAr$rDrErFrGrHrI)�r#rarbrcr`r%r&rQrr�r�r�r�rQrQrQrrQr�r�r�r�rQrQrQrQr�r�rQrr�rQr�r(rQr�r�r�r�r�r�r�r�r�r�r�rQrQrQrQrrQrr�r*r+rQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQrQr�rQrQrrQrQr,r�rQrQr�rQrQrQrQrQr�r�rQr�r�r�rQr�r�r�r�r�r�r�r�r�r�r�r�rQr�rQr�rQrQrQrrQrr�rQrQrrQrrQr
rrQrr
rr�rr-rQrQrQrr�rQrQr�rrQrQrQrQrQrQr�r�rQrQr!r�r�r"r#rQrrQrQrQr(r)rQrQr*r+�_ALIGNOF)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�AND)�rrMrNrOrbrrr<r=r@rArBr|rDr�rFrGr�rIr�r�r�rJrKrLrMr�r�rNrOrPrQr�r�rRrSr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rTrUrVrYr[rr�r�r�r�r�r�r�r�r�r�r�r�r�r^r_r�r�r�rarbrcrdrr�rrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryr�r�r�r|r�r�r�r}r�r�r�r�r~rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrrrrrr	r
rrr
rr�r�r�r�r�r�rrrr�rrrr r!r�r�r&r�rr�r'r(r�r)r*r�r�r�r�r�r�r/r0r1r2r�r3r�r�r�r�r�r9r:r;r<r=rr?r�r@r�rAr$rCrDrErFrGrHrI)�r#rarbrcr`r%r&rMrr�r�r�r�rMrMrMrr�rMr�rsr�r�r�r�r�r�r�rMrMrMrMr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rMrr�rMr�r(rMr�r�r�r�r�r�r�r�r�r�r�r�rMrMrMrMr�rrMrr�r*r�r+rMrMrMrMrMrMrMrMrMrMrMrMrMrMrMrMrMrMrMrMrMr�r�r�rMr�r�r�rMr�r�r�r�r�rMrMrrMrMr,r�rMrMr�rMrMrMrMrMr�r�rMr�r�r�rMr�r�r�r�r�r�r�r�r�r�r�r�rMr�rMr�rMrMrMr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rsrsrsrsr�r�r�r�r�rrMrr�rMrMrrMrrMr
rrMrr
rr�rrr-rMrrrMrrrMrr�rMrMr�rrMrMrMrMrMrMr�r�rMrMr!r�r�r"r#rMr%rr&rMrMrMr'r(r)rMrMr*r+�PLUS)�r#rarbrcr`r%r&rKrr�r�r�r�rKrKrKrr�rKr�rir�r�r�r�r�r�r�rKrKrKrKr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rKrr�rKr�r(rKr�r�r�r�r�r�r�r�r�r�r�r�rKrKrKrKr�rrKrr�r*r�r+rKrKrKrKrKrKrKrKrKrKrKrKrKrKrKrKrKrKrKrKrKr�r�r�rKr�r�r�rKr�r�r�r�r�rKrKrrKrKr,r�rKrKr�rKrKrKrKrKr�r�rKr�r�r�rKr�r�r�r�r�r�r�r�r�r�r�r�rKr�rKr�rKrKrKr�r�r�r�r�r�riririririririririririririr�r�r�r�r�rrKrr�rKrKrrKrrKr
rrKrr
rr�rrr-rKrrrKrrrKrr�rKrKr�rrKrKrKrKrKrKr�r�rKrKr!r�r�r"r#rKr%rr&rKrKrKr'r(r)rKrKr*r+�MINUS)�r#rarbrcr`r%r&rLrr�r�r�r�rLrLrLrr�rLr�rjr�r�r�r�r�r�r�rLrLrLrLr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rLrr�rLr�r(rLr�r�r�r�r�r�r�r�r�r�r�r�rLrLrLrLr�rrLrr�r*r�r+rLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLrLr�r�r�rLr�r�r�rLr�r�r�r�r�rLrLrrLrLr,r�rLrLr�rLrLrLrLrLr�r�rLr�r�r�rLr�r�r�r�r�r�r�r�r�r�r�r�rLr�rLr�rLrLrLr�r�r�r�r�r�rjrjrjrjrjrjrjrjrjrjrjrjrjr�r�r�r�r�rrLrr�rLrLrrLrrLr
rrLrr
rr�rrr-rLrrrLrrrLrr�rLrLr�rrLrLrLrLrLrLr�r�rLrLr!r�r�r"r#rLr%rr&rLrLrLr'r(r)rLrLr*r+�NOT)�r#rarbrcr`r%r&rRrr�r�r�r�rRrRrRrrRr�r�r�r�rRrRrRrRr�r�rRrr�rRr�r(rRr�r�r�r�r�r�r�r�r�r�r�rRrRrRrRrrRrr�r*r+rRrRrRrRrRrRrRrRrRrRrRrRrRrRrRrRrRrRrRrRrRrRrRr�rRrRrrRrRr,r�rRrRr�rRrRrRrRrRr�r�rRr�r�r�rRr�r�r�r�r�r�r�r�r�r�r�r�rRr�rRr�rRrRrRrrRrr�rRrRrrRrrRr
rrRrr
rr�rr-rRrRrRrr�rRrRr�rrRrRrRrRrRrRr�r�rRrRr!r�r�r"r#rRrrRrRrRr(r)rRrRr*r+�LNOT)�r#rarbrcr`r%r&rSrr�r�r�r�rSrSrSrrSr�r�r�r�rSrSrSrSr�r�rSrr�rSr�r(rSr�r�r�r�r�r�r�r�r�r�r�rSrSrSrSrrSrr�r*r+rSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSrSr�rSrSrrSrSr,r�rSrSr�rSrSrSrSrSr�r�rSr�r�r�rSr�r�r�r�r�r�r�r�r�r�r�r�rSr�rSr�rSrSrSrrSrr�rSrSrrSrrSr
rrSrr
rr�rr-rSrSrSrr�rSrSr�rrSrSrSrSrSrSr�r�rSrSr!r�r�r"r#rSrrSrSrSr(r)rSrSr*r+�OFFSETOF)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�
INT_CONST_DEC)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�
INT_CONST_OCT)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�
INT_CONST_HEX)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�
INT_CONST_BIN)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�INT_CONST_CHAR)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�FLOAT_CONST)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�HEX_FLOAT_CONST)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�
CHAR_CONST)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�WCHAR_CONST)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�U8CHAR_CONST)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�
U16CHAR_CONST)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�
U32CHAR_CONST)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�STRING_LITERAL)�rrMrNrOrbrrr�r<r=r@rArBr|rDr�rFrG�r�rIr�rJrKrLrMrNrOrPrQrRrSrTrUrVrYr[rr�r�r�r�r�r�r�r�r�r�r�r�r^r_r�r�rarbrcrdrr��
rrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryr|r}r~rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��r�r�r�r�r�r�rrrr�rrrr r!r�r�r�rr�r�r�r�r�r�r�r�r/r0r1r2r�r3r�r�r�r�r�r9r:r;r<r=rr�r�rAr$rDrErFrGrHrI)�r#rarbrcr`r%r&r�r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r�r�r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�WSTRING_LITERAL)�rrMrNrOrbrrr<r=r@rArBr|rDr�rFrGrIrJrKrLrMrNrOrPrQrRrSr�r�r�r�r�rTrUrVrYr[rr�r�r�r�r�r�r�r�r�r�r�r�r^r_r�r�rarbrcrdrrrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryr|r}r�r�r�r�r~rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr�rrrr r!r�r�r�rr�r�r�r�r�r�r�r�r/r0r1r2r�r3r�r�r�r�r�r9r:r;r<r=rr�r�rAr$rDrErFrGrHrI)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�U8STRING_LITERAL)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�U16STRING_LITERAL)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�U32STRING_LITERAL)�r#rarbrcr`r%r&r�rr�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r*r+r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r,r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�rr�rr�r
rr�rr
rr�rr-r�r�r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r!r�r�r"r#r�rr�r�r�r(r)r�r�r*r+�ELSE)'rrrr�r�r�r�r�r�r�rrrr�r�r�r�r�r�r�r�rrrrrr r!rr/r9r:r;r<r=rDrErHrI)'r#r&r(r�r�r�r�r�r�r�r*r+r,r�r�r�r�r�r�r�r�rrrr
r�rr
r-rr!rAr�r"r#r(r)r*r+�PPPRAGMASTRrr�EQUALS)Tr1r9r[rfrgrhrirjrwr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r���r�r�r�r
rrr
rrr����r$r%r&r'r(r)r*r+r,�r6r7r?r@rC)TrJrMrkrFrsrtrurvrYrkr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��6���r�r�r�r�r�r�r�r�r�r��5����3���rrrrrrrrr�4���rrr%r&r'�COMMA)�r1r5r6r9r:r5r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrMrNrOrPrQrRrSrTrUrVr[r\r]r^r_r`rbrdrerfrgrhrirjrqrsrurvrwr?r@rArBrzr{r}r~r�r�r�r��r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�����rWrZr[rArBr�r�rr�r�r�r�r�r�r�r�r�r�r�r�r��	r�r�r�r�r�r�r�r�r�r�r�r��;�<�=r�r��@�Ar�r�r�r�rDrEr�r�r�r�r�r�r�r�r�r�r�r�r��^r�r�r�r�rGr�r�r��r�r�r�r�r�r�r�r�rrrrrrrrrr	��r
�rrr
r�rr��r�r�rrrHrIrrr��rr����r"r#rJr$r%r&r'r(r)r*r+r,r�r�r�r-r.r5r6r7rKr8�r�r�r�r�r�r��3rLr?r@r�r�r�r�rC�Hr�r�)�rJrKrLrMrNrrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_rarbrcrdrerfrgrhrirjrkrlrmrnrorpr`rErqrrrsrtrurvr|rRrXr}r~r�r�r�r�r�r�r�r�rkr�r�r�rzr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr��C����>���rr�r�r�rMrNr�r(r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��A����@����?����1�������������r�/���r�r�r�r�r�rPr�r�r�r�r�r�r�r�r�r�r��2���r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�����r�r�r�r�r�r�r��B����=��������0���r�rrQrRrrrr�rr	r�r�rrrSrrrrrrrrrrrrrrrrrr�r ���rrr	r
rrr�rTr%r&r
rrrr'r�rr�RPAREN(r1r5r6r9r:r5r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrMrNrOrPrQrRrSrTrUrVr\r]r^r_r`rbrhri�]r>rjrqrsr?r@rArBrzr{r}r~r��rHryr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r���r��r�r�r�rWrZr[r�rr�r���r�����r�r�r�r�r���r��r�ryr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr��k�lr�r�r�r{r�r�r�r�r�r�r�r�rrrrrrrrrr	r�r
r�rrr
r���rr�r�r�r�r�r�����r�����rrrrrr�rrr�r�r"r$r%r&r'r(r)r*r+r,��r�r�r��
r6r7r8r�� �!r�r�r�r�r�r�r�rr?r@r�r�r�r�r$�ErC�Gr�r��M�O(rJrKrLrMrNrrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_rarbrcrdrerfrgrhrirjrlrmrnrorpr`rtrur�rrvr|rRr�r�r�r�r�r�r�r�r�r�rrr�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�iE���i��i��r�r�rr�r�r�r(r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r
r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrr�r�r�r�r�r�r�r�r�r�r�rr�r�r�r,r�rr�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r?r)r*r�r�iD���r�r�r�r�rr�r�r�i��i��rr�rrrr0rr	r1r2rrrrrrrrrrr�r�rrrr�rrr r�r@����rrr	r
rrrBrr%r&r
rrrrrFr'����rrrG�����COLON)�r1r5r9r;r<r=r?r@rArBrCrDrErFrGrHrIrJrKrMrNrOrbrgrhrirjrsrzr{r}r~r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�rWr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��gr�r�r�r�r�r�r�r�r�r�r�r�rrrrrrrrrr	r
rrr
rrrrrrrr�rrr"r$r%r&r'r(r)r*r+r,r6r7r8r?r@rC)�rJrKrMrOrPrQrSrTrUrVrWrXrYrZr[r\r]r^r_rarbrcr`rsrtrurvrRr�r�r�r�rkr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr�rr	rrrrrrrrrrrrr r%r&r'�LBRACKET)�r1r5r6r9r:r5r;r<r=r>r?r@rArBrCrDrErFrGrHrIrJrKrMrNrOrPrQrRrSrTrUrVr\r]r^r_r`rbrhrirjrqrsr?r@rArBrzr{r|r}r~r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rWrZr[r�rr�r�r�r�r�rar�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r
rrr
rrrr�r�r�rrrrr�r�r�r$r%r�r'r(r+r,r�r�r�r�r6r7r�r�r�r�r�r�r�r�r?r�r@r�r�r�r�rCr�r�r�r�)�r=rKrLrMrNrrOrPrQrRrSrTrUrVrWrXrYrZr[r\r]r^r_rarbrcrdrerfrgrhrirjrlrmrnrorpr`rGrur=r|rRr�r�r�r�r�r�r�r�r�rGr�r�r�rxr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr�r�r�rrr�rrrrrrrr�rrr�r�rrr	r
rrr%r�r&r
rrrr'r�rrr��RBRACKET)zrMrNrOrbr=r@rBrGr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rTrVr[rr�r�r�rbrdr�r�r�r�r�r�r�r�r�r�r��1r~�3�4r��r�r�r�r�r�r�r�r�r�r�rrrrrrrrrr	r�r
rrr
r��r�r�rr�r�rrr"������r&r'r(r)r*r�r���r�r8�"r��)�*r?r@�>�?rCr�)zrarbrcr`rr�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r(r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�rr������rr$r%r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r'r�r�r�r�r�r+r,rrr�r�rrr	rr�r6r7rrrrrrr�r�r�r�r r�r�r�r�r%r&r�r�r'r��PERIOD):r|r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rar�r�r�r�r�r�r�r�r�r�r
rrr
rr�r�r�r�r'r(r�r�r�r?r�r@rCr�r�):r�r�r�rzr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrr�r�r�r%r�r&r'r�r��ARROW),r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r
rrr
rr'r(r?r@rC),r�r�r{r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrr%r&r'�CONDOP)Ir�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrrrrrr	r
rrr
rr&r'r(r)r*r?r@rC)Ir�r�rer�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr%r&r'�DIVIDE)Ir�r�rgr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rgrgrgrgrgrgrgrgrgrgrgrgrgrgrgr�r�r�r�r�rrrrrr%r&r'�MOD)Ir�r�rhr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rhrhrhrhrhrhrhrhrhrhrhrhrhrhrhr�r�r�r�r�rrrrrr%r&r'�RSHIFT)Ir�r�rkr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rkrkrkrkrkrkrkrkrkrkrkr�r�r�r�r�rrrrrr%r&r'�LSHIFT)Ir�r�rlr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rlrlrlrlrlrlrlrlrlrlrlr�r�r�r�r�rrrrrr%r&r'�LT)Ir�r�rmr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rmrmrmrmrmrmrmr�r�r�r�r�rrrrrr%r&r'�LE)Ir�r�rnr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rnrnrnrnrnrnrnr�r�r�r�r�rrrrrr%r&r'�GE)Ir�r�ror�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rororororororor�r�r�r�r�rrrrrr%r&r'�GT)Ir�r�rpr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rprprprprprprpr�r�r�r�r�rrrrrr%r&r'�EQ)Ir�r�rqr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rqrqrqrqrqr�r�r�r�r�rrrrrr%r&r'�NE)Ir�r�rrr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrrrrrrr�r�r�r�r�rrrrrr%r&r'�OR)Ir�r�rtr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rtrtr�r�r�r�r�rrrrrr%r&r'�XOR)Ir�r�rur�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rur�rurur�r�r�r�r�rrrrrr%r&r'�LAND)Ir�r�rvr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rvr�r�r�r�r�rrrrrr%r&r')Ir�r�rwr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr%r&r')5r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r
rrr
rr&r'r(r)r*r?r@rC)5r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr%r&r')5r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr%r&r')5r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr%r&r')5r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr%r&r')5r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr%r&r')5r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr%r&r')5r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr%r&r')5r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr%r&r')5r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr%r&r')5r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r(r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrr%r&r'rr�)�LOR�XOREQUAL�
TIMESEQUAL�DIVEQUAL�MODEQUAL�	PLUSEQUAL�
MINUSEQUAL�LSHIFTEQUAL�RSHIFTEQUAL�ANDEQUAL�OREQUAL�ELLIPSISrr�translation_unit_or_empty�translation_unitr�empty);rrr/r2r3r4r7r8r5r>rWrXrYr[r=r>rnr�rGrHrTrUrWr�r�r�r�rarbrcr�r�r�r�r�r�r�r�r�r�r�r�rrrr�r�r�r�r0r1r2r3rr�rAr$rFrG);rr=rcrlrlrlrtrlr@rlrcrtrlr=r@r�rlr�r@r�r�r@r�r�r�r�r�r�r�r@r�r@r�r�r�r�r�r@r�r�r@r�r�r�r�r�r�r�r@r�r�r�r�r�r�r�r�r�r��external_declarationrr�function_definitionr�declaration)rrrrr[r�r�r�)r	r	rrrr�r�r�pp_directiver
�pppragma_directive)rrrr�r�r�r�r�r�r�r�r�r�r�rr0r1r2rArFrG)rrr�r�r�r�r�r�r�r�r�r�r�rr�r;r�r�r�r�r��
static_assert)rrr�r�r�r�r�r�rr0r1r2rArFrG)r
r
r�r�r�r�r�r�r�r�r�r�r�r�r��
id_declarator)rrr/r3r7rWrXr;rErWrXr�r�r�)rrr[r�rwr�rwr�r�r�r�r�r�r��declaration_specifiers)rrrrr[r>r�rHr�rr�r�r�r�r)r/r/rWrWrWrWrWrWrWrWrWrWrWrWrW�	decl_body)r0r0r0r0r0r0r0r0�direct_id_declarator)rrr/r3r4r7rWrXr:r;rErWrXr�r�r�r�r�)r1r1r1r1rjr1r1r1rjr1r1r1r1r1rjr1rjr1�pointer)rrr/r3r7rWrXr;r?rErWrXr�r�r�r�r�)r4r4r:r4r4r:r4r:rZr:r�r:r:r�r�r�r:�type_qualifier)8rrrr/r2r3r4r8r5r>rrWrYr[r=r>rnrArr�rDr�rGrHrIrUrVrWr�r�r�r�rr�r�r_rcrdr|r}rrrr�r�r�r�r�r�r�r�r�r�rr�r�)8r2r2r2r\r2r2r2r2rBr2r2r\r2r2rBr2r2r[rBrBrBr2rBr2rBrBr[r\rBrBrBr�r[r�r2rBrBr[rBrBrBrBr2r2rBrBrBr2r2rBr2rBr[r2rBr[�storage_class_specifier)rrrr/r2r3r4r8r>rrWrYr[r>rnr�rHrWr�rr�r�r�r�r)r3r3r3r]r3r3r3r3r3r3r]r3r3r3r3r3r3r]r3r3r3r3r3r3r3�function_specifier)r4r4r4r^r4r4r4r4r4r4r^r4r4r4r4r4r4r^r4r4r4r4r4r4r4�type_specifier_no_typeid)&rrrr/r7rrWrXr[r>rr�rDr�rHrIrWrr�r�r�r�rr�r�r_r|r}rrrr�r�r�r�r�r�r)&r5r5r5r_r5r5r_r5r5r5r5r5r5r5r5r5r_r5r5r5r5r�r5r�r5r5r5r5r5r5r5r5r5r5r5r5r5r5�type_specifier)!rrrr7rrXr[r>rr�rDr�rHrIrr�r�r�rr�r_r|r}rrrr�r�r�r�r�r�r)!r6r6r6rqr6rqr6r6r�r�r�r6r6r�rqr�r�r�r�r6r�r�r�r�r�r6r6r�r�r6r6r6r6�declaration_specifiers_no_type)rrrr2r3r4r8r>rrYr[r>rnr�rHr�rr�r�r�r�r)r7r7rXrmrmrmrmrmrXrmrXrrmrXrrXrrrrXrr�alignment_specifier))rrrr/r2r3r4r8r>rrWrYr[r>rnrr�rDr�rHrIrWr�r�r�r�r�r�r_r|r}rrrr�r�r�r�r�r�r))r8r8r8r`r8r8r8r8r8r8r`r8r8r8r8r�r�r�r8r8r�r`r�r�r�r�r�r8r�r�r�r�r�r8r8r�r�r8r8r8r8�typedef_name)!r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;r;�enum_specifier)!r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<r<�struct_or_union_specifier)!r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=r=�atomic_specifier)(rrrr2r3r4r7r8r>rrXrYr[r>rnrr�rDr�rHrIrr�r�r�rr�r_r|r}rrrr�r�r�r�r�r�r)(r>r>rYrnrnrnrsrnrnrYrsrnrYr>rnrsrsrsrYr>rsrsrsrsrsrsrYrsrsrsrsrsr>r>rsrsr>rYr>r>�struct_or_union)!r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7r7�declaration_list_optrr[r<r>�declaration_listr�init_declarator_list_optr/rWra�init_declarator_listrd�init_declarator)r/rWrErX)rerer�r��
declarator)r/rWrErXr�r�)rfrfrfrfr�r��typeid_declarator)r/rWr;rErXr�r�)rgrgr�rgrgrgrg�direct_typeid_declarator)r/rWr:r;rErXr�r�)rhrhr�rhrhrhrhrh�"declaration_specifiers_no_type_opt)r2r3r4r8r>rYrn)rkrorprxryryry�id_init_declarator_list_optr7rXrr�id_init_declarator_listru�id_init_declaratorrv�type_qualifier_list_opt)	r5r=rGrUrcr�r�r�r�)	r?rTrbrr�r�r�r�r��type_qualifier_list)r5r=rr�rDrGrIrUr�r�r�r_rcr|r}rrr�r�r�r�r�r�)rArVrrrrdrrArrrrrArrrrr�rrr�rArA�
brace_open)r6r7r<rzr{r}r~r�r>rFrYr�r_r�r�r�r�r�r�rr�r?r)r0r1r2r�rArFrG)rCrr�r\r]r�r�r�r�rarar�r�r�r�r�r�rar�r�r�r�r�r�r�r�rar�r�r��compound_statement)r<r�r>r�r_r�r�r�r�rr0r1r2rArFrG)rr�rr�r�r�r�r�r�r�r�r�r�r�r�r��unified_string_literal)Ur�r<rDr�rFrIrNrOrPrQrTrYr�r^r_r�r�rbrzrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryr|r}rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�r�r�r0r1r2r�r3r�r�r�rr�rAr$rFrG)Uryr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r{r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��constant_expression)r<rDr^r�r�r�r�)r�r�r�rIrr�r.�conditional_expression);r<rDr�rFrIrTrYr�r^r_r�r�rbrerxryr|r}rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrr�r�r�r�r�r0r1r2r�r3r�r�r�rr�rAr$rFrG);r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r8r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��binary_expression)Mr<rDr�rFrIrTrYr�r^r_r�r�rbrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryr|r}rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrr�r�r�r�r�r0r1r2r�r3r�r�r�rr�rAr$rFrG)Mr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrrrrrrr	r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��cast_expression)Pr<rDr�rFrIrPrTrYr�r^r_r�r�rbrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryr|r}rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�r�r�r0r1r2r�r3r�r�r�rr�rAr$rFrG)Pr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r&r�r�r�r�r&r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��unary_expression)Sr<rDr�rFrIrNrOrPrQrTrYr�r^r_r�r�rbrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryr|r}rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�r�r�r0r1r2r�r3r�r�r�rr�rAr$rFrG)Sr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��postfix_expression)Sr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��unary_operator)SrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrPrP�primary_expression)Sr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��
identifier)Zr<r>rDr�rFrHrIrNrOrPrQrTrYr�r^r_r�r�rbrerfrgrhrirjrkrlrmrnrorprqrrrsrtrurvrwrxryr|r}rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�rr�r�r�r�r�r�r0r1r2r�r3r�r�r�rr�r�rAr$rFrG)Zr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��constant)Sr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��unified_wstring_literal)Sr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��parameter_type_list)r>rHr�r�r�r)r�r�r�r�r�r��identifier_list_opt)r>rHr�)r�r�r��parameter_list)r�r�r�r�r�r��identifier_list)r�r�r��parameter_declaration)r>rHrr�r�r�r)r�r�r�r�r�r�r��enumerator_list)rCr\r])rArDrE�
enumerator)rCr\r]r�)rBrBrBrH�struct_declaration_list)rr�r�)r�r�r��brace_close)rrAr�r�r�rCrDrEr�r�rFr�rKr�)r�r�r�r�r�rrrrrr#r5r?rC�struct_declaration)rr�r�r�r�r�)r�r�r�r�r�r��specifier_qualifier_list)rr�rDrIr�r�r�r_r|r}rrr�r�)r�r�r�r�r�r�r�r�r�r�r�r�r�r��	type_name)r�rDrIr_r|r}rr)r�r�r�r�r�r�r�r��block_item_list_optr�rC�block_item_listr��
block_itemr�r��	statement)
r�r�r�r�r�r�rr0r1r2rArFrG)
r�r�r�r�r�rr�r:r�r�r�r�r��labeled_statement)
r�r�r�r�r�r�r�r�r�r�r�r�r��expression_statement)
r�r�r�r�r�r�r�r�r�r�r�r�r��selection_statement)
r�r�r�r�r�r�r�r�r�r�r�r�r��iteration_statement)
r�r�r�r�r�r�r�r�r�r�r�r�r��jump_statement)
r�r�r�r�r�r�r�r�r�r�r�r�r��expression_opt)r�r�r�r�r�r�r�rrr0r1r2r3rrAr$rFrG)r�r�r�r�r�r�rr�r4r�r�r�r>r�r�r�r�r��
expression)r�rIr�r_r�r�rerxr|r}r�r�r�r�r�r�r�rrr0r1r2r�r3rr�rAr$rFrG)r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��assignment_expression)3r�rFrIrTrYr�r_r�r�rbrerxryr|r}rr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrr�r�r�r�r0r1r2r�r3r�r�r�rr�rAr$rFrG)3r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�r�r"r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r��initializer)rFrYr�r�)r�r�rJrL�assignment_expression_opt)rTrbr�r�r�)r�r�r�r�r��typeid_noparen_declaratorrWr��abstract_declarator_optr�r�r�� direct_typeid_noparen_declaratorr�r�r��abstract_declarator)rWr�r�r�)r�r�r�r��direct_abstract_declarator)rWr�r�r�r�r�r�)r�r�r�r�r�r�r�r�r�r�r�r�r-)
r�r�r�rr0r1r2rArFrG)
r[rrr/r9r<r=rDrHrI)
r�r�r�r�r�r�r�r�r�r�r�r�rarFr�rGrK)rar�r�r�)r�r�r�r�)r�r�r�r�)r�r�r�r�)rar�r�r�r�)r�r�r�r�r�ryr�)r�r�r)r�r�r�r�r�)�struct_declarator_list_opt�struct_declarator_list�struct_declarator�pragmacomp_or_statement�pppragma_directive_list�assignment_operator�initializer_list_opt�initializer_list�designation_opt�designation�designator_list�
designator�argument_expression_list�parameter_type_list_opt�offsetof_member_designator(Z)zS' -> translation_unit_or_emptyzS'rNNN)z abstract_declarator_opt -> emptyr\r�p_abstract_declarator_opt�plyparser.pyrE)z.abstract_declarator_opt -> abstract_declaratorr\rrorprF)z"assignment_expression_opt -> emptyrZr�p_assignment_expression_optrprE)z2assignment_expression_opt -> assignment_expressionrZrrqrprF)zblock_item_list_opt -> emptyrMr�p_block_item_list_optrprE)z&block_item_list_opt -> block_item_listrMrrrrprF)zdeclaration_list_opt -> emptyr%r�p_declaration_list_optrprE)z(declaration_list_opt -> declaration_listr%rrsrprF)z+declaration_specifiers_no_type_opt -> emptyr-r�$p_declaration_specifiers_no_type_optrprE)zDdeclaration_specifiers_no_type_opt -> declaration_specifiers_no_typer-rrtrprF)zdesignation_opt -> emptyrhr�p_designation_optrprE)zdesignation_opt -> designationrhrrurprF)zexpression_opt -> emptyrVr�p_expression_optrprE)zexpression_opt -> expressionrVrrvrprF)z$id_init_declarator_list_opt -> emptyr.r�p_id_init_declarator_list_optrprE)z6id_init_declarator_list_opt -> id_init_declarator_listr.rrwrprF)zidentifier_list_opt -> emptyrBr�p_identifier_list_optrprE)z&identifier_list_opt -> identifier_listrBrrxrprF)z!init_declarator_list_opt -> emptyr'r�p_init_declarator_list_optrprE)z0init_declarator_list_opt -> init_declarator_listr'rryrprF)zinitializer_list_opt -> emptyrfr�p_initializer_list_optrprE)z(initializer_list_opt -> initializer_listrfrrzrprF)z parameter_type_list_opt -> emptyrmr�p_parameter_type_list_optrprE)z.parameter_type_list_opt -> parameter_type_listrmrr{rprF)z#struct_declarator_list_opt -> emptyr`r�p_struct_declarator_list_optrprE)z4struct_declarator_list_opt -> struct_declarator_listr`rr|rprF)z type_qualifier_list_opt -> emptyr1r�p_type_qualifier_list_optrprE)z.type_qualifier_list_opt -> type_qualifier_listr1rr}rprF)zdirect_id_declarator -> IDrr�p_direct_id_declarator_1rprD)z3direct_id_declarator -> LPAREN id_declarator RPARENrr�p_direct_id_declarator_2rprD)zpdirect_id_declarator -> direct_id_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKETrr�p_direct_id_declarator_3rprD)zsdirect_id_declarator -> direct_id_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKETrr	�p_direct_id_declarator_4rprD)zodirect_id_declarator -> direct_id_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKETrr	r�rpr)z\direct_id_declarator -> direct_id_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKETrr�p_direct_id_declarator_5rprD)zNdirect_id_declarator -> direct_id_declarator LPAREN parameter_type_list RPARENrr�p_direct_id_declarator_6rprD)zNdirect_id_declarator -> direct_id_declarator LPAREN identifier_list_opt RPARENrrr�rpr)z"direct_typeid_declarator -> TYPEIDr,r�p_direct_typeid_declarator_1rprD)z;direct_typeid_declarator -> LPAREN typeid_declarator RPARENr,r�p_direct_typeid_declarator_2rprD)zxdirect_typeid_declarator -> direct_typeid_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKETr,r�p_direct_typeid_declarator_3rprD)z{direct_typeid_declarator -> direct_typeid_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKETr,r	�p_direct_typeid_declarator_4rprD)zwdirect_typeid_declarator -> direct_typeid_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKETr,r	r�rpr)zddirect_typeid_declarator -> direct_typeid_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKETr,r�p_direct_typeid_declarator_5rprD)zVdirect_typeid_declarator -> direct_typeid_declarator LPAREN parameter_type_list RPARENr,r�p_direct_typeid_declarator_6rprD)zVdirect_typeid_declarator -> direct_typeid_declarator LPAREN identifier_list_opt RPARENr,rr�rpr)z*direct_typeid_noparen_declarator -> TYPEIDr]r�$p_direct_typeid_noparen_declarator_1rprD)z�direct_typeid_noparen_declarator -> direct_typeid_noparen_declarator LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKETr]r�$p_direct_typeid_noparen_declarator_3rprD)z�direct_typeid_noparen_declarator -> direct_typeid_noparen_declarator LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKETr]r	�$p_direct_typeid_noparen_declarator_4rprD)z�direct_typeid_noparen_declarator -> direct_typeid_noparen_declarator LBRACKET type_qualifier_list STATIC assignment_expression RBRACKETr]r	r�rpr)ztdirect_typeid_noparen_declarator -> direct_typeid_noparen_declarator LBRACKET type_qualifier_list_opt TIMES RBRACKETr]r�$p_direct_typeid_noparen_declarator_5rprD)zfdirect_typeid_noparen_declarator -> direct_typeid_noparen_declarator LPAREN parameter_type_list RPARENr]r�$p_direct_typeid_noparen_declarator_6rprD)zfdirect_typeid_noparen_declarator -> direct_typeid_noparen_declarator LPAREN identifier_list_opt RPARENr]rr�rpr)z%id_declarator -> direct_id_declaratorrr�p_id_declarator_1rprD)z-id_declarator -> pointer direct_id_declaratorrr�p_id_declarator_2rprD)z-typeid_declarator -> direct_typeid_declaratorr+r�p_typeid_declarator_1rprD)z5typeid_declarator -> pointer direct_typeid_declaratorr+r�p_typeid_declarator_2rprD)z=typeid_noparen_declarator -> direct_typeid_noparen_declaratorr[r�p_typeid_noparen_declarator_1rprD)zEtypeid_noparen_declarator -> pointer direct_typeid_noparen_declaratorr[r�p_typeid_noparen_declarator_2rprD)z-translation_unit_or_empty -> translation_unitrr�p_translation_unit_or_empty�c_parser.pyr�)z"translation_unit_or_empty -> emptyrrr�r�r+)z(translation_unit -> external_declarationrr�p_translation_unit_1r�r�)z9translation_unit -> translation_unit external_declarationrr�p_translation_unit_2r�r�)z+external_declaration -> function_definitionrr�p_external_declaration_1r�r4)z#external_declaration -> declarationrr�p_external_declaration_2r�r6)z$external_declaration -> pp_directiverr�p_external_declaration_3r�r�)z*external_declaration -> pppragma_directiverrr�r�r�)zexternal_declaration -> SEMIrr�p_external_declaration_4r�r�)z%external_declaration -> static_assertrr�p_external_declaration_5r�r�)z^static_assert -> _STATIC_ASSERT LPAREN constant_expression COMMA unified_string_literal RPARENrr	�p_static_assert_declarationr�r;)zAstatic_assert -> _STATIC_ASSERT LPAREN constant_expression RPARENrrr�r�r<)zpp_directive -> PPHASHrr�p_pp_directiver�r@)zpppragma_directive -> PPPRAGMArr�p_pppragma_directiver�r$)z*pppragma_directive -> PPPRAGMA PPPRAGMASTRrrr�r�r�)zBpppragma_directive -> _PRAGMA LPAREN unified_string_literal RPARENrrr�r�rC)z-pppragma_directive_list -> pppragma_directiverdr�p_pppragma_directive_listr�rG)zEpppragma_directive_list -> pppragma_directive_list pppragma_directiverdrr�r�rH)zLfunction_definition -> id_declarator declaration_list_opt compound_statementrr�p_function_definition_1r�iX)zcfunction_definition -> declaration_specifiers id_declarator declaration_list_opt compound_statementrr�p_function_definition_2r�ij)zstatement -> labeled_statementrPr�p_statementr�iy)z!statement -> expression_statementrPrr�r�iz)zstatement -> compound_statementrPrr�r�i{)z statement -> selection_statementrPrr�r�i|)z statement -> iteration_statementrPrr�r�i})zstatement -> jump_statementrPrr�r�i~)zstatement -> pppragma_directiverPrr�r�i)zstatement -> static_assertrPrr�r�i�)z<pragmacomp_or_statement -> pppragma_directive_list statementrcr�p_pragmacomp_or_statementr�i�)z$pragmacomp_or_statement -> statementrcrr�r�i�)z<decl_body -> declaration_specifiers init_declarator_list_optrr�p_decl_bodyr�i�)zGdecl_body -> declaration_specifiers_no_type id_init_declarator_list_optrrr�r�i�)zdeclaration -> decl_body SEMIrr�
p_declarationr�i)zdeclaration_list -> declarationr&r�p_declaration_listr�i
)z0declaration_list -> declaration_list declarationr&rr�r�i)zSdeclaration_specifiers_no_type -> type_qualifier declaration_specifiers_no_type_optrr�"p_declaration_specifiers_no_type_1r�i)z\declaration_specifiers_no_type -> storage_class_specifier declaration_specifiers_no_type_optrr�"p_declaration_specifiers_no_type_2r�i)zWdeclaration_specifiers_no_type -> function_specifier declaration_specifiers_no_type_optrr�"p_declaration_specifiers_no_type_3r�i)zUdeclaration_specifiers_no_type -> atomic_specifier declaration_specifiers_no_type_optrr�"p_declaration_specifiers_no_type_4r�i&)zXdeclaration_specifiers_no_type -> alignment_specifier declaration_specifiers_no_type_optrr�"p_declaration_specifiers_no_type_5r�i+)z?declaration_specifiers -> declaration_specifiers type_qualifierrr�p_declaration_specifiers_1r�i0)zHdeclaration_specifiers -> declaration_specifiers storage_class_specifierrr�p_declaration_specifiers_2r�i5)zCdeclaration_specifiers -> declaration_specifiers function_specifierrr�p_declaration_specifiers_3r�i:)zIdeclaration_specifiers -> declaration_specifiers type_specifier_no_typeidrr�p_declaration_specifiers_4r�i?)z(declaration_specifiers -> type_specifierrr�p_declaration_specifiers_5r�iD)zGdeclaration_specifiers -> declaration_specifiers_no_type type_specifierrr�p_declaration_specifiers_6r�iI)zDdeclaration_specifiers -> declaration_specifiers alignment_specifierrr�p_declaration_specifiers_7r�iN)zstorage_class_specifier -> AUTOrr�p_storage_class_specifierr�iS)z#storage_class_specifier -> REGISTERrrr�r�iT)z!storage_class_specifier -> STATICrrr�r�iU)z!storage_class_specifier -> EXTERNrrr�r�iV)z"storage_class_specifier -> TYPEDEFrrr�r�iW)z(storage_class_specifier -> _THREAD_LOCALrrr�r�iX)zfunction_specifier -> INLINErr�p_function_specifierr�i])zfunction_specifier -> _NORETURNrrr�r�i^)z type_specifier_no_typeid -> VOIDrr�p_type_specifier_no_typeidr�ic)z!type_specifier_no_typeid -> _BOOLrrr�r�id)z type_specifier_no_typeid -> CHARrrr�r�ie)z!type_specifier_no_typeid -> SHORTrrr�r�if)ztype_specifier_no_typeid -> INTrrr�r�ig)z type_specifier_no_typeid -> LONGrrr�r�ih)z!type_specifier_no_typeid -> FLOATrrr�r�ii)z"type_specifier_no_typeid -> DOUBLErrr�r�ij)z$type_specifier_no_typeid -> _COMPLEXrrr�r�ik)z"type_specifier_no_typeid -> SIGNEDrrr�r�il)z$type_specifier_no_typeid -> UNSIGNEDrrr�r�im)z$type_specifier_no_typeid -> __INT128rrr�r�in)ztype_specifier -> typedef_namerr�p_type_specifierr�is)z type_specifier -> enum_specifierrrr�r�it)z+type_specifier -> struct_or_union_specifierrrr�r�iu)z*type_specifier -> type_specifier_no_typeidrrr�r�iv)z"type_specifier -> atomic_specifierrrr�r�iw)z3atomic_specifier -> _ATOMIC LPAREN type_name RPARENr#r�p_atomic_specifierr�i})ztype_qualifier -> CONSTrr�p_type_qualifierr�i�)ztype_qualifier -> RESTRICTrrr�r�i�)ztype_qualifier -> VOLATILErrr�r�i�)ztype_qualifier -> _ATOMICrrr�r�i�)z'init_declarator_list -> init_declaratorr(r�p_init_declarator_listr�i�)zBinit_declarator_list -> init_declarator_list COMMA init_declaratorr(rr�r�i�)zinit_declarator -> declaratorr)r�p_init_declaratorr�i�)z0init_declarator -> declarator EQUALS initializerr)rr�r�i�)z-id_init_declarator_list -> id_init_declaratorr/r�p_id_init_declarator_listr�i�)zHid_init_declarator_list -> id_init_declarator_list COMMA init_declaratorr/rr�r�i�)z#id_init_declarator -> id_declaratorr0r�p_id_init_declaratorr�i�)z6id_init_declarator -> id_declarator EQUALS initializerr0rr�r�i�)zMspecifier_qualifier_list -> specifier_qualifier_list type_specifier_no_typeidrKr�p_specifier_qualifier_list_1r�i�)zCspecifier_qualifier_list -> specifier_qualifier_list type_qualifierrKr�p_specifier_qualifier_list_2r�i�)z*specifier_qualifier_list -> type_specifierrKr�p_specifier_qualifier_list_3r�i�)z>specifier_qualifier_list -> type_qualifier_list type_specifierrKr�p_specifier_qualifier_list_4r�i�)z/specifier_qualifier_list -> alignment_specifierrKr�p_specifier_qualifier_list_5r�i�)zHspecifier_qualifier_list -> specifier_qualifier_list alignment_specifierrKr�p_specifier_qualifier_list_6r�i�)z/struct_or_union_specifier -> struct_or_union IDr"r�p_struct_or_union_specifier_1r�i�)z3struct_or_union_specifier -> struct_or_union TYPEIDr"rr�r�i�)z[struct_or_union_specifier -> struct_or_union brace_open struct_declaration_list brace_closer"r�p_struct_or_union_specifier_2r�i�)zCstruct_or_union_specifier -> struct_or_union brace_open brace_closer"rr�r�i�)z^struct_or_union_specifier -> struct_or_union ID brace_open struct_declaration_list brace_closer"r�p_struct_or_union_specifier_3r�i�)zFstruct_or_union_specifier -> struct_or_union ID brace_open brace_closer"rr�r�i�)zbstruct_or_union_specifier -> struct_or_union TYPEID brace_open struct_declaration_list brace_closer"rr�r�i�)zJstruct_or_union_specifier -> struct_or_union TYPEID brace_open brace_closer"rr�r�i�)zstruct_or_union -> STRUCTr$r�p_struct_or_unionr�i�)zstruct_or_union -> UNIONr$rr�r�i�)z-struct_declaration_list -> struct_declarationrHr�p_struct_declaration_listr�i)zEstruct_declaration_list -> struct_declaration_list struct_declarationrHrr�r�i)zNstruct_declaration -> specifier_qualifier_list struct_declarator_list_opt SEMIrJr�p_struct_declaration_1r�i)zstruct_declaration -> SEMIrJr�p_struct_declaration_2r�i1)z(struct_declaration -> pppragma_directiverJr�p_struct_declaration_3r�i6)z+struct_declarator_list -> struct_declaratorrar�p_struct_declarator_listr�i;)zHstruct_declarator_list -> struct_declarator_list COMMA struct_declaratorrarr�r�i<)zstruct_declarator -> declaratorrbr�p_struct_declarator_1r�iD)z9struct_declarator -> declarator COLON constant_expressionrbr�p_struct_declarator_2r�iI)z.struct_declarator -> COLON constant_expressionrbrr�r�iJ)zenum_specifier -> ENUM IDr!r�p_enum_specifier_1r�iR)zenum_specifier -> ENUM TYPEIDr!rr�r�iS)z=enum_specifier -> ENUM brace_open enumerator_list brace_closer!r�p_enum_specifier_2r�iX)z@enum_specifier -> ENUM ID brace_open enumerator_list brace_closer!r�p_enum_specifier_3r�i])zDenum_specifier -> ENUM TYPEID brace_open enumerator_list brace_closer!rr�r�i^)zenumerator_list -> enumeratorrFr�p_enumerator_listr�ic)z(enumerator_list -> enumerator_list COMMArFrr�r�id)z3enumerator_list -> enumerator_list COMMA enumeratorrFrr�r�ie)z7alignment_specifier -> _ALIGNAS LPAREN type_name RPARENrr�p_alignment_specifierr�ip)zAalignment_specifier -> _ALIGNAS LPAREN constant_expression RPARENrrr�r�iq)zenumerator -> IDrGr�p_enumeratorr�iv)z+enumerator -> ID EQUALS constant_expressionrGrr�r�iw)zdeclarator -> id_declaratorr*r�p_declaratorr�i�)zdeclarator -> typeid_declaratorr*rr�r�i�)z(pointer -> TIMES type_qualifier_list_optrr�	p_pointerr�i�)z0pointer -> TIMES type_qualifier_list_opt pointerrrr�r�i�)z%type_qualifier_list -> type_qualifierr2r�p_type_qualifier_listr�i)z9type_qualifier_list -> type_qualifier_list type_qualifierr2rr�r�i)z%parameter_type_list -> parameter_listrAr�p_parameter_type_listr�i)z4parameter_type_list -> parameter_list COMMA ELLIPSISrArr�r�i)z'parameter_list -> parameter_declarationrCr�p_parameter_listr�i$)z<parameter_list -> parameter_list COMMA parameter_declarationrCrr�r�i%)z=parameter_declaration -> declaration_specifiers id_declaratorrEr�p_parameter_declaration_1r�i8)zIparameter_declaration -> declaration_specifiers typeid_noparen_declaratorrErr�r�i9)zGparameter_declaration -> declaration_specifiers abstract_declarator_optrEr�p_parameter_declaration_2r�iD)zidentifier_list -> identifierrDr�p_identifier_listr�id)z3identifier_list -> identifier_list COMMA identifierrDrr�r�ie)z$initializer -> assignment_expressionrYr�p_initializer_1r�in)z:initializer -> brace_open initializer_list_opt brace_closerYr�p_initializer_2r�is)z<initializer -> brace_open initializer_list COMMA brace_closerYrr�r�it)z/initializer_list -> designation_opt initializerrgr�p_initializer_listr�i|)zFinitializer_list -> initializer_list COMMA designation_opt initializerrgrr�r�i})z%designation -> designator_list EQUALSrir�
p_designationr�i�)zdesignator_list -> designatorrjr�p_designator_listr�i�)z-designator_list -> designator_list designatorrjrr�r�i�)z3designator -> LBRACKET constant_expression RBRACKETrkr�p_designatorr�i�)zdesignator -> PERIOD identifierrkrr�r�i�)z=type_name -> specifier_qualifier_list abstract_declarator_optrLr�p_type_namer�i�)zabstract_declarator -> pointerr^r�p_abstract_declarator_1r�i�)z9abstract_declarator -> pointer direct_abstract_declaratorr^r�p_abstract_declarator_2r�i�)z1abstract_declarator -> direct_abstract_declaratorr^r�p_abstract_declarator_3r�i�)z?direct_abstract_declarator -> LPAREN abstract_declarator RPARENr_r�p_direct_abstract_declarator_1r�i�)zddirect_abstract_declarator -> direct_abstract_declarator LBRACKET assignment_expression_opt RBRACKETr_r�p_direct_abstract_declarator_2r�i�)zadirect_abstract_declarator -> LBRACKET type_qualifier_list_opt assignment_expression_opt RBRACKETr_r�p_direct_abstract_declarator_3r�i�)zPdirect_abstract_declarator -> direct_abstract_declarator LBRACKET TIMES RBRACKETr_r�p_direct_abstract_declarator_4r�i�)z5direct_abstract_declarator -> LBRACKET TIMES RBRACKETr_r�p_direct_abstract_declarator_5r�i�)z^direct_abstract_declarator -> direct_abstract_declarator LPAREN parameter_type_list_opt RPARENr_r�p_direct_abstract_declarator_6r�i�)zCdirect_abstract_declarator -> LPAREN parameter_type_list_opt RPARENr_r�p_direct_abstract_declarator_7r�i�)zddirect_abstract_declarator -> LBRACKET STATIC type_qualifier_list_opt assignment_expression RBRACKETr_r�p_direct_abstract_declarator_8r�i�)z`direct_abstract_declarator -> LBRACKET type_qualifier_list STATIC assignment_expression RBRACKETr_rr�r�i�)zblock_item -> declarationrOr�p_block_itemr�i)zblock_item -> statementrOrr�r�i)zblock_item_list -> block_itemrNr�p_block_item_listr�i)z-block_item_list -> block_item_list block_itemrNrr�r�i)z@compound_statement -> brace_open block_item_list_opt brace_closer4r�p_compound_statement_1r�i)z5labeled_statement -> ID COLON pragmacomp_or_statementrQr�p_labeled_statement_1r�i$)zKlabeled_statement -> CASE constant_expression COLON pragmacomp_or_statementrQr�p_labeled_statement_2r�i()z:labeled_statement -> DEFAULT COLON pragmacomp_or_statementrQr�p_labeled_statement_3r�i,)zlabeled_statement -> ID COLONrQr�p_labeled_statement_4r�i0)z3labeled_statement -> CASE constant_expression COLONrQr�p_labeled_statement_5r�i4)z"labeled_statement -> DEFAULT COLONrQr�p_labeled_statement_6r�i8)zJselection_statement -> IF LPAREN expression RPAREN pragmacomp_or_statementrSr�p_selection_statement_1r�i<)zYselection_statement -> IF LPAREN expression RPAREN statement ELSE pragmacomp_or_statementrSr
�p_selection_statement_2r�i@)zNselection_statement -> SWITCH LPAREN expression RPAREN pragmacomp_or_statementrSr�p_selection_statement_3r�iD)zMiteration_statement -> WHILE LPAREN expression RPAREN pragmacomp_or_statementrTr�p_iteration_statement_1r�iI)zUiteration_statement -> DO pragmacomp_or_statement WHILE LPAREN expression RPAREN SEMIrTr
�p_iteration_statement_2r�iM)zwiteration_statement -> FOR LPAREN expression_opt SEMI expression_opt SEMI expression_opt RPAREN pragmacomp_or_statementrTr�p_iteration_statement_3r�iQ)zoiteration_statement -> FOR LPAREN declaration expression_opt SEMI expression_opt RPAREN pragmacomp_or_statementrTr�p_iteration_statement_4r�iU)zjump_statement -> GOTO ID SEMIrUr�p_jump_statement_1r�iZ)zjump_statement -> BREAK SEMIrUr�p_jump_statement_2r�i^)zjump_statement -> CONTINUE SEMIrUr�p_jump_statement_3r�ib)z(jump_statement -> RETURN expression SEMIrUr�p_jump_statement_4r�if)zjump_statement -> RETURN SEMIrUrrr�ig)z+expression_statement -> expression_opt SEMIrRr�p_expression_statementr�il)z#expression -> assignment_expressionrWr�p_expressionr�is)z4expression -> expression COMMA assignment_expressionrWrrr�it)z9assignment_expression -> LPAREN compound_statement RPARENrXr�#p_parenthesized_compound_expressionr�i�)ztypedef_name -> TYPEIDr r�p_typedef_namer�i�)z/assignment_expression -> conditional_expressionrXr�p_assignment_expressionr�i�)zSassignment_expression -> unary_expression assignment_operator assignment_expressionrXrrr�i�)zassignment_operator -> EQUALSrer�p_assignment_operatorr�i�)zassignment_operator -> XOREQUALrerr	r�i�)z!assignment_operator -> TIMESEQUALrerr	r�i�)zassignment_operator -> DIVEQUALrerr	r�i�)zassignment_operator -> MODEQUALrerr	r�i�)z assignment_operator -> PLUSEQUALrerr	r�i�)z!assignment_operator -> MINUSEQUALrerr	r�i�)z"assignment_operator -> LSHIFTEQUALrerr	r�i�)z"assignment_operator -> RSHIFTEQUALrerr	r�i�)zassignment_operator -> ANDEQUALrerr	r�i�)zassignment_operator -> OREQUALrerr	r�i�)z-constant_expression -> conditional_expressionr6r�p_constant_expressionr�i�)z+conditional_expression -> binary_expressionr7r�p_conditional_expressionr�i�)zZconditional_expression -> binary_expression CONDOP expression COLON conditional_expressionr7rrr�i�)z$binary_expression -> cast_expressionr8r�p_binary_expressionr�i�)z>binary_expression -> binary_expression TIMES binary_expressionr8rrr�i�)z?binary_expression -> binary_expression DIVIDE binary_expressionr8rrr�i�)z<binary_expression -> binary_expression MOD binary_expressionr8rrr�i�)z=binary_expression -> binary_expression PLUS binary_expressionr8rrr�i�)z>binary_expression -> binary_expression MINUS binary_expressionr8rrr�i�)z?binary_expression -> binary_expression RSHIFT binary_expressionr8rrr�i�)z?binary_expression -> binary_expression LSHIFT binary_expressionr8rrr�i�)z;binary_expression -> binary_expression LT binary_expressionr8rrr�i�)z;binary_expression -> binary_expression LE binary_expressionr8rrr�i�)z;binary_expression -> binary_expression GE binary_expressionr8rrr�i�)z;binary_expression -> binary_expression GT binary_expressionr8rrr�i�)z;binary_expression -> binary_expression EQ binary_expressionr8rrr�i�)z;binary_expression -> binary_expression NE binary_expressionr8rrr�i�)z<binary_expression -> binary_expression AND binary_expressionr8rrr�i�)z;binary_expression -> binary_expression OR binary_expressionr8rrr�i�)z<binary_expression -> binary_expression XOR binary_expressionr8rrr�i�)z=binary_expression -> binary_expression LAND binary_expressionr8rrr�i�)z<binary_expression -> binary_expression LOR binary_expressionr8rrr�i�)z#cast_expression -> unary_expressionr9r�p_cast_expression_1r�i�)z:cast_expression -> LPAREN type_name RPAREN cast_expressionr9r�p_cast_expression_2r�i�)z&unary_expression -> postfix_expressionr:r�p_unary_expression_1r�i�)z-unary_expression -> PLUSPLUS unary_expressionr:r�p_unary_expression_2r�i�)z/unary_expression -> MINUSMINUS unary_expressionr:rrr�i�)z2unary_expression -> unary_operator cast_expressionr:rrr�i�)z+unary_expression -> SIZEOF unary_expressionr:r�p_unary_expression_3r�i�)z2unary_expression -> SIZEOF LPAREN type_name RPARENr:rrr�i�)z4unary_expression -> _ALIGNOF LPAREN type_name RPARENr:rrr�i�)zunary_operator -> ANDr<r�p_unary_operatorr�i�)zunary_operator -> TIMESr<rrr�i�)zunary_operator -> PLUSr<rrr�i�)zunary_operator -> MINUSr<rrr�i�)zunary_operator -> NOTr<rrr�i�)zunary_operator -> LNOTr<rrr�i�)z(postfix_expression -> primary_expressionr;r�p_postfix_expression_1r�i�)zEpostfix_expression -> postfix_expression LBRACKET expression RBRACKETr;r�p_postfix_expression_2r�i�)zOpostfix_expression -> postfix_expression LPAREN argument_expression_list RPARENr;r�p_postfix_expression_3r�i�)z6postfix_expression -> postfix_expression LPAREN RPARENr;rrr�i�)z2postfix_expression -> postfix_expression PERIOD IDr;r�p_postfix_expression_4r�i)z6postfix_expression -> postfix_expression PERIOD TYPEIDr;rrr�i)z1postfix_expression -> postfix_expression ARROW IDr;rrr�i)z5postfix_expression -> postfix_expression ARROW TYPEIDr;rrr�i)z1postfix_expression -> postfix_expression PLUSPLUSr;r�p_postfix_expression_5r�i
)z3postfix_expression -> postfix_expression MINUSMINUSr;rrr�i)zUpostfix_expression -> LPAREN type_name RPAREN brace_open initializer_list brace_closer;r	�p_postfix_expression_6r�i)z[postfix_expression -> LPAREN type_name RPAREN brace_open initializer_list COMMA brace_closer;r
rr�i)z primary_expression -> identifierr=r�p_primary_expression_1r�i)zprimary_expression -> constantr=r�p_primary_expression_2r�i)z,primary_expression -> unified_string_literalr=r�p_primary_expression_3r�i)z-primary_expression -> unified_wstring_literalr=rrr�i)z.primary_expression -> LPAREN expression RPARENr=r�p_primary_expression_4r�i$)zWprimary_expression -> OFFSETOF LPAREN type_name COMMA offsetof_member_designator RPARENr=r	�p_primary_expression_5r�i()z(offsetof_member_designator -> identifierrnr�p_offsetof_member_designatorr�i0)zJoffsetof_member_designator -> offsetof_member_designator PERIOD identifierrnrrr�i1)zUoffsetof_member_designator -> offsetof_member_designator LBRACKET expression RBRACKETrnrrr�i2)z1argument_expression_list -> assignment_expressionrlr�p_argument_expression_listr�i>)zPargument_expression_list -> argument_expression_list COMMA assignment_expressionrlrrr�i?)zidentifier -> IDr>r�p_identifierr�iH)zconstant -> INT_CONST_DECr?r�p_constant_1r�iL)zconstant -> INT_CONST_OCTr?rr!r�iM)zconstant -> INT_CONST_HEXr?rr!r�iN)zconstant -> INT_CONST_BINr?rr!r�iO)zconstant -> INT_CONST_CHARr?rr!r�iP)zconstant -> FLOAT_CONSTr?r�p_constant_2r�ic)zconstant -> HEX_FLOAT_CONSTr?rr"r�id)zconstant -> CHAR_CONSTr?r�p_constant_3r�iq)zconstant -> WCHAR_CONSTr?rr#r�ir)zconstant -> U8CHAR_CONSTr?rr#r�is)zconstant -> U16CHAR_CONSTr?rr#r�it)zconstant -> U32CHAR_CONSTr?rr#r�iu)z(unified_string_literal -> STRING_LITERALr5r�p_unified_string_literalr�i�)z?unified_string_literal -> unified_string_literal STRING_LITERALr5rr$r�i�)z*unified_wstring_literal -> WSTRING_LITERALr@r�p_unified_wstring_literalr�i�)z+unified_wstring_literal -> U8STRING_LITERALr@rr%r�i�)z,unified_wstring_literal -> U16STRING_LITERALr@rr%r�i�)z,unified_wstring_literal -> U32STRING_LITERALr@rr%r�i�)zBunified_wstring_literal -> unified_wstring_literal WSTRING_LITERALr@rr%r�i�)zCunified_wstring_literal -> unified_wstring_literal U8STRING_LITERALr@rr%r�i�)zDunified_wstring_literal -> unified_wstring_literal U16STRING_LITERALr@rr%r�i�)zDunified_wstring_literal -> unified_wstring_literal U32STRING_LITERALr@rr%r�i�)zbrace_open -> LBRACEr3r�p_brace_openr�i�)zbrace_close -> RBRACErIr�
p_brace_closer�i�)zempty -> <empty>r
r�p_emptyr�i�N)�_tabversion�
_lr_method�
_lr_signature�_lr_action_items�
_lr_action�items�_k�_v�zip�_x�_y�_lr_goto_items�_lr_goto�_lr_productions���B/opt/nydus/tmp/pip-target-b52u9j4x/lib/python/pycparser/yacctab.py�<module>r:s�$����
�
�PY�
�e`�F�`�bA�B�e`�CI�Ky�zK+�JL+�e`�M+U+�W+W,�X,n-�V+o-�e`�p-z-�|-h2�i2r7�{-s7�e`�t7}7�7k<�l<uA�~7vA�e`�wAGB�IBIF�JFhJ�HBiJ�e`�jJnJ�pJ[�@\Qp�oJRp�e`�Sp[p�]peF�fFb`�\pc`�e`�d`k`�m`Ou�PuaM�l`bM�e`�cMkM�mMMY�NYBg�lMCg�e`�DgJg�LgEo�FoJx�KgKx�e`�LxRx�Tx{B�|BnO�SxoO�e`�pOwO�yO`Z�aZSg�xOTg�e`�Ug[g�]gDr�Erw~�\gx~�e`�y~@�BiI�jI\V�A]V�e`�^VcV�eVLa�Mam�dV@n�e`�AnGn�Inpx�qxcE�HndE�e`�eElE�nEUP�VPH]�mEI]�e`�J]R]�T]{g�|gnt�S]ot�e`�ptzt�|tc�dVL�{tWL�e`�XL`L�bLIW�JW|c�aL}c�e`�~cHd�Jdqn�rnd{�Ide{�e`�f{p{�r{YF�ZFLS�q{MS�e`�NSWS�YSv^�w^Hl�XSIl�e`�JlQl�SlLw�MwwC	�RlxC	�e`�yC	CD	�ED	~N	�N	i[	�DD	j[	�e`�k[	u[	�w[	pf	�qf	[s	�v[	\s	�e`�]s	cs	�es	p{	�q{	}E
�ds	~E
�e`�E
IF
�KF
VN
�WN
cX
�JF
dX
�e`�eX
mX
�oX
aa
�ba
Xl
�nX
Yl
�e`�Zl
bl
�dl
ot
�pt
|~
�cl
}~
�e`�~~
G
�I
TG�UGaQ�H
bQ�e`�cQrQ�tQY�@ZLd�sQMd�e`�NdVd�Xdcl�dlpv�Wdqv�e`�rv}v�vJ�KWI�~vXI�e`�YIcI�eI\S�]SP_�dIQ_�e`�R_Z_�\_Ug�VgZp�[_[p�e`�\pcp�ep^x�_xcA
�dpdA
�e`�eA
mA
�oA
mG
�nG
ZN
�nA
[N
�e`�\N
dN
�fN
YX
�ZX
Ed
�eN
Fd
�e`�Gd
Md
�Od
ng
�og
hk
�Nd
ik
�e`�jk
sk
�uk
To
�Uo
Ns
�tk
Os
�e`�Ps
Ts
�Vs
uv
�vv
oz
�Us
pz
�e`�qz
yz
�{z
Z~
�[~
TB�zz
UB�e`�VB]B�_BBF�CF@J�^BAJ�e`�BJFJ�HJgM�hMaQ�GJbQ�e`�cQhQ�jQIU�JUCY�iQDY�e`�EYKY�MYl\�m\f`�LYg`�e`�h`o`�q`Pd�QdJh�p`Kh�e`�LhVh�Xhwk�xkqo�Whro�e`�so{o�}o\s�]sVw�|oWw�e`�Xwbw�dwEE�FEYT�cwZT�e`�[TgT�iTJb�Kb^q�hT_q�e`�`qhq�jq_|�`|]H�iq^H�e`�_HiH�kH`S�aS^_�jH__�e`�`_e_�g_|n�}n]@�f_^@�e`�_@e@�g@|O�}OTa�f@Ua�e`�Va]a�_atp�upLB�^aMB�e`�NBSB�UBJM�KMHY�TBIY�e`�JYPY�RYGd�HdEp�QYFp�e`�GpQp�SpH{�I{FG�RpGG�e`�HGWG�YGNR�ORL^�XGM^�e`�N^]^�_^Ti�UiRu�^^Su�e`�Tucu�euZ@�[@XL�duYL�e`�ZLiL�kL`W�aW^c�jL_c�e`�`cpc�rcgn�hnez�qcfz�e`�gztz�vzkE�lEiQ�uzjQ�e`�kQ|Q�~Qs\�t\qh�}Qrh�e`�shh�Aivs�wst�@iu�e`�vC@�E@zJ�{JxV�D@yV�e`�zVHW�JWa�@b}m�IW~m�e`�mNn�PnEy�FyCE�OnDE�e`�EETE�VEKP�LPI\�UEJ\�e`�K\[\�]\mg�ngIt�\\Jt�e`�Kt\t�^tw�xaL�]tbL�e`�cLuL�wLPX�QXzd�vL{d�e`�|dOe�Qejp�kpT}�PeU}�e`�V}i}�k}DI�EInU�j}oU�e`�pUvU�xUTX�UXH[�wUI[�e`�J[W[�Z[\[�Y[^[�`[b[�_[d[�X[e[�e`�f[n[�p[z`�{`Hg�o[Ig�e`�JgQg�SgVv�WvII�RgJI�e`�KISI�UIkX�lXbk�TIck�e`�dkkk�mktt�utT@�lkU@�e`�V@`@�b@jJ�kJVW�a@WW�e`�XWbW�dWI_�J_Ph�cWQh�e`�RhZh�\hFl�Gldp�[hep�e`�fpmp�opas�bsv�np@w�e`�AwIw�Kwq{�r{`A�JwaA�e`�bAjA�lARF�SFrK�kAsK�e`�tKyK�{KaP�bPAV�zKBV�e`�CVKV�MVsZ�tZW`�LVX`�e`�Y`a`�c`Ie�Jemj�b`nj�e`�ojsj�uj[o�\oCu�tjDu�e`�EuIu�Kuqy�ryY�JuZ�e`�[_�aGD�HDoI�`pI�e`�qIuI�wI]N�^NET�vIFT�e`�GTKT�MTsX�tX]^�LT^^�e`�_^c^�e^Kc�Lcuh�d^vh�e`�wh{h�}hcm�dmPs�|hQs�e`�RsWs�Ysw�@xk}�Xsl}�e`�m}s}�u}[B�\BIH�t}JH�e`�RHxL�yLgR�QHhR�uRKV�LVVZ�tRWZ�fZ|]�}]Gb�eZHb�Ubke�levi�Tbwi�DjZm�[meq�Cjfq�tqJu�KuUy�sqVy�ey{|�||FA�dyGA�WAmD�nDxH�VAyH�II_L�`LjP�HIkP�xPNT�OTYX�wPZX�fX|[�}[G`�eXH`�V`Y`�U`[`�]```�\`b`�T`c`�e`��
�
��$�$�&�F�B���B�q�E�"�Q�%� �u�r�"�
�:�
��
�2���j��n�R��!�'��^U�-��t�Q�D�k�^U�:L�q�d�TU�SW�[�^U�Y`�c@�Ab�bc�^U�dz�}~�@	�|B	�D	E	�F	H	�C	J	�{K	�^U�L	a	�d	e	�f	g	�c	i	�k	l	�m	n	�j	p	�b	q	�^U�r		�A
\
�]
y
�@
z
�^U�{
I�LM�NO�KQ�ST�UV�RX�JY�^U�Zn�pB
�C
U�oV�^U�Wf�hb�c_�g`�^U�ap�rb�cW�qX�^U�Yq�si�j`�ra�^U�bm�oJ�Ke�nf�^U�g}�}�~v�~w�^U�xA�C�@z�B{�^U�|L�N^�_h �Mi �^U�j C!�E!["�\"i#�D!j#�^U�k##�A$W%�X%e&�@$f&�^U�g&A'�C'Q)�R)H+�B'I+�^U�J+Z+�\+X-�Y-P/�[+Q/�^U�R/r/�t/@1�A1S2�s/T2�^U�U2j2�l2B5�C5P7�k2Q7�^U�R7`7�b7^9�_9D;�a7E;�^U�F;V;�X;T=�U=z>�W;{>�^U�|>W?�Y?UA�VA{B�X?|B�^U�}BOC�QCcE�dEwG�PCxG�^U�yGJH�LHHJ�IJnK�KHoK�^U�pKFL�ILKL�LLNL�HLPL�RLTL�ULXL�QLZL�GL[L�^U�\LnL�qLsL�tLvL�pLxL�zL|L�}LL�yLAM�oLBM�^U�CM]M�`MbM�cMeM�_MgM�iMkM�lMnM�hMpM�^MqM�^U�rMHN�KNMN�NNPN�JNRN�TNVN�WNYN�SN[N�IN\N�^U�]NnN�pN@O�AOQO�oNRO�^U�SO_O�aOyO�zOPP�`OQP�^U�RPeP�gPBQ�CQ[Q�fP\Q�^U�]QwQ�yQWR�XRsR�xQtR�^U�uRYS�[SsS�tSQT�ZSRT�^U�STpT�sTuT�vTxT�rTzT�|TT�@UCU�{TEU�qTFU�^U�GU`U�cUeU�fUhU�bUjU�lUoU�pUsU�kUuU�aUvU�^U�wUKV�NVPV�QVSV�MVUV�WVZV�[V^V�VV`V�LVaV�^U�bV{V�}VaW�bWHX�|VIX�^U�JX_X�aX}Y�~Y\[�`X][�^U�^[j[�l[c]�d]^_�k[__�^U�`_t_�v_w`�x`za�u_{a�^U�|aTb�Vbjg�kgAm�UbBm�^U�CmXm�Zmwm�xmVn�YmWn�^U�Xnpn�rn_r�`rNv�qnOv�^U�Pvcv�evZ{�[{Q@�dvR@�^U�S@d@�f@gE�hEjJ�e@kJ�^U�lJ~J�@KMP�NP\U�J]U�^U�^UrU�tUA[�B[P`�sUQ`�^U�R`b`�d`qe�re@k�c`Ak�^U�BkVk�Xkep�fptu�Wkuu�^U�vuBv�Dvl{�m{WA�CvXA�^U�YAcA�eArF�sFAL�dABL�^U�CL\L�^LkQ�lQzV�]L{V�^U�|VQW�SWlW�mWGX�RWHX�^U�IX^X�`XmX�nX|X�_X}X�^U�~XNY�PYiY�jYDZ�OYEZ�^U�FZWZ�YZfZ�gZuZ�XZvZ�^U�wZN[�P[m[�n[L\�O[M\�^U�N\_\�a\o\�p\~\�`\\�^U�@]L]�N]`]�a]s]�M]t]�^U�u]N^�P^^^�_^m^�O^n^�^U�o^|^�~^x_�y_s`�}^t`�^U�u`Ia�Kaea�fa@b�JaAb�^U�Bb\b�^bXc�YcSd�]bTd�^U�Ud`d�bdDe�Eege�adhe�^U�ie~e�AfDf�@fFf�HfKf�GfMf�eNf�^U�Of`f�cfff�bfhf�jfmf�ifof�afpf�^U�qf}f�@gCg�DgGg�fIg�KgNg�OgRg�JgTg�~fUg�^U�Vgag�cgYh�ZhPi�bgQi�^U�Riei�gi]j�^jTk�fiUk�^U�Vklk�nkdl�el[m�mk\m�^U�]mrm�tmjn�knao�smbo�^U�coxo�zopp�qpgq�yohq�^U�iqyq�{qqr�rrhs�zqis�^U�jszs�|sFu�GuQv�{sRv�^U�Sv_v�av[x�\xVz�`vWz�^U�Xzoz�qz}�@~NA�pzOA�^U�PA]A�_AqA�rADB�^AEB�^U�FBaB�cByB�zBPC�bBQC�^U�RCmC�pCsC�oCuC�wCzC�vC|C�nC}C�^U�~CWD�ZD]D�^DaD�YDcD�eDhD�iDlD�dDnD�XDoD�^U�pDRE�UEXE�YE\E�TE^E�`EcE�dEgE�_EiE�SEjE�^U�kE@F�BFTF�UFgF�AFhF�^U�iFEG�GGeG�fGDH�FGEH�^U�eHhH�dHjH�lHoH�kHqH�cHrH�NIQI�MISI�UIXI�TIZI�LI[I�rIuI�vIyI�qI{I�}I@J�AJDJ�|IFJ�pIGJ�cJMK�NKxK�bJyK�ULL�@MjM�TLkM�DNGN�CNIN�KNNN�JNPN�BNQN�kNnN�jNpN�rNuN�qNwN�iNxN�NOQO�ROUO�MOWO�YO\O�]O`O�XObO�LOcO�wOIP�JP\P�vO]P�mPP�@QRQ�lPSQ�gQyQ�zQLR�fQMR�\RrR�sRIS�[RJS�hSkS�gSmS�oSrS�nStS�fSuS�QT_T�`TnT�PToT�OURU�NUTU�VUYU�UU[U�MU\U�^U��
���"�"�$�F�B���R��U�B�q�E�"�v�r�2��H�n�R�h�r�l��x��|�B��#�%��[�r8PK�t�\��v�ff__init__.pynu�[���PK�t�\)�zx;);)�_ast_gen.pynu�[���PK�t�\NE�??5_build_tables.pynu�[���PK�t�\4�T��
�9_c_ast.cfgnu�[���PK�t�\`�;;oJast_transforms.pynu�[���PK�t�\�e�#�z�z�`c_ast.pynu�[���PK�t�\"���~E~E��c_generator.pynu�[���PK�t�\��@E@E
�!c_lexer.pynu�[���PK�t�\
x�L�&�&.gc_parser.pynu�[���PK�t�\��@H"H"	/�lextab.pynu�[���PK�t�\7x�:��plyparser.pynu�[���PK�t�\D(�4@@
��yacctab.pynu�[���PK�t�\ލXoff@ply/__init__.pynu�[���PK�t�\U�ؙ��
�ply/cpp.pynu�[���PK�t�\�X{ii!�ply/ctokens.pynu�[���PK�t�\e�������
ȓply/lex.pynu�[���PK�t�\�?�0kk�;ply/yacc.pynu�[���PK�t�\vw����VT	ply/ygen.pynu�[���PK�t�\��<��(\]	ply/__pycache__/__init__.cpython-312.pycnu�[���PK�t�\a�
��}�}#�^	ply/__pycache__/cpp.cpython-312.pycnu�[���PK�t�\��Ǐ�	�	'��	ply/__pycache__/ctokens.cpython-312.pycnu�[���PK�t�\���k����#��	ply/__pycache__/lex.cpython-312.pycnu�[���PK�t�\d�sf��$��
ply/__pycache__/yacc.cpython-312.pycnu�[���PK�t�\n	�܌�$�ply/__pycache__/ygen.cpython-312.pycnu�[���PK�t�\�����$�__pycache__/__init__.cpython-312.pycnu�[���PK�t�\@��0�0$�)__pycache__/_ast_gen.cpython-312.pycnu�[���PK�t�\	�J��)�Z__pycache__/_build_tables.cpython-312.pycnu�[���PK�t�\��*o��*"^__pycache__/ast_transforms.cpython-312.pycnu�[���PK�t�\R�����!!t__pycache__/c_ast.cpython-312.pycnu�[���PK�t�\�b�bubu'n8
__pycache__/c_generator.cpython-312.pycnu�[���PK�t�\�hV�FGFG#'�
__pycache__/c_lexer.cpython-312.pycnu�[���PK�t�\c�-�YY$��
__pycache__/c_parser.cpython-312.pycnu�[���PK�t�\<Y�--"%O__pycache__/lextab.cpython-312.pycnu�[���PK�t�\n�����%�j__pycache__/plyparser.cpython-312.pycnu�[���PK�t�\j�@#����#��__pycache__/yacctab.cpython-312.pycnu�[���PK##pq