class SubroutineStatement(BasicStatement): def __init__(self, loc=None, lPrefix=[], sSub="SUBROUTINE", sName="", nIndent=0, oSub = None): BasicStatement.__init__(self, None, loc, nIndent) self.lPrefix = lPrefix self.sSub = sSub self.sName = sName self.lArgs = DoubleList() self.sParOpen = None self.sParClose = None self.oSub = oSub # -------------------------------------------------------------------------- def SetParOpen(self, sParOpen): self.sParOpen = sParOpen # -------------------------------------------------------------------------- def SetParClose(self, sParClose): self.sParClose = sParClose # -------------------------------------------------------------------------- def GetName(self): return self.sName # -------------------------------------------------------------------------- def GetPrefix(self): return self.lPrefix # -------------------------------------------------------------------------- def GetArguments(self): return self.lArgs.GetMainList() # -------------------------------------------------------------------------- def AddArgument(self, sName, sComma=None, d=None): if self.sParOpen==None: self.sParOpen="(" self.sParClose = ")" if sComma==None and \ len(self.lArgs.lGetSecondaryList())==len(self.lArgs)-1: self.lArgs.append(",", sName) else: self.lArgs.append(sName, sComma) if self.oSub: self.oSub.AddArgument(sName, sComma=sComma, d=d) # -------------------------------------------------------------------------- def ToList(self, stylesheet, l): BasicStatement.ToList(self, stylesheet, l) for i in self.lPrefix: l.append(stylesheet.sKeyword(i), nIndentNext=1) l.append(stylesheet.sKeyword(self.sSub), nIndentNext=1) l.append(self.sName) if not self.sParOpen: return l.append(self.sParOpen) self.lArgs.ToList(stylesheet, l) l.append(self.sParClose)
class Read(BasicIOList): # Stores a read statement def __init__(self, sLabel=None, loc=None, nIndent=0, sRead="READ", sParOpen=None, nUnit=None, var=None): BasicIOList.__init__(self, sLabel, loc, nIndent, sRead, sParOpen) self.lIOExp = DoubleList() self.sFormat = None self.sComma = None if nUnit: if not sParOpen: self.SetParOpen() self.AddIOOpt("%s"%nUnit) self.SetParClose() if var: self.AddIOExpression(var) # -------------------------------------------------------------------------- def SetFormat(self, sFormat, sComma=None): self.sFormat = sFormat self.sComma = sComma # -------------------------------------------------------------------------- def AddIOExpression(self, exp, sComma=None): # To simplify manually creating statements, a comma is automatically # added, if only expressions are specified here (except for the first # call). if type(exp)==type(1): exp=`exp` if sComma==None and \ len(self.lIOExp.lGetSecondaryList())==len(self.lIOExp)-1: self.lIOExp.append(",", exp) else: self.lIOExp.append(exp, sComma) # -------------------------------------------------------------------------- def GetVarUsage(self, varUsage, sType="read", obj=None, loc=None): for i in self.lIOExp.GetMainList(): varUsage.AddVariable(i, "write", obj, loc) BasicIOList.GetVarUsage(self, varUsage, sType, obj, loc) # -------------------------------------------------------------------------- def ToList(self, stylesheet, l): BasicIOList.ToList(self, stylesheet, l) l.append(' ') if self.sFormat: l.append(self.sFormat, nIndent=1) if self.sComma: l.append(self.sComma) self.lIOExp.ToList(stylesheet, l)
class FunctionCall(BasicRepr): # Stores a function call. def __init__(self, sName=None, sArg=None): self.sName = sName self.lArgs = DoubleList() self.sParOpen = None self.sParClose = None if sArg: self.sParOpen="(" self.AddArgument(sArg) self.sParClose=")" # -------------------------------------------------------------------------- # Returns the name of the called subroutine def sGetName(self): return self.sName # -------------------------------------------------------------------------- def lGetArgs(self): return self.lArgs # -------------------------------------------------------------------------- def SetParOpen(self, sParOpen): self.sParOpen = sParOpen # -------------------------------------------------------------------------- def SetParClose(self, sParClose): self.sParClose = sParClose # -------------------------------------------------------------------------- # Adds an actual argument. def AddArgument(self, arg, sComma=None): if self.sParOpen==None: self.sParOpen="(" self.sParClose = ")" if sComma==None and \ len(self.lArgs.lGetSecondaryList())==len(self.lArgs)-1: self.lArgs.append(",", arg) else: self.lArgs.append(arg, sComma) # -------------------------------------------------------------------------- # Adds a keyword argument: keyword=val def AddKeywordArgument(self, sKeyword, sEqual, obj, sComma=None): self.lArgs.append(OptionString(sKeyword, sEqual, obj), sComma) # -------------------------------------------------------------------------- # Adds an alternate return specification: *123 def AddAltReturn(self, sStar, sLabel, sComma=None): self.lArgs.append(StarLabel(sStar, sLabel), sComma) # -------------------------------------------------------------------------- # Adds an alternate return specification with keyword: keyw=*123 def AddKeywordAltReturn(self, sKeyword, sEqual, sStar, sLabel, sComma=None): self.lArgs.append(OptionString(sKeyword, sEqual, StarLabel(sStar, sLabel)), sComma) # -------------------------------------------------------------------------- def GetVarUsage(self, varUsage, sType="read", obj=None, loc=None): for i in self.lArgs.GetMainList(): varUsage.AddVariable(i, "unknown", obj, loc) # -------------------------------------------------------------------------- def ToList(self, stylesheet, l): if stylesheet["mathsmode"]: s = string.lower(self.sName) if s=="sqrt" and stylesheet["dosqrt"]: return stylesheet.HandleSqrt(self, l) if s=="exp" and stylesheet["doexp"]: return stylesheet.HandleExp(self, l) if s=="abs" and stylesheet["doabs"]: return stylesheet.HandleAbs(self, l) l.append(self.sName) if not self.sParOpen: return l.append(self.sParOpen) self.lArgs.ToList(stylesheet, l, bAddSpace=1) l.append(self.sParClose)