예제 #1
0
파일: Parser.cs 프로젝트: strunberg/TEA
        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;
        }
예제 #2
0
파일: Parser.cs 프로젝트: strunberg/TEA
        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;
        }