Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
03/08/18 11:42:18 (6 years ago)
Author:
lkammere
Message:

#2886: Store production rules in grammar instead of nonterminal symbols.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2886_SymRegGrammarEnumeration/HeuristicLab.Algorithms.DataAnalysis.SymRegGrammarEnumeration/GrammarEnumeration/Grammar.cs

    r15832 r15834  
    1414
    1515    #region Symbols
    16     public VariableSymbol Var;
     16
     17    public IReadOnlyDictionary<Symbol, IReadOnlyList<Production>> Productions { get; }
     18
     19    public NonterminalSymbol Var;
     20    public IReadOnlyList<VariableTerminalSymbol> VarTerminals;
    1721
    1822    public NonterminalSymbol Expr;
     
    6569    public Grammar(string[] variables) {
    6670      #region Define Symbols
    67       Var = new VariableSymbol("var", variables);
     71      Var = new NonterminalSymbol("Var");
    6872
    6973      Expr = new NonterminalSymbol("Expr");
     
    96100      StartSymbol = Expr;
    97101
    98       Expr.AddProduction(Term, Expr, Addition);
    99       Expr.AddProduction(Term);
    100 
    101       Term.AddProduction(Factor, Term, Multiplication);
    102       Term.AddProduction(Factor);
    103       Term.AddProduction(InvExpr, Inv);
    104 
    105       Factor.AddProduction(Var);
    106       Factor.AddProduction(LogFactor);
    107       Factor.AddProduction(ExpFactor);
    108       Factor.AddProduction(SinFactor);
    109       Factor.AddProduction(CosFactor);
    110 
    111       LogFactor.AddProduction(SimpleExpr, Log);
    112       ExpFactor.AddProduction(SimpleTerm, Exp);
    113       SinFactor.AddProduction(SimpleExpr, Sin);
    114       CosFactor.AddProduction(SimpleExpr, Cos);
    115 
    116       SimpleExpr.AddProduction(SimpleTerm, SimpleExpr, Addition);
    117       SimpleExpr.AddProduction(SimpleTerm);
    118 
    119       SimpleTerm.AddProduction(Var, SimpleTerm, Multiplication);
    120       SimpleTerm.AddProduction(Var);
    121 
    122       InvExpr.AddProduction(InvTerm, InvExpr, Addition);
    123       InvExpr.AddProduction(InvTerm);
    124 
    125       InvTerm.AddProduction(Factor, InvTerm, Multiplication);
    126       InvTerm.AddProduction(Factor);
     102      Dictionary<Symbol, IReadOnlyList<Production>> productions = new Dictionary<Symbol, IReadOnlyList<Production>>();
     103
     104      // Map each variable to a separate production rule of the "Var" nonterminal symbol.
     105      VarTerminals = variables.Select(v => new VariableTerminalSymbol(v)).ToArray();
     106      productions[Var] = VarTerminals.Select(v => new Production(v)).ToArray();
     107
     108      productions[Expr] = new[] {
     109        new Production(Term, Expr, Addition),
     110        new Production(Term)
     111      };
     112
     113      productions[Term] = new[] {
     114        new Production(Factor, Term, Multiplication),
     115        new Production(Factor),
     116        new Production(InvExpr, Inv)
     117      };
     118
     119      productions[Factor] = new[] {
     120        new Production(Var),
     121        new Production(LogFactor),
     122        new Production(ExpFactor),
     123        new Production(SinFactor),
     124        new Production(CosFactor),
     125      };
     126
     127      productions[LogFactor] = new[] { new Production(SimpleExpr, Log) };
     128      productions[ExpFactor] = new[] { new Production(SimpleTerm, Exp) };
     129      productions[SinFactor] = new[] { new Production(SimpleExpr, Sin) };
     130      productions[CosFactor] = new[] { new Production(SimpleExpr, Cos) };
     131
     132      productions[SimpleExpr] = new[] {
     133        new Production(SimpleTerm, SimpleExpr, Addition),
     134        new Production(SimpleTerm)
     135      };
     136
     137      productions[SimpleTerm] = new[] {
     138        new Production(Var, SimpleTerm, Multiplication),
     139        new Production(Var)
     140      };
     141
     142      productions[InvExpr] = new[] {
     143        new Production(InvTerm, InvExpr, Addition),
     144        new Production(InvTerm)
     145      };
     146
     147      productions[InvTerm] = new[] {
     148        new Production(Factor, InvTerm, Multiplication),
     149        new Production(Factor)
     150      };
     151
     152      Productions = productions;
    127153      #endregion
    128154
Note: See TracChangeset for help on using the changeset viewer.