private IExpr ParseSymbolLiteral() { LookAhead(); if (mHeadToken != TokenType.Identifier) { throw new RheaException( Expected("Identifier"), mLexer.GetSourceInfo() ); } IExpr expr = new ExprConst( ValueSymbol.Intern((string)mLexer.Value) ); LookAhead(); return expr; }
private IExpr ParseInt() { IExpr expr = new ExprConst(new ValueInt((int)mLexer.Value)); LookAhead(); return expr; }
private IExpr ParseString() { IExpr expr = new ExprConst(new ValueString((string)mLexer.Value)); LookAhead(); return expr; }
private IExpr ParseAtom() { IExpr expr; switch (mHeadToken) { case TokenType.Int: expr = ParseInt(); break; case TokenType.String: expr = ParseString(); break; case TokenType.Identifier: expr = ParseVariableReference(); break; case TokenType.Colon: expr = ParseSymbolLiteral(); break; case TokenType.Hat: expr = ParseLambdaExpression(); if (mHeadToken == TokenType.End) { LookAhead(); } break; case TokenType.LeftParen: expr = ParseParenthesizedExpression(); break; case TokenType.True: expr = new ExprConst(ValueTrue.Instance); LookAhead(); break; case TokenType.False: expr = new ExprConst(ValueFalse.Instance); LookAhead(); break; case TokenType.Nil: expr = new ExprConst(ValueNil.Instance); LookAhead(); break; default: throw new RheaException(Unexpected(), mLexer.GetSourceInfo()); } return expr; }