/// <summary> /// Parse function body /// </summary> /// <param name="funcInfo">Function to parse</param> private void ParseFunction(Parser1To2Pass.FunctionInfo funcInfo) { var funcElem = new FunctionElement(); m_currentFunction = funcElem; funcElem.Info = funcInfo.Info; StatementListElement statements = new StatementListElement(); m_currentBlock.Push(statements); foreach (var arg in funcInfo.Info.Arguments) { var declElem = new VarDeclarationElement { VarType = arg.TypeInfo.Name, VarName = arg.ArgName, IgnoreInitialization = true }; declElem.SetParent(statements); funcElem.AddArgumentVariable(declElem); } if (funcInfo.FuncLexemes.Count > 0) { for (int i = 0, end = funcInfo.FuncLexemes.Count;;) { TreeElement element; i = ParseStatement(funcInfo.FuncLexemes, i, out element); if (element != null) //if null => ignore (block element) { var statementElem = new StatementElement(); statementElem.AddChild(element); m_currentBlock.Peek().AddChild(statementElem); } if (i >= end) { break; } } } funcElem.AddChild(statements); m_parserOutput.Functions.Add(funcElem); m_currentBlock.Pop(); }
/// <summary> /// Parse function default arguments and save it before body parsing /// </summary> /// <param name="funcInfo">Parsed function</param> private void ParseFunctionDefaultVals(Parser1To2Pass.FunctionInfo funcInfo) { for (int i = 0, end = funcInfo.ArgInitLexemes.Count; i < end; ++i) { ValueElement valElement; if (funcInfo.ArgInitLexemes[i].Count != 0) { ParseExpression(funcInfo.ArgInitLexemes[i], 0, -1, ExpressionFlags.AllowDefaultValue, out valElement); } else { valElement = null; } funcInfo.Info.Arguments[i].DefaultVal = valElement; } m_symbols.UpdateFunction(funcInfo.Info); }