Ejemplo n.º 1
0
        // <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);
        }
Ejemplo n.º 2
0
 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");
 }
Ejemplo n.º 3
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;
        }