示例#1
0
 public ClassDecl(bool publicAccess, bool abstract_, Identifier name, TypevarSeq typevars, Block block)
 {
     PublicAccess = publicAccess;
     Abstract     = abstract_;
     Name         = name;
     Typevars     = typevars;
     Block        = block;
 }
示例#2
0
 public Signature(bool publicAccess, bool static_, Identifier name, TypevarSeq typevars, Param[] domain, TypeNode codomain)
 {
     PublicAccess = publicAccess;
     Static       = static_;
     Name         = name;
     Typevars     = typevars;
     Domain       = domain;
     Codomain     = codomain;
 }
示例#3
0
        public static Signature Consume(Parser parser, bool inClass = false)
        {
            bool publicAccess = Utils.ParseAccessModifier(parser);
            bool static_      = false;

            if (inClass)
            {
                static_ = Utils.ParseStatic(parser);
            }

            parser.Eat(TokenInfo.TokenType.FUNC);

            Identifier name     = null;
            TypevarSeq typevars = null;

            Param[]  domain   = new Param[0];
            TypeNode codomain = null;

            // func foo(baz: String, bax) -> Int
            // func foo(baz)
            // func foo()

            name     = parser.TryConsumer(Identifier.Consume);
            typevars = parser.TryConsumer(TypevarSeq.Consume);

            parser.Eat(TokenInfo.TokenType.L_PAREN, false);
            domain = Utils.ParseSequence(parser, Param.Consume);

            parser.Eat(TokenInfo.TokenType.R_PAREN, false);

            bool  arrow      = true;
            Token arrowToken = null;

            try
            {
                arrowToken = parser.Eat(TokenInfo.TokenType.ARROW);
            }
            catch (ParserError)
            {
                arrow = false;
            }

            if (arrow)
            {
                try
                {
                    codomain = parser.TryConsumer(TypeNode.Consume);
                }
                catch (ParserError ex)
                {
                    if (!ex.IsExceptionFictive())
                    {
                        throw ex;
                    }
                    throw new ParserError(
                              new ExpectedElementException("Expected type after ARROW token"),
                              parser.Cursor
                              );
                }
            }

            return(new Signature(publicAccess, static_, name, typevars, domain, codomain));
        }