Ejemplo n.º 1
0
 def visitTernaryExpression(self,
                            ctx: siliconParser.TernaryExpressionContext):
     condition = self.visit(ctx.expression(0))
     if condition.asBoolean():
         return SiliconValue(self.visit(ctx.expression(1)))
     else:
         return SiliconValue(self.visit(ctx.expression(2)))
Ejemplo n.º 2
0
    def visitInExpression(self, ctx: siliconParser.InExpressionContext):
        lhs = self.visit(ctx.expression(0))
        rhs = self.visit(ctx.expression(0))

        if rhs.isList():
            for val in rhs.asList():
                if val == lhs:
                    return SiliconValue(True)
            return SiliconValue(False)
        raise Exception("Invalid In Expression")
Ejemplo n.º 3
0
    def lt(self, ctx: siliconParser.CompExpressionContext):
        lhs = self.visit(ctx.expression(0))
        rhs = self.visit(ctx.expression(1))

        if lhs.isNumber() and rhs.isNumber():
            return SiliconValue(lhs.asDouble() < rhs.asDouble())

        if lhs.isString() or rhs.isString():
            return SiliconValue(lhs.asString() < rhs.asString())

        raise Exception("Eval Exception")
Ejemplo n.º 4
0
    def subtract(self, ctx: siliconParser.AddExpressionContext):
        lhs = self.visit(ctx.expression(0))
        rhs = self.visit(ctx.expression(1))

        if lhs.isNumber() and rhs.isNumber():
            return SiliconValue(lhs.asDouble() - rhs.asDouble())

        if lhs.isList():
            l = lhs.asList()
            l.remove(rhs)
            return SiliconValue(l)

        raise Exception("Eval Exception")
Ejemplo n.º 5
0
    def resolveIndexes(self, val, indexes):
        for ec in indexes:
            idx = self.visit(ec)
            if not idx.isNumber() or (not val.isList() and not val.isString()):
                raise Exception("resolveIndexes Exception")

            i = idx.asDouble().intValue()
            if val.isString():
                val = SiliconValue(val.asString()[i, i + 1])
            else:
                val = val.asList()[i]

        return val
Ejemplo n.º 6
0
    def visitAndExpression(self, ctx: siliconParser.AndExpressionContext):
        lhs = self.visit(ctx.expression(0))
        rhs = self.visit(ctx.expression(1))
        if not lhs.isBoolean() or not rhs.isBoolean():
            raise Exception("Invalid Type")

        raise SiliconValue(lhs.asBoolean() and rhs.asBoolean())
Ejemplo n.º 7
0
    def visitPowerExpression(self, ctx: siliconParser.PowerExpressionContext):
        lhs = self.visit(ctx.expression(0))
        rhs = self.visit(ctx.expression(1))
        if lhs.isNumber() and rhs.isNumber():
            return SiliconValue(pow(lhs.asDouble(), rhs.asDouble()))

        raise Exception("EvalException")
Ejemplo n.º 8
0
    def visitList2(self, ctx: siliconParser.List2Context):
        l = list()
        if ctx.exprList():
            for ex in ctx.exprList().expression():
                l.append(self.visit(ex))

        return SiliconValue(l)
Ejemplo n.º 9
0
    def neq(self, ctx: siliconParser.EqExpressionContext):
        lhs = self.visit(ctx.expression(0))
        rhs = self.visit(ctx.expression(1))

        if lhs == None:
            raise Exception("eq Exception")

        return SiliconValue(not lhs == rhs)
Ejemplo n.º 10
0
    def modulus(self, ctx: siliconParser.MultExpressionContext):
        lhs = self.visit(ctx.expression(0))
        rhs = self.visit(ctx.expression(1))

        if lhs.isNumber() and rhs.isNumber():
            return SiliconValue(lhs.asDouble() % rhs.asDouble())

        raise Exception("Eval Exception")
Ejemplo n.º 11
0
 def visitStringExpression(self,
                           ctx: siliconParser.StringExpressionContext):
     text = ctx.getText()
     text = text[1:len(text) - 1].replace('\\\\(.)', '$1')
     val = SiliconValue(text)
     if ctx.indexes():
         exps = ctx.indexes().expression()
         val = self.resolveIndexes(val, exps)
     return val
Ejemplo n.º 12
0
    def setAtIndex(self, ctx: ParserRuleContext, indexes: list,
                   val: SiliconValue, newVal: SiliconValue):
        if not val.isList():
            raise Exception('setAtIndex Exception' + ctx.getText())

        for i in range(len(indexes) - 1):
            idx = self.visit(indexes[i])
            if not idx.isNumber:
                raise Exception('setAtIndex Exception: Not a number' +
                                ctx.getText())
            val = val.asList()[int(idx.asDouble())]

        idx = self.visit(indexes[len(indexes) - 1])
        if not idx.isNumber():
            raise Exception('setAtIndex Exception: Not a number ' +
                            ctx.getText())

        val.asList()[int(idx.asDouble())] = newVal
Ejemplo n.º 13
0
    def add(self, ctx: siliconParser.AddExpressionContext):
        lhs = self.visit(ctx.expression(0))
        rhs = self.visit(ctx.expression(1))

        if lhs == None or rhs == None:
            raise Exception("Eval Exception")

        if lhs.isNumber() and rhs.isNumber():
            return SiliconValue(lhs.asDouble() + rhs.asDouble())

        if lhs.isList():
            l = lhs.asList()
            l.append(rhs)
            return SiliconValue(l)

        if lhs.isString():
            return SiliconValue(lhs.asString() + "" + rhs.asString())

        if rhs.isString():
            return SiliconValue(lhs.asString() + "" + rhs.asString())

        return SiliconValue(lhs.asString() + rhs.asString())
Ejemplo n.º 14
0
    def multiply(self, ctx: siliconParser.MultExpressionContext):
        lhs = self.visit(ctx.expression(0))
        rhs = self.visit(ctx.expression(1))
        if lhs == None or rhs == None:
            print("lhs " + lhs + " rhs " + rhs)
            raise Exception("Evalexception")

        if lhs.isNumber() and rhs.isNumber():
            return SiliconValue(lhs.asDouble() * rhs.asDouble())

        if lhs.isString() and rhs.isNumber():
            return SiliconValue(
                lhs.asString() * int(rhs.asDouble())
            )  # TODO : Fix needs as a big number can cause crash

        if lhs.isList() and rhs.isNumber():
            total = []
            for i in range(int(rhs.asDouble())):
                total.append(lhs.asList())

            return SiliconValue(total)

        raise Exception(ctx)
Ejemplo n.º 15
0
 def visitBoolExpression(self, ctx: siliconParser.BoolExpressionContext):
     return SiliconValue(bool(ctx.getText()))
Ejemplo n.º 16
0
 def visitNotExpression(self, ctx: siliconParser.NotExpressionContext):
     v = self.visit(ctx.expression())
     if not v.isBoolean():
         raise Exception(ctx)
     return SiliconValue(not v.asBoolean())
Ejemplo n.º 17
0
 def visitUnaryMinusExpression(
         self, ctx: siliconParser.UnaryMinusExpressionContext):
     v = self.visit(ctx.expression())
     if not v.isNumber():
         raise Exception("EvalException")
     return SiliconValue(-1 * v.asDouble())
Ejemplo n.º 18
0
 def visitNumberExpression(self,
                           ctx: siliconParser.NumberExpressionContext):
     val = ctx.getText()
     if '.' in val:
         return SiliconValue(float(val))
     return SiliconValue(int(val))