public void AddSymbol(string symbolName, string description, int minimumArity, int maximumArity) { var symbol = new SimpleSymbol(symbolName, description, minimumArity, maximumArity); AddSymbol(symbol); SetSubtreeCount(symbol, symbol.MinimumArity, symbol.MaximumArity); foreach (var s in Symbols) { if (s == ProgramRootSymbol) { continue; } if (s.MaximumArity > 0) { AddAllowedChildSymbol(s, symbol); } if (s == DefunSymbol) { continue; } if (s == StartSymbol) { continue; } if (symbol.MaximumArity > 0) { AddAllowedChildSymbol(symbol, s); } } }
public void AddSymbol(string symbolName, string description, int minimumArity, int maximumArity) { var symbol = new SimpleSymbol(symbolName, description, minimumArity, maximumArity); AddSymbol(symbol); SetSubtreeCount(symbol, symbol.MinimumArity, symbol.MaximumArity); foreach (var s in Symbols) { if (s == ProgramRootSymbol) continue; if (s.MaximumArity > 0) AddAllowedChildSymbol(s, symbol); if (s == DefunSymbol) continue; if (s == StartSymbol) continue; if (symbol.MaximumArity > 0) AddAllowedChildSymbol(symbol, s); } }
private SimpleSymbol(SimpleSymbol original, Cloner cloner) : base(original, cloner) { minimumArity = original.minimumArity; maximumArity = original.maximumArity; }
// initialize set of allowed symbols and define // the allowed combinations of symbols private void Initialize() { #region Symbols var block = new SimpleSymbol("Block", "A group of statements", 1, byte.MaxValue); var stat = new SimpleSymbol("Statement", "A statement.", 1, 1); var ifThenElseStat = new SimpleSymbol("IfThenElseStat", "An if statement.", 2, 3); var whileStat = new SimpleSymbol("WhileStat", "A while statement.", 2, 2); whileStat.Enabled = false; var boolExpr = new SimpleSymbol("BooleanExpression", "A Boolean expression.", 1, 1); var numericalExpr = new SimpleSymbol("NumericalExpression", "A numerical expression.", 1, 1); var equal = new SimpleSymbol("Equal", "Equal comparator.", 2, 2); var lessThan = new SimpleSymbol("LessThan", "LessThan comparator.", 2, 2); var lessThanOrEqual = new SimpleSymbol("LessThanOrEqual", "LessThanOrEqual comparator.", 2, 2); var greaterThan = new SimpleSymbol("GreaterThan", "GreaterThan comparator.", 2, 2); var greaterThanOrEqual = new SimpleSymbol("GreaterThanOrEqual", "GreaterThanOrEqual comparator.", 2, 2); var conjunction = new SimpleSymbol("ConditionalAnd", "Conjunction comparator.", 2, byte.MaxValue); var disjunction = new SimpleSymbol("ConditionalOr", "Disjunction comparator.", 2, byte.MaxValue); var negation = new SimpleSymbol("Negation", "A negation.", 1, 1); var addition = new SimpleSymbol("Addition", "Addition operator.", 2, byte.MaxValue); var subtraction = new SimpleSymbol("Subtraction", "Subtraction operator.", 2, byte.MaxValue); var multiplication = new SimpleSymbol("Multiplication", "Multiplication operator.", 2, byte.MaxValue); var division = new SimpleSymbol("Division", "Division operator.", 2, byte.MaxValue); var modulus = new SimpleSymbol("Modulus", "Modulus operator.", 2, byte.MaxValue); var number = new Number(); var logicalVal = new BooleanValue(); var ahead = new SimpleSymbol("Ahead", "Immediately moves your robot ahead (forward) by distance measured in pixels.", 1, 1); var back = new SimpleSymbol("Back", "Immediately moves your robot backward by distance measured in pixels.", 1, 1); var fire = new SimpleSymbol("Fire", "Immediately fires a bullet.", 1, 1); var shotPower = new ShotPower(); var getEnergy = new SimpleSymbol("GetEnergy", "Returns the robot's current energy.", 0, 0); var getHeading = new SimpleSymbol("GetHeading", "Returns the direction that the robot's body is facing, in degrees.", 0, 0); var getGunHeading = new SimpleSymbol("GetGunHeading", "Returns the direction that the robot's gun is facing, in degrees.", 0, 0); var getRadarHeading = new SimpleSymbol("GetRadarHeading", "Returns the direction that the robot's radar is facing, in degrees.", 0, 0); var getX = new SimpleSymbol("GetX", "Returns the X position of the robot. (0,0) is at the bottom left of the battlefield.", 0, 0); var getY = new SimpleSymbol("GetY", "Returns the Y position of the robot. (0,0) is at the bottom left of the battlefield.", 0, 0); var turnLeft = new SimpleSymbol("TurnLeft", "Immediately turns the robot's body to the left by degrees.", 1, 1); var turnRight = new SimpleSymbol("TurnRight", "Immediately turns the robot's body to the right by degrees.", 1, 1); var turnGunLeft = new SimpleSymbol("TurnGunLeft", "Immediately turns the robot's gun to the left by degrees.", 1, 1); var turnGunRight = new SimpleSymbol("TurnGunRight", "Immediately turns the robot's gun to the right by degrees.", 1, 1); var turnRadarLeft = new SimpleSymbol("TurnRadarLeft", "Immediately turns the robot's radar to the left by degrees.", 1, 1); var turnRadarRight = new SimpleSymbol("TurnRadarRight", "Immediately turns the robot's radar to the right by degrees.", 1, 1); var onBulletHit = new SimpleSymbol("OnBulletHit", "This method is called when one of your bullets hits another robot.", 2, 10); var onBulletMissed = new SimpleSymbol("OnBulletMissed", "This method is called when one of your bullets misses, i.e. hits a wall.", 2, 10); var onHitByBullet = new SimpleSymbol("OnHitByBullet", "This method is called when your robot is hit by a bullet.", 2, 10); var onHitRobot = new SimpleSymbol("OnHitRobot", "This method is called when your robot collides with another robot.", 2, 10); var onHitWall = new SimpleSymbol("OnHitWall", "This method is called when your robot collides with a wall.", 2, 10); var onScannedRobot = new SimpleSymbol("OnScannedRobot", "This method is called when your robot sees another robot, i.e. when the robot's radar scan \"hits\" another robot.", 2, 10); var run = new SimpleSymbol("Run", "The main method in every robot.", 1, 10); var tank = new SimpleSymbol("Tank", "The root of a Robocode Tank program.", 2, 7); var doNothing = new SimpleSymbol("DoNothing", "Do nothing this turn, meaning that the robot will skip its turn.", 0, 0); var emptyEvent = new SimpleSymbol("EmptyEvent", "This is a placeholder for an empty event.", 0, 0); #endregion #region Symbol Collections var controlSymbols = new ISymbol[] { ifThenElseStat, whileStat }; var actionSymbols = new ISymbol[] { ahead, back, fire, turnGunLeft, turnGunRight, turnLeft, turnRadarLeft, turnRadarRight, turnRight }; var functionSymbols = new ISymbol[] { getEnergy, getGunHeading, getHeading, getRadarHeading, getX, getY }; var events = new GroupSymbol(EventsName, new ISymbol[] { run, onScannedRobot, onBulletHit, onBulletMissed, onHitByBullet, onHitRobot, onHitWall }); var controlStatements = new GroupSymbol(ControlStatementsName, controlSymbols); var expressions = new GroupSymbol(ExpressionsName, new ISymbol[] { boolExpr, numericalExpr }); var robocodeFunctions = new GroupSymbol(RobocodeFunctionsName, functionSymbols); var robocodeActions = new GroupSymbol(RobocodeActionsName, actionSymbols); var relationalOperators = new GroupSymbol(RelationalOperatorsName, new ISymbol[] { equal, lessThan, lessThanOrEqual, greaterThan, greaterThanOrEqual }); var logicalOperators = new GroupSymbol(LogicalOperators, new ISymbol[] { conjunction, disjunction, negation }); var numericalOperators = new GroupSymbol(NumericalOperatorsName, new ISymbol[] { addition, subtraction, multiplication, division, modulus }); #endregion #region Adding Symbols AddSymbol(tank); AddSymbol(stat); AddSymbol(block); AddSymbol(shotPower); AddSymbol(number); AddSymbol(logicalVal); AddSymbol(events); AddSymbol(expressions); AddSymbol(controlStatements); AddSymbol(robocodeFunctions); AddSymbol(robocodeActions); AddSymbol(relationalOperators); AddSymbol(logicalOperators); AddSymbol(numericalOperators); AddSymbol(emptyEvent); AddSymbol(doNothing); #endregion #region Grammar Definition // StartSymbol AddAllowedChildSymbol(StartSymbol, tank); // Tank AddAllowedChildSymbol(tank, run, 0); AddAllowedChildSymbol(tank, onScannedRobot, 1); AddAllowedChildSymbol(tank, onBulletHit, 2); AddAllowedChildSymbol(tank, onBulletMissed, 3); AddAllowedChildSymbol(tank, onHitByBullet, 4); AddAllowedChildSymbol(tank, onHitRobot, 5); AddAllowedChildSymbol(tank, onHitWall, 6); // Events AddAllowedChildSymbol(events, stat); // Block AddAllowedChildSymbol(block, stat); // Stat AddAllowedChildSymbol(stat, stat); AddAllowedChildSymbol(stat, block); AddAllowedChildSymbol(stat, controlStatements); AddAllowedChildSymbol(stat, robocodeFunctions); AddAllowedChildSymbol(stat, robocodeActions); AddAllowedChildSymbol(stat, emptyEvent); AddAllowedChildSymbol(stat, doNothing); // IfStat AddAllowedChildSymbol(ifThenElseStat, boolExpr, 0); AddAllowedChildSymbol(ifThenElseStat, stat, 1); AddAllowedChildSymbol(ifThenElseStat, emptyEvent, 1); AddAllowedChildSymbol(ifThenElseStat, doNothing, 1); AddAllowedChildSymbol(ifThenElseStat, stat, 2); AddAllowedChildSymbol(ifThenElseStat, emptyEvent, 2); AddAllowedChildSymbol(ifThenElseStat, doNothing, 2); // WhileStat AddAllowedChildSymbol(whileStat, boolExpr, 0); AddAllowedChildSymbol(whileStat, stat, 1); AddAllowedChildSymbol(whileStat, emptyEvent, 1); AddAllowedChildSymbol(whileStat, doNothing, 1); // Numerical Expressions AddAllowedChildSymbol(numericalExpr, number); AddAllowedChildSymbol(numericalExpr, robocodeFunctions); AddAllowedChildSymbol(numericalExpr, numericalOperators); AddAllowedChildSymbol(numericalOperators, number); AddAllowedChildSymbol(numericalOperators, robocodeFunctions); AddAllowedChildSymbol(numericalOperators, numericalOperators); // Logical Expressions AddAllowedChildSymbol(boolExpr, logicalVal); AddAllowedChildSymbol(boolExpr, logicalOperators); AddAllowedChildSymbol(logicalOperators, logicalVal); AddAllowedChildSymbol(logicalOperators, logicalOperators); AddAllowedChildSymbol(logicalOperators, relationalOperators); AddAllowedChildSymbol(relationalOperators, numericalExpr); // Functions and Actions AddAllowedChildSymbol(robocodeFunctions, numericalExpr); foreach (var a in robocodeActions.Symbols) { if (a.Name == fire.Name) AddAllowedChildSymbol(a, shotPower); else AddAllowedChildSymbol(a, numericalExpr); } #endregion }