Changeset 16352


Ignore:
Timestamp:
12/08/18 07:50:29 (6 months ago)
Author:
gkronber
Message:

#2915: added support for expressions like "x c" as well as support for '{' '}' as alternatives to '(' ')' to the infix parser

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2915-AbsoluteSymbol/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Importer/InfixExpressionParser.cs

    r16239 r16352  
    4242  /// Expr          = ['-' | '+'] Term { '+' Term | '-' Term }
    4343  /// Term          = Fact { '*' Fact | '/' Fact }
    44   /// Fact          = '(' Expr ')'
    45   ///                 | 'LAG' '(' varId ',' ['+' | '-' ] number ')'
    46   ///                 | funcId '(' ArgList ')'
    47   ///                 | VarExpr | number
     44  /// Fact          = SimpleFact [ '^' SimpleFact ]
     45  /// SimpleFact    = '(' Expr ')'
     46  ///                 | '{' Expr '}'
     47  ///                 | 'LAG' '(' varId ',' ['+' | '-' ] number ')
     48  ///                 | funcId '(' ArgList ')'
     49  ///                 | VarExpr
     50  ///                 | number
    4851  /// ArgList       = Expr { ',' Expr }
    4952  /// VarExpr       = varId OptFactorPart
     
    9598        { "*", new Multiplication()},
    9699        { "-", new Subtraction()},
     100        { "^", new Power() },
    97101        { "ABS", new Absolute() },
    98102        { "EXP", new Exponential()},
     
    171175            && str[pos] != '*'
    172176            && str[pos] != '/'
     177            && str[pos] != '^'
    173178            && str[pos] != ')'
    174179            && str[pos] != ']'
     180            && str[pos] != '}'
    175181            && str[pos] != ',') {
    176182            sb.Append(str[pos]);
     
    231237          pos++;
    232238          yield return new Token { TokenType = TokenType.Operator, strVal = "*" };
     239        } else if (str[pos] == '^') {
     240          pos++;
     241          yield return new Token { TokenType = TokenType.Operator, strVal = "^" };
    233242        } else if (str[pos] == '(') {
    234243          pos++;
     
    243252          pos++;
    244253          yield return new Token { TokenType = TokenType.RightBracket, strVal = "]" };
     254        } else if (str[pos] == '{') {
     255          pos++;
     256          yield return new Token { TokenType = TokenType.LeftPar, strVal = "{" };
     257        } else if (str[pos] == '}') {
     258          pos++;
     259          yield return new Token { TokenType = TokenType.RightPar, strVal = "}" };
    245260        } else if (str[pos] == '=') {
    246261          pos++;
     
    364379    }
    365380
    366     /// Fact          = '(' Expr ')'
    367     ///                 | 'LAG' '(' varId ',' ['+' | '-' ] number ')'
    368     ///                 | funcId '(' ArgList ')'
    369     ///                 | VarExpr | number
     381    // Fact = SimpleFact ['^' SimpleFact]
     382    private ISymbolicExpressionTreeNode ParseFact(Queue<Token> tokens) {
     383      var expr = ParseSimpleFact(tokens);
     384      var next = tokens.Peek();
     385      if (next.TokenType == TokenType.Operator && next.strVal == "^") {
     386        tokens.Dequeue(); // skip;
     387
     388        var p = GetSymbol("^").CreateTreeNode();
     389        p.AddSubtree(expr);
     390        p.AddSubtree(ParseSimpleFact(tokens));
     391        expr = p;
     392      }
     393      return expr;
     394    }
     395
     396
     397    /// SimpleFact   = '(' Expr ')'
     398    ///                 | '{' Expr '}'
     399    ///                 | 'LAG' '(' varId ',' ['+' | '-' ] number ')'
     400    ///                 | funcId '(' ArgList ')
     401    ///                 | VarExpr
     402    ///                 | number
    370403    /// ArgList       = Expr { ',' Expr }
    371404    /// VarExpr       = varId OptFactorPart
     
    374407    /// varVal        =  ident | ' ident ' | " ident "
    375408    /// ident         =  '_' | letter { '_' | letter | digit }
    376     private ISymbolicExpressionTreeNode ParseFact(Queue<Token> tokens) {
     409    private ISymbolicExpressionTreeNode ParseSimpleFact(Queue<Token> tokens) {
    377410      var next = tokens.Peek();
    378411      if (next.TokenType == TokenType.LeftPar) {
    379         tokens.Dequeue();
     412        var initPar = tokens.Dequeue(); // match par type
    380413        var expr = ParseExpr(tokens);
    381414        var rPar = tokens.Dequeue();
    382415        if (rPar.TokenType != TokenType.RightPar)
    383           throw new ArgumentException("expected )");
     416          throw new ArgumentException("expected closing parenthesis");
     417        if (initPar.strVal == "(" && rPar.strVal == "}")
     418          throw new ArgumentException("expected closing )");
     419        if (initPar.strVal == "{" && rPar.strVal == ")")
     420          throw new ArgumentException("expected closing }");
    384421        return expr;
    385422      } else if (next.TokenType == TokenType.Identifier) {
     
    428465          if (rPar.TokenType != TokenType.RightPar)
    429466            throw new ArgumentException("expected )");
     467
    430468
    431469          return funcNode;
Note: See TracChangeset for help on using the changeset viewer.