示例#1
0
文件: Visitor.py 项目: theQRL/silicon
 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)))
示例#2
0
文件: Visitor.py 项目: theQRL/silicon
    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")
示例#3
0
文件: Visitor.py 项目: theQRL/silicon
    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")
示例#4
0
文件: Visitor.py 项目: theQRL/silicon
    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")
示例#5
0
文件: Visitor.py 项目: theQRL/silicon
    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
示例#6
0
文件: Visitor.py 项目: theQRL/silicon
    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())
示例#7
0
文件: Visitor.py 项目: theQRL/silicon
    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")
示例#8
0
文件: Visitor.py 项目: theQRL/silicon
    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)
示例#9
0
文件: Visitor.py 项目: theQRL/silicon
    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)
示例#10
0
文件: Visitor.py 项目: theQRL/silicon
    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")
示例#11
0
文件: Visitor.py 项目: theQRL/silicon
 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
示例#12
0
文件: Visitor.py 项目: theQRL/silicon
    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
示例#13
0
文件: Visitor.py 项目: theQRL/silicon
    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())
示例#14
0
文件: Visitor.py 项目: theQRL/silicon
    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)
示例#15
0
文件: Visitor.py 项目: theQRL/silicon
 def visitBoolExpression(self, ctx: siliconParser.BoolExpressionContext):
     return SiliconValue(bool(ctx.getText()))
示例#16
0
文件: Visitor.py 项目: theQRL/silicon
 def visitNotExpression(self, ctx: siliconParser.NotExpressionContext):
     v = self.visit(ctx.expression())
     if not v.isBoolean():
         raise Exception(ctx)
     return SiliconValue(not v.asBoolean())
示例#17
0
文件: Visitor.py 项目: theQRL/silicon
 def visitUnaryMinusExpression(
         self, ctx: siliconParser.UnaryMinusExpressionContext):
     v = self.visit(ctx.expression())
     if not v.isNumber():
         raise Exception("EvalException")
     return SiliconValue(-1 * v.asDouble())
示例#18
0
文件: Visitor.py 项目: theQRL/silicon
 def visitNumberExpression(self,
                           ctx: siliconParser.NumberExpressionContext):
     val = ctx.getText()
     if '.' in val:
         return SiliconValue(float(val))
     return SiliconValue(int(val))