public void Visit(ArithContext parserRule, IObjectContext <IVar, IVar> context) { Visit(parserRule.left, context); Visit(parserRule.right, context); if (!globalContext.IfDefineType(parserRule.left.computedType.Name) || !globalContext.IfDefineType(parserRule.right.computedType.Name)) { parserRule.computedType = globalContext.Undefined; } else { //Lo dejo como un tipo idefinido if (!parserRule.left.computedType.Equals(globalContext.Int) || !parserRule.right.computedType.Equals(globalContext.Int)) { errorLogger.LogError($"({parserRule.Start.Line},{parserRule.Start.Column + 1}) - Type Error: Operator '{parserRule.op.Text }' cannot be applied to operands of type '{parserRule.left.computedType.Name}' and '{parserRule.right.computedType.Name}'"); parserRule.computedType = globalContext.Undefined; } else { parserRule.computedType = globalContext.Int; } } }
public IHolderCil Visit(ArithContext parserRule, IFunctionCil cilTree, IContextCil contextCil) { var valueNum = new LocalCil($"_valueNum{cilTree.LocalCils.Count}"); cilTree.LocalCils.Add(valueNum); var valueLeft = Visit(parserRule.left, cilTree, contextCil); var valueRight = Visit(parserRule.right, cilTree, contextCil); var valLeft = GetValue(valueLeft, cilTree, CilAst.Int); var valRigth = GetValue(valueRight, cilTree, CilAst.Int); switch (parserRule.op.Text) { case "/": var isZero = new LocalCil($"_isZero{cilTree.LocalCils.Count}"); cilTree.LocalCils.Add(isZero); cilTree.ThreeDirInses.Add(new NotEqualCil(isZero, valRigth, new HolderCil("0"))); Visit_Runtime_Error_whit_Cond(isZero, cilTree, $"\"({parserRule.Start.Line},{parserRule.Start.Column+1}) - Rutime Error: Division by zero\""); cilTree.ThreeDirInses.Add(new DivCil(valueNum, valLeft, valRigth)); break; case "*": cilTree.ThreeDirInses.Add(new MultCil(valueNum, valLeft, valRigth)); break; case "+": cilTree.ThreeDirInses.Add(new SumCil(valueNum, valLeft, valRigth)); break; case "-": cilTree.ThreeDirInses.Add(new RestCil(valueNum, valLeft, valRigth)); break; default: break; } return(CreateABasicTypeWhitVal(cilTree, CilAst.Int, valueNum)); }