Esempio n. 1
0
    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)
Esempio n. 2
0
 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)
Esempio n. 3
0
    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
Esempio n. 4
0
    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
Esempio n. 5
0
 def __init__(self, var, ex):
     self.variable = Variable(info=var)
     self.ex = ex
Esempio n. 6
0
 def Execute(self, run_cntxt):
     run_cntxt.add(self.sym_info)
     self.var = Variable(self.sym_info)