public Statement print_stmt()
{
var args = new List<Argument>();
Exp outputStream = null; // default to stdout.
bool trailing_comma = false;
Token token = Expect(TokenType.ID);
int posEnd = token.End;
if (!Peek(TokenType.NEWLINE))
{
if (PeekAndDiscard(TokenType.OP_SHR))
{
outputStream = test();
if (PeekAndDiscard(TokenType.COMMA))
{
var e = test();
args.Add(new Argument(null, e, filename, e.Start, e.End));
while (PeekAndDiscard(TokenType.COMMA))
{
var d = test();
args.Add(new Argument(null, d, filename, e.Start, d.End));
}
posEnd = args.Last().End;
}
}
else
{
for (; ; )
{
var tok = lexer.Peek();
if (tok.Type == TokenType.EOF &&
tok.Type == TokenType.NEWLINE &&
tok.Type == TokenType.SEMI)
break;
var a = test();
args.Add(new Argument(null, a, filename, a.Start, a.End));
posEnd = a.End;
if (!PeekAndDiscard(TokenType.COMMA))
break;
if (Peek(stmt_follow))
{
trailing_comma = true;
break;
}
}
}
}
return new PrintStatement(outputStream, args, trailing_comma, filename, token.Start, posEnd );
}