예제 #1
0
        LuaAST parseParlist() {
            ParserState ps = new ParserState(this);
            LuaAST rst = new LuaAST();
            rst.Name = "parlist";
            do
            {
                LuaAST namelist = parseNamelist();
                if (namelist == null) break;
                rst.Components.Add("namelist", namelist);
                if (peek().Type == LuaTokenType.OP_comma) {
                    m_pos++;
                    if (peek().Type != LuaTokenType.OP_ellipsis) error("'...' expected");
                    rst.Token = peek();
                    m_pos++;
                   
                }
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();
            if (peek().Type == LuaTokenType.OP_ellipsis)
            {
                rst.Token = peek();
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            }

            ps.restore();
            return null;
        }
예제 #2
0
        LuaAST parseVar() {
            ParserState ps = new ParserState(this);
            
            do
            {
                LuaAST prefix = parsePrefix();
                if (prefix == null) break;
                LuaAST suffix = parseSuffix();
                LuaAST rst = new LuaAST();
                rst.Name = "var";
                rst.Components.Add("prefix", prefix);
                while (suffix != null) {
                    rst.ComponentGroup.Add(suffix);
                    suffix = parseSuffix();
                }
                if (rst.ComponentGroup.Count == 0 || !rst.ComponentGroup[rst.ComponentGroup.Count - 1].Components.ContainsKey("index")) break; //error("index expected");
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            
            ps.restore();
            do
            {
                LuaAST name = parseName();
                if (name != null) return name;
            } while (false);
            ps.restore();

            return null;
        }
예제 #3
0
        LuaAST parseFunction() {
            ParserState ps = new ParserState(this);
            do
            {
                if (peek().Type != LuaTokenType.KW_function) break;
                m_pos++;

                LuaAST body = parseFuncbody();
                if (body == null) error("function body expected");
                LuaAST rst = new LuaAST();
                rst.Name = "function";
                rst.Components.Add("funcbody", body);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);

            ps.restore();
            return null;
        }
예제 #4
0
        private Decl.Function parseFunction()
        {
            ParserState ps = new ParserState(this);
            Decl.Function rst = new Decl.Function();

            if (peek().Type == DeclTokenType.Comment)
            {
                rst.Desc = peek().Data;
                m_pos++;
            }

            if (peek().Type == DeclTokenType.KW_Static)
            {
                rst.isStatic = true;
                m_pos++;
            }

            if (peek().Type != DeclTokenType.Identifier)
            {
                ps.restore();
                return null;
            }
            string id1 = peek().Data;
            m_pos++;

            if (peek().Type == DeclTokenType.Identifier)
            {
                rst.type = id1;
                rst.name = peek().Data;
                m_pos++;
            }
            else
            {
                rst.name = id1;
            }

            if (peek().Type != DeclTokenType.OP_LParen)
            {
                ps.restore();
                return null;
            }
            m_pos++;

            Decl.Variable var = parseVariable();
            if (var != null)
            {
                rst.parameters.Add(var);

                while (peek().Type == DeclTokenType.OP_Comma)
                {
                    m_pos++;
                    Decl.Variable moreVar = parseVariable();
                    if (moreVar == null)
                    {
                        throw new System.Exception("Line " + peek().Line + ": variable expected");
                    }
                    rst.parameters.Add(moreVar);
                }
            }
            if (peek().Type != DeclTokenType.OP_RParen)
            {
                throw new System.Exception("')' expected");
            }
            m_pos++;

            return rst;
        }
예제 #5
0
        LuaAST parseCall()
        {
            ParserState ps = new ParserState(this);
            LuaAST rst = new LuaAST();
            rst.Name = "call";
            do
            {
                LuaAST args = parseArgs();
                if (args == null) break;
                rst.Components.Add("args", args);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();

            do
            {
                if (peek().Type != LuaTokenType.OP_colon) break;
                m_pos++;
                LuaAST name = parseName();
                if (name == null) error("name expected");
                rst.Components.Add("name", name);
                LuaAST args = parseArgs();
                if (args == null) error("args expected");
                rst.Components.Add("args", args);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();

            return null;
        }
예제 #6
0
        LuaAST parseFunctioncall() {
            ParserState ps = new ParserState(this);
            do
            {
                LuaAST prefix = parsePrefix();
                if (prefix == null) break;
                LuaAST rst = new LuaAST();
                rst.Components.Add("prefix", prefix);
                LuaAST suffix = parseSuffix();
                while (suffix!=null) {
                    rst.ComponentGroup.Add(suffix);
                    suffix = parseSuffix();
                }

                if (rst.ComponentGroup.Count == 0) break;
                LuaAST last = rst.ComponentGroup[rst.ComponentGroup.Count-1];
                if (!last.Components.ContainsKey("call")) break;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);


            ps.restore();
            return null;
        }
예제 #7
0
        LuaAST parseUnop() {
            ParserState ps = new ParserState(this);

            switch (peek().Type)
            {
                case LuaTokenType.OP_sub:
                case LuaTokenType.OP_hash:
                case LuaTokenType.KW_not:
                    LuaAST rst = new LuaAST();
                    rst.Token = peek();
                    m_pos++;
                    rst.start = ps.pos;
                rst.end = m_pos;
                    return rst;
            }
            ps.restore();
            return null;
        }
예제 #8
0
        LuaAST parseExp() {
            ParserState ps = new ParserState(this);
            do
            {
                LuaAST unop = parseUnop();
                if (unop == null) break;
                LuaAST exp = parseExp();
                if (exp == null) error("expression expected");

                LuaAST rst = new LuaAST();
                rst.Name = "unopExp";
                rst.Components.Add("unop", unop);
                rst.Components.Add("exp", exp);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();

            do{
                LuaAST value = parseValue();
                if(value == null) break;
                LuaAST rst =new LuaAST();
                rst.Name = "biopExp";
                rst.Components.Add("value",value);
                
                LuaAST biop = parseBiop();
                if(biop != null){
                    LuaAST exp = parseExp();
                    if(exp == null) error("expression expected");
                    rst.Components.Add("biop",biop);
                    rst.Components.Add("exp",exp);
                }
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            }while(false);
            ps.restore();
            return null;
        }
예제 #9
0
        LuaAST parseBiop() {
            ParserState ps = new ParserState(this);
            switch (peek().Type)
            {
                case LuaTokenType.OP_add:
                case LuaTokenType.OP_sub:
                case LuaTokenType.OP_mul:
                case LuaTokenType.OP_div:
                case LuaTokenType.OP_pow:
                case LuaTokenType.OP_mod:
                case LuaTokenType.OP_doubleDot:
                case LuaTokenType.OP_lt:
                case LuaTokenType.OP_le:
                case LuaTokenType.OP_gt:
                case LuaTokenType.OP_ge:
                case LuaTokenType.OP_eq:
                case LuaTokenType.OP_ne:
                case LuaTokenType.KW_and:
                case LuaTokenType.KW_or:
                    LuaAST rst = new LuaAST();
                    rst.Token = peek();
                    m_pos++;
                    rst.start = ps.pos;
                rst.end = m_pos;
                    return rst;
            }

            ps.restore();
            return null;
        }
예제 #10
0
        LuaAST parseChunk() {
            ParserState ps = new ParserState(this);
            int i = 0;
            LuaAST rst = new LuaAST();
            rst.start = m_pos;
            rst.Name = "chunk";
            
            while(true)
            {
                ParserState statState = new ParserState(this);
                try
                {
                    LuaAST stat = parseStat();
                    if (stat == null) {
                        LuaAST laststat = parseLaststat();
                        if (laststat != null)
                        {
                            rst.Components.Add("laststat", laststat);
                            if (peek().Type == LuaTokenType.OP_semicolon)
                            {
                                m_pos++;
                            }
                        }
                        break;
                    }
                    rst.ComponentGroup.Add(stat);
                    if (peek().Type == LuaTokenType.OP_semicolon)
                    {
                        m_pos++;
                    }

                }
                catch (Exception e) {
                    if (errMsg == null) errMsg = e.Message;

                    statState.restore();
                    int line = peek().line;
                    while (peek().Type != LuaTokenType.EOF && peek().line <= line) {
                        m_pos++;
                    }
                    if (peek().Type == LuaTokenType.EOF)
                    {
                        break;
                    }
                    
                }
                
            }



            rst.end = m_pos;

            return rst;

            ps.restore();
            return null;
        }
예제 #11
0
        LuaAST parseFieldsep() {
            ParserState ps = new ParserState(this);
            switch (peek().Type) { 
                case LuaTokenType.OP_comma:
                case LuaTokenType.OP_semicolon:
                    LuaAST rst = new LuaAST();
                    rst.Token = peek();
                    m_pos++;
                    rst.start = ps.pos;
                    rst.end = m_pos;
                    return rst;
            }

            ps.restore();
            return null;
        }
예제 #12
0
        LuaAST parseFieldlist() {
            ParserState ps = new ParserState(this);
            do
            {
                LuaAST field = parseField();
                if (field == null) break;
                LuaAST rst = new LuaAST();
                rst.Name = "fieldlist";
                rst.ComponentGroup.Add(field);

                LuaAST fieldsep = parseFieldsep();
                while (fieldsep != null) {
                    field = parseField();
                    if (field == null) { break; }
                    rst.ComponentGroup.Add(field);
                    fieldsep = parseFieldsep();
                }
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);

            ps.restore();
            return null;
        }
예제 #13
0
        LuaAST parseTableconstructor() {
            ParserState ps = new ParserState(this);

            do
            {
                if (peek().Type != LuaTokenType.OP_lbrace) break;
                m_pos++;

                LuaAST rst = new LuaAST();
                rst.Name = "tableconstructor";
                LuaAST fieldlist = parseFieldlist();
                if (fieldlist != null) {
                    rst.Components.Add("fieldlist", fieldlist);
                }
                if (peek().Type != LuaTokenType.OP_rbrace) error("'}' expected");
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);


            ps.restore();
            return null;
        }
예제 #14
0
        LuaAST parseNamelist() {
            ParserState ps = new ParserState(this);

            do
            {
                LuaAST name = parseName();
                if (name == null) break;
                LuaAST rst = new LuaAST();
                rst.Name = "namelist";
                rst.ComponentGroup.Add(name);
                while (peek().Type == LuaTokenType.OP_comma)
                {
                    ParserState nps = new ParserState(this);
                    m_pos++;
                    name = parseName();
                    if (name == null)
                    {
                        nps.restore();
                        break;
                    }
                    rst.ComponentGroup.Add(name);
                }
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;

            } while (false);

            ps.restore();
            return null;

        }
예제 #15
0
        LuaAST parseName() {
            ParserState ps = new ParserState(this);

            if (peek().Type == LuaTokenType.Identifier) {
                LuaAST rst = new LuaAST();
                rst.Name = "Name";
                rst.Token = peek();
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            }
            ps.restore();
            return null;
        }
예제 #16
0
        LuaAST parseExplist() {
            ParserState ps = new ParserState(this);
            do
            {
                LuaAST exp = parseExp();
                if (exp == null) break;
                LuaAST rst = new LuaAST();
                rst.Name = "explist";
                rst.ComponentGroup.Add(exp);
                while (peek().Type == LuaTokenType.OP_comma)
                {
                    m_pos++;
                    exp = parseExp();
                    if (exp == null) error("expression expected");
                    rst.ComponentGroup.Add(exp);
                }
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;

            } while (false);

            ps.restore();
            return null;
        }
예제 #17
0
        LuaAST parseBlock() {
            ParserState ps = new ParserState(this);
            return parseChunk();

            ps.restore();
            return null;
        }
예제 #18
0
        LuaAST parseIndex()
        {
            ParserState ps = new ParserState(this);
            LuaAST rst = new LuaAST();
            rst.Name = "index";
            do
            {
                if (peek().Type != LuaTokenType.OP_lbracket) break;
                m_pos++;
                LuaAST exp = parseExp();
                if (exp == null) error("expression expected");
                if (peek().Type != LuaTokenType.OP_rbracket) error("']' expected");
                m_pos++;
                rst.Components.Add("exp", exp);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();

            do
            {
                if (peek().Type != LuaTokenType.OP_dot) break;
                m_pos++;
                LuaAST name = parseName();
                if (name == null) error("name expected");
                
                rst.Components.Add("name", name);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();

            return null;
        }
예제 #19
0
        LuaAST parseStat()
        {
            ParserState ps = new ParserState(this);
            
            do
            {
                LuaAST varlist = parseVarlist();
                if (varlist == null) break;
                if (peek().Type != LuaTokenType.OP_assign) break;
                m_pos++;
                LuaAST explist = parseExplist();
                if (explist == null) break;
                LuaAST rst = new LuaAST();
                rst.Name = "assignExp";
                rst.start = ps.pos;
                rst.end = m_pos;
                rst.Components.Add("varlist", varlist);
                rst.Components.Add("explist", explist);
                return rst;
            } while (false);
            ps.restore();

            do
            {
                LuaAST functioncall = parseFunctioncall();
                if (functioncall == null) break;
                LuaAST rst = new LuaAST();
                rst.Name = "functioncallExp";
                rst.Components.Add("functioncall", functioncall);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();

            do
            {
                if (peek().Type != LuaTokenType.KW_do) break;
                m_pos++;
                LuaAST block = parseBlock();
                if (block == null) error("block expected");
                if (peek().Type != LuaTokenType.KW_end) error("'end' expected");
                m_pos++;
                LuaAST rst = new LuaAST();
                
                rst.Name = "doExp";
                rst.Components.Add("block", block);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();

            do
            {
                if (peek().Type != LuaTokenType.KW_while) break;
                m_pos++;

                LuaAST exp = parseExp();
                if (exp == null) error("expression expected");
                if (peek().Type != LuaTokenType.KW_do) error("'do' expected");
                m_pos++;
                LuaAST block = parseBlock();
                if (block == null) break;
                if (peek().Type != LuaTokenType.KW_end) error("'end' expected");
                m_pos++;

                LuaAST rst = new LuaAST();
                rst.Name = "whileExp";
                rst.Components.Add("exp", exp);
                rst.Components.Add("block", block);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();
            do
            {
                if (peek().Type != LuaTokenType.KW_repeat) break;
                m_pos++;
                LuaAST block = parseBlock();
                if (block == null) error("block expected"); ;
                if (peek().Type != LuaTokenType.KW_until) error("'until' expected");
                m_pos++;

                LuaAST exp = parseExp();
                if (exp == null) error("expression expected"); ;

                LuaAST rst = new LuaAST();
                rst.Name = "repeatExp";
                rst.Components.Add("exp", exp);
                rst.Components.Add("block", block);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();
            do
            {
                if (peek().Type != LuaTokenType.KW_if) break;
                m_pos++;

                LuaAST exp = parseExp();
                if (exp == null) error("expression expected");
                if (peek().Type != LuaTokenType.KW_then) error("'then' expected");
                m_pos++;
                LuaAST block = parseBlock();
                if (block == null) error("block expected");

                LuaAST rst = new LuaAST();
                rst.Name = "ifExp";
                rst.Components.Add("exp", exp);
                rst.Components.Add("block", block);

                while (peek().Type == LuaTokenType.KW_elseif) {
                    m_pos++;
                    LuaAST expblock = new LuaAST();
                    expblock.Name = "expblock";
                    LuaAST elexp = parseExp();
                    if(elexp == null) error("expression expected");
                    expblock.Components.Add("exp", elexp);
                    if (peek().Type != LuaTokenType.KW_then) error("'then' expected");
                    m_pos++;
                    LuaAST elblock = parseBlock();
                    if (elblock == null) error("block expected");
                    expblock.Components.Add("block", elblock);
                    rst.ComponentGroup.Add(expblock);
                }

                if (peek().Type == LuaTokenType.KW_else) {
                    m_pos++;
                    LuaAST elblock = parseBlock();
                    if (elblock == null) error("block expected");
                    rst.Components.Add("elseBlock", elblock);
                }
                if (peek().Type != LuaTokenType.KW_end) error("'end' expected");
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();
            do
            {
                if (peek().Type != LuaTokenType.KW_for) break;
                m_pos++;
                LuaAST name = parseName();
                if (name == null) break;
                if (peek().Type != LuaTokenType.OP_assign) break;
                m_pos++;
                LuaAST initExp = parseExp();
                if (initExp == null) error("expression expected");
                if (peek().Type != LuaTokenType.OP_comma) error("',' expected");
                m_pos++;

                LuaAST condExp = parseExp();
                if (condExp == null) error("expression expected");

                LuaAST rst = new LuaAST();
                rst.Name = "forExp";
                rst.Components.Add("name", name);
                rst.Components.Add("initExp", initExp);
                rst.Components.Add("condExp", condExp);
                

                if (peek().Type == LuaTokenType.OP_comma)
                {
                    m_pos++;
                    LuaAST stepExp = parseExp();
                    if (stepExp == null) error("expression expected");
                    rst.Components.Add("stepExp", stepExp);
                }

                if (peek().Type != LuaTokenType.KW_do) error("'do' expected");
                m_pos++;
                LuaAST block = parseBlock();
                if (block == null) error("block expected");
                rst.Components.Add("block", block);
                if (peek().Type != LuaTokenType.KW_end) error("'end' expected");
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();
            do
            {
                if (peek().Type != LuaTokenType.KW_for) break;
                m_pos++;
                LuaAST namelist = parseNamelist();
                if (namelist == null) error("name or namelist expected");

                if (peek().Type != LuaTokenType.KW_in) error("'in' expected");
                m_pos++;

                LuaAST explist = parseExplist();
                if (explist == null) error("expression list expected");
                
                LuaAST rst = new LuaAST();
                rst.Name = "forInExp";
                rst.Components.Add("namelist", namelist);
                rst.Components.Add("explist", explist);
              
                if (peek().Type != LuaTokenType.KW_do) error("'do' expected");
                m_pos++;
                LuaAST block = parseBlock();
                if (block == null) error("block expected");
                rst.Components.Add("block", block);
                if (peek().Type != LuaTokenType.KW_end) error("'end' expected");
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();
            do
            {
                if (peek().Type != LuaTokenType.KW_function) break;
                m_pos++;
                LuaAST funcname = parseFuncname();
                if (funcname == null) error("function name expected");

                LuaAST funcbody = parseFuncbody();
                if (funcbody == null) error("function body expected");
                

                LuaAST rst = new LuaAST();
                rst.Name = "functionExp";
                rst.Components.Add("funcname", funcname);
                rst.Components.Add("funcbody", funcbody);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();
            do
            {
                if (peek().Type != LuaTokenType.KW_local) break;
                m_pos++;
                if (peek().Type != LuaTokenType.KW_function) break;
                m_pos++;
                LuaAST funcname = parseFuncname();
                if (funcname == null) error("function name expected");

                LuaAST funcbody = parseFuncbody();
                if (funcbody == null) error("function body expected");


                LuaAST rst = new LuaAST();
                rst.Name = "localFunctionExp";
                rst.Components.Add("funcname", funcname);
                rst.Components.Add("funcbody", funcbody);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();

            do
            {
                if (peek().Type != LuaTokenType.KW_local) break;
                m_pos++;
                LuaAST varlist = parseVarlist();
                if (varlist == null) error("name expected"); ;

                LuaAST rst = new LuaAST();
                rst.Name = "localAssignExp";
                rst.Components.Add("varlist", varlist);
                

                if (peek().Type == LuaTokenType.OP_assign)
                {
                    m_pos++;
                    LuaAST explist = parseExplist();
                    if (explist == null) error("expression expected");
                    rst.Components.Add("explist", explist);
                }

                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;

            } while (false);
            ps.restore();
            //allow id-expression
            do{
                return parseName();
            }while(false);

            ps.restore();
            return null;
        }
예제 #20
0
 LuaAST parseSuffix()
 {
     ParserState ps = new ParserState(this);
     LuaAST rst = new LuaAST();
     rst.Name = "suffix";
     LuaAST call = parseCall();
     if (call != null) {
         rst.Components.Add("call", call);
         rst.start = ps.pos;
         rst.end = m_pos;
         return rst;
     }
     LuaAST index = parseIndex();
     if (index != null)
     {
         rst.Components.Add("index", index);
         rst.start = ps.pos;
         rst.end = m_pos;
         return rst;
     }
     ps.restore();
     return null;
 }
예제 #21
0
 LuaAST parseLaststat() {
     ParserState ps = new ParserState(this);
     do
     {
         if (peek().Type != LuaTokenType.KW_return) break;
         m_pos++;
         LuaAST rst = new LuaAST();
         rst.Name = "return";
         LuaAST explist = parseExplist();
         if (explist != null) {
             rst.Components.Add("explist", explist);
         }
         rst.start = ps.pos;
         rst.end = m_pos;
         return rst;
     } while (false);
     ps.restore();
     if (peek().Type == LuaTokenType.KW_break) {
         m_pos++;
         LuaAST rst = new LuaAST();
         rst.Name = "break";
         rst.start = ps.pos;
         rst.end = m_pos;
         return rst;
     }
     ps.restore();
     return null;
 }
예제 #22
0
        LuaAST parseArgs() {
            ParserState ps = new ParserState(this);
            LuaAST rst = new LuaAST();
            rst.Name = "args";
            do
            {
                if (peek().Type != LuaTokenType.OP_lparen) break;
                m_pos++;
                
                LuaAST explist = parseExplist();
                if (explist != null) rst.Components.Add("explist",explist);
                if (peek().Type != LuaTokenType.OP_rparen) error("')' expected");
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();

            do
            {
                LuaAST tc = parseTableconstructor();
                if (tc == null) break;
                rst.Components.Add("tableconstructor", tc);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();

            if (peek().Type == LuaTokenType.StringLiteral) {
                rst.Token = peek();
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            }

            return null;
        }
예제 #23
0
        LuaAST parseFuncname() {
            ParserState ps = new ParserState(this);
            do
            {
                LuaAST name = parseName();
                if (name == null) break;
                LuaAST rst = new LuaAST();
                rst.Name = "funcname";
                rst.ComponentGroup.Add(name);
                while (peek().Type == LuaTokenType.OP_dot) {
                    m_pos++;
                    name = parseName();
                    if (name == null) error("name expected");
                    rst.ComponentGroup.Add(name);
                }
                if (peek().Type == LuaTokenType.OP_colon) {
                    m_pos++;
                    name = parseName();
                    if (name == null) error("name expected");
                    rst.Components.Add("colonName",name);
                }
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;

            } while (false);

            ps.restore();
            return null;
        }
예제 #24
0
        private Decl.Class parseClass()
        {
            ParserState ps = new ParserState(this);
            Decl.Class rst = new Decl.Class();

            if (peek().Type == DeclTokenType.Comment)
            {
                rst.Desc = peek().Data;
                m_pos++;
            }

            if (peek().Type != DeclTokenType.KW_Class)
            {
                ps.restore();
                return null;
            }
            m_pos++;
            if (peek().Type == DeclTokenType.Identifier)
            {
                rst.Name = peek().Data;
                m_pos++;
            }
            else
            {
                rst.Name = "__unnamed@" + getUniqueString();
            }
            if (peek().Type == DeclTokenType.OP_Colon)
            {
                m_pos++;
                if (peek().Type == DeclTokenType.Identifier)
                {
                    rst.BaseClass = peek().Data;
                    m_pos++;
                }
                else
                {
                    throw new System.Exception("Line " + peek().Line + ": baseClass expected");
                }
            }

            if (peek().Type != DeclTokenType.OP_LBrace)
            {
                throw new System.Exception("Line " + peek().Line + ": '{' expected");
            }
            m_pos++;
            rst.Declarations = parseDeclarations();

            if (peek().Type != DeclTokenType.OP_RBrace)
            {
                throw new System.Exception("Line " + peek().Line + ": '}' expected");
            }
            m_pos++;
            if (peek().Type == DeclTokenType.Identifier)
            {
                rst.Object = peek().Data;
                m_pos++;
            }

            return rst;
        }
예제 #25
0
        LuaAST parseValue() {
            ParserState ps = new ParserState(this);
            LuaAST rst = new LuaAST();
            rst.Name = "value";
            if (peek().Type == LuaTokenType.KW_nil) {
                rst.Token = peek();
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            }
            if (peek().Type == LuaTokenType.KW_false)
            {
                rst.Token = peek();
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            }
            if (peek().Type == LuaTokenType.KW_true)
            {
                rst.Token = peek();
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            }
            if (peek().Type == LuaTokenType.Number)
            {
                rst.Token = peek();
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            }
            if (peek().Type == LuaTokenType.StringLiteral)
            {
                rst.Token = peek();
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            }
            if (peek().Type == LuaTokenType.OP_ellipsis)
            {
                rst.Token = peek();
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            }
            do
            {
                LuaAST func = parseFunction();
                if (func == null) break;
                rst.Components.Add("function", func);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();

            do
            {
                LuaAST tc = parseTableconstructor();
                if (tc == null) break;
                rst.Components.Add("tableconstructor", tc);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();
            do
            {
                LuaAST fc = parseFunctioncall();
                if (fc == null) break;
                rst.Components.Add("functioncall", fc);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();

            do
            {
                LuaAST var = parseVar();
                if (var == null) break;
                rst.Components.Add("var", var);
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);

            do
            {
                if (peek().Type != LuaTokenType.OP_lparen) break;
                m_pos++;
                LuaAST exp = parseExp();
                if (exp == null) error ("expression expected");
                rst.Components.Add("exp", exp);
                if (peek().Type != LuaTokenType.OP_rparen) error("')' expected");
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            } while (false);
            ps.restore();

            return null;
        }
예제 #26
0
        private Decl.Variable parseVariable()
        {
            ParserState ps = new ParserState(this);
            Decl.Variable rst = new Decl.Variable();

            if (peek().Type == DeclTokenType.Comment)
            {
                rst.desc = peek().Data;
                m_pos++;
            }

            if (peek().Type == DeclTokenType.OP_Dots)
            {
                rst.name = "...";
                m_pos++;
                return rst;
            }

            if (peek().Type == DeclTokenType.KW_Static)
            {
                rst.isStatic = true;
                m_pos++;
            }

            if (peek().Type != DeclTokenType.Identifier)
            {
                ps.restore();
                return null;
            }
            string id1 = peek().Data;
            m_pos++;

            if (peek().Type == DeclTokenType.Identifier)
            {
                rst.type = id1;
                rst.name = peek().Data;
                m_pos++;
            }
            else
            {
                rst.name = id1;
            }

            if (peek().Type == DeclTokenType.OP_LSquare)
            {
                m_pos++;
                if (peek().Type == DeclTokenType.Number)
                {
                    rst.arraySize = System.Convert.ToInt32(peek().Data);
                    m_pos++;
                }
                if (peek().Type != DeclTokenType.OP_RSquare)
                {
                    throw new System.Exception("Line " + peek().Line + ": ']' expected");
                }
                m_pos++;
            }

            if (peek().Type == DeclTokenType.OP_Equal)
            {
                m_pos++;
                if (peek().Type == DeclTokenType.EOF)
                {
                    throw new System.Exception("Unexpected EOF");
                }
                rst.defaultValue = peek().Data;
                m_pos++;
            }
            return rst;
        }
예제 #27
0
        LuaAST parseFuncbody() {
            ParserState ps = new ParserState(this);
            do{
                if (peek().Type != LuaTokenType.OP_lparen) break;
                m_pos++;
                LuaAST rst = new LuaAST();
                rst.Name = "funcbody";
                LuaAST parlist = parseParlist();
                
                if (parlist != null) {
                    rst.Components.Add("parlist", parlist);
                }
                if (peek().Type != LuaTokenType.OP_rparen) error("')' expected");
                m_pos++;

                LuaAST block = parseBlock();
                if (block == null) error("block expected");
                rst.Components.Add("block", block);
                if (peek().Type != LuaTokenType.KW_end) error("'end' expected");
                m_pos++;
                rst.start = ps.pos;
                rst.end = m_pos;
                return rst;
            }while (false);


            ps.restore();
            return null;
        }