Beispiel #1
0
        Expression ParseSuffixedExpr(Scope scope, bool onlyDotColon = false)
        {
            // base primary expression
            Expression prim = ParsePrimaryExpr(scope);

            while (true)
            {
                if (reader.IsSymbol('.') || reader.IsSymbol(':'))
                {
                    string symb = reader.Get().Data; // '.' or ':'
                    // TODO: should we allow keywords? I vote no.
                    if (!reader.Is(TokenType.Ident))
                    {
                        error("<Ident> expected");
                    }

                    Token      id = reader.Get();
                    MemberExpr m  = new MemberExpr();
                    m.Base    = prim;
                    m.Indexer = symb;
                    m.Ident   = id.Data;

                    prim = m;
                }
                else if (!onlyDotColon && reader.ConsumeSymbol('['))
                {
                    int       pass           = 0;
                    const int maxamount      = 100;
                    bool      wasLastNumeric = false;
                    bool      first          = true;
                    bool      hadComma       = false;
                    do
                    {
                        Token tok  = reader.Peek();
                        int   col  = tok.Column;
                        int   line = tok.Line;

                        Expression ex = ParseExpr(scope);
                        //if (!reader.ConsumeSymbol(']'))
                        //error("']' expected");

                        IndexExpr i = new IndexExpr();
                        i.Base  = prim;
                        i.Index = ex;

                        prim = i;

                        if ((first || wasLastNumeric) && ex is NumberExpr && hadComma == false)
                        {
                            tok = reader.Peek();
                            bool cma = reader.ConsumeSymbol(',');
                            if (cma && hadComma == false && first == false)
                            {
                                error("Unexpected ',' in matrice indexing", tok.Line, tok.Column, tok);
                            }
                            //else if (cma == false && hadComma)
                            //    ;
                            hadComma = cma;
                        }
                        else
                        {
                            tok = reader.Peek();
                            bool cma = reader.ConsumeSymbol(',');
                            //if (cma == false)
                            //    break;
                            if (cma && hadComma == false)
                            {
                                error("Unexpected ',' in matrice indexing", -1, -1, tok);
                            }
                            else if (cma == false && ex is NumberExpr == false && wasLastNumeric && hadComma == false)
                            {
                                error("Expected numeric constant in matrice indexing", line, col, tok);
                            }
                            else if (cma == false && hadComma)
                            {
                                if (tok.Type == TokenType.Symbol && tok.Data == "]")
                                {
                                    ;
                                }
                                else
                                {
                                    error("Expected ','", -1, -1, tok);
                                }
                            }
                            else if (cma == false)
                            {
                                break;
                            }
                            else
                            {
                                hadComma = true;
                            }
                            hadComma = cma;
                        }

                        if (pass++ >= maxamount)
                        {
                            error("Maximum index depth reached");
                        }

                        wasLastNumeric = ex is NumberExpr;
                        first          = false;
                    } while (!(reader.Peek().Data == "]"));
                    if (!reader.ConsumeSymbol(']'))
                    {
                        error("']' expected");
                    }
                }
                else if (!onlyDotColon && reader.ConsumeSymbol('('))
                {
                    List <Expression> args = new List <Expression>();
                    while (!reader.ConsumeSymbol(')'))
                    {
                        Expression ex = ParseExpr(scope);

                        args.Add(ex);
                        if (!reader.ConsumeSymbol(','))
                        {
                            if (reader.ConsumeSymbol(')'))
                            {
                                break;
                            }
                            else
                            {
                                error("')' expected");
                            }
                            break;
                        }
                    }
                    CallExpr c = new CallExpr();
                    c.Base      = prim;
                    c.Arguments = args;

                    prim = c;
                }
                else if (!onlyDotColon &&
                         (reader.Is(TokenType.SingleQuoteString) ||
                          reader.Is(TokenType.DoubleQuoteString) ||
                          reader.Is(TokenType.LongString)))
                {
                    //string call

                    StringCallExpr e = new StringCallExpr();
                    e.Base      = prim;
                    e.Arguments = new List <Expression> {
                        new StringExpr(reader.Peek().Data)
                        {
                            StringType = reader.Peek().Type
                        }
                    };
                    reader.Get();
                    prim = e;
                }
                else if (!onlyDotColon && reader.IsSymbol('{'))
                {
                    // table call

                    // Fix for the issue with whole expr being parsed, not just table.
                    // See LuaMinify issue #2 (https://github.com/stravant/LuaMinify/issues/2)
                    //Expression ex = ParseExpr(scope);
                    Expression ex = ParseSimpleExpr(scope);

                    TableCallExpr t = new TableCallExpr();
                    t.Base      = prim;
                    t.Arguments = new List <Expression> {
                        ex
                    };

                    prim = t;
                }
                else
                {
                    break;
                }
            }
            return(prim);
        }
Beispiel #2
0
        Expression ParseSuffixedExpr(Scope scope, bool onlyDotColon = false)
        {
            // base primary expression
            Expression prim = ParsePrimaryExpr(scope);

            while (true)
            {
                if (tok.IsSymbol('.') || tok.IsSymbol(':'))
                {
                    string symb = tok.Get().Data; // '.' or ':'
                    // TODO: should we allow keywords?
                    if (!tok.Is(TokenType.Ident))
                    {
                        error("<Ident> expected");
                    }

                    Token      id = tok.Get();
                    MemberExpr m  = new MemberExpr();
                    m.Base    = prim;
                    m.Indexer = symb;
                    m.Ident   = id.Data;

                    prim = m;
                }
                else if (!onlyDotColon && tok.ConsumeSymbol('['))
                {
                    Expression ex = ParseExpr(scope);

                    if (!tok.ConsumeSymbol(']'))
                    {
                        error("']' expected");
                    }

                    IndexExpr i = new IndexExpr();
                    i.Base  = prim;
                    i.Index = ex;

                    prim = i;
                }
                else if (!onlyDotColon && tok.ConsumeSymbol('('))
                {
                    List <Expression> args = new List <Expression>();
                    while (!tok.ConsumeSymbol(')'))
                    {
                        Expression ex = ParseExpr(scope);

                        args.Add(ex);
                        if (!tok.ConsumeSymbol(','))
                        {
                            if (tok.ConsumeSymbol(')'))
                            {
                                break;
                            }
                            else
                            {
                                error("')' expected");
                            }
                        }
                    }
                    CallExpr c = new CallExpr();
                    c.Base      = prim;
                    c.Arguments = args;

                    prim = c;
                }
                else if (!onlyDotColon &&
                         (tok.Is(TokenType.SingleQuoteString) ||
                          tok.Is(TokenType.DoubleQuoteString) ||
                          tok.Is(TokenType.LongString)))
                {
                    //string call

                    StringCallExpr e = new StringCallExpr();
                    e.Base      = prim;
                    e.Arguments = new List <Expression> {
                        new StringExpr(tok.Peek().Data)
                        {
                            StringType = tok.Peek().Type
                        }
                    };
                    tok.Get();
                    prim = e;
                }
                else if (!onlyDotColon && tok.IsSymbol('{'))
                {
                    // table call
                    Expression ex = ParseExpr(scope);

                    TableCallExpr t = new TableCallExpr();
                    t.Base      = prim;
                    t.Arguments = new List <Expression> {
                        ex
                    };

                    prim = t;
                }
                else
                {
                    break;
                }
            }
            return(prim);
        }