public static AstNode ParseTerm(TokenStream stream) { switch (stream.Current.Class) { case TokenClass.Identifier: return new NameExpression (stream.Location, stream.ReadToken ().Value); case TokenClass.IntLiteral: return new IntegerExpression (stream.Location, long.Parse ( stream.ReadToken ().Value)); case TokenClass.FloatLiteral: return new FloatExpression (stream.Location, double.Parse ( stream.ReadToken ().Value)); case TokenClass.InterpolatedStringLiteral: AstNode val = ParseString (stream.Location, stream.ReadToken ().Value); if (val == null) { stream.MakeError (); return new StringExpression (stream.Location, ""); } return val; case TokenClass.StringLiteral: return new StringExpression (stream.Location, stream.ReadToken ().Value); case TokenClass.OpenBracket: return ParseList (stream); case TokenClass.OpenBrace: return ParseHash (stream); case TokenClass.OpenParan: stream.ReadToken (); AstNode expr = ParseExpression (stream); if (stream.Accept (TokenClass.Comma)) { return ParseTuple (expr, stream); } stream.Expect (TokenClass.CloseParan); return expr; case TokenClass.Keyword: switch (stream.Current.Value) { case "self": stream.ReadToken (); return new SelfStatement (stream.Location); case "true": stream.ReadToken (); return new TrueExpression (stream.Location); case "false": stream.ReadToken (); return new FalseExpression (stream.Location); case "null": stream.ReadToken (); return new NullExpression (stream.Location); case "lambda": return ParseLambda (stream); case "match": return ParseMatch (stream); } break; } stream.MakeError (); return null; }