private bool ParseConstructorDefinition(TokenReader reader, out MethodDefinition method) { Token start = reader.Peek(); method = null; if (!this.Expect(reader, Keyword.Constructor)) { return false; } string methodName = null; if (!this.ParseFullNameDeclaration(reader, out methodName)) { return false; } methodName = methodName + ".constructor"; MethodDefinition methodDef = new MethodDefinition( start, methodName); if (!this.Expect(reader, Keyword.LeftParen)) { return false; } Token tok = reader.Peek(); while (!tok.Is(Keyword.RightParen)) { ParameterDeclaration parameter = null; if (!this.ParseParameterDeclaration(reader, out parameter)) { return false; } methodDef.AddParameter(parameter); tok = reader.Peek(); if (tok.Is(Keyword.SemiColon)) { reader.Read(); tok = reader.Peek(); } } if (!this.Expect(reader, Keyword.RightParen)) { return false; } if (!this.Expect(reader, Keyword.SemiColon)) { return false; } tok = reader.Peek(); if (tok.Is(Keyword.Inherited)) { reader.Read(); if (!this.Expect(reader, Keyword.LeftParen)) { return false; } tok = reader.Peek(); while (!tok.Is(Keyword.RightParen)) { Expression arg = null; if (!this.ParseExpression(reader, out arg)) { return false; } methodDef.BaseConstructorArguments.Add(arg); tok = reader.Peek(); if (!tok.Is(Keyword.Comma)) { break; } else { reader.Read(); } } if (!this.Expect(reader, Keyword.RightParen)) { return false; } if (!this.Expect(reader, Keyword.SemiColon)) { return false; } } tok = reader.Peek(); if (tok.Is(Keyword.Var)) { VarBlock varBlock = null; if (!this.ParseVarBlock(reader, true, out varBlock)) { return false; } methodDef.LocalVariables = varBlock; } BlockStatement body = null; if (!this.ParseBlockStatement(reader, out body)) { return false; } methodDef.Body = body; method = methodDef; return true; }
private bool ParseMethodDefinition(TokenReader reader, out MethodDefinition method) { method = null; Token tok = reader.Peek(); Token start = tok; bool isFunction = false; if (tok.Is(Keyword.Constructor)) { return this.ParseConstructorDefinition(reader, out method); } if (tok.Is(Keyword.Destructor)) { return this.ParseDestructorDefinition(reader, out method); } if (tok.Is(Keyword.Function)) { isFunction = true; reader.Read(); } else { if (!this.Expect(reader, Keyword.Procedure)) { return false; } } string methodName = null; if (!this.ParseFullNameDeclaration(reader, out methodName)) { return false; } MethodDefinition methodDef = new MethodDefinition( start, methodName); if (!this.Expect(reader, Keyword.LeftParen)) { return false; } tok = reader.Peek(); while (!tok.Is(Keyword.RightParen)) { ParameterDeclaration parameter = null; if (!this.ParseParameterDeclaration(reader, out parameter)) { return false; } methodDef.AddParameter(parameter); tok = reader.Peek(); if (tok.Is(Keyword.SemiColon)) { reader.Read(); tok = reader.Peek(); } } if (!this.Expect(reader, Keyword.RightParen)) { return false; } if (isFunction) { if (!this.Expect(reader, Keyword.Colon)) { return false; } TypeReference returnType = null; if (!this.ParseTypeReference(reader, out returnType)) { return false; } methodDef.ReturnType = returnType; } if (!this.Expect(reader, Keyword.SemiColon)) { return false; } tok = reader.Peek(); if (tok.Is(Keyword.Extern)) { reader.Read(); string externalImpl = null; tok = reader.Read(); LiteralToken litTok = tok as LiteralToken; if (tok == null || litTok == null || !(litTok.Value is string)) { string message = string.Format( System.Globalization.CultureInfo.CurrentCulture, Properties.Resources.Parser_Unexpected, tok != null ? tok.ToString() : Properties.Resources.Parser_EndOfFile); this.log.Write( new Message( reader.Path, reader.Line, reader.Column, Severity.Error, message)); return false; } externalImpl = (string)litTok.Value; methodDef.ExternImpl = externalImpl; } else { if (tok.Is(Keyword.Var)) { VarBlock varBlock = null; if (!this.ParseVarBlock(reader, true, out varBlock)) { return false; } methodDef.LocalVariables = varBlock; } BlockStatement body = null; if (!this.ParseBlockStatement(reader, out body)) { return false; } methodDef.Body = body; } method = methodDef; return true; }