Esempio n. 1
0
        private static void CgNameExp(FuncInfo fi, NameExp node, int a)
        {
            var r = fi.SlotOfLocVar(node.Name);

            if (r >= 0)
            {
                fi.EmitMove(a, r);
            }
            else
            {
                var idx = fi.IndexOfUpval(node.Name);
                if (idx >= 0)
                {
                    fi.EmitGetUpval(a, idx);
                }
                else
                {
                    var taExp = new TableAccessExp
                    {
                        PrefixExp = new NameExp
                        {
                            Line = 0,
                            Name = "_ENV"
                        },
                        KeyExp = new StringExp
                        {
                            Line = 0,
                            Str  = node.Name
                        }
                    };
                    CgTableAccessExp(fi, taExp, a);
                }
            }
        }
Esempio n. 2
0
        private static void CgTableAccessExp(FuncInfo fi, TableAccessExp node, int a)
        {
            var b = fi.AllocReg();

            CgExp(fi, node.PrefixExp, b, 1);
            var c = fi.AllocReg();

            CgExp(fi, node.KeyExp, c, 1);
            fi.EmitGetTable(a, b, c);
            fi.FreeRegs(2);
        }
Esempio n. 3
0
        private static Exp FinishPrefixExp(Lexer.Lexer lexer, Exp exp)
        {
            while (true)
            {
                switch (lexer.LookAhead())
                {
                case ETokenType.SepLBracket:
                {
                    lexer.NextToken(out _, out _, out _);
                    var keyExp = ParseExp(lexer);
                    lexer.NextTokenOfKind(ETokenType.SepRBracket, out _, out _);
                    exp = new TableAccessExp
                    {
                        LastLine  = lexer.Line,
                        PrefixExp = exp,
                        KeyExp    = keyExp
                    };
                    break;
                }

                case ETokenType.SepDot:
                {
                    lexer.NextToken(out _, out _, out _);
                    lexer.NextIdentifier(out var line, out var name);
                    var keyExp = new StringExp
                    {
                        Line = line,
                        Str  = name
                    };
                    exp = new TableAccessExp
                    {
                        LastLine  = line,
                        PrefixExp = exp,
                        KeyExp    = keyExp
                    };
                    break;
                }

                case ETokenType.SepColon:
                case ETokenType.SepLParen:
                case ETokenType.SepLCurly:
                case ETokenType.String:
                {
                    exp = FinishFuncCallExp(lexer, exp);
                    break;
                }

                default:
                    return(exp);
                }
            }
        }
Esempio n. 4
0
        private static void ParseFuncName(Lexer.Lexer lexer, out Exp exp, out bool hasColon)
        {
            hasColon = false;
            lexer.NextIdentifier(out var line, out var name);
            exp = new NameExp {
                Line = line, Name = name
            };

            while (lexer.LookAhead() == ETokenType.SepDot)
            {
                lexer.NextToken(out _, out _, out _);
                lexer.NextIdentifier(out line, out name);
                var idx = new StringExp {
                    Line = line, Str = name
                };
                exp = new TableAccessExp
                {
                    LastLine  = line,
                    KeyExp    = idx,
                    PrefixExp = exp,
                };
            }

            if (lexer.LookAhead() == ETokenType.SepColon)
            {
                lexer.NextToken(out _, out _, out _);
                lexer.NextIdentifier(out line, out name);
                var idx = new StringExp {
                    Line = line, Str = name
                };
                exp = new TableAccessExp
                {
                    LastLine  = line,
                    PrefixExp = exp,
                    KeyExp    = idx,
                };
                hasColon = true;
            }
        }