Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
10/01/13 12:08:25 (11 years ago)
Author:
jkarder
Message:

#2069:

  • refactored grammar and symbols
  • fixed cloning and storable ctors
  • fixed plugin dependencies
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/Grammar.cs

    r9879 r10011  
    2020#endregion
    2121
    22 using System.Collections.Generic;
    2322using HeuristicLab.Common;
    2423using HeuristicLab.Core;
     
    3130  public class Grammar : SymbolicExpressionGrammar {
    3231    [StorableConstructor]
    33     private Grammar(bool deserializing) : base(deserializing) { }
    34     private Grammar(Grammar original, Cloner cloner)
    35       : base(original, cloner) {
    36     }
     32    protected Grammar(bool deserializing) : base(deserializing) { }
     33    protected Grammar(Grammar original, Cloner cloner) : base(original, cloner) { }
    3734
    3835    public Grammar()
     
    5047      #region Symbols
    5148      var block = new Block();
    52 
    53       var ifStmt = new IfStatement();
    54       var elseStmt = new ElseStatement();
    55       var whileLoop = new WhileLoop();
    56 
    57       var numExpr = new NumericalExpression();
     49      var stat = new Stat();
     50      var ifStat = new IfStat();
     51      var elseStat = new ElseStat();
     52      var whileStat = new WhileStat();
     53
     54      var logicalExpr = new LogicalExpression();
     55      var numericalExpr = new NumericalExpression();
     56
     57      var equal = new Equal();
     58      var lessThan = new LessThan();
     59      var lessThanOrEqual = new LessThanOrEqual();
     60      var greaterThan = new GreaterThan();
     61      var greaterThanOrEqual = new GreaterThanOrEqual();
     62
     63      var conjunction = new Conjunction();
     64      var disjunction = new Disjunction();
     65      var negation = new Negation();
     66
     67      var addition = new Addition();
     68      var subtraction = new Subtraction();
     69      var multiplication = new Multiplication();
     70      var division = new Division();
     71      var modulus = new Modulus();
     72
    5873      var number = new Number();
    59       var numOp = new NumericalOperation();
    60       var add = new Addition();
    61       var sub = new Subtraction();
    62       var mult = new Multiplication();
    63       var div = new Division();
    64       var mod = new Modulus();
    65 
    66       var logicExpr = new LogicalExpression();
    67       var logicComp = new LogicalComparison();
    68       var numComp = new NumericalComparison();
    69       var logicVal = new LogicalValue();
    70       var not = new Negation();
    71       var and = new Conjunction();
    72       var or = new Disjunction();
    73       var eq = new Equal();
    74       var lt = new LessThan();
    75       var gt = new GreaterThan();
    76       var lteq = new LessThanOrEqual();
    77       var gteq = new GreaterThanOrEqual();
     74      var logicalVal = new LogicalValue();
    7875
    7976      var ahead = new Ahead();
    8077      var back = new Back();
    81       var doNothing = new DoNothing();
    8278      var fire = new Fire();
    8379      var shotPower = new ShotPower();
     
    108104      var onHitWall = new OnHitWall();
    109105      var onScannedRobot = new OnScannedRobot();
    110       var emptyEvent = new EmptyEvent();
    111106
    112107      var run = new Run();
    113108      var tank = new Tank();
    114       var program = new Program();
     109
     110      var doNothing = new DoNothing();
     111      var emptyEvent = new EmptyEvent();
    115112      #endregion
    116113
    117114      #region Symbol Collections
    118       var numericalExpressions = new List<ISymbol>()
    119             {
    120                 number, numOp, getEnergy, getGunHeading, getHeading, getRadarHeading, getX, getY
    121             };
    122 
    123       var numericalOperators = new List<ISymbol>()
    124             {
    125                 add, sub, mult, div, mod
    126             };
    127 
    128       var logicalExpressions = new List<ISymbol>()
    129             {
    130                 logicVal, logicComp, numComp, not
    131             };
    132 
    133       var logicalComparators = new List<ISymbol>()
    134             {
    135                 and, or
    136             };
    137 
    138       var numericalComparators = new List<ISymbol>()
    139             {
    140                 lt, gt, lteq, gteq, eq
    141             };
    142 
    143       var terminalSymbols = new List<ISymbol>()
    144             {
    145                 doNothing, //getEnergy, getGunHeading, getHeading, getRadarHeading, getX, getY
    146             };
    147 
    148       var functionSymbols = new List<ISymbol>()
    149             {
    150                 ahead, back, fire,
    151                 //setAdjustGunForRobotTurn, setAdjustRadarForGunTurn, setAdjustRadarForRobotTurn,
    152                 turnGunLeft, turnGunRight, turnLeft, turnRadarLeft, turnRadarRight, turnRight
    153             };
    154 
    155       var constantSymbols = new List<ISymbol>()
    156             {
    157                 shotPower
    158             };
    159 
    160       var eventSymbols = new List<ISymbol>()
    161             {
    162                 run, onBulletHit, onBulletMissed, onHitByBullet,
    163                 onHitRobot, onHitWall, onScannedRobot, block, emptyEvent
    164             };
     115      var eventSymbols = new ISymbol[] { onScannedRobot, onBulletHit, onBulletMissed, onHitByBullet, onHitRobot, onHitWall };
     116      var controlSymbols = new ISymbol[] { ifStat, whileStat };
     117      var functionSymbols = new ISymbol[] {
     118        ahead, back, fire, turnGunLeft, turnGunRight, turnLeft, turnRadarLeft, turnRadarRight, turnRight
     119        //setAdjustGunForRobotTurn, setAdjustRadarForGunTurn, setAdjustRadarForRobotTurn,
     120      };
     121      var relationalOperators = new ISymbol[] { equal, lessThan, lessThanOrEqual, greaterThan, greaterThanOrEqual };
     122      var logicalOperators = new ISymbol[] { conjunction, disjunction, negation };
     123      var numericalExpressions = new ISymbol[] { number, getEnergy, getGunHeading, getHeading, getRadarHeading, getX, getY };
     124      var numericalOperators = new ISymbol[] { addition, subtraction, multiplication, division, modulus };
    165125      #endregion
    166126
    167127      #region Adding Symbols
    168       // add all symbols to the grammar
    169 
    170       AddSymbol(ifStmt);
    171       AddSymbol(elseStmt);
    172       AddSymbol(whileLoop);
    173 
    174       AddSymbol(numExpr);
     128      foreach (var s in eventSymbols)
     129        AddSymbol(s);
     130      foreach (var s in controlSymbols)
     131        AddSymbol(s);
     132      foreach (var s in functionSymbols)
     133        AddSymbol(s);
     134      foreach (var s in relationalOperators)
     135        AddSymbol(s);
     136      foreach (var s in logicalOperators)
     137        AddSymbol(s);
    175138      foreach (var s in numericalExpressions)
    176139        AddSymbol(s);
     
    178141        AddSymbol(s);
    179142
    180       AddSymbol(logicExpr);
    181       foreach (var s in logicalExpressions)
    182         AddSymbol(s);
    183       foreach (var s in logicalComparators)
    184         AddSymbol(s);
    185       foreach (var s in numericalComparators)
    186         AddSymbol(s);
    187 
    188       foreach (var s in terminalSymbols)
    189         AddSymbol(s);
     143      AddSymbol(block);
     144      AddSymbol(stat);
     145      AddSymbol(elseStat);
     146      AddSymbol(shotPower);
     147      AddSymbol(logicalVal);
     148      AddSymbol(logicalExpr);
     149      AddSymbol(numericalExpr);
     150      AddSymbol(run);
     151      AddSymbol(tank);
     152      AddSymbol(emptyEvent);
     153      AddSymbol(doNothing);
     154      #endregion
     155
     156      #region Grammar Definition
     157      // StartSymbol
     158      AddAllowedChildSymbol(StartSymbol, tank);
     159
     160      // Tank
     161      AddAllowedChildSymbol(tank, run, 0);
     162      AddAllowedChildSymbol(tank, onScannedRobot, 1);
     163      AddAllowedChildSymbol(tank, onBulletHit, 2);
     164      AddAllowedChildSymbol(tank, onBulletMissed, 3);
     165      AddAllowedChildSymbol(tank, onHitByBullet, 4);
     166      AddAllowedChildSymbol(tank, onHitRobot, 5);
     167      AddAllowedChildSymbol(tank, onHitWall, 6);
     168
     169      // Run
     170      AddAllowedChildSymbol(run, stat);
     171
     172      // Event
     173      foreach (var s in eventSymbols)
     174        AddAllowedChildSymbol(s, stat);
     175
     176      // Block
     177      AddAllowedChildSymbol(block, stat);
     178
     179      // Stat
     180      AddAllowedChildSymbol(stat, stat);
     181      AddAllowedChildSymbol(stat, block);
     182      foreach (var s in controlSymbols)
     183        AddAllowedChildSymbol(stat, s);
    190184      foreach (var s in functionSymbols)
    191         AddSymbol(s);
    192       foreach (var s in constantSymbols)
    193         AddSymbol(s);
    194       foreach (var s in eventSymbols)
    195         AddSymbol(s);
    196       AddSymbol(tank);
    197       #endregion
    198 
    199       #region Defining Grammar
    200       // define grammar rules
    201 
    202       // Branches
    203       AddAllowedChildSymbol(ifStmt, logicExpr, 0);
    204       AddAllowedChildSymbol(ifStmt, block, 1);
    205       AddAllowedChildSymbol(ifStmt, elseStmt, 2);
    206       AddAllowedChildSymbol(ifStmt, doNothing, 2);
    207       AddAllowedChildSymbol(elseStmt, block);
    208       AddAllowedChildSymbol(whileLoop, logicExpr, 0);
    209       AddAllowedChildSymbol(whileLoop, block, 1);
     185        AddAllowedChildSymbol(stat, s);
     186      AddAllowedChildSymbol(stat, emptyEvent);
     187      AddAllowedChildSymbol(stat, doNothing);
     188
     189      // IfStat
     190      AddAllowedChildSymbol(ifStat, logicalExpr, 0);
     191      AddAllowedChildSymbol(ifStat, stat, 1);
     192      AddAllowedChildSymbol(ifStat, emptyEvent, 1);
     193      AddAllowedChildSymbol(ifStat, doNothing, 1);
     194      AddAllowedChildSymbol(ifStat, elseStat, 2);
     195      AddAllowedChildSymbol(ifStat, emptyEvent, 2);
     196      AddAllowedChildSymbol(ifStat, doNothing, 2);
     197
     198      // ElseStat
     199      AddAllowedChildSymbol(elseStat, stat);
     200      AddAllowedChildSymbol(elseStat, emptyEvent);
     201      AddAllowedChildSymbol(elseStat, doNothing);
     202
     203      // WhileStat
     204      AddAllowedChildSymbol(whileStat, logicalExpr, 0);
     205      AddAllowedChildSymbol(whileStat, stat, 1);
     206      AddAllowedChildSymbol(whileStat, emptyEvent, 1);
     207      AddAllowedChildSymbol(whileStat, doNothing, 1);
    210208
    211209      // Numerical Expressions
    212       foreach (var s in numericalExpressions) {
    213         AddAllowedChildSymbol(numExpr, s);
    214         AddAllowedChildSymbol(numOp, s, 1);
    215         AddAllowedChildSymbol(numOp, s, 2);
     210      foreach (var s in numericalExpressions)
     211        AddAllowedChildSymbol(numericalExpr, s);
     212      foreach (var s in numericalOperators) {
     213        AddAllowedChildSymbol(numericalExpr, s);
     214        foreach (var ne in numericalExpressions)
     215          AddAllowedChildSymbol(s, ne);
     216        foreach (var no in numericalOperators) {
     217          AddAllowedChildSymbol(s, no);
     218        }
    216219      }
    217       foreach (var s in numericalOperators)
    218         AddAllowedChildSymbol(numOp, s, 0);
    219220
    220221      // Logical Expressions
    221       foreach (var s in logicalExpressions) {
    222         AddAllowedChildSymbol(logicExpr, s);
    223         AddAllowedChildSymbol(not, s);
    224         AddAllowedChildSymbol(logicComp, s, 1);
    225         AddAllowedChildSymbol(logicComp, s, 2);
     222      AddAllowedChildSymbol(logicalExpr, logicalVal);
     223      foreach (var s in logicalOperators) {
     224        AddAllowedChildSymbol(logicalExpr, s);
     225        AddAllowedChildSymbol(s, logicalVal);
     226        foreach (var lo in logicalOperators)
     227          AddAllowedChildSymbol(s, lo);
     228        foreach (var ro in relationalOperators)
     229          AddAllowedChildSymbol(s, ro);
    226230      }
    227       foreach (var s in logicalComparators)
    228         AddAllowedChildSymbol(logicComp, s, 0);
    229       foreach (var s in numericalExpressions) {
    230         AddAllowedChildSymbol(numComp, s, 1);
    231         AddAllowedChildSymbol(numComp, s, 2);
    232       }
    233       foreach (var s in numericalComparators)
    234         AddAllowedChildSymbol(numComp, s, 0);
    235 
    236 
    237       // All Void Statements can appear in run or in an event handler or inside a block
    238       foreach (var e in eventSymbols) {
    239         AddAllowedChildSymbol(e, ifStmt);
    240         AddAllowedChildSymbol(e, whileLoop);
    241         AddAllowedChildSymbol(e, doNothing);
    242         foreach (var f in functionSymbols)
    243           AddAllowedChildSymbol(e, f);
    244       }
    245 
    246       // Add the appropriate parameters as children of their respective functions
     231      foreach (var s in relationalOperators)
     232        AddAllowedChildSymbol(s, numericalExpr);
     233
     234      // Functions
    247235      foreach (var f in functionSymbols) {
    248236        if (f is Fire)
    249237          AddAllowedChildSymbol(f, shotPower);
    250238        else
    251           AddAllowedChildSymbol(f, numExpr);
    252 
     239          AddAllowedChildSymbol(f, numericalExpr);
    253240      }
    254 
    255       // Add all Event Methods to Tank. Run and OnScannedEvent are not optional,
    256       // so EmptyEvent cannot take their places
    257 
    258       AddAllowedChildSymbol(tank, run, 0);
    259       AddAllowedChildSymbol(tank, onScannedRobot, 1);
    260       AddAllowedChildSymbol(tank, onBulletMissed, 2);
    261       AddAllowedChildSymbol(tank, onHitByBullet, 3);
    262       AddAllowedChildSymbol(tank, onHitRobot, 4);
    263       AddAllowedChildSymbol(tank, onHitWall, 5);
    264       AddAllowedChildSymbol(tank, onBulletHit, 6);
    265       for (int i = 2; i < tank.MaximumArity; i++)
    266         AddAllowedChildSymbol(tank, emptyEvent, i);
    267 
    268       AddAllowedChildSymbol(StartSymbol, tank, 0);
    269241      #endregion
    270242    }
Note: See TracChangeset for help on using the changeset viewer.