// <postfix-exp> ::= <primary> // | <postfix-exp> '(' <arg-list> ')' // | <postfix-exp> '[' <expr> ']' private static AstExpression ParsePostfix(TokenStream tks) { var si = tks.SourceInfo; var save = tks.Index; var expr = ParsePrimary(tks); if (expr == null) { tks.Restore(save); return(null); } Token tk; while ((tk = tks.Accept(TokenType.Dot, TokenType.LParen, TokenType.LSquBracket)) != null) { switch (tk.Type) { case TokenType.Dot: var memberIdent = tks.Expect(TokenType.Ident).StringValue; expr = new AstMemberAccess(si, expr, memberIdent); break; case TokenType.LParen: expr = new AstCall(si, expr, ParseExpressionList(tks)); tks.Expect(TokenType.RParen); break; case TokenType.LSquBracket: tks.ThrowIfTokenIs(TokenType.RSquBracket); expr = new AstIndex(si, expr, ParseExpressionList(tks)); tks.Expect(TokenType.RSquBracket); break; } } return(expr); }
private void CompileIndex(AstIndex node, Syt syt, StringBuilder sb) { CompileRecursive(node.exprLeft, syt, sb); CompileRecursive(node.exprRight, syt, sb); sb.AppendLine("add"); sb.AppendLine("pop pointer 1"); sb.AppendLine("push that 0"); }
private AstExpr ParseRef() { AstExpr varRef = new AstVarRef {StName = Expect(Ktoken.Id).St}; if (Accept(Ktoken.Lbracket)) { var astIndex = new AstIndex { exprLeft = varRef, exprRight = ParseExpr() }; Expect(Ktoken.Rbracket); return astIndex; } if (Accept(Ktoken.Dot)) { var varRefRight = new AstVarRef { StName = Expect(Ktoken.Id).St }; varRef = new AstDot { varLeft = (AstVarRef)varRef, varRight = varRefRight }; } if (FCurrent(Ktoken.Lparen)) return new AstCall { exprFunc = varRef, rgexprParam = ParseArgumentList().ToArray() }; return varRef; }