def visitVarDeclInitialize(self, ctx: CParser.VarDeclInitializeContext): name = ctx.Id().getText() # Check if it's an array initialization try: size = ctx.IntConst().getText() initializeList = None try: list = self.visitArrayInitializeList(ctx.arrayInitializeList()) initializeList = Variable.ArrayInitializeList( ctx.start.line, ctx.start.column, list) except: pass try: string = ctx.StringConst() string = string.getText()[1:-1] list = [] for char in string: list.append( Literals.Char(ctx.start.line, ctx.start.column, "'" + char + "'")) initializeList = Variable.ArrayInitializeList( ctx.start.line, ctx.start.column, list) except: pass return Variable.ArrayInitialize(ctx.start.line, ctx.start.column, name, size, initializeList) except: expression = None try: expression = self.visitSimpleExpression(ctx.simpleExpression()) except: pass return Variable.VarDeclInitialize(ctx.start.line, ctx.start.column, name, expression)
def visitVarDeclaration(self, ctx: CParser.VarDeclarationContext): type = self.visitTypeSpecifier(ctx.typeSpecifier()) varDeclList = Variable.VarDeclList( ctx.start.line, ctx.start.column, self.visitVarDeclList(ctx.varDeclList())) return Variable.VariableDecl(ctx.start.line, ctx.start.column, type, varDeclList)
def Factor(self, pb): retval = None if self.CurrentToken == TOKEN.TOK_NUMERIC: retval = NumericConstant(self.GetNumber()) self.CurrentToken = self.GetToken() elif self.CurrentToken == TOKEN.TOK_STRING: retval = StringLiteral(self.last_str) self.CurrentToken = self.GetToken() elif self.CurrentToken in [TOKEN.TOK_BOOL_FALSE, TOKEN.TOK_BOOL_TRUE]: retval = BooleanConstant(True if self.CurrentToken == TOKEN.TOK_BOOL_TRUE else False) self.CurrentToken = self.GetToken() elif self.CurrentToken == TOKEN.TOK_OPAREN: self.CurrentToken = self.GetToken() retval = self.BExpr(pb) if self.CurrentToken != TOKEN.TOK_CPAREN: raise Exception("Missing Closing Paranthesis") self.CurrentToken = self.GetToken() elif self.CurrentToken == TOKEN.TOK_PLUS or self.CurrentToken == TOKEN.TOK_SUB: l_token = self.CurrentToken self.CurrentToken = self.GetToken() retval = self.Factor(pb) if l_token == TOKEN.TOK_PLUS: retval = UnaryPlus(retval) else: retval = UnaryMinus(retval) elif self.CurrentToken == TOKEN.TOK_NOT: l_token = self.CurrentToken self.CurrentToken = self.GetToken() retval = self.Factor(pb) retval = LogicalNot(retval) elif self.CurrentToken == TOKEN.TOK_UNQUOTED_STRING: st = self.last_str if not self.prog.IsFunction(st): info = pb.get(st) if not info: raise Exception("Undefined symbol") self.GetNext() retval = Variable(info) else: if pb.GetProcedureName() == st: p = pb.GetProcedure() else: p = self.prog.GetProc(st) ptr = self.ParseCallProc(pb, p) self.GetNext() retval = ptr else: raise Exception("Illegal Token") return retval
def Factor(self, com_cntxt): retval = None if self.CurrentToken == TOKEN.TOK_NUMERIC: retval = NumericConstant(self.GetNumber()) self.CurrentToken = self.GetToken() elif self.CurrentToken == TOKEN.TOK_STRING: retval = StringLiteral(self.last_str) self.CurrentToken = self.GetToken() elif self.CurrentToken in [TOKEN.TOK_BOOL_FALSE, TOKEN.TOK_BOOL_TRUE]: retval = BooleanConstant(True if self.CurrentToken == TOKEN.TOK_BOOL_TRUE else False) self.CurrentToken = self.GetToken() elif self.CurrentToken == TOKEN.TOK_OPAREN: self.CurrentToken = self.GetToken() retval = self.BExpr(com_cntxt) if self.CurrentToken != TOKEN.TOK_CPAREN: raise Exception("Missing Closing Paranthesis") self.CurrentToken = self.GetToken() elif self.CurrentToken == TOKEN.TOK_PLUS or self.CurrentToken == TOKEN.TOK_SUB: l_token = self.CurrentToken self.CurrentToken = self.GetToken() retval = self.Factor(com_cntxt) if l_token == TOKEN.TOK_PLUS: retval = UnaryPlus(retval) else: retval = UnaryMinus(retval) elif self.CurrentToken == TOKEN.TOK_NOT: l_token = self.CurrentToken self.CurrentToken = self.GetToken() retval = self.Factor(com_cntxt) retval = LogicalNot(retval) elif self.CurrentToken == TOKEN.TOK_UNQUOTED_STRING: st = self.last_str info = com_cntxt.get(st) if not info: raise Exception("Undefined symbol") self.GetNext() retval = Variable(info) else: raise Exception("Illegal Token") return retval
def __init__(self, var, ex): self.variable = Variable(info=var) self.ex = ex
def Execute(self, run_cntxt): run_cntxt.add(self.sym_info) self.var = Variable(self.sym_info)