bool ParseNestable(string termToken, bool eofOk, CodeStringBuilder sig) { while (_parser.Read()) { sig.Append(_parser); if (_parser.TokenText == termToken) return true; else if (_parser.TokenText == "(") ParseNestable(")", eofOk, sig); else if (_parser.TokenText == "{") ParseNestable("}", eofOk, sig); else if (_parser.TokenText == "[") ParseNestable("]", eofOk, sig); } return eofOk; }
bool ProcessFunction() { var startPos = _parser.Position; var retVal = false; try { var sig = new CodeStringBuilder(); // Function name if (!_parser.Read() || _parser.TokenType != TokenParser.TokenType.Word) return false; var funcName = _parser.TokenText; var funcStartPos = _parser.TokenStartPostion; sig.Append(_parser); // Exclude probe keywords switch (funcName) { case "and": case "char": case "enum": case "numeric": case "oldvalue": case "or": case "else": case "for": case "if": case "select": case "switch": case "while": return false; } // Next char should be '(' - start of argument brackets if (!_parser.Read() || _parser.TokenText != "(") return false; sig.Append(_parser); if (!ParseNestable(")", false, sig)) return false; // Optional attributes. while (_parser.Read()) { if (_parser.TokenText == "{") break; //sig.Append(_parser); switch (_parser.TokenText) { case "(": ParseNestable(")", false, sig); break; case "[": ParseNestable("]", false, sig); break; case ";": case ")": case "]": case "}": return false; } } // Add the function to the list AddFunction(funcName, funcStartPos.LineNum, _parser.Position.LineNum, sig.ToString()); return retVal = true; } finally { if (!retVal) { _parser.Position = startPos; } } }