- Timestamp:
- 10/01/13 12:08:25 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/Robocode.TrunkInt/HeuristicLab.Problems.Robocode/3.3/Grammar.cs
r9879 r10011 20 20 #endregion 21 21 22 using System.Collections.Generic;23 22 using HeuristicLab.Common; 24 23 using HeuristicLab.Core; … … 31 30 public class Grammar : SymbolicExpressionGrammar { 32 31 [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) { } 37 34 38 35 public Grammar() … … 50 47 #region Symbols 51 48 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 58 73 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(); 78 75 79 76 var ahead = new Ahead(); 80 77 var back = new Back(); 81 var doNothing = new DoNothing();82 78 var fire = new Fire(); 83 79 var shotPower = new ShotPower(); … … 108 104 var onHitWall = new OnHitWall(); 109 105 var onScannedRobot = new OnScannedRobot(); 110 var emptyEvent = new EmptyEvent();111 106 112 107 var run = new Run(); 113 108 var tank = new Tank(); 114 var program = new Program(); 109 110 var doNothing = new DoNothing(); 111 var emptyEvent = new EmptyEvent(); 115 112 #endregion 116 113 117 114 #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 }; 165 125 #endregion 166 126 167 127 #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); 175 138 foreach (var s in numericalExpressions) 176 139 AddSymbol(s); … … 178 141 AddSymbol(s); 179 142 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); 190 184 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); 210 208 211 209 // 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 } 216 219 } 217 foreach (var s in numericalOperators)218 AddAllowedChildSymbol(numOp, s, 0);219 220 220 221 // 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); 226 230 } 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 247 235 foreach (var f in functionSymbols) { 248 236 if (f is Fire) 249 237 AddAllowedChildSymbol(f, shotPower); 250 238 else 251 AddAllowedChildSymbol(f, numExpr); 252 239 AddAllowedChildSymbol(f, numericalExpr); 253 240 } 254 255 // Add all Event Methods to Tank. Run and OnScannedEvent are not optional,256 // so EmptyEvent cannot take their places257 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);269 241 #endregion 270 242 }
Note: See TracChangeset
for help on using the changeset viewer.