StateDeclAST.py revision 8086
1# Copyright (c) 2011 Advanced Micro Devices, Inc. 2# All rights reserved. 3# 4# Redistribution and use in source and binary forms, with or without 5# modification, are permitted provided that the following conditions are 6# met: redistributions of source code must retain the above copyright 7# notice, this list of conditions and the following disclaimer; 8# redistributions in binary form must reproduce the above copyright 9# notice, this list of conditions and the following disclaimer in the 10# documentation and/or other materials provided with the distribution; 11# neither the name of the copyright holders nor the names of its 12# contributors may be used to endorse or promote products derived from 13# this software without specific prior written permission. 14# 15# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 18# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 19# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 25# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 27from slicc.ast.DeclAST import DeclAST 28from slicc.symbols import Func, Type 29 30class StateDeclAST(DeclAST): 31 def __init__(self, slicc, type_ast, pairs, states): 32 super(StateDeclAST, self).__init__(slicc, pairs) 33 34 self.type_ast = type_ast 35 self.states = states 36 37 def __repr__(self): 38 return "[StateDecl: %s]" % (self.type_ast) 39 40 def files(self, parent=None): 41 if "external" in self: 42 return set() 43 44 if parent: 45 ident = "%s_%s" % (parent, self.type_ast.ident) 46 else: 47 ident = self.type_ast.ident 48 s = set(("%s.hh" % ident, "%s.cc" % ident)) 49 return s 50 51 def generate(self): 52 ident = str(self.type_ast) 53 54 # Make the new type 55 t = Type(self.symtab, ident, self.location, self.pairs, 56 self.state_machine) 57 self.symtab.newSymbol(t) 58 59 # Add all of the states of the type to it 60 for state in self.states: 61 state.generate(t) 62 63 # Add the implicit State_to_string method - FIXME, this is a bit dirty 64 func_id = "%s_to_string" % t.c_ident 65 66 pairs = { "external" : "yes" } 67 func = Func(self.symtab, func_id, self.location, 68 self.symtab.find("std::string", Type), [ t ], [], "", 69 pairs, None) 70 self.symtab.newSymbol(func) 71 72 # Add the State_to_permission method 73 func_id = "%s_to_permission" % t.c_ident 74 75 pairs = { "external" : "yes" } 76 func = Func(self.symtab, func_id, self.location, 77 self.symtab.find("AccessPermission", Type), [ t ], [], "", 78 pairs, None) 79 self.symtab.newSymbol(func) 80