예제 #1
0
        private void ParseFunction(AccessLevel accessLevel, bool isStatic)
        {
            Token name      = _lexer.Eat(TokenType.Identifer);
            Token openParen = _lexer.Eat(TokenType.OpenParen);

            //参数
            List <DefineVariableNode> parms = new List <DefineVariableNode>();

            if (!_lexer.Match(")"))
            {
                do
                {
                    _lexer.Match(TokenType.Identifer); //TODO:使用Match函数报错
                    DefineVariableNode variable =
                        ParseDefineVariable(out AssignNode assign, false);
                    if (assign != null)
                    {
                        return;                 //TODO:报错 没有赋值
                    }
                    parms.Add(variable);
                    if (_lexer.Match(")"))
                    {
                        break;
                    }
                } while (_lexer.MatchNow(","));
            }
            if (!_lexer.Match(")"))
            {
                return;                     //TODO:报错 意外的符号
            }
            Token closeParen = _lexer.Eat(TokenType.CloseParen);

            //返回值
            Token  colon = null, returnToken = null;
            string returnName = "void";

            if (_lexer.Match(":"))
            {
                colon = _lexer.Eat(TokenType.Colon);
                if (_lexer.Match(TokenType.Identifer))
                {
                    returnToken = _lexer.Eat(TokenType.Identifer);
                    returnName  = returnToken.Content;
                }
                else
                {
                    return;  //TODO:使用Match函数报错
                }
            }

            FunctionDefinition function;

            if (_parsingStructure is InterfaceDefinition)
            {
                if (_lexer.Match("{"))
                {
                    return;           //TODO:报错 接口成员不能有定义
                }
                _lexer.MatchNow(";"); //TODO:使用Match函数报错
                function = new FunctionDefinition(name, openParen, closeParen, colon, returnToken, returnName,
                                                  null, null, _parsingStructure, parms, null, accessLevel, false);
                _parsingStructure.AddFunction(function);
                return;
            }
            ChunkNode chunkNode = ParseChunk(s_commonOrder, out Token openBrace, out Token closeBrace);

            function = new FunctionDefinition(name, openParen, closeParen, colon, returnToken, returnName,
                                              openBrace, closeBrace, _parsingStructure, parms, chunkNode, accessLevel, isStatic);
            _parsingStructure.AddFunction(function);
        }