private bool ParseLiteralValue(ref ASTNode retn) { tokenStream.Save(); // todo if we support bitwise not, add it here if (tokenStream.Current == ExpressionTokenType.Not && tokenStream.Next == ExpressionTokenType.Boolean) { bool value = bool.Parse(tokenStream.Next.value); retn = ASTNode.BooleanLiteralNode((!value).ToString()).WithLocation(tokenStream.Current); tokenStream.Advance(2); return(true); } if (tokenStream.Current == ExpressionTokenType.Minus && tokenStream.Next == ExpressionTokenType.Number && (tokenStream.Previous.IsOperator || !tokenStream.HasPrevious)) { retn = ASTNode.NumericLiteralNode("-" + tokenStream.Next.value).WithLocation(tokenStream.Current); tokenStream.Advance(2); return(true); } if (tokenStream.Current == ExpressionTokenType.Plus && tokenStream.Next == ExpressionTokenType.Number && (tokenStream.Previous.IsOperator || !tokenStream.HasPrevious)) { retn = ASTNode.NumericLiteralNode(tokenStream.Next.value).WithLocation(tokenStream.Current); tokenStream.Advance(2); return(true); } switch (tokenStream.Current.expressionTokenType) { case ExpressionTokenType.Null: retn = ASTNode.NullLiteralNode(tokenStream.Current.value).WithLocation(tokenStream.Current); break; case ExpressionTokenType.String: retn = ASTNode.StringLiteralNode(tokenStream.Current.value).WithLocation(tokenStream.Current); break; case ExpressionTokenType.Boolean: retn = ASTNode.BooleanLiteralNode(tokenStream.Current.value).WithLocation(tokenStream.Current); break; case ExpressionTokenType.Number: retn = ASTNode.NumericLiteralNode(tokenStream.Current.value).WithLocation(tokenStream.Current); break; case ExpressionTokenType.Default: // todo -- allow a type expression a-la default(List<float>); retn = ASTNode.DefaultLiteralNode(tokenStream.Current.value).WithLocation(tokenStream.Current); break; default: return(false); } tokenStream.Advance(); return(true); }