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); } } }
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); }
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); } } }
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; } }