public Exp atom()
{
Exp e;
Token t;
while (PeekAndDiscard(TokenType.COMMENT))
;
switch (lexer.Peek().Type)
{
case TokenType.LPAREN:
lexer.Get();
if (Peek(TokenType.Yield))
{
e = yield_expr();
}
else
{
e = testlist_comp(true);
}
Expect(TokenType.RPAREN);
return e;
case TokenType.LBRACKET:
lexer.Get();
e = testlist_comp(false);
Expect(TokenType.RBRACKET);
return e;
case TokenType.LBRACE:
t = lexer.Get();
e = dictorsetmaker(t.Start);
Expect(TokenType.RBRACE);
return e;
case TokenType.ID:
t = lexer.Get();
return new Identifier((string)t.Value, filename, t.Start, t.End);
case TokenType.STRING:
t = lexer.Get();
var start = t.Start;
var str = (Str) t.Value;
while (Peek(TokenType.STRING))
{
t = lexer.Get();
str = new Str(str.s + t.Value, filename, start, t.End);
}
return str;
case TokenType.INTEGER:
t = lexer.Get();
return new IntLiteral((int) t.Value, filename, t.Start, t.End);
case TokenType.LONGINTEGER:
t = lexer.Get();
return new LongLiteral((long) t.Value, filename, t.Start, t.End);
case TokenType.REAL:
t = lexer.Get();
return new RealLiteral((double) t.Value, filename, t.Start, t.End);
case TokenType.IMAG:
t = lexer.Get();
return new ImaginaryLiteral((double) t.Value, filename, t.Start, t.End);
case TokenType.ELLIPSIS:
t = lexer.Get();
return new Ellipsis(filename, t.Start, t.End);
case TokenType.None:
t = lexer.Get();
return new NoneExp(filename, t.Start, t.End);
case TokenType.False:
t = lexer.Get();
return new BooleanLiteral(false, filename, t.Start, t.End);
case TokenType.True:
t = lexer.Get();
return new BooleanLiteral(true, filename, t.Start, t.End);
default:
return null;
}
}