blob: f69a12f2a01227542adbb3e0561c1c8f77717b4d [file] [log] [blame]
/*******************************************************************************
* You may amend and distribute as you like, but don't remove this header!
*
* EPPlus provides server-side generation of Excel 2007/2010 spreadsheets.
* See http://www.codeplex.com/EPPlus for details.
*
* Copyright (C) 2011 Jan Källman
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php
* If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html
*
* All code and executables are provided "as is" with no warranty either express or implied.
* The author accepts no liability for any damage or loss of business that this product may cause.
*
* Code change notes:
*
* Author Change Date
* ******************************************************************************
* Mats Alm Added 2013-03-01 (Prior file history on https://github.com/swmal/ExcelFormulaParser)
*******************************************************************************/
using System.Collections.Frozen;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
namespace EpplusFormulaParser;
public class Operator : IOperator {
private const int _precedencePercent = 2;
private const int _precedenceExp = 4;
private const int _precedenceMultiplyDivide = 6;
private const int _precedenceAddSubtract = 12;
private const int _precedenceConcat = 15;
private const int _precedenceComparison = 25;
private Operator(OperatorType type, int precedence) {
Type = type;
Precedence = precedence;
}
public OperatorType Type { get; }
public int Precedence { get; }
public override string ToString() {
return "Operator: " + Type;
}
public static IOperator Plus { get; } = new Operator(OperatorType.Plus, _precedenceAddSubtract);
public static IOperator Minus { get; } = new Operator(OperatorType.Minus, _precedenceAddSubtract);
public static IOperator Multiply { get; } =
new Operator(OperatorType.Multiply, _precedenceMultiplyDivide);
public static IOperator Divide { get; } =
new Operator(OperatorType.Divide, _precedenceMultiplyDivide);
public static IOperator Exp { get; } = new Operator(OperatorType.Exponentiation, _precedenceExp);
public static IOperator Concat { get; } = new Operator(OperatorType.Concat, _precedenceConcat);
public static IOperator GreaterThan { get; } =
new Operator(OperatorType.GreaterThan, _precedenceComparison);
public static IOperator Eq { get; } = new Operator(OperatorType.Equals, _precedenceComparison);
public static IOperator NotEqualsTo { get; } =
new Operator(OperatorType.NotEqualTo, _precedenceComparison);
public static IOperator GreaterThanOrEqual { get; } =
new Operator(OperatorType.GreaterThanOrEqual, _precedenceComparison);
public static IOperator LessThan { get; } =
new Operator(OperatorType.LessThan, _precedenceComparison);
public static IOperator LessThanOrEqual { get; } =
new Operator(OperatorType.LessThanOrEqual, _precedenceComparison);
public static IOperator Percent { get; } = new Operator(OperatorType.Percent, _precedencePercent);
private static FrozenDictionary<string, IOperator> _fromString =
new Dictionary<string, IOperator> {
{ "+", Plus },
{ "-", Minus },
{ "*", Multiply },
{ "/", Divide },
{ "^", Exp },
{ "=", Eq },
{ ">", GreaterThan },
{ ">=", GreaterThanOrEqual },
{ "<", LessThan },
{ "<=", LessThanOrEqual },
{ "<>", NotEqualsTo },
{ "&", Concat },
}.ToFrozenDictionary();
public static bool TryParse(string opString, [NotNullWhen(true)] out IOperator? @operator) {
return _fromString.TryGetValue(opString, out @operator);
}
}