parser.py revision 11062
16657Snate@binkert.org# Copyright (c) 2009 The Hewlett-Packard Development Company
26657Snate@binkert.org# All rights reserved.
36657Snate@binkert.org#
46657Snate@binkert.org# Redistribution and use in source and binary forms, with or without
56657Snate@binkert.org# modification, are permitted provided that the following conditions are
66657Snate@binkert.org# met: redistributions of source code must retain the above copyright
76657Snate@binkert.org# notice, this list of conditions and the following disclaimer;
86657Snate@binkert.org# redistributions in binary form must reproduce the above copyright
96657Snate@binkert.org# notice, this list of conditions and the following disclaimer in the
106657Snate@binkert.org# documentation and/or other materials provided with the distribution;
116657Snate@binkert.org# neither the name of the copyright holders nor the names of its
126657Snate@binkert.org# contributors may be used to endorse or promote products derived from
136657Snate@binkert.org# this software without specific prior written permission.
146657Snate@binkert.org#
156657Snate@binkert.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
166657Snate@binkert.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
176657Snate@binkert.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
186657Snate@binkert.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
196657Snate@binkert.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
206657Snate@binkert.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
216657Snate@binkert.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
226657Snate@binkert.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
236657Snate@binkert.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
246657Snate@binkert.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
256657Snate@binkert.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
266657Snate@binkert.org#
276657Snate@binkert.org# Authors: Nathan Binkert
286657Snate@binkert.org
296657Snate@binkert.orgimport os.path
306657Snate@binkert.orgimport re
316657Snate@binkert.orgimport sys
326657Snate@binkert.org
336999Snate@binkert.orgfrom m5.util import code_formatter
348452Snate@binkert.orgfrom m5.util.grammar import Grammar, ParseError
356657Snate@binkert.org
366657Snate@binkert.orgimport slicc.ast as ast
376657Snate@binkert.orgimport slicc.util as util
386657Snate@binkert.orgfrom slicc.symbols import SymbolTable
396657Snate@binkert.org
406657Snate@binkert.orgclass SLICC(Grammar):
419219Spower.jg@gmail.com    def __init__(self, filename, base_dir, verbose=False, traceback=False, **kwargs):
428454Snate@binkert.org        self.protocol = None
438454Snate@binkert.org        self.traceback = traceback
448453Snate@binkert.org        self.verbose = verbose
456999Snate@binkert.org        self.symtab = SymbolTable(self)
469219Spower.jg@gmail.com        self.base_dir = base_dir
476999Snate@binkert.org
488454Snate@binkert.org        try:
498454Snate@binkert.org            self.decl_list = self.parse_file(filename, **kwargs)
508454Snate@binkert.org        except ParseError, e:
518454Snate@binkert.org            if not self.traceback:
528454Snate@binkert.org                sys.exit(str(e))
538454Snate@binkert.org            raise
548454Snate@binkert.org
558453Snate@binkert.org    def currentLocation(self):
568453Snate@binkert.org        return util.Location(self.current_source, self.current_line,
578453Snate@binkert.org                             no_warning=not self.verbose)
588453Snate@binkert.org
596999Snate@binkert.org    def codeFormatter(self, *args, **kwargs):
606999Snate@binkert.org        code = code_formatter(*args, **kwargs)
616999Snate@binkert.org        code['protocol'] = self.protocol
626999Snate@binkert.org        return code
636657Snate@binkert.org
648453Snate@binkert.org    def process(self):
658454Snate@binkert.org        self.decl_list.findMachines()
668454Snate@binkert.org        self.decl_list.generate()
676657Snate@binkert.org
689219Spower.jg@gmail.com    def writeCodeFiles(self, code_path, includes):
699219Spower.jg@gmail.com        self.symtab.writeCodeFiles(code_path, includes)
706657Snate@binkert.org
718453Snate@binkert.org    def writeHTMLFiles(self, html_path):
728453Snate@binkert.org        self.symtab.writeHTMLFiles(html_path)
736657Snate@binkert.org
746657Snate@binkert.org    def files(self):
756714Ssteve.reinhardt@amd.com        f = set([
766714Ssteve.reinhardt@amd.com            'MachineType.cc',
776657Snate@binkert.org            'MachineType.hh',
786657Snate@binkert.org            'Types.hh' ])
796657Snate@binkert.org
808454Snate@binkert.org        f |= self.decl_list.files()
816657Snate@binkert.org
826714Ssteve.reinhardt@amd.com        return f
836657Snate@binkert.org
846657Snate@binkert.org    t_ignore = '\t '
856657Snate@binkert.org
866657Snate@binkert.org    # C or C++ comment (ignore)
876657Snate@binkert.org    def t_c_comment(self, t):
886657Snate@binkert.org        r'/\*(.|\n)*?\*/'
896657Snate@binkert.org        t.lexer.lineno += t.value.count('\n')
906657Snate@binkert.org
916657Snate@binkert.org    def t_cpp_comment(self, t):
926657Snate@binkert.org        r'//.*'
936657Snate@binkert.org
946657Snate@binkert.org    # Define a rule so we can track line numbers
956657Snate@binkert.org    def t_newline(self, t):
966657Snate@binkert.org        r'\n+'
976657Snate@binkert.org        t.lexer.lineno += len(t.value)
986657Snate@binkert.org
996657Snate@binkert.org    reserved = {
1008454Snate@binkert.org        'protocol' : 'PROTOCOL',
1018454Snate@binkert.org        'include' : 'INCLUDE',
1026657Snate@binkert.org        'global' : 'GLOBAL',
1036657Snate@binkert.org        'machine' : 'MACHINE',
1046657Snate@binkert.org        'in_port' : 'IN_PORT',
1056657Snate@binkert.org        'out_port' : 'OUT_PORT',
1066657Snate@binkert.org        'action' : 'ACTION',
1076657Snate@binkert.org        'transition' : 'TRANS',
1086657Snate@binkert.org        'structure' : 'STRUCT',
1096657Snate@binkert.org        'external_type' : 'EXTERN_TYPE',
1106657Snate@binkert.org        'enumeration' : 'ENUM',
1118086SBrad.Beckmann@amd.com        'state_declaration' : 'STATE_DECL',
1126657Snate@binkert.org        'peek' : 'PEEK',
1137567SBrad.Beckmann@amd.com        'stall_and_wait' : 'STALL_AND_WAIT',
1146657Snate@binkert.org        'enqueue' : 'ENQUEUE',
1156657Snate@binkert.org        'check_allocate' : 'CHECK_ALLOCATE',
11610981SBrad.Beckmann@amd.com        'check_next_cycle' : 'CHECK_NEXT_CYCLE',
1176657Snate@binkert.org        'check_stop_slots' : 'CHECK_STOP_SLOTS',
1186882SBrad.Beckmann@amd.com        'static_cast' : 'STATIC_CAST',
1196657Snate@binkert.org        'if' : 'IF',
1207839Snilay@cs.wisc.edu        'is_valid' : 'IS_VALID',
1217839Snilay@cs.wisc.edu        'is_invalid' : 'IS_INVALID',
1226657Snate@binkert.org        'else' : 'ELSE',
1236657Snate@binkert.org        'return' : 'RETURN',
1246657Snate@binkert.org        'void' : 'VOID',
1256657Snate@binkert.org        'new' : 'NEW',
1267839Snilay@cs.wisc.edu        'OOD' : 'OOD',
1276657Snate@binkert.org    }
1286657Snate@binkert.org
1296657Snate@binkert.org    literals = ':[]{}(),='
1306657Snate@binkert.org
1316657Snate@binkert.org    tokens = [ 'EQ', 'NE', 'LT', 'GT', 'LE', 'GE',
1326657Snate@binkert.org               'LEFTSHIFT', 'RIGHTSHIFT',
1336657Snate@binkert.org               'NOT', 'AND', 'OR',
1346657Snate@binkert.org               'PLUS', 'DASH', 'STAR', 'SLASH',
1359692Snilay@cs.wisc.edu               'INCR', 'DECR',
1366657Snate@binkert.org               'DOUBLE_COLON', 'SEMI',
1376657Snate@binkert.org               'ASSIGN', 'DOT',
1386657Snate@binkert.org               'IDENT', 'LIT_BOOL', 'FLOATNUMBER', 'NUMBER', 'STRING' ]
1396657Snate@binkert.org    tokens += reserved.values()
1406657Snate@binkert.org
1416657Snate@binkert.org    t_EQ = r'=='
1426657Snate@binkert.org    t_NE = r'!='
1436657Snate@binkert.org    t_LT = r'<'
1446657Snate@binkert.org    t_GT = r'>'
1456657Snate@binkert.org    t_LE = r'<='
1466657Snate@binkert.org    t_GE = r'>='
1476657Snate@binkert.org    t_LEFTSHIFT = r'<<'
1486657Snate@binkert.org    t_RIGHTSHIFT = r'>>'
1496657Snate@binkert.org    t_NOT = r'!'
1506657Snate@binkert.org    t_AND = r'&&'
1516657Snate@binkert.org    t_OR = r'\|\|'
1526657Snate@binkert.org    t_PLUS = r'\+'
1536657Snate@binkert.org    t_DASH = r'-'
1546657Snate@binkert.org    t_STAR = r'\*'
1556657Snate@binkert.org    t_SLASH = r'/'
1566657Snate@binkert.org    t_DOUBLE_COLON = r'::'
1576657Snate@binkert.org    t_SEMI = r';'
1586657Snate@binkert.org    t_ASSIGN = r':='
1596657Snate@binkert.org    t_DOT = r'\.'
1609692Snilay@cs.wisc.edu    t_INCR = r'\+\+'
1619692Snilay@cs.wisc.edu    t_DECR = r'--'
1626657Snate@binkert.org
1636657Snate@binkert.org    precedence = (
1649692Snilay@cs.wisc.edu        ('left', 'INCR', 'DECR'),
1656657Snate@binkert.org        ('left', 'AND', 'OR'),
1666657Snate@binkert.org        ('left', 'EQ', 'NE'),
1676657Snate@binkert.org        ('left', 'LT', 'GT', 'LE', 'GE'),
1686657Snate@binkert.org        ('left', 'RIGHTSHIFT', 'LEFTSHIFT'),
1696657Snate@binkert.org        ('left', 'PLUS', 'DASH'),
1706657Snate@binkert.org        ('left', 'STAR', 'SLASH'),
1716657Snate@binkert.org        ('right', 'NOT', 'UMINUS'),
1726657Snate@binkert.org    )
1736657Snate@binkert.org
1746657Snate@binkert.org    def t_IDENT(self, t):
1756657Snate@binkert.org        r'[a-zA-Z_][a-zA-Z_0-9]*'
1766657Snate@binkert.org        if t.value == 'true':
1776657Snate@binkert.org            t.type = 'LIT_BOOL'
1786657Snate@binkert.org            t.value = True
1796657Snate@binkert.org            return t
1806657Snate@binkert.org
1816657Snate@binkert.org        if t.value == 'false':
1826657Snate@binkert.org            t.type = 'LIT_BOOL'
1836657Snate@binkert.org            t.value = False
1846657Snate@binkert.org            return t
1856657Snate@binkert.org
1866657Snate@binkert.org        # Check for reserved words
1876657Snate@binkert.org        t.type = self.reserved.get(t.value, 'IDENT')
1886657Snate@binkert.org        return t
1896657Snate@binkert.org
1906657Snate@binkert.org    def t_FLOATNUMBER(self, t):
1916657Snate@binkert.org        '[0-9]+[.][0-9]+'
1926657Snate@binkert.org        try:
1936657Snate@binkert.org            t.value = float(t.value)
1946657Snate@binkert.org        except ValueError:
1958452Snate@binkert.org            raise ParseError("Illegal float", t)
1966657Snate@binkert.org        return t
1976657Snate@binkert.org
1986657Snate@binkert.org    def t_NUMBER(self, t):
1996657Snate@binkert.org        r'[0-9]+'
2006657Snate@binkert.org        try:
2016657Snate@binkert.org            t.value = int(t.value)
2026657Snate@binkert.org        except ValueError:
2038452Snate@binkert.org            raise ParseError("Illegal number", t)
2046657Snate@binkert.org        return t
2056657Snate@binkert.org
2066657Snate@binkert.org    def t_STRING1(self, t):
2076657Snate@binkert.org        r'\"[^"\n]*\"'
2086657Snate@binkert.org        t.type = 'STRING'
2096657Snate@binkert.org        t.value = t.value[1:-1]
2106657Snate@binkert.org        return t
2116657Snate@binkert.org
2126657Snate@binkert.org    def t_STRING2(self, t):
2136657Snate@binkert.org        r"\'[^'\n]*\'"
2146657Snate@binkert.org        t.type = 'STRING'
2156657Snate@binkert.org        t.value = t.value[1:-1]
2166657Snate@binkert.org        return t
2176657Snate@binkert.org
2186657Snate@binkert.org    def p_file(self, p):
2196657Snate@binkert.org        "file : decls"
2206657Snate@binkert.org        p[0] = p[1]
2216657Snate@binkert.org
2226657Snate@binkert.org    def p_empty(self, p):
2236657Snate@binkert.org        "empty :"
2246657Snate@binkert.org
2256657Snate@binkert.org    def p_decls(self, p):
2266657Snate@binkert.org        "decls : declsx"
2276657Snate@binkert.org        p[0] = ast.DeclListAST(self, p[1])
2286657Snate@binkert.org
2296657Snate@binkert.org    def p_declsx__list(self, p):
2306657Snate@binkert.org        "declsx : decl declsx"
2318454Snate@binkert.org        if isinstance(p[1], ast.DeclListAST):
2328454Snate@binkert.org            decls = p[1].decls
2338454Snate@binkert.org        elif p[1] is None:
2348454Snate@binkert.org            decls = []
2358454Snate@binkert.org        else:
2368454Snate@binkert.org            decls = [ p[1] ]
2378454Snate@binkert.org        p[0] = decls + p[2]
2386657Snate@binkert.org
2396657Snate@binkert.org    def p_declsx__none(self, p):
2406657Snate@binkert.org        "declsx : empty"
2416657Snate@binkert.org        p[0] = []
2426657Snate@binkert.org
2438454Snate@binkert.org    def p_decl__protocol(self, p):
2448454Snate@binkert.org        "decl : PROTOCOL STRING SEMI"
2458454Snate@binkert.org        if self.protocol:
2468454Snate@binkert.org            msg = "Protocol can only be set once! Error at %s:%s\n" % \
2478454Snate@binkert.org                (self.current_source, self.current_line)
2488454Snate@binkert.org            raise ParseError(msg)
2498454Snate@binkert.org        self.protocol = p[2]
2508454Snate@binkert.org        p[0] = None
2518454Snate@binkert.org
2528454Snate@binkert.org    def p_decl__include(self, p):
2538454Snate@binkert.org        "decl : INCLUDE STRING SEMI"
2548454Snate@binkert.org        dirname = os.path.dirname(self.current_source)
2559219Spower.jg@gmail.com        if os.path.exists(os.path.join(dirname, p[2])):
2569219Spower.jg@gmail.com            filename = os.path.join(dirname, p[2])
2579219Spower.jg@gmail.com        else:
2589219Spower.jg@gmail.com            filename = os.path.join(self.base_dir, p[2])
2598454Snate@binkert.org        p[0] = self.parse_file(filename)
2608454Snate@binkert.org
2619773Snilay@cs.wisc.edu    def p_decl__machine0(self, p):
26210308Snilay@cs.wisc.edu        "decl : MACHINE '(' idents ')' ':' obj_decls '{' decls '}'"
2639773Snilay@cs.wisc.edu        p[0] = ast.MachineAST(self, p[3], [], p[7], p[9])
2649773Snilay@cs.wisc.edu
2659773Snilay@cs.wisc.edu    def p_decl__machine1(self, p):
26610308Snilay@cs.wisc.edu        "decl : MACHINE '(' idents pairs ')' ':' obj_decls '{' decls '}'"
2676657Snate@binkert.org        p[0] = ast.MachineAST(self, p[3], p[4], p[7], p[9])
2686657Snate@binkert.org
2696657Snate@binkert.org    def p_decl__action(self, p):
2706657Snate@binkert.org        "decl : ACTION '(' ident pairs ')' statements"
2716657Snate@binkert.org        p[0] = ast.ActionDeclAST(self, p[3], p[4], p[6])
2726657Snate@binkert.org
2736657Snate@binkert.org    def p_decl__in_port(self, p):
2746657Snate@binkert.org        "decl : IN_PORT '(' ident ',' type ',' var pairs ')' statements"
2756657Snate@binkert.org        p[0] = ast.InPortDeclAST(self, p[3], p[5], p[7], p[8], p[10])
2766657Snate@binkert.org
2776657Snate@binkert.org    def p_decl__out_port(self, p):
2786657Snate@binkert.org        "decl : OUT_PORT '(' ident ',' type ',' var pairs ')' SEMI"
2796657Snate@binkert.org        p[0] = ast.OutPortDeclAST(self, p[3], p[5], p[7], p[8])
2806657Snate@binkert.org
2816657Snate@binkert.org    def p_decl__trans0(self, p):
28210964Sdavid.hashe@amd.com        "decl : TRANS '(' idents ',' idents ',' ident_or_star ')' idents"
28310165Snilay@cs.wisc.edu        p[0] = ast.TransitionDeclAST(self, [], p[3], p[5], p[7], p[9])
2846657Snate@binkert.org
2856657Snate@binkert.org    def p_decl__trans1(self, p):
28610165Snilay@cs.wisc.edu        "decl : TRANS '(' idents ',' idents ')' idents"
28710165Snilay@cs.wisc.edu        p[0] = ast.TransitionDeclAST(self, [], p[3], p[5], None, p[7])
2889104Shestness@cs.utexas.edu
2899104Shestness@cs.utexas.edu    def p_decl__trans2(self, p):
29010964Sdavid.hashe@amd.com        "decl : TRANS '(' idents ',' idents ',' ident_or_star ')' idents idents"
29110165Snilay@cs.wisc.edu        p[0] = ast.TransitionDeclAST(self, p[9], p[3], p[5], p[7], p[10])
2929104Shestness@cs.utexas.edu
2939104Shestness@cs.utexas.edu    def p_decl__trans3(self, p):
29410165Snilay@cs.wisc.edu        "decl : TRANS '(' idents ',' idents ')' idents idents"
29510165Snilay@cs.wisc.edu        p[0] = ast.TransitionDeclAST(self, p[7], p[3], p[5], None, p[8])
2966657Snate@binkert.org
2976657Snate@binkert.org    def p_decl__extern0(self, p):
2986657Snate@binkert.org        "decl : EXTERN_TYPE '(' type pairs ')' SEMI"
2996657Snate@binkert.org        p[4]["external"] = "yes"
3006657Snate@binkert.org        p[0] = ast.TypeDeclAST(self, p[3], p[4], [])
3016657Snate@binkert.org
3026657Snate@binkert.org    def p_decl__global(self, p):
3036657Snate@binkert.org        "decl : GLOBAL '(' type pairs ')' '{' type_members '}'"
3046657Snate@binkert.org        p[4]["global"] = "yes"
3056657Snate@binkert.org        p[0] = ast.TypeDeclAST(self, p[3], p[4], p[7])
3066657Snate@binkert.org
3076657Snate@binkert.org    def p_decl__struct(self, p):
3086657Snate@binkert.org        "decl : STRUCT '(' type pairs ')' '{' type_members '}'"
3096657Snate@binkert.org        p[0] = ast.TypeDeclAST(self, p[3], p[4], p[7])
3106657Snate@binkert.org
3116657Snate@binkert.org    def p_decl__enum(self, p):
3126657Snate@binkert.org        "decl : ENUM '(' type pairs ')' '{' type_enums   '}'"
3136657Snate@binkert.org        p[4]["enumeration"] = "yes"
3146657Snate@binkert.org        p[0] = ast.EnumDeclAST(self, p[3], p[4], p[7])
3156657Snate@binkert.org
3168086SBrad.Beckmann@amd.com    def p_decl__state_decl(self, p):
3178086SBrad.Beckmann@amd.com        "decl : STATE_DECL '(' type pairs ')' '{' type_states   '}'"
3188086SBrad.Beckmann@amd.com        p[4]["enumeration"] = "yes"
3198086SBrad.Beckmann@amd.com        p[4]["state_decl"] = "yes"
3208086SBrad.Beckmann@amd.com        p[0] = ast.StateDeclAST(self, p[3], p[4], p[7])
3218086SBrad.Beckmann@amd.com
32210307Snilay@cs.wisc.edu    # Type fields
32310308Snilay@cs.wisc.edu    def p_obj_decls__list(self, p):
32410308Snilay@cs.wisc.edu        "obj_decls : obj_decl obj_decls"
32510308Snilay@cs.wisc.edu        p[0] = [ p[1] ] + p[2]
32610308Snilay@cs.wisc.edu
32710308Snilay@cs.wisc.edu    def p_obj_decls__empty(self, p):
32810308Snilay@cs.wisc.edu        "obj_decls : empty"
32910308Snilay@cs.wisc.edu        p[0] = []
33010308Snilay@cs.wisc.edu
33110307Snilay@cs.wisc.edu    def p_type_members__list(self, p):
33210307Snilay@cs.wisc.edu        "type_members : type_member type_members"
33310307Snilay@cs.wisc.edu        p[0] = [ p[1] ] + p[2]
33410307Snilay@cs.wisc.edu
33510307Snilay@cs.wisc.edu    def p_type_members__empty(self, p):
33610307Snilay@cs.wisc.edu        "type_members : empty"
33710307Snilay@cs.wisc.edu        p[0] = []
33810307Snilay@cs.wisc.edu
33910307Snilay@cs.wisc.edu    def p_type_member__0(self, p):
34010307Snilay@cs.wisc.edu        """type_member : obj_decl
34110307Snilay@cs.wisc.edu                       | func_decl
34210307Snilay@cs.wisc.edu                       | func_def"""
34310307Snilay@cs.wisc.edu        p[0] = p[1]
34410307Snilay@cs.wisc.edu
34510307Snilay@cs.wisc.edu    # Member / Variable declarations
34610307Snilay@cs.wisc.edu    def p_decl__obj_decl(self, p):
34710307Snilay@cs.wisc.edu        "decl : obj_decl"
34810307Snilay@cs.wisc.edu        p[0] = p[1]
34910307Snilay@cs.wisc.edu
35010307Snilay@cs.wisc.edu    def p_obj_decl__0(self, p):
35110307Snilay@cs.wisc.edu        "obj_decl : type ident pairs SEMI"
35210308Snilay@cs.wisc.edu        p[0] = ast.ObjDeclAST(self, p[1], p[2], p[3], None, False)
35310307Snilay@cs.wisc.edu
35410307Snilay@cs.wisc.edu    def p_obj_decl__1(self, p):
35510307Snilay@cs.wisc.edu        "obj_decl : type STAR ident pairs SEMI"
35610308Snilay@cs.wisc.edu        p[0] = ast.ObjDeclAST(self, p[1], p[3], p[4], None, True)
35710307Snilay@cs.wisc.edu
35810307Snilay@cs.wisc.edu    def p_obj_decl__2(self, p):
35910307Snilay@cs.wisc.edu        "obj_decl : type ident ASSIGN expr SEMI"
36010308Snilay@cs.wisc.edu        p[0] = ast.ObjDeclAST(self, p[1], p[2], ast.PairListAST(self), p[4],
36110308Snilay@cs.wisc.edu                False)
36210307Snilay@cs.wisc.edu
36310307Snilay@cs.wisc.edu    def p_obj_decl__3(self, p):
36410307Snilay@cs.wisc.edu        "obj_decl : type STAR ident ASSIGN expr SEMI"
36510308Snilay@cs.wisc.edu        p[0] = ast.ObjDeclAST(self, p[1], p[3], ast.PairListAST(self), p[5],
36610308Snilay@cs.wisc.edu                True)
3676657Snate@binkert.org
3689298Snilay@cs.wisc.edu    # Function definition and declaration
3696657Snate@binkert.org    def p_decl__func_decl(self, p):
3709298Snilay@cs.wisc.edu        "decl : func_decl"
3719298Snilay@cs.wisc.edu        p[0] = p[1]
3729298Snilay@cs.wisc.edu
3739298Snilay@cs.wisc.edu    def p_func_decl__0(self, p):
3749298Snilay@cs.wisc.edu        """func_decl :  void ident '(' params ')' pairs SEMI
3756657Snate@binkert.org                | type ident '(' params ')' pairs SEMI"""
3766657Snate@binkert.org        p[0] = ast.FuncDeclAST(self, p[1], p[2], p[4], p[6], None)
3776657Snate@binkert.org
37810307Snilay@cs.wisc.edu    def p_func_decl__1(self, p):
37910307Snilay@cs.wisc.edu        """func_decl :  void ident '(' types ')' pairs SEMI
38010307Snilay@cs.wisc.edu                | type ident '(' types ')' pairs SEMI"""
38110307Snilay@cs.wisc.edu        p[0] = ast.FuncDeclAST(self, p[1], p[2], p[4], p[6], None)
38210307Snilay@cs.wisc.edu
3836657Snate@binkert.org    def p_decl__func_def(self, p):
3849298Snilay@cs.wisc.edu        "decl : func_def"
3859298Snilay@cs.wisc.edu        p[0] = p[1]
3869298Snilay@cs.wisc.edu
3879298Snilay@cs.wisc.edu    def p_func_def__0(self, p):
3889298Snilay@cs.wisc.edu        """func_def : void ident '(' params ')' pairs statements
3899298Snilay@cs.wisc.edu            | type ident '(' params ')' pairs statements"""
3906657Snate@binkert.org        p[0] = ast.FuncDeclAST(self, p[1], p[2], p[4], p[6], p[7])
3916657Snate@binkert.org
3926657Snate@binkert.org    # Enum fields
3936657Snate@binkert.org    def p_type_enums__list(self, p):
3946657Snate@binkert.org        "type_enums : type_enum type_enums"
3956657Snate@binkert.org        p[0] = [ p[1] ] + p[2]
3966657Snate@binkert.org
3976657Snate@binkert.org    def p_type_enums__empty(self, p):
3986657Snate@binkert.org        "type_enums : empty"
3996657Snate@binkert.org        p[0] = []
4006657Snate@binkert.org
4016657Snate@binkert.org    def p_type_enum(self, p):
4026657Snate@binkert.org        "type_enum : ident pairs SEMI"
4036657Snate@binkert.org        p[0] = ast.TypeFieldEnumAST(self, p[1], p[2])
4046657Snate@binkert.org
4058086SBrad.Beckmann@amd.com    # States
4068086SBrad.Beckmann@amd.com    def p_type_states__list(self, p):
4078086SBrad.Beckmann@amd.com        "type_states : type_state type_states"
4088086SBrad.Beckmann@amd.com        p[0] = [ p[1] ] + p[2]
4098086SBrad.Beckmann@amd.com
4108086SBrad.Beckmann@amd.com    def p_type_states__empty(self, p):
4118086SBrad.Beckmann@amd.com        "type_states : empty"
4128086SBrad.Beckmann@amd.com        p[0] = []
4138086SBrad.Beckmann@amd.com
4148086SBrad.Beckmann@amd.com    def p_type_state(self, p):
4158086SBrad.Beckmann@amd.com        "type_state : ident ',' enumeration pairs SEMI"
4168086SBrad.Beckmann@amd.com        p[0] = ast.TypeFieldStateAST(self, p[1], p[3], p[4])
4178086SBrad.Beckmann@amd.com
4186657Snate@binkert.org    # Formal Param
4196657Snate@binkert.org    def p_params__many(self, p):
4206657Snate@binkert.org        "params : param ',' params"
4216657Snate@binkert.org        p[0] = [ p[1] ] + p[3]
4226657Snate@binkert.org
4236657Snate@binkert.org    def p_params__one(self, p):
4246657Snate@binkert.org        "params : param"
4256657Snate@binkert.org        p[0] = [ p[1] ]
4266657Snate@binkert.org
4276657Snate@binkert.org    def p_params__none(self, p):
4286657Snate@binkert.org        "params : empty"
4296657Snate@binkert.org        p[0] = []
4306657Snate@binkert.org
4316657Snate@binkert.org    def p_param(self, p):
4326657Snate@binkert.org        "param : type ident"
4336657Snate@binkert.org        p[0] = ast.FormalParamAST(self, p[1], p[2])
4346657Snate@binkert.org
4356882SBrad.Beckmann@amd.com    def p_param__pointer(self, p):
4366882SBrad.Beckmann@amd.com        "param : type STAR ident"
4376882SBrad.Beckmann@amd.com        p[0] = ast.FormalParamAST(self, p[1], p[3], None, True)
4386882SBrad.Beckmann@amd.com
4396907SBrad.Beckmann@amd.com    def p_param__pointer_default(self, p):
44010308Snilay@cs.wisc.edu        "param : type STAR ident ASSIGN STRING"
4416907SBrad.Beckmann@amd.com        p[0] = ast.FormalParamAST(self, p[1], p[3], p[5], True)
4426907SBrad.Beckmann@amd.com
4436907SBrad.Beckmann@amd.com    def p_param__default_number(self, p):
44410308Snilay@cs.wisc.edu        "param : type ident ASSIGN NUMBER"
4456877Ssteve.reinhardt@amd.com        p[0] = ast.FormalParamAST(self, p[1], p[2], p[4])
4466877Ssteve.reinhardt@amd.com
4476907SBrad.Beckmann@amd.com    def p_param__default_bool(self, p):
44810308Snilay@cs.wisc.edu        "param : type ident ASSIGN LIT_BOOL"
4496907SBrad.Beckmann@amd.com        p[0] = ast.FormalParamAST(self, p[1], p[2], p[4])
4506907SBrad.Beckmann@amd.com
4516907SBrad.Beckmann@amd.com    def p_param__default_string(self, p):
45210308Snilay@cs.wisc.edu        "param : type ident ASSIGN STRING"
4536907SBrad.Beckmann@amd.com        p[0] = ast.FormalParamAST(self, p[1], p[2], p[4])
4546907SBrad.Beckmann@amd.com
45510307Snilay@cs.wisc.edu    # Type
45610307Snilay@cs.wisc.edu    def p_types__multiple(self, p):
45710307Snilay@cs.wisc.edu        "types : type ',' types"
45810307Snilay@cs.wisc.edu        p[0] = [ p[1] ] + p[3]
45910307Snilay@cs.wisc.edu
46010307Snilay@cs.wisc.edu    def p_types__one(self, p):
46110307Snilay@cs.wisc.edu        "types : type"
46210307Snilay@cs.wisc.edu        p[0] = [ p[1] ]
46310307Snilay@cs.wisc.edu
46410307Snilay@cs.wisc.edu    def p_types__empty(self, p):
46510307Snilay@cs.wisc.edu        "types : empty"
46610307Snilay@cs.wisc.edu        p[0] = []
46710307Snilay@cs.wisc.edu
46810307Snilay@cs.wisc.edu    def p_typestr__multi(self, p):
46910307Snilay@cs.wisc.edu        "typestr : typestr DOUBLE_COLON ident"
47010307Snilay@cs.wisc.edu        p[0] = '%s::%s' % (p[1], p[3])
47110307Snilay@cs.wisc.edu
47210307Snilay@cs.wisc.edu    def p_typestr__single(self, p):
47310307Snilay@cs.wisc.edu        "typestr : ident"
47410307Snilay@cs.wisc.edu        p[0] = p[1]
47510307Snilay@cs.wisc.edu
47610307Snilay@cs.wisc.edu    def p_type__one(self, p):
47710307Snilay@cs.wisc.edu        "type : typestr"
47810307Snilay@cs.wisc.edu        p[0] = ast.TypeAST(self, p[1])
47910307Snilay@cs.wisc.edu
48010307Snilay@cs.wisc.edu    def p_void(self, p):
48110307Snilay@cs.wisc.edu        "void : VOID"
48210307Snilay@cs.wisc.edu        p[0] = ast.TypeAST(self, p[1])
48310307Snilay@cs.wisc.edu
4846657Snate@binkert.org    # Idents and lists
4856657Snate@binkert.org    def p_idents__braced(self, p):
4866657Snate@binkert.org        "idents : '{' identx '}'"
4876657Snate@binkert.org        p[0] = p[2]
4886657Snate@binkert.org
4896657Snate@binkert.org    def p_idents__bare(self, p):
4906657Snate@binkert.org        "idents : ident"
4916657Snate@binkert.org        p[0] = [ p[1] ]
4926657Snate@binkert.org
4936657Snate@binkert.org    def p_identx__multiple_1(self, p):
4946657Snate@binkert.org        """identx : ident SEMI identx
4956657Snate@binkert.org                  | ident ',' identx"""
4966657Snate@binkert.org        p[0] = [ p[1] ] + p[3]
4976657Snate@binkert.org
4986657Snate@binkert.org    def p_identx__multiple_2(self, p):
4996657Snate@binkert.org        "identx : ident identx"
5006657Snate@binkert.org        p[0] = [ p[1] ] + p[2]
5016657Snate@binkert.org
5026657Snate@binkert.org    def p_identx__single(self, p):
5036657Snate@binkert.org        "identx : empty"
5046657Snate@binkert.org        p[0] = [ ]
5056657Snate@binkert.org
5066657Snate@binkert.org    def p_ident(self, p):
5076657Snate@binkert.org        "ident : IDENT"
5086657Snate@binkert.org        p[0] = p[1]
5096657Snate@binkert.org
51010964Sdavid.hashe@amd.com    def p_ident_or_star(self, p):
51110964Sdavid.hashe@amd.com        """ident_or_star : ident
51210964Sdavid.hashe@amd.com                         | STAR"""
51310964Sdavid.hashe@amd.com        p[0] = p[1]
51410964Sdavid.hashe@amd.com
5156657Snate@binkert.org    # Pair and pair lists
5166657Snate@binkert.org    def p_pairs__list(self, p):
5176657Snate@binkert.org        "pairs : ',' pairsx"
5186657Snate@binkert.org        p[0] = p[2]
5196657Snate@binkert.org
5206657Snate@binkert.org    def p_pairs__empty(self, p):
5216657Snate@binkert.org        "pairs : empty"
5226657Snate@binkert.org        p[0] = ast.PairListAST(self)
5236657Snate@binkert.org
5246657Snate@binkert.org    def p_pairsx__many(self, p):
5256657Snate@binkert.org        "pairsx : pair ',' pairsx"
5266657Snate@binkert.org        p[0] = p[3]
5276657Snate@binkert.org        p[0].addPair(p[1])
5286657Snate@binkert.org
5296657Snate@binkert.org    def p_pairsx__one(self, p):
5306657Snate@binkert.org        "pairsx : pair"
5316657Snate@binkert.org        p[0] = ast.PairListAST(self)
5326657Snate@binkert.org        p[0].addPair(p[1])
5336657Snate@binkert.org
5346657Snate@binkert.org    def p_pair__assign(self, p):
5356657Snate@binkert.org        """pair : ident '=' STRING
5367567SBrad.Beckmann@amd.com                | ident '=' ident
5377567SBrad.Beckmann@amd.com                | ident '=' NUMBER"""
5386657Snate@binkert.org        p[0] = ast.PairAST(self, p[1], p[3])
5396657Snate@binkert.org
5406657Snate@binkert.org    def p_pair__literal(self, p):
5416657Snate@binkert.org        "pair : STRING"
5426657Snate@binkert.org        p[0] = ast.PairAST(self, "short", p[1])
5436657Snate@binkert.org
5446657Snate@binkert.org    # Below are the rules for action descriptions
5456657Snate@binkert.org    def p_statements__inner(self, p):
5466657Snate@binkert.org        "statements : '{' statements_inner '}'"
5476657Snate@binkert.org        p[0] = ast.StatementListAST(self, p[2])
5486657Snate@binkert.org
5496657Snate@binkert.org    def p_statements__none(self, p):
5506657Snate@binkert.org        "statements : '{' '}'"
5516657Snate@binkert.org        p[0] = ast.StatementListAST(self, [])
5526657Snate@binkert.org
5536657Snate@binkert.org    def p_statements_inner__many(self, p):
5546657Snate@binkert.org        "statements_inner : statement statements_inner"
5556657Snate@binkert.org        p[0] = [ p[1] ] + p[2]
5566657Snate@binkert.org
5576657Snate@binkert.org    def p_statements_inner__one(self, p):
5586657Snate@binkert.org        "statements_inner : statement"
5596657Snate@binkert.org        p[0] = [ p[1] ]
5606657Snate@binkert.org
5616657Snate@binkert.org    def p_exprs__multiple(self, p):
5626657Snate@binkert.org        "exprs : expr ',' exprs"
5636657Snate@binkert.org        p[0] = [ p[1] ] + p[3]
5646657Snate@binkert.org
5656657Snate@binkert.org    def p_exprs__one(self, p):
5666657Snate@binkert.org        "exprs : expr"
5676657Snate@binkert.org        p[0] = [ p[1] ]
5686657Snate@binkert.org
5696657Snate@binkert.org    def p_exprs__empty(self, p):
5706657Snate@binkert.org        "exprs : empty"""
5716657Snate@binkert.org        p[0] = []
5726657Snate@binkert.org
5736657Snate@binkert.org    def p_statement__expression(self, p):
5746657Snate@binkert.org        "statement : expr SEMI"
5756657Snate@binkert.org        p[0] = ast.ExprStatementAST(self, p[1])
5766657Snate@binkert.org
5776657Snate@binkert.org    def p_statement__assign(self, p):
5786657Snate@binkert.org        "statement : expr ASSIGN expr SEMI"
5796657Snate@binkert.org        p[0] = ast.AssignStatementAST(self, p[1], p[3])
5806657Snate@binkert.org
5816657Snate@binkert.org    def p_statement__enqueue(self, p):
58210155Snilay@cs.wisc.edu        "statement : ENQUEUE '(' var ',' type ')' statements"
58310155Snilay@cs.wisc.edu        p[0] = ast.EnqueueStatementAST(self, p[3], p[5], None, p[7])
58410155Snilay@cs.wisc.edu
58510155Snilay@cs.wisc.edu    def p_statement__enqueue_latency(self, p):
58610155Snilay@cs.wisc.edu        "statement : ENQUEUE '(' var ',' type ',' expr ')' statements"
58710155Snilay@cs.wisc.edu        p[0] = ast.EnqueueStatementAST(self, p[3], p[5], p[7], p[9])
5886657Snate@binkert.org
5897567SBrad.Beckmann@amd.com    def p_statement__stall_and_wait(self, p):
5907567SBrad.Beckmann@amd.com        "statement : STALL_AND_WAIT '(' var ',' var ')' SEMI"
5917567SBrad.Beckmann@amd.com        p[0] = ast.StallAndWaitStatementAST(self, p[3], p[5])
5927567SBrad.Beckmann@amd.com
5936657Snate@binkert.org    def p_statement__peek(self, p):
5946863Sdrh5@cs.wisc.edu        "statement : PEEK '(' var ',' type pairs ')' statements"
5956863Sdrh5@cs.wisc.edu        p[0] = ast.PeekStatementAST(self, p[3], p[5], p[6], p[8], "peek")
5966657Snate@binkert.org
5976657Snate@binkert.org    def p_statement__check_allocate(self, p):
5986657Snate@binkert.org        "statement : CHECK_ALLOCATE '(' var ')' SEMI"
5996657Snate@binkert.org        p[0] = ast.CheckAllocateStatementAST(self, p[3])
6006657Snate@binkert.org
60110981SBrad.Beckmann@amd.com    def p_statement__check_next_cycle(self, p):
60210981SBrad.Beckmann@amd.com        "statement : CHECK_NEXT_CYCLE '(' ')' SEMI"
60310981SBrad.Beckmann@amd.com        p[0] = ast.CheckNextCycleAST(self)
60410981SBrad.Beckmann@amd.com
6056657Snate@binkert.org    def p_statement__check_stop(self, p):
6066657Snate@binkert.org        "statement : CHECK_STOP_SLOTS '(' var ',' STRING ',' STRING ')' SEMI"
6076657Snate@binkert.org        p[0] = ast.CheckStopStatementAST(self, p[3], p[5], p[7])
6086657Snate@binkert.org
6096657Snate@binkert.org    def p_statement__return(self, p):
6106657Snate@binkert.org        "statement : RETURN expr SEMI"
6116657Snate@binkert.org        p[0] = ast.ReturnStatementAST(self, p[2])
6126657Snate@binkert.org
6136657Snate@binkert.org    def p_statement__if(self, p):
6146657Snate@binkert.org        "statement : if_statement"
6156657Snate@binkert.org        p[0] = p[1]
6166657Snate@binkert.org
6176657Snate@binkert.org    def p_if_statement__if(self, p):
6186657Snate@binkert.org        "if_statement : IF '(' expr ')' statements"
6196657Snate@binkert.org        p[0] = ast.IfStatementAST(self, p[3], p[5], None)
6206657Snate@binkert.org
6216657Snate@binkert.org    def p_if_statement__if_else(self, p):
6226657Snate@binkert.org        "if_statement : IF '(' expr ')' statements ELSE statements"
6236657Snate@binkert.org        p[0] = ast.IfStatementAST(self, p[3], p[5], p[7])
6246657Snate@binkert.org
6256657Snate@binkert.org    def p_statement__if_else_if(self, p):
6266657Snate@binkert.org        "if_statement : IF '(' expr ')' statements ELSE if_statement"
6276657Snate@binkert.org        p[0] = ast.IfStatementAST(self, p[3], p[5],
6286657Snate@binkert.org                                  ast.StatementListAST(self, p[7]))
6296657Snate@binkert.org
63010155Snilay@cs.wisc.edu    def p_expr__static_cast(self, p):
63110155Snilay@cs.wisc.edu        "aexpr : STATIC_CAST '(' type ',' expr ')'"
63210155Snilay@cs.wisc.edu        p[0] = ast.StaticCastAST(self, p[3], "ref", p[5])
63310155Snilay@cs.wisc.edu
63410155Snilay@cs.wisc.edu    def p_expr__static_cast_ptr(self, p):
63510155Snilay@cs.wisc.edu        "aexpr : STATIC_CAST '(' type ',' STRING ',' expr ')'"
63610155Snilay@cs.wisc.edu        p[0] = ast.StaticCastAST(self, p[3], p[5], p[7])
63710155Snilay@cs.wisc.edu
6386657Snate@binkert.org    def p_expr__var(self, p):
6396657Snate@binkert.org        "aexpr : var"
6406657Snate@binkert.org        p[0] = p[1]
6416657Snate@binkert.org
6427839Snilay@cs.wisc.edu    def p_expr__localvar(self, p):
6437839Snilay@cs.wisc.edu        "aexpr : type ident"
6447839Snilay@cs.wisc.edu        p[0] = ast.LocalVariableAST(self, p[1], p[2])
6457839Snilay@cs.wisc.edu
6466657Snate@binkert.org    def p_expr__literal(self, p):
6476657Snate@binkert.org        "aexpr : literal"
6486657Snate@binkert.org        p[0] = p[1]
6496657Snate@binkert.org
6506657Snate@binkert.org    def p_expr__enumeration(self, p):
6516657Snate@binkert.org        "aexpr : enumeration"
6526657Snate@binkert.org        p[0] = p[1]
6536657Snate@binkert.org
6546657Snate@binkert.org    def p_expr__func_call(self, p):
6556657Snate@binkert.org        "aexpr : ident '(' exprs ')'"
6566657Snate@binkert.org        p[0] = ast.FuncCallExprAST(self, p[1], p[3])
6576657Snate@binkert.org
6586657Snate@binkert.org    def p_expr__new(self, p):
6596657Snate@binkert.org        "aexpr : NEW type"
6606657Snate@binkert.org        p[0] = ast.NewExprAST(self, p[2])
6616657Snate@binkert.org
6627839Snilay@cs.wisc.edu    def p_expr__null(self, p):
6637839Snilay@cs.wisc.edu        "aexpr : OOD"
6647839Snilay@cs.wisc.edu        p[0] = ast.OodAST(self)
6657839Snilay@cs.wisc.edu
6666657Snate@binkert.org    def p_expr__member(self, p):
6676657Snate@binkert.org        "aexpr : aexpr DOT ident"
6686657Snate@binkert.org        p[0] = ast.MemberExprAST(self, p[1], p[3])
6696657Snate@binkert.org
6706657Snate@binkert.org    def p_expr__member_method_call(self, p):
6716657Snate@binkert.org        "aexpr : aexpr DOT ident '(' exprs ')'"
67211062Snilay@cs.wisc.edu        p[0] = ast.MemberMethodCallExprAST(self, p[1],
67311062Snilay@cs.wisc.edu                    ast.FuncCallExprAST(self, p[3], p[5]))
67411049Snilay@cs.wisc.edu
67511049Snilay@cs.wisc.edu    def p_expr__member_method_call_lookup(self, p):
67611049Snilay@cs.wisc.edu        "aexpr : aexpr '[' exprs ']'"
67711062Snilay@cs.wisc.edu        p[0] = ast.MemberMethodCallExprAST(self, p[1],
67811062Snilay@cs.wisc.edu                    ast.FuncCallExprAST(self, "lookup", p[3]))
6796657Snate@binkert.org
6806657Snate@binkert.org    def p_expr__class_method_call(self, p):
6816657Snate@binkert.org        "aexpr : type DOUBLE_COLON ident '(' exprs ')'"
68211062Snilay@cs.wisc.edu        p[0] = ast.ClassMethodCallExprAST(self, p[1],
68311062Snilay@cs.wisc.edu                    ast.FuncCallExprAST(self, p[3], p[5]))
6846657Snate@binkert.org
6856657Snate@binkert.org    def p_expr__aexpr(self, p):
6866657Snate@binkert.org        "expr : aexpr"
6876657Snate@binkert.org        p[0] = p[1]
6886657Snate@binkert.org
6896657Snate@binkert.org    def p_expr__binary_op(self, p):
6906657Snate@binkert.org        """expr : expr STAR  expr
6916657Snate@binkert.org                | expr SLASH expr
6926657Snate@binkert.org                | expr PLUS  expr
6936657Snate@binkert.org                | expr DASH  expr
6946657Snate@binkert.org                | expr LT    expr
6956657Snate@binkert.org                | expr GT    expr
6966657Snate@binkert.org                | expr LE    expr
6976657Snate@binkert.org                | expr GE    expr
6986657Snate@binkert.org                | expr EQ    expr
6996657Snate@binkert.org                | expr NE    expr
7006657Snate@binkert.org                | expr AND   expr
7016657Snate@binkert.org                | expr OR    expr
7026657Snate@binkert.org                | expr RIGHTSHIFT expr
7036657Snate@binkert.org                | expr LEFTSHIFT  expr"""
7046657Snate@binkert.org        p[0] = ast.InfixOperatorExprAST(self, p[1], p[2], p[3])
7056657Snate@binkert.org
7066657Snate@binkert.org    # FIXME - unary not
7076657Snate@binkert.org    def p_expr__unary_op(self, p):
7086657Snate@binkert.org        """expr : NOT expr
7099692Snilay@cs.wisc.edu                | INCR expr
7109692Snilay@cs.wisc.edu                | DECR expr
7116657Snate@binkert.org                | DASH expr %prec UMINUS"""
7129692Snilay@cs.wisc.edu        p[0] = ast.PrefixOperatorExprAST(self, p[1], p[2])
7136657Snate@binkert.org
7146657Snate@binkert.org    def p_expr__parens(self, p):
7156657Snate@binkert.org        "aexpr : '(' expr ')'"
7166657Snate@binkert.org        p[0] = p[2]
7176657Snate@binkert.org
7187839Snilay@cs.wisc.edu    def p_expr__is_valid_ptr(self, p):
7197839Snilay@cs.wisc.edu        "aexpr : IS_VALID '(' var ')'"
7207839Snilay@cs.wisc.edu        p[0] = ast.IsValidPtrExprAST(self, p[3], True)
7217839Snilay@cs.wisc.edu
7227839Snilay@cs.wisc.edu    def p_expr__is_invalid_ptr(self, p):
7237839Snilay@cs.wisc.edu        "aexpr : IS_INVALID '(' var ')'"
7247839Snilay@cs.wisc.edu        p[0] = ast.IsValidPtrExprAST(self, p[3], False)
7257839Snilay@cs.wisc.edu
7266657Snate@binkert.org    def p_literal__string(self, p):
7276657Snate@binkert.org        "literal : STRING"
7287055Snate@binkert.org        p[0] = ast.LiteralExprAST(self, p[1], "std::string")
7296657Snate@binkert.org
7306657Snate@binkert.org    def p_literal__number(self, p):
7316657Snate@binkert.org        "literal : NUMBER"
7326657Snate@binkert.org        p[0] = ast.LiteralExprAST(self, p[1], "int")
7336657Snate@binkert.org
7346657Snate@binkert.org    def p_literal__float(self, p):
7356657Snate@binkert.org        "literal : FLOATNUMBER"
7366657Snate@binkert.org        p[0] = ast.LiteralExprAST(self, p[1], "int")
7376657Snate@binkert.org
7386657Snate@binkert.org    def p_literal__bool(self, p):
7396657Snate@binkert.org        "literal : LIT_BOOL"
7406657Snate@binkert.org        p[0] = ast.LiteralExprAST(self, p[1], "bool")
7416657Snate@binkert.org
7426657Snate@binkert.org    def p_enumeration(self, p):
7436657Snate@binkert.org        "enumeration : ident ':' ident"
7446657Snate@binkert.org        p[0] = ast.EnumExprAST(self, ast.TypeAST(self, p[1]), p[3])
7456657Snate@binkert.org
7466657Snate@binkert.org    def p_var(self, p):
7476657Snate@binkert.org        "var : ident"
7486657Snate@binkert.org        p[0] = ast.VarExprAST(self, p[1])
749