Beispiel #1
0
        // class ::= "class" ident [ ":" ident ] class_block
        private SyntaxClassNode ParseClassNode()
        {
            if (!TokenStream_.TakeExpect(TokenType.Keyword, "class", out Token Tok))
            {
                ExitCode_ = new ExitUnexpectedSymbolCode(Tok);
                return(null);
            }

            if (!TokenStream_.TakeExpect(TokenType.Identifier, out Token ClassName))
            {
                ExitCode_ = new ExitUnexpectedSymbolCode(ClassName);
                return(null);
            }

            SyntaxIdentifierNode BaseClassIdentNode = null;

            if (TokenStream_.PeekExpect(TokenType.Delimiter, ":"))
            {
                // skip ":"
                TokenStream_.Take();
                if (!TokenStream_.TakeExpect(TokenType.Identifier, out Token BaseName))
                {
                    ExitCode_ = new ExitUnexpectedSymbolCode(BaseName);
                    return(null);
                }

                BaseClassIdentNode = new SyntaxIdentifierNode(BaseName);
            }

            var ClassBodyNode = ParseClassBodyNode();

            if (ClassBodyNode == null)
            {
                return(null);
            }

            return(new SyntaxClassNode(ClassName.Code, ClassBodyNode, BaseClassIdentNode));
        }
Beispiel #2
0
 public SyntaxDotClassExpressionNode(SyntaxIdentifierNode ClassIdentNode, SyntaxIdentifierNode CallIdentNode)
     : base(new Token(TokenType.Operator, "."), ClassIdentNode, CallIdentNode)
 {
 }
Beispiel #3
0
 public LiteValue Visit(SyntaxIdentifierNode Node, LiteEnv Env)
 {
     return(Env.Get(Node.GetValue()));
 }
Beispiel #4
0
 public SyntaxClassNode(string ClassName, SyntaxClassBodyStatementNode BlockNode, SyntaxIdentifierNode BaseClassIdentNode)
     : base(BlockNode, BaseClassIdentNode)
 {
     ClassName_ = ClassName;
 }