public Exp trailer(Exp core)
{
Token tok;
switch (lexer.Peek().Type)
{
case TokenType.LPAREN:
tok = lexer.Get();
var args = arglist(core, tok.Start);
Expect(TokenType.RPAREN);
return args;
case TokenType.LBRACKET:
lexer.Get();
var subs = subscriptlist();
tok = Expect(TokenType.RBRACKET);
return new ArrayRef(core, subs, filename, core.Start, tok.End);
case TokenType.DOT:
lexer.Get();
tok = Expect(TokenType.ID);
var id = new Identifier((string) tok.Value, filename, core.Start, tok.End);
return new AttributeAccess(core, id, filename, core.Start, tok.End);
default: throw new InvalidOperationException();
}
}
//subscriptlist: subscript (',' subscript)* [',']