private VisitResult VisitIfElseStatement(ASTIfElse node) { var condition = Visit(node.Condition).Value; if (condition) { var result = Visit(node.IfTrue); if (result != null && result.ControlType != ControlType.None) { return(result); } } else { foreach (var elif in node.Elifs) { var elifCondition = Visit(elif.Condition).Value; if (elifCondition) { var result = Visit(elif.IfTrue); if (result != null && result.ControlType != ControlType.None) { return(result); } } } if (node.Else != null) { var result = Visit(node.Else); if (result != null && result.ControlType != ControlType.None) { return(result); } } } return(null); }
private Symbol VisitIfElseStatement(ASTIfElse node) { var conditionType = Visit(node.Condition); if (conditionType.Name != "bool") { ThrowIncompatibleTypesException(node.Token, conditionType.Name, "bool"); } Logger.DebugScope($"Enter scope : if"); var ifScope = new ScopedSymbolTable("if", _currentScope.Level + 1, _currentScope); _currentScope = ifScope; var returnType = Visit(node.IfTrue); DebugPrintSymbolTable(); _currentScope = _currentScope.EnclosingScope; Logger.DebugScope($"Leave scope : if"); foreach (var elif in node.Elifs) { var elifType = Visit(elif); if (returnType is null) { returnType = elifType; } if (returnType != elifType) { ThrowIncompatibleTypesException(node.Token, returnType.Name, elifType.Name); } } if (node.Else != null) { Logger.DebugScope($"Enter scope : else"); var elseScope = new ScopedSymbolTable("else", _currentScope.Level + 1, _currentScope); _currentScope = elseScope; var elseType = Visit(node.Else); if (returnType is null) { returnType = elseType; } if (returnType != elseType) { ThrowIncompatibleTypesException(node.Token, returnType.Name, elseType.Name); } DebugPrintSymbolTable(); _currentScope = _currentScope.EnclosingScope; Logger.DebugScope($"Leave scope : else"); } return(returnType); }