Exemplo n.º 1
0
        //print_stmt: 'print' ( [ expression (',' expression)* [','] ] | '>>' expression [ (',' expression)+ [','] ] )
        private PrintStatement ParsePrintStmt()
        {
            Eat(TokenKind.KeywordPrint);
            string printWhiteSpace = _tokenWhiteSpace;
            var start = GetStart();
            Expression dest = null;
            PrintStatement ret;

            string rightShiftWhiteSpace = null;
            string theCommaWhiteSpace = null;
            bool needNonEmptyTestList = false;
            int end = 0;
            if (MaybeEat(TokenKind.RightShift)) {
                rightShiftWhiteSpace = _tokenWhiteSpace;
                dest = ParseExpression();
                if (MaybeEat(TokenKind.Comma)) {
                    theCommaWhiteSpace = _tokenWhiteSpace;
                    needNonEmptyTestList = true;
                    end = GetEnd();
                } else {
                    ret = new PrintStatement(dest, new Expression[0], false);
                    if (_verbatim) {
                        AddPreceedingWhiteSpace(ret, printWhiteSpace);
                        AddSecondPreceedingWhiteSpace(ret, rightShiftWhiteSpace);
                    }
                    ret.SetLoc(start, GetEnd());
                    return ret;
                }
            }

            bool trailingComma = false;
            List<string> commaWhiteSpace = null;

            Expression[] exprs;
            if (!NeverTestToken(PeekToken())) {
                var expr = ParseExpression();
                if (!MaybeEat(TokenKind.Comma)) {
                    exprs = new[] { expr };
                } else {
                    List<Expression> exprList = ParseTestListAsExpr(expr, out commaWhiteSpace, out trailingComma);
                    exprs = exprList.ToArray();
                }
            } else {
                if (needNonEmptyTestList) {
                    ReportSyntaxError(start, end, "print statement expected expression to be printed");
                    exprs = new[] { Error("") };
                } else {
                    exprs = new Expression[0];
                }
            }

            ret = new PrintStatement(dest, exprs, trailingComma);
            if (_verbatim) {
                AddPreceedingWhiteSpace(ret, printWhiteSpace);
                AddSecondPreceedingWhiteSpace(ret, rightShiftWhiteSpace);
                AddThirdPreceedingWhiteSpace(ret, theCommaWhiteSpace);
                if (commaWhiteSpace != null) {
                    AddListWhiteSpace(ret, commaWhiteSpace.ToArray());
                }
            }
            ret.SetLoc(start, GetEnd());
            return ret;
        }
Exemplo n.º 2
0
 // PrintStatement
 public override bool Walk(PrintStatement node)
 {
     return ShouldWalkWorker(node);
 }
Exemplo n.º 3
0
 public override bool Walk(PrintStatement node)
 {
     UpdateChildRanges(node);
     return base.Walk(node);
 }
Exemplo n.º 4
0
 public override void PostWalk(PrintStatement node)
 {
     PostWalkWorker(node);
 }