public virtual object Execute(FiMClass reportClass) { uint localVariables = 0; object result = null; foreach (var node in this.Body) { if (!node.GetType().IsSubclassOf(typeof(KirinExecutableNode))) { if (node.GetType().IsSubclassOf(typeof(KirinNode)) || node.GetType() == typeof(KirinNode)) { var no = (KirinNode)node; throw new FiMException($"Paragraph contains a non-KirinExecutable node at line ${FiMHelper.GetIndexPair(reportClass.Report.ReportString, node.Start).Line}"); } else { throw new FiMException($"Paragraph contains a non-KirinExecutable node ('{node.NodeType}')"); } } var n = (KirinExecutableNode)node; if (n.NodeType == "KirinVariableDeclaration") { localVariables++; } object r; #if HIDE_ERROR r = n.Execute(reportClass); #else try { r = n.Execute(reportClass); } catch (FiMException err) { throw new Exception(err.Message + " at line " + FiMHelper.GetIndexPair(reportClass.Report.ReportString, n.Start).Line); } #endif if (r != null) { reportClass.Variables.Pop(count: localVariables); return(r); } if (n.NodeType == "KirinReturn") { result = ((KirinValue)r).Value; break; } } reportClass.Variables.Pop(count: localVariables); return(result); }
public static KirinIfStatement ParseNodes( KirinIfStatementStart startNode, KirinNode[] nodes, KirinIfStatementEnd endNode, string content) { var statement = new KirinIfStatement(-1, -1); string currentCondition = startNode.RawCondition; KirinNode conditionNode = startNode; List <KirinNode> subStatement = new List <KirinNode>(); foreach (var subnode in nodes) { if (subnode.NodeType != "KirinElseIfStatement") { subStatement.Add(subnode); } else { var conditionStatement = FiMLexer.ParseStatement(subStatement.ToArray(), content); try { statement.AddCondition(currentCondition, conditionStatement); } catch (FiMException ex) { throw new Exception(ex.Message + " at line " + FiMHelper.GetIndexPair(content, conditionNode.Start).Line); } var elseIfNode = subnode as KirinElseIfStatement; currentCondition = elseIfNode.RawCondition; conditionNode = subnode; subStatement.Clear(); } } if (subStatement.Count > 0) { var conditionStatement = FiMLexer.ParseStatement(subStatement.ToArray(), content); try { statement.AddCondition(currentCondition, conditionStatement); } catch (FiMException ex) { throw new Exception(ex.Message + " at line " + FiMHelper.GetIndexPair(content, conditionNode.Start).Line); } } statement.SetComplete(startNode.Start, endNode.Start + endNode.Length); if (statement.Count == 0) { throw new FiMException("If Statement has empty conditions"); } return(statement); }