public static GenericConstraintNode Parse(Lexer lex)
        {
            GenericConstraintNode n = new GenericConstraintNode();

            lex.Dequeue("where");
            var tkn = lex.Dequeue(TokenType.Identifier);

            n.Parameter = tkn.Value;

            lex.Dequeue(TokenType.Colon);
            do
            {
                if (GenericConstraintTypeSet.Match(lex))
                {
                    lex.Dequeue();
                    n.KeywordConstraints.Add(tkn.Value);
                }
                else
                {
                    n.Constraints.Add(TRefNode.Parse(lex));
                }
            } while(lex.DequeueIf(TokenType.Comma, out tkn));

            return(n);
        }
Пример #2
0
        public static UsingNode Parse(Lexer lex)
        {
            UsingNode n = new UsingNode();

            lex.Dequeue("using");
            n.Identifier = TRefNode.Parse(lex);
            lex.Dequeue(TokenType.Semi);

            return(n);
        }
Пример #3
0
        public static bool IsPresent(Lexer lex)
        {
            if (BuiltinTypeSet.Match(lex))
            {
                return(true);
            }

            if (TRefNode.IsPresent(lex))
            {
                return(true);
            }

            return(false);
        }
Пример #4
0
        public static AttributeNode Parse(Lexer lex)
        {
            AttributeNode n = new AttributeNode();

            lex.Dequeue(TokenType.LBracket);
            n.Identifier = TRefNode.Parse(lex);
            lex.Dequeue(TokenType.LParen);

            //TODO: Add parameter parsing

            lex.Dequeue(TokenType.RParen);
            lex.Dequeue(TokenType.RBracket);

            return(n);
        }
Пример #5
0
        public static ClassInheritNode Parse(Lexer lex)
        {
            ClassInheritNode n = new ClassInheritNode();

            lex.Dequeue(TokenType.Colon);

            Token tkn;

            do
            {
                n.Bases.Add(TRefNode.Parse(lex));
            } while(lex.DequeueIf(TokenType.Comma, out tkn));

            return(n);
        }
Пример #6
0
        public static TypeNode Parse(Lexer lex)
        {
            TypeNode n = new TypeNode();

            if (BuiltinTypeSet.Match(lex))
            {
                n.BuiltinType = lex.Dequeue().Value;
            }
            else if (TRefNode.IsPresent(lex))
            {
                n.CustomType = TRefNode.Parse(lex);
            }

            return(n);
        }
Пример #7
0
        public static TRefNode Parse(Lexer lex)
        {
            TRefNode r = new TRefNode();

            Token t = lex.Dequeue(TokenType.Identifier);

            r.Identifier.Add(t.Value);

            while (lex.DequeueIf(TokenType.Dot, out t))
            {
                t = lex.Dequeue(TokenType.Identifier);
                r.Identifier.Add(t.Value);;
            }

            return(r);
        }
Пример #8
0
        public static NamespaceNode Parse(Lexer lex)
        {
            var n = new NamespaceNode();

            lex.Dequeue("namespace");
            n.Identifier = TRefNode.Parse(lex);
            lex.Dequeue(TokenType.LBrace);

            while (SubdefNode.IsPresent(lex))
            {
                n.Subdefinitions.Add(SubdefNode.Parse(lex));
            }

            lex.Dequeue(TokenType.RBrace);

            return(n);
        }