parser.py revision 14097
16657Snate@binkert.org# Copyright (c) 2009 The Hewlett-Packard Development Company 211888Sleolson@google.com# Copyright (c) 2017 Google Inc. 36657Snate@binkert.org# All rights reserved. 46657Snate@binkert.org# 56657Snate@binkert.org# Redistribution and use in source and binary forms, with or without 66657Snate@binkert.org# modification, are permitted provided that the following conditions are 76657Snate@binkert.org# met: redistributions of source code must retain the above copyright 86657Snate@binkert.org# notice, this list of conditions and the following disclaimer; 96657Snate@binkert.org# redistributions in binary form must reproduce the above copyright 106657Snate@binkert.org# notice, this list of conditions and the following disclaimer in the 116657Snate@binkert.org# documentation and/or other materials provided with the distribution; 126657Snate@binkert.org# neither the name of the copyright holders nor the names of its 136657Snate@binkert.org# contributors may be used to endorse or promote products derived from 146657Snate@binkert.org# this software without specific prior written permission. 156657Snate@binkert.org# 166657Snate@binkert.org# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 176657Snate@binkert.org# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 186657Snate@binkert.org# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 196657Snate@binkert.org# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 206657Snate@binkert.org# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 216657Snate@binkert.org# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 226657Snate@binkert.org# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 236657Snate@binkert.org# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 246657Snate@binkert.org# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 256657Snate@binkert.org# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 266657Snate@binkert.org# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 276657Snate@binkert.org# 286657Snate@binkert.org# Authors: Nathan Binkert 2911888Sleolson@google.com# Lena Olson 306657Snate@binkert.org 316657Snate@binkert.orgimport os.path 326657Snate@binkert.orgimport re 336657Snate@binkert.orgimport sys 346657Snate@binkert.org 356999Snate@binkert.orgfrom m5.util import code_formatter 368452Snate@binkert.orgfrom m5.util.grammar import Grammar, ParseError 376657Snate@binkert.org 386657Snate@binkert.orgimport slicc.ast as ast 396657Snate@binkert.orgimport slicc.util as util 406657Snate@binkert.orgfrom slicc.symbols import SymbolTable 416657Snate@binkert.org 426657Snate@binkert.orgclass SLICC(Grammar): 439219Spower.jg@gmail.com def __init__(self, filename, base_dir, verbose=False, traceback=False, **kwargs): 448454Snate@binkert.org self.protocol = None 458454Snate@binkert.org self.traceback = traceback 468453Snate@binkert.org self.verbose = verbose 476999Snate@binkert.org self.symtab = SymbolTable(self) 489219Spower.jg@gmail.com self.base_dir = base_dir 496999Snate@binkert.org 508454Snate@binkert.org try: 518454Snate@binkert.org self.decl_list = self.parse_file(filename, **kwargs) 528454Snate@binkert.org except ParseError, e: 538454Snate@binkert.org if not self.traceback: 548454Snate@binkert.org sys.exit(str(e)) 558454Snate@binkert.org raise 568454Snate@binkert.org 578453Snate@binkert.org def currentLocation(self): 588453Snate@binkert.org return util.Location(self.current_source, self.current_line, 598453Snate@binkert.org no_warning=not self.verbose) 608453Snate@binkert.org 616999Snate@binkert.org def codeFormatter(self, *args, **kwargs): 626999Snate@binkert.org code = code_formatter(*args, **kwargs) 636999Snate@binkert.org code['protocol'] = self.protocol 646999Snate@binkert.org return code 656657Snate@binkert.org 668453Snate@binkert.org def process(self): 678454Snate@binkert.org self.decl_list.generate() 686657Snate@binkert.org 699219Spower.jg@gmail.com def writeCodeFiles(self, code_path, includes): 709219Spower.jg@gmail.com self.symtab.writeCodeFiles(code_path, includes) 716657Snate@binkert.org 728453Snate@binkert.org def writeHTMLFiles(self, html_path): 738453Snate@binkert.org self.symtab.writeHTMLFiles(html_path) 746657Snate@binkert.org 756657Snate@binkert.org def files(self): 7611283Santhony.gutierrez@amd.com f = set(['Types.hh']) 776657Snate@binkert.org 788454Snate@binkert.org f |= self.decl_list.files() 796657Snate@binkert.org 806714Ssteve.reinhardt@amd.com return f 816657Snate@binkert.org 826657Snate@binkert.org t_ignore = '\t ' 836657Snate@binkert.org 846657Snate@binkert.org # C or C++ comment (ignore) 856657Snate@binkert.org def t_c_comment(self, t): 866657Snate@binkert.org r'/\*(.|\n)*?\*/' 876657Snate@binkert.org t.lexer.lineno += t.value.count('\n') 886657Snate@binkert.org 896657Snate@binkert.org def t_cpp_comment(self, t): 906657Snate@binkert.org r'//.*' 916657Snate@binkert.org 926657Snate@binkert.org # Define a rule so we can track line numbers 936657Snate@binkert.org def t_newline(self, t): 946657Snate@binkert.org r'\n+' 956657Snate@binkert.org t.lexer.lineno += len(t.value) 966657Snate@binkert.org 976657Snate@binkert.org reserved = { 988454Snate@binkert.org 'protocol' : 'PROTOCOL', 998454Snate@binkert.org 'include' : 'INCLUDE', 1006657Snate@binkert.org 'global' : 'GLOBAL', 1016657Snate@binkert.org 'machine' : 'MACHINE', 1026657Snate@binkert.org 'in_port' : 'IN_PORT', 1036657Snate@binkert.org 'out_port' : 'OUT_PORT', 1046657Snate@binkert.org 'action' : 'ACTION', 1056657Snate@binkert.org 'transition' : 'TRANS', 1066657Snate@binkert.org 'structure' : 'STRUCT', 1076657Snate@binkert.org 'external_type' : 'EXTERN_TYPE', 1086657Snate@binkert.org 'enumeration' : 'ENUM', 1098086SBrad.Beckmann@amd.com 'state_declaration' : 'STATE_DECL', 1106657Snate@binkert.org 'peek' : 'PEEK', 1117567SBrad.Beckmann@amd.com 'stall_and_wait' : 'STALL_AND_WAIT', 1126657Snate@binkert.org 'enqueue' : 'ENQUEUE', 1136657Snate@binkert.org 'check_allocate' : 'CHECK_ALLOCATE', 11410981SBrad.Beckmann@amd.com 'check_next_cycle' : 'CHECK_NEXT_CYCLE', 1156657Snate@binkert.org 'check_stop_slots' : 'CHECK_STOP_SLOTS', 11614097Spfotouhi@ucdavis.edu 'check_on_cache_probe' : 'CHECK_PROBE', 1176882SBrad.Beckmann@amd.com 'static_cast' : 'STATIC_CAST', 1186657Snate@binkert.org 'if' : 'IF', 1197839Snilay@cs.wisc.edu 'is_valid' : 'IS_VALID', 1207839Snilay@cs.wisc.edu 'is_invalid' : 'IS_INVALID', 1216657Snate@binkert.org 'else' : 'ELSE', 1226657Snate@binkert.org 'return' : 'RETURN', 1236657Snate@binkert.org 'void' : 'VOID', 1246657Snate@binkert.org 'new' : 'NEW', 1257839Snilay@cs.wisc.edu 'OOD' : 'OOD', 1266657Snate@binkert.org } 1276657Snate@binkert.org 1286657Snate@binkert.org literals = ':[]{}(),=' 1296657Snate@binkert.org 1306657Snate@binkert.org tokens = [ 'EQ', 'NE', 'LT', 'GT', 'LE', 'GE', 1316657Snate@binkert.org 'LEFTSHIFT', 'RIGHTSHIFT', 1326657Snate@binkert.org 'NOT', 'AND', 'OR', 1336657Snate@binkert.org 'PLUS', 'DASH', 'STAR', 'SLASH', 1349692Snilay@cs.wisc.edu 'INCR', 'DECR', 1356657Snate@binkert.org 'DOUBLE_COLON', 'SEMI', 1366657Snate@binkert.org 'ASSIGN', 'DOT', 1376657Snate@binkert.org 'IDENT', 'LIT_BOOL', 'FLOATNUMBER', 'NUMBER', 'STRING' ] 1386657Snate@binkert.org tokens += reserved.values() 1396657Snate@binkert.org 1406657Snate@binkert.org t_EQ = r'==' 1416657Snate@binkert.org t_NE = r'!=' 1426657Snate@binkert.org t_LT = r'<' 1436657Snate@binkert.org t_GT = r'>' 1446657Snate@binkert.org t_LE = r'<=' 1456657Snate@binkert.org t_GE = r'>=' 1466657Snate@binkert.org t_LEFTSHIFT = r'<<' 1476657Snate@binkert.org t_RIGHTSHIFT = r'>>' 1486657Snate@binkert.org t_NOT = r'!' 1496657Snate@binkert.org t_AND = r'&&' 1506657Snate@binkert.org t_OR = r'\|\|' 1516657Snate@binkert.org t_PLUS = r'\+' 1526657Snate@binkert.org t_DASH = r'-' 1536657Snate@binkert.org t_STAR = r'\*' 1546657Snate@binkert.org t_SLASH = r'/' 1556657Snate@binkert.org t_DOUBLE_COLON = r'::' 1566657Snate@binkert.org t_SEMI = r';' 1576657Snate@binkert.org t_ASSIGN = r':=' 1586657Snate@binkert.org t_DOT = r'\.' 1599692Snilay@cs.wisc.edu t_INCR = r'\+\+' 1609692Snilay@cs.wisc.edu t_DECR = r'--' 1616657Snate@binkert.org 1626657Snate@binkert.org precedence = ( 1639692Snilay@cs.wisc.edu ('left', 'INCR', 'DECR'), 16411888Sleolson@google.com ('left', 'OR'), 16511888Sleolson@google.com ('left', 'AND'), 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): 26211283Santhony.gutierrez@amd.com "decl : MACHINE '(' enumeration ')' ':' 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): 26611283Santhony.gutierrez@amd.com "decl : MACHINE '(' enumeration 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 60914097Spfotouhi@ucdavis.edu def p_statement__check_probe(self, p): 61014097Spfotouhi@ucdavis.edu "statement : CHECK_PROBE '(' var ',' var ')' SEMI" 61114097Spfotouhi@ucdavis.edu p[0] = ast.CheckProbeStatementAST(self, p[3], p[5]) 61214097Spfotouhi@ucdavis.edu 6136657Snate@binkert.org def p_statement__return(self, p): 6146657Snate@binkert.org "statement : RETURN expr SEMI" 6156657Snate@binkert.org p[0] = ast.ReturnStatementAST(self, p[2]) 6166657Snate@binkert.org 6176657Snate@binkert.org def p_statement__if(self, p): 6186657Snate@binkert.org "statement : if_statement" 6196657Snate@binkert.org p[0] = p[1] 6206657Snate@binkert.org 6216657Snate@binkert.org def p_if_statement__if(self, p): 6226657Snate@binkert.org "if_statement : IF '(' expr ')' statements" 6236657Snate@binkert.org p[0] = ast.IfStatementAST(self, p[3], p[5], None) 6246657Snate@binkert.org 6256657Snate@binkert.org def p_if_statement__if_else(self, p): 6266657Snate@binkert.org "if_statement : IF '(' expr ')' statements ELSE statements" 6276657Snate@binkert.org p[0] = ast.IfStatementAST(self, p[3], p[5], p[7]) 6286657Snate@binkert.org 6296657Snate@binkert.org def p_statement__if_else_if(self, p): 6306657Snate@binkert.org "if_statement : IF '(' expr ')' statements ELSE if_statement" 6316657Snate@binkert.org p[0] = ast.IfStatementAST(self, p[3], p[5], 6326657Snate@binkert.org ast.StatementListAST(self, p[7])) 6336657Snate@binkert.org 63410155Snilay@cs.wisc.edu def p_expr__static_cast(self, p): 63510155Snilay@cs.wisc.edu "aexpr : STATIC_CAST '(' type ',' expr ')'" 63610155Snilay@cs.wisc.edu p[0] = ast.StaticCastAST(self, p[3], "ref", p[5]) 63710155Snilay@cs.wisc.edu 63810155Snilay@cs.wisc.edu def p_expr__static_cast_ptr(self, p): 63910155Snilay@cs.wisc.edu "aexpr : STATIC_CAST '(' type ',' STRING ',' expr ')'" 64010155Snilay@cs.wisc.edu p[0] = ast.StaticCastAST(self, p[3], p[5], p[7]) 64110155Snilay@cs.wisc.edu 6426657Snate@binkert.org def p_expr__var(self, p): 6436657Snate@binkert.org "aexpr : var" 6446657Snate@binkert.org p[0] = p[1] 6456657Snate@binkert.org 6467839Snilay@cs.wisc.edu def p_expr__localvar(self, p): 6477839Snilay@cs.wisc.edu "aexpr : type ident" 6487839Snilay@cs.wisc.edu p[0] = ast.LocalVariableAST(self, p[1], p[2]) 6497839Snilay@cs.wisc.edu 6506657Snate@binkert.org def p_expr__literal(self, p): 6516657Snate@binkert.org "aexpr : literal" 6526657Snate@binkert.org p[0] = p[1] 6536657Snate@binkert.org 6546657Snate@binkert.org def p_expr__enumeration(self, p): 6556657Snate@binkert.org "aexpr : enumeration" 6566657Snate@binkert.org p[0] = p[1] 6576657Snate@binkert.org 6586657Snate@binkert.org def p_expr__func_call(self, p): 6596657Snate@binkert.org "aexpr : ident '(' exprs ')'" 6606657Snate@binkert.org p[0] = ast.FuncCallExprAST(self, p[1], p[3]) 6616657Snate@binkert.org 6626657Snate@binkert.org def p_expr__new(self, p): 6636657Snate@binkert.org "aexpr : NEW type" 6646657Snate@binkert.org p[0] = ast.NewExprAST(self, p[2]) 6656657Snate@binkert.org 6667839Snilay@cs.wisc.edu def p_expr__null(self, p): 6677839Snilay@cs.wisc.edu "aexpr : OOD" 6687839Snilay@cs.wisc.edu p[0] = ast.OodAST(self) 6697839Snilay@cs.wisc.edu 6706657Snate@binkert.org def p_expr__member(self, p): 6716657Snate@binkert.org "aexpr : aexpr DOT ident" 6726657Snate@binkert.org p[0] = ast.MemberExprAST(self, p[1], p[3]) 6736657Snate@binkert.org 6746657Snate@binkert.org def p_expr__member_method_call(self, p): 6756657Snate@binkert.org "aexpr : aexpr DOT ident '(' exprs ')'" 67611062Snilay@cs.wisc.edu p[0] = ast.MemberMethodCallExprAST(self, p[1], 67711062Snilay@cs.wisc.edu ast.FuncCallExprAST(self, p[3], p[5])) 67811049Snilay@cs.wisc.edu 67911049Snilay@cs.wisc.edu def p_expr__member_method_call_lookup(self, p): 68011049Snilay@cs.wisc.edu "aexpr : aexpr '[' exprs ']'" 68111062Snilay@cs.wisc.edu p[0] = ast.MemberMethodCallExprAST(self, p[1], 68211062Snilay@cs.wisc.edu ast.FuncCallExprAST(self, "lookup", p[3])) 6836657Snate@binkert.org 6846657Snate@binkert.org def p_expr__class_method_call(self, p): 6856657Snate@binkert.org "aexpr : type DOUBLE_COLON ident '(' exprs ')'" 68611062Snilay@cs.wisc.edu p[0] = ast.ClassMethodCallExprAST(self, p[1], 68711062Snilay@cs.wisc.edu ast.FuncCallExprAST(self, p[3], p[5])) 6886657Snate@binkert.org 6896657Snate@binkert.org def p_expr__aexpr(self, p): 6906657Snate@binkert.org "expr : aexpr" 6916657Snate@binkert.org p[0] = p[1] 6926657Snate@binkert.org 6936657Snate@binkert.org def p_expr__binary_op(self, p): 6946657Snate@binkert.org """expr : expr STAR expr 6956657Snate@binkert.org | expr SLASH expr 6966657Snate@binkert.org | expr PLUS expr 6976657Snate@binkert.org | expr DASH expr 6986657Snate@binkert.org | expr LT expr 6996657Snate@binkert.org | expr GT expr 7006657Snate@binkert.org | expr LE expr 7016657Snate@binkert.org | expr GE expr 7026657Snate@binkert.org | expr EQ expr 7036657Snate@binkert.org | expr NE expr 7046657Snate@binkert.org | expr AND expr 7056657Snate@binkert.org | expr OR expr 7066657Snate@binkert.org | expr RIGHTSHIFT expr 7076657Snate@binkert.org | expr LEFTSHIFT expr""" 7086657Snate@binkert.org p[0] = ast.InfixOperatorExprAST(self, p[1], p[2], p[3]) 7096657Snate@binkert.org 7106657Snate@binkert.org # FIXME - unary not 7116657Snate@binkert.org def p_expr__unary_op(self, p): 7126657Snate@binkert.org """expr : NOT expr 7139692Snilay@cs.wisc.edu | INCR expr 7149692Snilay@cs.wisc.edu | DECR expr 7156657Snate@binkert.org | DASH expr %prec UMINUS""" 7169692Snilay@cs.wisc.edu p[0] = ast.PrefixOperatorExprAST(self, p[1], p[2]) 7176657Snate@binkert.org 7186657Snate@binkert.org def p_expr__parens(self, p): 7196657Snate@binkert.org "aexpr : '(' expr ')'" 7206657Snate@binkert.org p[0] = p[2] 7216657Snate@binkert.org 7227839Snilay@cs.wisc.edu def p_expr__is_valid_ptr(self, p): 7237839Snilay@cs.wisc.edu "aexpr : IS_VALID '(' var ')'" 7247839Snilay@cs.wisc.edu p[0] = ast.IsValidPtrExprAST(self, p[3], True) 7257839Snilay@cs.wisc.edu 7267839Snilay@cs.wisc.edu def p_expr__is_invalid_ptr(self, p): 7277839Snilay@cs.wisc.edu "aexpr : IS_INVALID '(' var ')'" 7287839Snilay@cs.wisc.edu p[0] = ast.IsValidPtrExprAST(self, p[3], False) 7297839Snilay@cs.wisc.edu 7306657Snate@binkert.org def p_literal__string(self, p): 7316657Snate@binkert.org "literal : STRING" 7327055Snate@binkert.org p[0] = ast.LiteralExprAST(self, p[1], "std::string") 7336657Snate@binkert.org 7346657Snate@binkert.org def p_literal__number(self, p): 7356657Snate@binkert.org "literal : NUMBER" 7366657Snate@binkert.org p[0] = ast.LiteralExprAST(self, p[1], "int") 7376657Snate@binkert.org 7386657Snate@binkert.org def p_literal__float(self, p): 7396657Snate@binkert.org "literal : FLOATNUMBER" 7406657Snate@binkert.org p[0] = ast.LiteralExprAST(self, p[1], "int") 7416657Snate@binkert.org 7426657Snate@binkert.org def p_literal__bool(self, p): 7436657Snate@binkert.org "literal : LIT_BOOL" 7446657Snate@binkert.org p[0] = ast.LiteralExprAST(self, p[1], "bool") 7456657Snate@binkert.org 7466657Snate@binkert.org def p_enumeration(self, p): 7476657Snate@binkert.org "enumeration : ident ':' ident" 7486657Snate@binkert.org p[0] = ast.EnumExprAST(self, ast.TypeAST(self, p[1]), p[3]) 7496657Snate@binkert.org 7506657Snate@binkert.org def p_var(self, p): 7516657Snate@binkert.org "var : ident" 7526657Snate@binkert.org p[0] = ast.VarExprAST(self, p[1]) 753