From d5cbb646ed3d57198ef63e3984bf201f0b360dfd Mon Sep 17 00:00:00 2001 From: Koen Yskout Date: Tue, 17 Apr 2018 13:54:17 +0200 Subject: [PATCH] Release v3.0 --- OGP1718-Worms/.classpath | 5 + OGP1718-Worms/.project | 5 + OGP1718-Worms/images/burger-poisonous.png | Bin 0 -> 31463 bytes OGP1718-Worms/lib/antlr-runtime-4.7.1.jar | Bin 0 -> 336803 bytes OGP1718-Worms/programs/program.txt | 35 + OGP1718-Worms/programs/program_example.txt | 20 + OGP1718-Worms/programs/program_simple.txt | 3 + OGP1718-Worms/programs/syntax_test.txt | 54 + OGP1718-Worms/src-provided/worms/Worms.java | 3 + .../src-provided/worms/facade/IFacade.java | 138 +- .../worms/internal/gui/AbstractPainter.java | 0 .../worms/internal/gui/ErrorScreen.java | 0 .../worms/internal/gui/GUIConstants.java | 0 .../worms/internal/gui/GUIOptions.java | 7 + .../worms/internal/gui/GUIUtils.java | 0 .../worms/internal/gui/GameState.java | 0 .../worms/internal/gui/InputMode.java | 0 .../worms/internal/gui/Level.java | 0 .../worms/internal/gui/Screen.java | 0 .../worms/internal/gui/WormsGUI.java | 0 .../gui/game/DefaultActionHandler.java | 20 +- .../internal/gui/game/IActionHandler.java | 5 + .../worms/internal/gui/game/ImageSprite.java | 0 .../internal/gui/game/PlayGameScreen.java | 18 +- .../gui/game/PlayGameScreenDebugPainter.java | 0 .../gui/game/PlayGameScreenPainter.java | 10 + .../worms/internal/gui/game/Sprite.java | 0 .../gui/game/commands/ActivateWizard.java | 29 + .../gui/game/commands/AddNewFood.java | 0 .../gui/game/commands/AddNewTeam.java | 0 .../gui/game/commands/AddNewWorm.java | 93 +- .../internal/gui/game/commands/Command.java | 0 .../worms/internal/gui/game/commands/Eat.java | 0 .../internal/gui/game/commands/Fire.java | 83 + .../game/commands/InstantaneousCommand.java | 0 .../internal/gui/game/commands/Jump.java | 0 .../internal/gui/game/commands/Move.java | 0 .../internal/gui/game/commands/Rename.java | 0 .../gui/game/commands/SelectNextWorm.java | 0 .../internal/gui/game/commands/StartGame.java | 1 + .../internal/gui/game/commands/Turn.java | 0 .../gui/game/modes/DefaultInputMode.java | 8 + .../gui/game/modes/EnteringNameMode.java | 0 .../internal/gui/game/modes/GameOverMode.java | 0 .../gui/game/modes/SetupInputMode.java | 11 +- .../internal/gui/game/modes/TurningMode.java | 0 .../internal/gui/game/sprites/FoodSprite.java | 61 +- .../gui/game/sprites/ProjectileSprite.java | 143 ++ .../internal/gui/game/sprites/WormSprite.java | 0 .../internal/gui/menu/AbstractMenuScreen.java | 0 .../internal/gui/menu/ChooseLevelScreen.java | 0 .../internal/gui/menu/MainMenuScreen.java | 0 .../internal/gui/menu/MenuInputMode.java | 0 .../worms/internal/gui/messages/Message.java | 0 .../internal/gui/messages/MessageDisplay.java | 0 .../internal/gui/messages/MessagePainter.java | 0 .../internal/gui/messages/MessageType.java | 0 .../worms/programs/IProgramFactory.java | 443 +++++ .../worms/programs/ParseOutcome.java | 20 + .../worms/programs/ProgramParser.java | 245 +++ .../worms/programs/SourceLocation.java | 61 + .../worms/programs/SuccessOrFail.java | 100 + .../internal/parser/ParserVisitor.java | 392 ++++ .../programs/internal/parser/WormsProgram.g4 | 200 ++ .../parser/example/ExamplePrinter.java | 42 + .../parser/example/PrintingObject.java | 80 + .../parser/example/PrintingObjectFactory.java | 49 + .../parser/example/PrintingProgram.java | 22 + .../parser/generated/WormsProgram.interp | 141 ++ .../parser/generated/WormsProgram.tokens | 112 ++ .../generated/WormsProgramBaseVisitor.java | 317 +++ .../parser/generated/WormsProgramLexer.interp | 199 ++ .../parser/generated/WormsProgramLexer.java | 280 +++ .../parser/generated/WormsProgramLexer.tokens | 112 ++ .../parser/generated/WormsProgramParser.java | 1757 +++++++++++++++++ .../parser/generated/WormsProgramVisitor.java | 306 +++ .../worms/util/ModelException.java | 0 .../worms/util/MustNotImplementException.java | 0 .../worms/model/PartialPart2FacadeTest.java | 0 .../worms/model/PartialPart3FacadeTest.java | 42 + .../worms/model/SimpleActionHandler.java | 95 + 81 files changed, 5752 insertions(+), 15 deletions(-) create mode 100644 OGP1718-Worms/images/burger-poisonous.png create mode 100644 OGP1718-Worms/lib/antlr-runtime-4.7.1.jar create mode 100755 OGP1718-Worms/programs/program.txt create mode 100755 OGP1718-Worms/programs/program_example.txt create mode 100755 OGP1718-Worms/programs/program_simple.txt create mode 100755 OGP1718-Worms/programs/syntax_test.txt mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/Worms.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/facade/IFacade.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/AbstractPainter.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/ErrorScreen.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/GUIConstants.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/GUIOptions.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/GUIUtils.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/GameState.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/InputMode.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/Level.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/Screen.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/WormsGUI.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/DefaultActionHandler.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/IActionHandler.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/ImageSprite.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/PlayGameScreen.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/PlayGameScreenDebugPainter.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/PlayGameScreenPainter.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/Sprite.java create mode 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/commands/ActivateWizard.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/commands/AddNewFood.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/commands/AddNewTeam.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/commands/AddNewWorm.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Command.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Eat.java create mode 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Fire.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/commands/InstantaneousCommand.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Jump.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Move.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Rename.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/commands/SelectNextWorm.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/commands/StartGame.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Turn.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/modes/DefaultInputMode.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/modes/EnteringNameMode.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/modes/GameOverMode.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/modes/SetupInputMode.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/modes/TurningMode.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/sprites/FoodSprite.java create mode 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/sprites/ProjectileSprite.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/game/sprites/WormSprite.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/menu/AbstractMenuScreen.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/menu/ChooseLevelScreen.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/menu/MainMenuScreen.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/menu/MenuInputMode.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/messages/Message.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/messages/MessageDisplay.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/messages/MessagePainter.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/internal/gui/messages/MessageType.java create mode 100755 OGP1718-Worms/src-provided/worms/programs/IProgramFactory.java create mode 100755 OGP1718-Worms/src-provided/worms/programs/ParseOutcome.java create mode 100755 OGP1718-Worms/src-provided/worms/programs/ProgramParser.java create mode 100755 OGP1718-Worms/src-provided/worms/programs/SourceLocation.java create mode 100755 OGP1718-Worms/src-provided/worms/programs/SuccessOrFail.java create mode 100755 OGP1718-Worms/src-provided/worms/programs/internal/parser/ParserVisitor.java create mode 100755 OGP1718-Worms/src-provided/worms/programs/internal/parser/WormsProgram.g4 create mode 100755 OGP1718-Worms/src-provided/worms/programs/internal/parser/example/ExamplePrinter.java create mode 100755 OGP1718-Worms/src-provided/worms/programs/internal/parser/example/PrintingObject.java create mode 100755 OGP1718-Worms/src-provided/worms/programs/internal/parser/example/PrintingObjectFactory.java create mode 100755 OGP1718-Worms/src-provided/worms/programs/internal/parser/example/PrintingProgram.java create mode 100755 OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgram.interp create mode 100755 OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgram.tokens create mode 100755 OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramBaseVisitor.java create mode 100755 OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramLexer.interp create mode 100755 OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramLexer.java create mode 100755 OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramLexer.tokens create mode 100755 OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramParser.java create mode 100755 OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramVisitor.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/util/ModelException.java mode change 100644 => 100755 OGP1718-Worms/src-provided/worms/util/MustNotImplementException.java mode change 100644 => 100755 OGP1718-Worms/tests/worms/model/PartialPart2FacadeTest.java create mode 100755 OGP1718-Worms/tests/worms/model/PartialPart3FacadeTest.java create mode 100755 OGP1718-Worms/tests/worms/model/SimpleActionHandler.java diff --git a/OGP1718-Worms/.classpath b/OGP1718-Worms/.classpath index 4629a2b..b9488d7 100644 --- a/OGP1718-Worms/.classpath +++ b/OGP1718-Worms/.classpath @@ -9,6 +9,11 @@ + + + + + diff --git a/OGP1718-Worms/.project b/OGP1718-Worms/.project index 7c6ada6..33267ef 100644 --- a/OGP1718-Worms/.project +++ b/OGP1718-Worms/.project @@ -25,5 +25,10 @@ 2 PROJECT_LOC/levels + + resources/programs + 2 + PROJECT_LOC/programs + diff --git a/OGP1718-Worms/images/burger-poisonous.png b/OGP1718-Worms/images/burger-poisonous.png new file mode 100644 index 0000000000000000000000000000000000000000..692e676c4b4d3fcab0c2f571b7ef94c0c5099f87 GIT binary patch literal 31463 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 Hu0mjf4ogmL literal 0 HcmV?d00001 diff --git a/OGP1718-Worms/lib/antlr-runtime-4.7.1.jar b/OGP1718-Worms/lib/antlr-runtime-4.7.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..e2e0ac72e0165ea3338df4bec007daaefb2635bd GIT binary patch literal 336803 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%0A(IwrO6!P8_* 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ℜ!xDHiVquFR7w9 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 literal 0 HcmV?d00001 diff --git a/OGP1718-Worms/programs/program.txt b/OGP1718-Worms/programs/program.txt new file mode 100755 index 0000000..2e51829 --- /dev/null +++ b/OGP1718-Worms/programs/program.txt @@ -0,0 +1,35 @@ +// Worm that turns towards nearest worm, fires, and moves; or turns and tries to jump if no worm is in sight. + +def updateNearestWorm: { + delta := 0; + nearestWorm := null; + turnToNearest := 0; + while delta < 6.28: { + obj := searchobj delta; + if (obj != null && isworm obj): + if !sameteam obj: + if (nearestWorm == null) || (distance obj < distance nearestWorm): { + nearestWorm := obj; + turnToNearest := delta; + } + delta := delta + 0.2; + } +} + +// main program + +while true: { + invoke updateNearestWorm; + + if nearestWorm != null: { + print nearestWorm; + print distance nearestWorm; + turn turnToNearest; + fire; + move; + } + else { + turn 0.2; + jump; + } +} diff --git a/OGP1718-Worms/programs/program_example.txt b/OGP1718-Worms/programs/program_example.txt new file mode 100755 index 0000000..6164e5c --- /dev/null +++ b/OGP1718-Worms/programs/program_example.txt @@ -0,0 +1,20 @@ +def controlled_move: + if getap self > 100.0: + { jump; + print getx self; + print gety self; } + else move; + +max_distance := 10.0; +while true: { + w := searchobj 0.0; + if isworm w: { + if sameteam w: + invoke controlled_move; + else if distance w < max_distance: + fire; + else + { turn d; + max_distance := max_distance + 0.1; } + } +} \ No newline at end of file diff --git a/OGP1718-Worms/programs/program_simple.txt b/OGP1718-Worms/programs/program_simple.txt new file mode 100755 index 0000000..8fb7d8d --- /dev/null +++ b/OGP1718-Worms/programs/program_simple.txt @@ -0,0 +1,3 @@ +turn 0.2; +fire; +move; \ No newline at end of file diff --git a/OGP1718-Worms/programs/syntax_test.txt b/OGP1718-Worms/programs/syntax_test.txt new file mode 100755 index 0000000..f7af558 --- /dev/null +++ b/OGP1718-Worms/programs/syntax_test.txt @@ -0,0 +1,54 @@ +// don't execute this :-) +def test_proc: { + x := +1; + while true: + print false; + if x == 1: { + print x * x; + } else: {} + invoke test_proc; + break; + if 0-x/y*z - y * z - 2*x + 3 == 2 && true != false: {} + move; + jump; + eat; + fire; +} + +def secondProc: { + invoke test_proc; + if getx self > 0: + invoke secondProc; +} + +x := ( 3 * 4 ); // comment +// comment +y := (-33.5 * (+55 / 1.22)); + +jump; +turn 5; +turn 0.2; +turn -0.2; +fire; + +if (x >= 5): + { } +else + fire; + +while y: + { turn (0.01); + y := (y - 1); } + +while y: + { move; + y := (y - 1); + if (true): { turn y; } + else { + while (false): + {print y;} + } + } + +if (true): { } else { invoke test_proc; } + diff --git a/OGP1718-Worms/src-provided/worms/Worms.java b/OGP1718-Worms/src-provided/worms/Worms.java old mode 100644 new mode 100755 index c72466b..0776318 --- a/OGP1718-Worms/src-provided/worms/Worms.java +++ b/OGP1718-Worms/src-provided/worms/Worms.java @@ -22,6 +22,9 @@ public class Worms { options.randomSeed = randomSeed; } else if ("-clickselect".equals(arg)) { options.enableClickToSelect = true; + } else if ("-program".equals(arg)) { + String program = args[++i]; + options.programFile = program; } } diff --git a/OGP1718-Worms/src-provided/worms/facade/IFacade.java b/OGP1718-Worms/src-provided/worms/facade/IFacade.java old mode 100644 new mode 100755 index 4bfac9f..0f34712 --- a/OGP1718-Worms/src-provided/worms/facade/IFacade.java +++ b/OGP1718-Worms/src-provided/worms/facade/IFacade.java @@ -2,7 +2,10 @@ package worms.facade; import java.math.BigInteger; import java.util.*; + +import worms.internal.gui.game.IActionHandler; import worms.model.*; +import worms.programs.IProgramFactory; import worms.util.ModelException; import worms.util.MustNotImplementException; @@ -356,6 +359,7 @@ public interface IFacade { default void fall(Worm worm) throws ModelException, MustNotImplementException { throw new MustNotImplementException(); } + /** * Return the time needed by the given worm to jump to the nearest position * adjacent to impassable terrain. @@ -380,7 +384,17 @@ public interface IFacade { */ void jump(Worm worm, double timeStep) throws ModelException; + /** + * Make the given worm eat a portion of food. + */ + void eat(Worm worm) throws ModelException; + /** + * Have the give worm fire a projectile. + * - The method must return the projectile that has been fired. + */ + Projectile fire(Worm worm) throws ModelException; + /************ * FOOD @@ -426,11 +440,76 @@ public interface IFacade { */ World getWorld(Food food) throws ModelException; + /** + * Return whether or not the given portion of food is poisonous. + */ + boolean isPoisonous(Food food) throws ModelException; + + /** + * Poison the given portion of food. + */ + void poison(Food food) throws ModelException; + + + + /************* + * PROJECTILE + *************/ /** - * Make the given worm eat a portion of food. + * Check whether the given projectile is terminated. */ - public void eat(Worm worm); + boolean isTerminated(Projectile projectile) throws ModelException; + + /** + * Return the current orientation of the given projectile (in radians). + */ + double getOrientation(Projectile projectile) throws ModelException; + + /** + * Return the current location of the given projectile. + * - The resulting array contains the the x-coordinate of the given projectile + * followed by its y-coordinate. + */ + double[] getLocation(Projectile projectile) throws ModelException; + + /** + * Return the radius of the given projectile. + */ + double getRadius(Projectile projectile); + + /** + * Return the number of hit points of the given projectile. + */ + int getNbHitPoints(Projectile projectile) throws ModelException; + + /** + * Returns the location on the jump trajectory of the given projectile + * after a time t. + * - The resulting location is an array with two elements, + * with the first element being the x-coordinate and the + * second element the y-coordinate. + */ + double[] getJumpStep(Projectile projectile, double elapsedTime); + + /** + * Return the time needed by the given projectile to jump to the nearest + * location at which the projectile hits impassable terrain or a worm. + * - deltaT determines the resolution to be used in successive steps of the jump. + */ + double getJumpTime(Projectile projectile, double jumpTimeStep) throws ModelException; + + /** + * Make the given projectile jump using the given time step. + * - The given time step determines a time interval during which + * you may assume that the projectile will not hit impassable + * terrain nor a worm. + */ + void jump(Projectile projectile, double jumpTimeStep) throws ModelException; + + + + /******** * TEAM @@ -523,4 +602,59 @@ public interface IFacade { throw new MustNotImplementException(); } + + + + + /********** + * PROGRAMS + **********/ + + /** + * Return the program loaded on the given worm. + */ + Program getWormProgram(Worm worm) throws ModelException; + + /** + * Load the given program on the given worm. + * + * While executing the program, the worm must invoke the methods corresponding + * to actions through the provided ActionHandler object (e.g., actionHandler.jump(this), + * actionHandler.turn(this, 0.2), etc.) rather than invoking them directly (e.g., this.jump()). + * This executes the action as if a human player has initiated it, so the GUI can update itself. + * The GUI will also invoke the corresponding method on the worm through the facade. + */ + public void loadProgramOnWorm(Worm worm, Program program, IActionHandler actionHandler) throws ModelException; + + /** + * Execute the program loaded on the given worm. + * The worm is positioned in some world. Returns null if the program + * is not completely executed. Otherwise, returns the objects that have been + * printed. + * + * This method is only used in the tests. The GUI never calls this method; + * you should execute the program when the worm is activated. + */ + public List executeProgram(Worm worm) throws ModelException; + + /** + * Creates a new program factory. + */ + public IProgramFactory createProgramFactory() throws ModelException; + + + + + + /********* + * WIZARD + *********/ + + /** + * Have the wizard cast a spell over two randomly slected game objects in the given + * world. + */ + void castSpell(World world) throws ModelException; + + } diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/AbstractPainter.java b/OGP1718-Worms/src-provided/worms/internal/gui/AbstractPainter.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/ErrorScreen.java b/OGP1718-Worms/src-provided/worms/internal/gui/ErrorScreen.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/GUIConstants.java b/OGP1718-Worms/src-provided/worms/internal/gui/GUIConstants.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/GUIOptions.java b/OGP1718-Worms/src-provided/worms/internal/gui/GUIOptions.java old mode 100644 new mode 100755 index bad55db..aec42b4 --- a/OGP1718-Worms/src-provided/worms/internal/gui/GUIOptions.java +++ b/OGP1718-Worms/src-provided/worms/internal/gui/GUIOptions.java @@ -26,4 +26,11 @@ public class GUIOptions { */ public boolean enableClickToSelect = false; + /** + * The program that is executed by computer-controlled worms. + * Default: "programs/program.txt" + * + * Can also be set from the command line with the -program argument + */ + public String programFile = "programs/program.txt"; } \ No newline at end of file diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/GUIUtils.java b/OGP1718-Worms/src-provided/worms/internal/gui/GUIUtils.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/GameState.java b/OGP1718-Worms/src-provided/worms/internal/gui/GameState.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/InputMode.java b/OGP1718-Worms/src-provided/worms/internal/gui/InputMode.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/Level.java b/OGP1718-Worms/src-provided/worms/internal/gui/Level.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/Screen.java b/OGP1718-Worms/src-provided/worms/internal/gui/Screen.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/WormsGUI.java b/OGP1718-Worms/src-provided/worms/internal/gui/WormsGUI.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/DefaultActionHandler.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/DefaultActionHandler.java old mode 100644 new mode 100755 index 9f25190..51219c8 --- a/OGP1718-Worms/src-provided/worms/internal/gui/game/DefaultActionHandler.java +++ b/OGP1718-Worms/src-provided/worms/internal/gui/game/DefaultActionHandler.java @@ -5,11 +5,13 @@ import java.util.concurrent.Executors; import worms.facade.IFacade; import worms.internal.gui.GameState; +import worms.internal.gui.game.commands.ActivateWizard; import worms.internal.gui.game.commands.AddNewFood; import worms.internal.gui.game.commands.AddNewTeam; import worms.internal.gui.game.commands.AddNewWorm; import worms.internal.gui.game.commands.Command; import worms.internal.gui.game.commands.Eat; +import worms.internal.gui.game.commands.Fire; import worms.internal.gui.game.commands.Jump; import worms.internal.gui.game.commands.Move; import worms.internal.gui.game.commands.Rename; @@ -88,8 +90,14 @@ class DefaultActionHandler implements IActionHandler { executeCommand(new Rename(getFacade(), worm, newName, getScreen())); } - public void eat(Worm worm) { - executeCommand(new Eat(getFacade(), worm, getScreen())); + @Override + public boolean eat(Worm worm) { + return executeCommand(new Eat(getFacade(), worm, getScreen())); + } + + @Override + public boolean fire(Worm worm) { + return executeCommand(new Fire(getFacade(), worm, getScreen())); } public void selectNextWorm() { @@ -100,8 +108,8 @@ class DefaultActionHandler implements IActionHandler { executeCommand(new StartGame(getFacade(), getScreen())); } - public void addNewWorm() { - executeCommand(new AddNewWorm(getFacade(), getScreen())); + public void addNewWorm(boolean withProgram) { + executeCommand(new AddNewWorm(getFacade(), withProgram, getScreen())); } public void addEmptyTeam(String name) { @@ -111,5 +119,9 @@ class DefaultActionHandler implements IActionHandler { public void addNewFood() { executeCommand(new AddNewFood(getFacade(), getScreen())); } + + public void activateWizard() { + executeCommand(new ActivateWizard(getFacade(), getScreen())); + } } diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/IActionHandler.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/IActionHandler.java old mode 100644 new mode 100755 index e0bb5c5..933ea9f --- a/OGP1718-Worms/src-provided/worms/internal/gui/game/IActionHandler.java +++ b/OGP1718-Worms/src-provided/worms/internal/gui/game/IActionHandler.java @@ -14,6 +14,7 @@ import worms.model.Worm; *
  • shows periodic updates on the GUI (such as jump animations) *
  • eventually calls the corresponding facade methods, exactly like what * happens with a human player + *
  • makes sure a worm will fall after moving *
  • returns true if the action has been completed successfully; false * otherwise * @@ -29,6 +30,10 @@ public interface IActionHandler { public boolean move(Worm worm); public boolean jump(Worm worm); + + public boolean eat(Worm worm); + + public boolean fire(Worm worm); /** * Print a message on the screen for a short amount of time. diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/ImageSprite.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/ImageSprite.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/PlayGameScreen.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/PlayGameScreen.java old mode 100644 new mode 100755 index 4a6c295..23c4d91 --- a/OGP1718-Worms/src-provided/worms/internal/gui/game/PlayGameScreen.java +++ b/OGP1718-Worms/src-provided/worms/internal/gui/game/PlayGameScreen.java @@ -224,6 +224,14 @@ public class PlayGameScreen extends Screen { } } + + public void fire() { + Worm worm = getSelectedWorm(); + if (worm != null) { + userActionHandler.fire(worm); + } + + } public void turn(double angle) { Worm worm = getSelectedWorm(); @@ -397,7 +405,11 @@ public class PlayGameScreen extends Screen { } public void addPlayerControlledWorm() { - userActionHandler.addNewWorm(); + userActionHandler.addNewWorm(false); + } + + public void addComputerControlledWorm() { + userActionHandler.addNewWorm(true); } public void addFood() { @@ -445,4 +457,8 @@ public class PlayGameScreen extends Screen { return programActionHandler; } + public void activateWizard() { + userActionHandler.activateWizard(); + } + } diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/PlayGameScreenDebugPainter.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/PlayGameScreenDebugPainter.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/PlayGameScreenPainter.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/PlayGameScreenPainter.java old mode 100644 new mode 100755 index b8fc34e..a92ebe9 --- a/OGP1718-Worms/src-provided/worms/internal/gui/game/PlayGameScreenPainter.java +++ b/OGP1718-Worms/src-provided/worms/internal/gui/game/PlayGameScreenPainter.java @@ -17,6 +17,7 @@ import worms.internal.gui.GUIUtils; import worms.internal.gui.GameState; import worms.internal.gui.Level; import worms.internal.gui.game.sprites.FoodSprite; +import worms.internal.gui.game.sprites.ProjectileSprite; import worms.internal.gui.game.sprites.WormSprite; import worms.model.World; import worms.util.ModelException; @@ -102,9 +103,18 @@ public class PlayGameScreenPainter extends AbstractPainter { paintWorm(sprite); } + for (ProjectileSprite sprite : getScreen().getSpritesOfType( + ProjectileSprite.class)) { + paintProjectile(sprite); + } + this.currentGraphics = null; } + protected void paintProjectile(ProjectileSprite sprite) { + sprite.draw(currentGraphics); + } + protected void paintFood(FoodSprite sprite) { sprite.draw(currentGraphics); } diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/Sprite.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/Sprite.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/ActivateWizard.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/ActivateWizard.java new file mode 100755 index 0000000..5a0bbd9 --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/ActivateWizard.java @@ -0,0 +1,29 @@ +package worms.internal.gui.game.commands; + +import worms.facade.IFacade; +import worms.internal.gui.game.PlayGameScreen; +import worms.internal.gui.messages.MessageType; +import worms.util.ModelException; + +public class ActivateWizard extends InstantaneousCommand { + + public ActivateWizard(IFacade facade, + PlayGameScreen screen) { + super(facade, screen); + } + + @Override + protected boolean canStart() { + return true; + } + + @Override + protected void doStartExecution() { + try { + getFacade().castSpell(getWorld()); + getScreen().addMessage("The wizard has done wizardry things!", MessageType.INFO); + } catch (ModelException e) { + getScreen().addMessage("The wizard could not cast its spell :(", MessageType.ERROR); + } + } +} \ No newline at end of file diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/AddNewFood.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/AddNewFood.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/AddNewTeam.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/AddNewTeam.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/AddNewWorm.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/AddNewWorm.java old mode 100644 new mode 100755 index 021a848..cf1ba9b --- a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/AddNewWorm.java +++ b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/AddNewWorm.java @@ -1,21 +1,34 @@ package worms.internal.gui.game.commands; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.List; import java.util.Random; import worms.facade.IFacade; import worms.internal.gui.GUIUtils; +import worms.internal.gui.WormsGUI; import worms.internal.gui.game.PlayGameScreen; import worms.internal.gui.messages.MessageType; +import worms.model.Program; import worms.model.Team; +import worms.model.Worm; +import worms.programs.IProgramFactory; +import worms.programs.ParseOutcome; +import worms.programs.ProgramParser; import worms.util.ModelException; public class AddNewWorm extends InstantaneousCommand { private static final double MIN_RADIUS = 0.25; - private static final double MAX_RADIUS = Math.pow(2, 1.0/3.0) * MIN_RADIUS; - - public AddNewWorm(IFacade facade, PlayGameScreen screen) { + private static final double MAX_RADIUS = Math.pow(2, 1.0 / 3.0) * MIN_RADIUS; + private boolean withProgram; + + public AddNewWorm(IFacade facade, boolean withProgram, PlayGameScreen screen) { super(facade, screen); + this.withProgram = withProgram; } @Override @@ -36,10 +49,82 @@ public class AddNewWorm extends InstantaneousCommand { double direction = random.nextDouble() * 2 * Math.PI; Team team = getScreen().getLastCreatedTeam(); - getFacade().createWorm(getWorld(), p, direction, radius, name, team); + Worm worm = getFacade().createWorm(getWorld(), p, direction, radius, name, team); + + if (withProgram) { + loadProgram(worm); + } + } catch (ModelException e) { e.printStackTrace(); getScreen().addMessage("Could not create worm", MessageType.ERROR); } } + + private void loadProgram(Worm worm) { + String programText = readProgramText(); + if (programText != null) { + IProgramFactory factory = getFacade().createProgramFactory(); + ProgramParser parser = ProgramParser.create(factory); + ParseOutcome outcome = parser.parseString(programText); + + if (outcome != null) { + if (outcome.isSuccess()) { + Program program = outcome.getSuccessValue(); + getFacade().loadProgramOnWorm(worm, program, getScreen().getProgramActionHandler()); + } else { + List errors = outcome.getFailValue(); + String msg = "Parsing failed\nwith the following errors:\n"; + for (String error : errors) { + msg += error + "\n"; + } + cancelExecution(); + getGUI().showError(msg); + return; + } + } + } else { + cancelExecution(); + getGUI().showError("Could not parse program"); + } + } + + private WormsGUI getGUI() { + return getScreen().getGUI(); + } + + protected String readProgramText() { + InputStream stream; + try { + stream = GUIUtils.openResource(getGUI().getOptions().programFile); + } catch (IOException e) { + e.printStackTrace(); + getGUI().showError(e.getMessage()); + return null; + } + + BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); + StringBuilder programText = new StringBuilder(); + String line; + try { + line = reader.readLine(); + while (line != null) { + programText.append(line); + programText.append("\n"); + line = reader.readLine(); + } + } catch (IOException e) { + e.printStackTrace(); + cancelExecution(e); + return null; + } finally { + try { + reader.close(); + } catch (IOException e) { + // I don't care + } + } + return programText.toString(); + } + } diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Command.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Command.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Eat.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Eat.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Fire.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Fire.java new file mode 100755 index 0000000..95e7b29 --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Fire.java @@ -0,0 +1,83 @@ +package worms.internal.gui.game.commands; + +import worms.facade.IFacade; +import worms.internal.gui.GUIConstants; +import worms.internal.gui.game.PlayGameScreen; +import worms.internal.gui.game.sprites.ProjectileSprite; +import worms.internal.gui.messages.MessageType; +import worms.model.Projectile; +import worms.model.Worm; +import worms.util.ModelException; + +public class Fire extends Command { + private final Worm worm; + + private Projectile projectile; + private double totalDuration; + private boolean hasJumped; + + public Fire(IFacade facade, Worm worm, PlayGameScreen screen) { + super(facade, screen); + this.worm = worm; + } + + @Override + protected boolean canStart() { + return worm != null; + } + + @Override + protected void doStartExecution() { + try { + projectile = getFacade().fire(worm); + if (projectile != null) { + totalDuration = getFacade().getJumpTime(projectile, GUIConstants.JUMP_TIME_STEP); + ProjectileSprite sprite = new ProjectileSprite(getScreen(), projectile); + sprite.update(); + getScreen().addSprite(sprite); + } else { + cancelExecution(); + } + } catch (ModelException e) { + e.printStackTrace(); + cancelExecution(); + } + } + + @Override + protected void afterExecutionCompleted() { + super.afterExecutionCompleted(); + ProjectileSprite sprite = getScreen().getSpriteOfTypeFor(ProjectileSprite.class, projectile); + if (sprite != null) { + sprite.setDoneMoving(); + } + } + + @Override + protected void afterExecutionCancelled(Throwable e) { + getScreen().addMessage("This worm cannot shoot :(" + (e != null ? "\n" + e.getMessage() : ""), + MessageType.ERROR); + } + + @Override + protected void doUpdate(double dt) { + try { + if (getElapsedTime() >= totalDuration) { + if (!hasJumped) { + hasJumped = true; + getFacade().jump(projectile, GUIConstants.JUMP_TIME_STEP); + completeExecution(); + } + } else { + ProjectileSprite sprite = getScreen().getSpriteOfTypeFor(ProjectileSprite.class, projectile); + + double[] xy = getFacade().getJumpStep(projectile, getElapsedTime()); + + sprite.setCenterLocation(getScreen().getScreenX(xy[0]), getScreen().getScreenY(xy[1])); + } + } catch (ModelException e) { + e.printStackTrace(); + cancelExecution(); + } + } +} \ No newline at end of file diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/InstantaneousCommand.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/InstantaneousCommand.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Jump.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Jump.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Move.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Move.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Rename.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Rename.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/SelectNextWorm.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/SelectNextWorm.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/StartGame.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/StartGame.java old mode 100644 new mode 100755 index 7445771..fdf0375 --- a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/StartGame.java +++ b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/StartGame.java @@ -24,6 +24,7 @@ public class StartGame extends InstantaneousCommand { protected void afterExecutionCancelled(Throwable e) { if (e != null) { getScreen().addMessage("Cannot start the game: " + e.getMessage(), MessageType.ERROR); + e.printStackTrace(); } else { getScreen().addMessage("Cannot start the game without worms", MessageType.ERROR); } diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Turn.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/commands/Turn.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/modes/DefaultInputMode.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/modes/DefaultInputMode.java old mode 100644 new mode 100755 index 39e5d9c..c534583 --- a/OGP1718-Worms/src-provided/worms/internal/gui/game/modes/DefaultInputMode.java +++ b/OGP1718-Worms/src-provided/worms/internal/gui/game/modes/DefaultInputMode.java @@ -55,6 +55,14 @@ public class DefaultInputMode extends InputMode { case 'E': getScreen().eat(); break; + case 'f': + case 'F': + getScreen().fire(); + break; + case 's': + case 'S': + getScreen().activateWizard(); + break; } } diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/modes/EnteringNameMode.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/modes/EnteringNameMode.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/modes/GameOverMode.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/modes/GameOverMode.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/modes/SetupInputMode.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/modes/SetupInputMode.java old mode 100644 new mode 100755 index a3c8517..6d492ce --- a/OGP1718-Worms/src-provided/worms/internal/gui/game/modes/SetupInputMode.java +++ b/OGP1718-Worms/src-provided/worms/internal/gui/game/modes/SetupInputMode.java @@ -24,6 +24,10 @@ public class SetupInputMode extends InputMode { case 'W': getScreen().addPlayerControlledWorm(); break; + case 'c': + case 'C': + getScreen().addComputerControlledWorm(); + break; case 'f': case 'F': getScreen().addFood(); @@ -49,7 +53,12 @@ public class SetupInputMode extends InputMode { getScreen() .showInstructions( g, - "Press\n'T' to create a new team\n'W' to add a new worm\n'F' to add food\n'S' to start the game"); + "Press\n" + + "'T' to create a new team\n" + + "'W' to add a new player-controlled worm\n" + + "'C' to add a new computer-controlled worm\n" + + "'F' to add food\n" + + "'S' to start the game"); } } diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/modes/TurningMode.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/modes/TurningMode.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/sprites/FoodSprite.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/sprites/FoodSprite.java old mode 100644 new mode 100755 index e990efa..e2f091e --- a/OGP1718-Worms/src-provided/worms/internal/gui/game/sprites/FoodSprite.java +++ b/OGP1718-Worms/src-provided/worms/internal/gui/game/sprites/FoodSprite.java @@ -1,5 +1,8 @@ package worms.internal.gui.game.sprites; +import java.awt.Image; +import java.awt.image.BufferedImage; + import worms.internal.gui.game.ImageSprite; import worms.internal.gui.game.PlayGameScreen; import worms.model.Food; @@ -12,10 +15,22 @@ public class FoodSprite extends ImageSprite { private final Food food; private double radius; + + private boolean poisonous = false; + + // original image, at original scale + private final BufferedImage originalPoisonousImage; + + // only created when scale != 1.0 + private BufferedImage scaledPoisonousImage; public FoodSprite(PlayGameScreen screen, Food food) { super(screen, "images/burger.png"); this.food = food; + // constraint: must have same dimensions as original image + // constraint: does not respect hflipping + this.originalPoisonousImage = loadImage("images/burger-poisonous.png"); + this.scaledPoisonousImage = this.originalPoisonousImage; update(); } @@ -45,9 +60,52 @@ public class FoodSprite extends ImageSprite { setScale(scaleFactor); } + + @Override + public void setScale(double newScale) { + double oldScale = getScale(); + + super.setScale(newScale); + + if (newScale == oldScale) { + return; + } + + if (newScale != 1.0) { + this.scaledPoisonousImage = toBufferedImage(originalPoisonousImage.getScaledInstance( + (int) (newScale * originalPoisonousImage.getWidth()), + (int) (newScale * originalPoisonousImage.getHeight()), + Image.SCALE_SMOOTH)); + } else { + this.scaledPoisonousImage = originalPoisonousImage; + } + } + + + @Override + protected Image getImageToDraw() { + if (isPoisonous()) { + return scaledPoisonousImage; + } else { + return super.getImageToDraw(); + } + } + + public synchronized double getRadius() { + return radius; + } + + public synchronized boolean isPoisonous() { + return poisonous; + } + + public void setPoisonous(boolean poisonous) { + this.poisonous = poisonous; + } @Override public synchronized void update() { + setPoisonous(getFacade().isPoisonous(getFood())); setRadius(getFacade().getRadius(getFood())); double[] xy = getFacade().getLocation(getFood()); setCenterLocation(getScreen().getScreenX(xy[0]), getScreen().getScreenY(xy[1])); @@ -67,8 +125,5 @@ public class FoodSprite extends ImageSprite { return !getFacade().isTerminated(food); } - public synchronized double getRadius() { - return radius; - } } diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/sprites/ProjectileSprite.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/sprites/ProjectileSprite.java new file mode 100755 index 0000000..c166da1 --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/internal/gui/game/sprites/ProjectileSprite.java @@ -0,0 +1,143 @@ +package worms.internal.gui.game.sprites; + +import java.awt.Color; +import java.awt.Graphics2D; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; + +import worms.internal.gui.GUIUtils; +import worms.internal.gui.game.PlayGameScreen; +import worms.internal.gui.game.Sprite; +import worms.model.Projectile; + +public class ProjectileSprite extends Sprite { + + private static final int MIN_DISPLAY_SIZE = 3; // pixels + private static final int MAX_DISPLAY_SIZE = 10; // pixels + private static final int DISPLAY_SCALE = 10; + + private static final int NB_HISTORY = 15; + private static final Color[] colors = new Color[NB_HISTORY]; + static { + for (int i = 0; i < colors.length; i++) { + float t = (float) i / colors.length; + colors[i] = new Color(1.0F, (1 - t), 0, 0.8F); + } + } + + private final Projectile projectile; + + private double sizeInPixels; + + @SuppressWarnings("serial") + private static class LimitedQueue extends LinkedList { + private int limit; + + public LimitedQueue(int limit) { + this.limit = limit; + } + + @Override + public boolean add(E o) { + boolean result = super.add(o); + while (size() > limit) { + super.remove(); + } + return result; + } + } + + private final List lastLocations = Collections.synchronizedList(new LimitedQueue( + NB_HISTORY)); + private boolean moving; + + public ProjectileSprite(PlayGameScreen screen, Projectile projectile) { + super(screen); + this.projectile = projectile; + this.moving = true; + } + + @Override + public synchronized void draw(Graphics2D g) { + if (moving) { + for (int i = 0; i < lastLocations.size(); i++) { + double[] loc = lastLocations.get(i); + g.setColor(colors[i]); + double t = (double) (i + 1) / lastLocations.size(); + double size = sizeInPixels * t * t * t; + g.fill(GUIUtils.circleAt(loc[0], loc[1], size)); + } + } else { + g.setColor(colors[NB_HISTORY-1]); + g.fill(GUIUtils.circleAt(getCenterX(), getCenterY(), sizeInPixels)); + } + } + + @Override + public Projectile getObject() { + return getProjectile(); + } + + public Projectile getProjectile() { + return projectile; + } + + public synchronized void setSize(double sizeInPixels) { + this.sizeInPixels = Math.min(MAX_DISPLAY_SIZE, + Math.max(MIN_DISPLAY_SIZE, DISPLAY_SCALE * sizeInPixels)); + } + + @Override + public double getHeight(Graphics2D g) { + return sizeInPixels; + } + + @Override + public double getWidth(Graphics2D g) { + return sizeInPixels; + } + + @Override + public boolean isObjectAlive() { + return !getFacade().isTerminated(getProjectile()); + } + + @Override + public synchronized void update() { + setSize(getScreen().worldToScreenDistance(getFacade().getRadius(getProjectile()))); + double[] loc = getFacade().getLocation(getProjectile()); + setCenterLocation(getScreen().getScreenX(loc[0]), getScreen().getScreenY(loc[1])); + } + + @Override + public synchronized void setCenterLocation(double x, double y) { + super.setCenterLocation(x, y); + if (moving && !lastLocations.isEmpty()) { + // do some averaving to show some intermediate positions for + // fast-moving object (rifle projectiles) + + if (lastLocations.size() > 1) { + double[] c1 = lastLocations.get(lastLocations.size() - 1); + double[] c2 = lastLocations.get(0); + lastLocations.add(new double[] { (c1[0] + c2[0]) / 2, + (c1[1] + c2[1]) / 2 }); + } + double[] prev = lastLocations.get(lastLocations.size() - 1); + lastLocations.remove(prev); + + for (int i = 0; i < NB_HISTORY; i++) { + if (prev != null) { + double t = (double) i / (NB_HISTORY); + lastLocations.add(new double[] { t * x + (1 - t) * prev[0], + t * y + (1 - t) * prev[1] }); + } + } + } + lastLocations.add(new double[] { x, y }); + } + + public synchronized void setDoneMoving() { + this.moving = false; + } +} diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/game/sprites/WormSprite.java b/OGP1718-Worms/src-provided/worms/internal/gui/game/sprites/WormSprite.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/menu/AbstractMenuScreen.java b/OGP1718-Worms/src-provided/worms/internal/gui/menu/AbstractMenuScreen.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/menu/ChooseLevelScreen.java b/OGP1718-Worms/src-provided/worms/internal/gui/menu/ChooseLevelScreen.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/menu/MainMenuScreen.java b/OGP1718-Worms/src-provided/worms/internal/gui/menu/MainMenuScreen.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/menu/MenuInputMode.java b/OGP1718-Worms/src-provided/worms/internal/gui/menu/MenuInputMode.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/messages/Message.java b/OGP1718-Worms/src-provided/worms/internal/gui/messages/Message.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/messages/MessageDisplay.java b/OGP1718-Worms/src-provided/worms/internal/gui/messages/MessageDisplay.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/messages/MessagePainter.java b/OGP1718-Worms/src-provided/worms/internal/gui/messages/MessagePainter.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/internal/gui/messages/MessageType.java b/OGP1718-Worms/src-provided/worms/internal/gui/messages/MessageType.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/programs/IProgramFactory.java b/OGP1718-Worms/src-provided/worms/programs/IProgramFactory.java new file mode 100755 index 0000000..c2b4acf --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/IProgramFactory.java @@ -0,0 +1,443 @@ +package worms.programs; + +import java.util.ArrayList; +import java.util.List; + +import worms.util.ModelException; +import worms.util.MustNotImplementException; + +/** + * A program factory is used by the parser ({@link ProgramParser}) to construct + * an in-memory representation of your program. For example, when reading the + * program source code + * + *
    + * print 2.0
    + * 
    + * + * the parser will create a Program object by (conceptually) executing the + * following code: + * + *
    + * factory.createProgram(Collections.emptyList(),
    + * 		factory.createPrintStatement(factory.createDoubleLiteral(2.0)));
    + * 
    + * + * on the returned factory object. + * + *

    + * For testing, you may use the methods from {@link ProgramParser} yourself. + *

    + * + *

    + * You should declare your class as follows:

    + * public class ProgramFactory implements IProgramFactory<MyExpression, MyStatement, MyProc, Program>
    + * 
    where MyExpression, MyStatement, MyProc, and Program are your classes + * for representing expressions, statements, procedure definitions, and programs, + * respectively. + * + *

    + * The SourceLocation object in the methods defined by this factory refers to + * the location (line and column) in the text file where the statement or + * expression begins. + * + * @param + * Your class for representing an expression. + * @param + * Your class for representing a statement. + * @param

    + * Your class for representing a procedure. + * @param + * Your class for representing a program (should be Program). + * + * + */ +public interface IProgramFactory { + + /* PROGRAM */ + + /** + * Create a program from the given arguments. + * + * @param procs + * The procedure definitions for the program. + * @param main + * The main statement of the program. Most likely this is a + * sequence statement. + * @return A new program. + */ + public Program createProgram(List

    procs, S main) throws ModelException; + + /** + * Create a program from the given argument. + * + * @param main + * The main statement of the program. Most likely this is a + * sequence statement. + * @return A new program without procedure definitions. + */ + public default Program createProgram(S main) throws ModelException { + return createProgram(new ArrayList

    (), main); + } + + /* PROCEDURE DEFINITIONS */ + + /** + * Create a procedure definition with the given name and body. + * + * @param procedureName + * The name of the procedure + * @param body + * The body of the procedure. + */ + public P createProcedureDefinition(String procedureName, S body, SourceLocation sourceLocation); + + /* STATEMENTS */ + + /** + * Create a statement that assigns the value obtained by evaluating the + * given expression to a variable with the given name. + */ + public S createAssignmentStatement(String variableName, E value, SourceLocation sourceLocation) + throws ModelException; + + /** + * Create a print statement that prints the value obtained by evaluating the + * given expression. + */ + public S createPrintStatement(E value, SourceLocation sourceLocation) throws ModelException; + + /** + * Create a turn statement that makes the worm that is executing the program + * turn by the amount obtained by evaluating the given expression. + */ + public S createTurnStatement(E angle, SourceLocation location) throws ModelException; + + /** + * Create a statement that makes the worm that is executing the program move + * one step. + */ + public S createMoveStatement(SourceLocation location) throws ModelException; + + /** + * Returns a statement that makes the worm that is executing the program jump. + */ + public S createJumpStatement(SourceLocation location) throws ModelException; + + /** + * Returns a statement that makes the worm that is executing the program eat. + */ + public S createEatStatement(SourceLocation location); + + /** + * Returns a statement that makes the worm that is executing the program fire + * a weapon. + */ + public S createFireStatement(SourceLocation location) throws ModelException; + + /** + * Create a sequence of statements involving the given list of statements. + */ + public S createSequenceStatement(List statements, SourceLocation sourceLocation) throws ModelException; + + /** + * Create an if-then-else statement involving the given condition and the + * given then-part and else-part. + * The else-part may be null. + */ + public S createIfStatement(E condition, S ifBody, S elseBody, SourceLocation sourceLocation) throws ModelException; + + /** + * Create a while statement involving the given condition and given body. + */ + public S createWhileStatement(E condition, S body, SourceLocation sourceLocation) throws ModelException; + + /** + * Create a break statement. + */ + public default S createBreakStatement(SourceLocation sourceLocation) + throws ModelException, MustNotImplementException { + // Individual students must not work out this method. + throw new MustNotImplementException(); + } + + /** + * Create an invoke statement that invokes the procedure with the given name. + */ + public default S createInvokeStatement(String procedureName, SourceLocation sourceLocation) + throws ModelException, MustNotImplementException { + // Individual students must not work out this method. + throw new MustNotImplementException(); + } + + /* EXPRESSIONS */ + + /** + * Create an expression that evaluates to the current value of the given + * variable. + */ + public E createReadVariableExpression(String variableName, SourceLocation sourceLocation) throws ModelException; + + /** + * Creates an expression that represents a literal double value. + */ + public E createDoubleLiteralExpression(double value, SourceLocation location) throws ModelException; + + /** + * Creates an expression that represents a literal boolean value. + */ + public E createBooleanLiteralExpression(boolean value, SourceLocation location) throws ModelException; + + /** + * Creates an expression that represents the null value. + */ + public E createNullExpression(SourceLocation location) throws ModelException; + + /** + * Creates an expression that represents the self value, evaluating to the + * worm that executes the program. + */ + public E createSelfExpression(SourceLocation location) throws ModelException; + + /** + * Returns an expression that evaluates to the addition of the values + * obtained by evaluating the given left and second expressions. + */ + public E createAdditionExpression(E left, E right, SourceLocation location) throws ModelException; + + /** + * Returns an expression that evaluates to the subtraction of the values + * obtained by evaluating the first and second given expressions. + */ + public default E createSubtractionExpression(E left, E right, SourceLocation location) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to the multiplication of the values + * obtained by evaluating the first and second given expressions. + */ + public default E createMultiplicationExpression(E left, E right, SourceLocation location) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to the division of the values + * obtained by evaluating the first and second given expressions. + */ + public default E createDivisionExpression(E left, E right, SourceLocation location) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to the square root of the value + * obtained by evaluating the given expression. + */ + public default E createSqrtExpression(E e, SourceLocation location) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to the sine of the value + * obtained by evaluating the given expression. + */ + public default E createSinExpression(E e, SourceLocation location) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to the cosine of the value + * obtained by evaluating the given expression. + */ + public default E createCosExpression(E e, SourceLocation location) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to the conjunction of the values + * obtained by evaluating the given left and right expressions. + */ + public E createAndExpression(E left, E right, SourceLocation sourceLocation) throws ModelException; + + /** + * Returns an expression that evaluates to the disjunction of the values + * obtained by evaluating the given left and right expressions. + */ + public default E createOrExpression(E left, E right, SourceLocation sourceLocation) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to true when the given expression + * evaluates to false, and vice versa. + */ + public E createNotExpression(E expression, SourceLocation sourceLocation) throws ModelException; + + /** + * Returns an expression that evaluates to true if the evaluation of the + * left expression yields a value that is equal to the value obtained by + * evaluating the right expression. + */ + public E createEqualityExpression(E left, E right, SourceLocation location) throws ModelException; + + /** + * Returns an expression that evaluates to true if the evaluation of the + * left expression yields a value that is different from the value obtained by + * evaluating the right expression. + */ + public default E createInequalityExpression(E left, E right, SourceLocation sourceLocation) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to true if the evaluation of the + * left expression yields a value that is less than the value obtained by + * evaluating the right expression. + */ + public E createLessThanExpression(E left, E right, SourceLocation location); + + /** + * Returns an expression that evaluates to true if the evaluation of the + * left expression yields a value that is less than or equal to the value obtained by + * evaluating the right expression. + */ + public default E createLessThanOrEqualExpression(E left, E right, SourceLocation sourceLocation) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to true if the evaluation of the + * left expression yields a value that is greater than the value obtained by + * evaluating the right expression. + */ + public default E createGreaterThanExpression(E left, E right, SourceLocation sourceLocation) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to true if the evaluation of the + * left expression yields a value that is greater than or equal to the value obtained by + * evaluating the right expression. + */ + public default E createGreaterThanOrEqualExpression(E left, E right, SourceLocation sourceLocation) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to the position along the x-axis of + * the game object to which the given expression evaluates. + */ + public default E createGetXExpression(E e, SourceLocation location) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to the position along the y-axis of + * the game object to which the given expression evaluates. + */ + public default E createGetYExpression(E e, SourceLocation location) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to the radius of the game object to which + * the given expression evaluates. + */ + public default E createGetRadiusExpression(E e, SourceLocation location) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to the direction of the game object to which + * the given expression evaluates. + */ + public default E createGetDirectionExpression(E entity, SourceLocation location) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to the number of action points of the worm to which + * the given expression evaluates. + */ + public default E createGetActionPointsExpression(E entity, SourceLocation sourceLocation) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to the maximum number of action points of the worm to which + * the given expression evaluates. + */ + public default E createGetMaxActionPointsExpression(E entity, SourceLocation sourceLocation) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to the number of hit points of the game object to which + * the given expression evaluates. + */ + public default E createHitPointsExpression(E entity, SourceLocation sourceLocation) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + public E createSearchObjectExpression(E angleDelta, SourceLocation sourceLocation) throws ModelException; + + /** + * Returns an expression that evaluates to a boolean reflecting whether or not + * the executing worm belongs to the same team as the worm to which the given + * expression evaluates. + */ + public default E createSameTeamExpression(E entity, SourceLocation sourceLocation) + throws ModelException, MustNotImplementException { + // Individual students must not work out this method. + throw new MustNotImplementException(); + } + + /** + * Returns an expression that evaluates to the distance between the executing worm + * and the game object to which the given expression evaluates. + */ + public E createDistanceExpression(E entity, SourceLocation sourceLocation) throws ModelException; + + /** + * Returns a boolean indicating whether or not the object to which the given + * expression evaluates is a worm. + */ + public E createIsWormExpression(E entity, SourceLocation sourceLocation) throws ModelException; + + /** + * Returns a boolean indicating whether or not the object to which the given + * expression evaluates is a portion of food. + */ + public default E createIsFoodExpression(E entity, SourceLocation sourceLocation) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + + /** + * Returns a boolean indicating whether or not the object to which the given + * expression evaluates is a projectile. + */ + public default E createIsProjectileExpression(E entity, SourceLocation sourceLocation) + throws ModelException, MustNotImplementException { + throw new MustNotImplementException(); + } + +} diff --git a/OGP1718-Worms/src-provided/worms/programs/ParseOutcome.java b/OGP1718-Worms/src-provided/worms/programs/ParseOutcome.java new file mode 100755 index 0000000..ec6d287 --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/ParseOutcome.java @@ -0,0 +1,20 @@ +package worms.programs; + +import java.util.List; + +import worms.programs.SuccessOrFail.WrappedSuccessOrFail; + +public class ParseOutcome

    extends WrappedSuccessOrFail> { + + private ParseOutcome(SuccessOrFail> outcome) { + super(outcome); + } + + public static

    ParseOutcome

    success(P p) { + return new ParseOutcome<>(DefaultSuccessOrFail.success(p)); + } + + public static

    ParseOutcome

    failure(List errors) { + return new ParseOutcome<>(DefaultSuccessOrFail.failure(errors)); + } +} \ No newline at end of file diff --git a/OGP1718-Worms/src-provided/worms/programs/ProgramParser.java b/OGP1718-Worms/src-provided/worms/programs/ProgramParser.java new file mode 100755 index 0000000..877b01c --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/ProgramParser.java @@ -0,0 +1,245 @@ +package worms.programs; + +import java.io.IOException; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.antlr.v4.runtime.BaseErrorListener; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.CharStreams; +import org.antlr.v4.runtime.CommonTokenStream; +import org.antlr.v4.runtime.RecognitionException; +import org.antlr.v4.runtime.Recognizer; + +import worms.programs.IProgramFactory; +import worms.programs.internal.parser.ParserVisitor; +import worms.programs.internal.parser.generated.WormsProgramLexer; +import worms.programs.internal.parser.generated.WormsProgramParser; +import worms.internal.gui.GUIUtils; +import worms.model.Program; + +/** + * Parser for Worms programs. + * + * To use this class, first create an implementation of {@link IProgramFactory}: + * + *

    + * 
    + * IProgramFactory<MyExpression, MyStatement, MyProcedure, Program> factory = new ProgramFactory();
    + * 
    + * 
    + * + * The easiest way to use this class for parsing a Program given as a String is + * via the {@link #parseProgramFromString(String, IProgramFactory)} method: + * + *
    + * 
    + * Program program = ProgramParser.parseProgram(text, factory);
    + * 
    + * 
    + * + * For more control, create an instance of this class: + * + *
    + * 
    + * ProgramParser<MyExpression, MyStatement, Task> parser = new ProgramParser<>(factory);
    + * 
    + * 
    + * + * Finally, parse a string or file:
    + * ParseOurcome<Program> parseResult = parser.parse(textToParse);
    + * 
    + * + * If parsing is successful, parseResult.isSuccess() returns true + * and parseResult.getSuccessValue() returns the created program. + * + * If parsing was not successful, parseResult.ifSuccess() returns + * false and parseResult.getFailValue() returns the list of errors + * during parsing. + * + * + * @param E + * The type of expressions + * @param S + * The type of statements + * @param P + * The type of procedures + * @param Prg + * The type of program that is created; should be your + * worms.model.Program class + */ +public class ProgramParser { + + private final IProgramFactory factory; + + private final List errors = new ArrayList<>(); + + protected ProgramParser(IProgramFactory factory) { + if (factory == null) { + throw new NullPointerException("Factory must be effective."); + } + this.factory = factory; + } + + public IProgramFactory getFactory() { + return factory; + } + + /** + * Returns the program that results from parsing the given string, or + * Optional.empty() if parsing has failed. + * + * When parsing has failed, the error messages can be retrieved with the + * getErrors() method. + * + */ + public ParseOutcome parseString(String string) { + return parse(CharStreams.fromString(string)); + } + + /** + * Returns the program that results from parsing the file with the given name, + * or Optional.empty() if parsing has failed. + * + * When parsing has failed, the error messages can be retrieved with the + * getErrors() method. + */ + public ParseOutcome parseFile(String filename) throws IOException { + return parse(CharStreams.fromStream(GUIUtils.openResource(filename))); + } + + /** + * Returns the program that results from parsing the file with the given URL, or + * Optional.empty() if parsing has failed. + * + * When parsing has failed, the error messages can be retrieved with the + * getErrors() method. + */ + public ParseOutcome parseFile(URL url) throws IOException { + return parse(CharStreams.fromStream(GUIUtils.openResource(url))); + } + + /** + * Returns the program that results from parsing the given CharStream, or + * Optional.empty() if parsing has failed. + * + * When parsing has failed, the error messages can be retrieved with the + * getErrors() method. + * + * @note For more convenient methods, see the + * {@link #parseProgramFromString(String, ITaskFactory, List)}, + * {@link #parseProgramFromFile(String, ITaskFactory, List)}, + * {@link #parseString(String, List)} and {@link #parseFile(String, List)} + * methods. + */ + protected ParseOutcome parse(CharStream input) { + reset(); + + WormsProgramLexer lexer = new WormsProgramLexer(input); + WormsProgramParser parser = new WormsProgramParser(new CommonTokenStream(lexer)); + parser.addErrorListener(new BaseErrorListener() { + @Override + public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, + int charPositionInLine, String msg, RecognitionException e) { + errors.add(msg + " (" + line + ", " + charPositionInLine + ")"); + } + }); + ParserVisitor visitor = new ParserVisitor<>(factory); + try { + visitor.visitProgram(parser.program()); + if (errors.isEmpty()) { + assert visitor.getMain() != null; + Prg program = factory.createProgram(visitor.getProcedures(), visitor.getMain()); + if (program != null) { + return ParseOutcome.success(program); + } + errors.add("Factory did not return a Program object"); + } + } catch (Exception e) { + e.printStackTrace(); + errors.add(e.toString()); + } + return ParseOutcome.failure(errors); + } + + protected void reset() { + this.errors.clear(); + } + + public List getErrors() { + return Collections.unmodifiableList(errors); + } + + /** + * Create a new parser from the given factory. + * + * @param factory + * @return + */ + public static ProgramParser create(IProgramFactory factory) { + return new ProgramParser<>(factory); + } + + /** + * Parse program text using the given factory. + * + * @param text + * The text to parse + * @param factory + * The factory to use + * @return The parsed program, if any, or null if an error occurred during + * parsing. + */ + public static Program parseProgramFromString(String text, IProgramFactory factory) { + ProgramParser parser = create(factory); + ParseOutcome outcome = parser.parseString(text); + if (outcome.isFail()) { + System.out.println("Parsing failed: " + outcome.getFailValue()); + return null; + } + return outcome.getSuccessValue(); + } + + /** + * Parse program from a file using the given factory. + * + * @param filename + * The filename from which to read the program text + * @param factory + * The factory to use + * @return The parsed program, if any, or null if an error occurred during + * parsing. + */ + public static Program parseProgramFromFile(String filename, IProgramFactory factory) + throws IOException { + ProgramParser parser = create(factory); + ParseOutcome outcome = parser.parseFile(filename); + if (outcome.isFail()) { + System.out.println("Parsing failed: " + outcome.getFailValue()); + return null; + } + return outcome.getSuccessValue(); + } + + /** + * Parse program from a file using the given factory. + * + * @param filename + * The filename from which to read the program text + * @param factory + * The factory to use + * @return The parsed program, if any, or null if an error occurred during + * parsing. + */ + public static Program parseProgramFromURL(URL url, IProgramFactory factory) throws IOException { + ProgramParser parser = create(factory); + ParseOutcome outcome = parser.parseFile(url); + if (outcome.isFail()) { + System.out.println("Parsing failed: " + outcome.getFailValue()); + return null; + } + return outcome.getSuccessValue(); + } +} diff --git a/OGP1718-Worms/src-provided/worms/programs/SourceLocation.java b/OGP1718-Worms/src-provided/worms/programs/SourceLocation.java new file mode 100755 index 0000000..9ab882f --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/SourceLocation.java @@ -0,0 +1,61 @@ +package worms.programs; + +import be.kuleuven.cs.som.annotate.Value; + +/** + * A source location represents a position in a source file, + * denoted by the line and column (position in the line) of + * a certain character in the file. + * + * This class is a value class. + */ +@Value +public final class SourceLocation { + + private final int line; + private final int column; + + public SourceLocation(int line, int column) { + this.line = line; + this.column = column; + } + + public int getLine() { + return line; + } + + public int getColumn() { + return column; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + column; + result = prime * result + line; + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + SourceLocation other = (SourceLocation) obj; + if (column != other.column) + return false; + if (line != other.line) + return false; + return true; + } + + @Override + public String toString() { + return String.format("@%d,%d", line, column); + } + +} diff --git a/OGP1718-Worms/src-provided/worms/programs/SuccessOrFail.java b/OGP1718-Worms/src-provided/worms/programs/SuccessOrFail.java new file mode 100755 index 0000000..211b391 --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/SuccessOrFail.java @@ -0,0 +1,100 @@ +package worms.programs; + +/** + * An interface that holds either a success value of type S or a failure value of type F. + */ +public interface SuccessOrFail { + + public boolean isSuccess(); + + public S getSuccessValue(); + + public F getFailValue(); + + public default boolean isFail() { + return !isSuccess(); + } + + public static class DefaultSuccessOrFail implements SuccessOrFail { + private final boolean success; + private final F failValue; + private final S successValue; + + private DefaultSuccessOrFail(boolean success, S successValue, F failValue) { + if (success && failValue != null) { + throw new IllegalArgumentException(); + } + if (!success && successValue != null) { + throw new IllegalArgumentException(); + } + this.success = success; + this.successValue = successValue; + this.failValue = failValue; + } + + @Override + public boolean isSuccess() { + return success; + } + + @Override + public F getFailValue() { + return failValue; + } + + @Override + public S getSuccessValue() { + return successValue; + } + + public static SuccessOrFail success(S successValue) { + return new DefaultSuccessOrFail<>(true, successValue, null); + } + + public static SuccessOrFail failure(F failValue) { + return new DefaultSuccessOrFail<>(false, null, failValue); + } + + @Override + public String toString() { + if (isSuccess()) { + return "SUCCESS value: " + getSuccessValue(); + } else { + return "FAIL value: " + getFailValue(); + } + } + + } + + public static class WrappedSuccessOrFail implements SuccessOrFail { + private final SuccessOrFail wrapped; + + protected WrappedSuccessOrFail(SuccessOrFail wrapped) { + if (wrapped == null) { + throw new NullPointerException(); + } + this.wrapped = wrapped; + } + + @Override + public boolean isSuccess() { + return wrapped.isSuccess(); + } + + @Override + public S getSuccessValue() { + return wrapped.getSuccessValue(); + } + + @Override + public F getFailValue() { + return wrapped.getFailValue(); + } + + @Override + public String toString() { + return wrapped.toString(); + } + + } +} \ No newline at end of file diff --git a/OGP1718-Worms/src-provided/worms/programs/internal/parser/ParserVisitor.java b/OGP1718-Worms/src-provided/worms/programs/internal/parser/ParserVisitor.java new file mode 100755 index 0000000..55fc02c --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/internal/parser/ParserVisitor.java @@ -0,0 +1,392 @@ +package worms.programs.internal.parser; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.Token; + +import worms.programs.IProgramFactory; +import worms.programs.SourceLocation; +import worms.programs.internal.parser.generated.WormsProgramBaseVisitor; +import worms.programs.internal.parser.generated.WormsProgramLexer; +import worms.programs.internal.parser.generated.WormsProgramParser.AddSubExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.AndOrExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.AssignmentStatementContext; +import worms.programs.internal.parser.generated.WormsProgramParser.BreakStatementContext; +import worms.programs.internal.parser.generated.WormsProgramParser.ComparisonExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.ConstantExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.CosExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.DistanceExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.EatActionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.FalseLiteralExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.FireActionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.GetAPExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.GetDirectionExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.GetHPExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.GetMaxAPExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.GetRadiusExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.GetXExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.GetYExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.IfStatementContext; +import worms.programs.internal.parser.generated.WormsProgramParser.InvokeStatementContext; +import worms.programs.internal.parser.generated.WormsProgramParser.IsFoodExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.IsProjectileExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.IsWormExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.JumpActionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.MoveActionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.MulDivExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.NotExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.NullExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.ParenExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.PrintStatementContext; +import worms.programs.internal.parser.generated.WormsProgramParser.ProceduredefContext; +import worms.programs.internal.parser.generated.WormsProgramParser.ProgramContext; +import worms.programs.internal.parser.generated.WormsProgramParser.ReadVariableExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.SameTeamExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.SearchObjExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.SelfExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.SequenceStatementContext; +import worms.programs.internal.parser.generated.WormsProgramParser.SinExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.SqrtExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.TrueLiteralExpressionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.TurnActionContext; +import worms.programs.internal.parser.generated.WormsProgramParser.WhileStatementContext; + +public class ParserVisitor extends WormsProgramBaseVisitor { + + @Override + public Void visitProgram(ProgramContext ctx) { + procedures = ctx.procdef.stream().map(procdef -> procDefVisitor.visit(procdef)).collect(Collectors.toList()); + List mainStmts = ctx.programBody.stream().map(stmt -> statementVisitor.visit(stmt)) + .collect(Collectors.toList()); + if (mainStmts.size() == 1) { + main = mainStmts.get(0); + } else { + main = factory.createSequenceStatement(mainStmts, toSourceLocation(ctx)); + } + assert main != null; + return null; + } + + private class ProcedureDefinitionVisitor extends WormsProgramBaseVisitor

    { + + @Override + public P visitProceduredef(ProceduredefContext ctx) { + return getFactory().createProcedureDefinition(ctx.procname.getText(), statementVisitor.visit(ctx.body), + toSourceLocation(ctx)); + } + } + + private class StatementVisitor extends WormsProgramBaseVisitor { + + @Override + public S visitAssignmentStatement(AssignmentStatementContext ctx) { + return getFactory().createAssignmentStatement(ctx.variableName.getText(), + expressionVisitor.visit(ctx.value), toSourceLocation(ctx)); + } + + @Override + public S visitWhileStatement(WhileStatementContext ctx) { + return getFactory().createWhileStatement(expressionVisitor.visit(ctx.condition), + statementVisitor.visit(ctx.body), toSourceLocation(ctx)); + } + + @Override + public S visitIfStatement(IfStatementContext ctx) { + S ifBody = statementVisitor.visit(ctx.ifbody); + S elseBody = null; + if (ctx.elsebody != null) + elseBody = statementVisitor.visit(ctx.elsebody); + return getFactory().createIfStatement(expressionVisitor.visit(ctx.condition), ifBody, elseBody, + toSourceLocation(ctx)); + } + + @Override + public S visitPrintStatement(PrintStatementContext ctx) { + return getFactory().createPrintStatement(expressionVisitor.visit(ctx.value), toSourceLocation(ctx)); + } + + @Override + public S visitSequenceStatement(SequenceStatementContext ctx) { + if (ctx.stmts.size() != 1) { + return getFactory().createSequenceStatement( + ctx.stmts.stream().map(this::visit).collect(Collectors.toList()), toSourceLocation(ctx)); + } else { + return visit(ctx.stmts.get(0)); + } + } + + @Override + public S visitInvokeStatement(InvokeStatementContext ctx) { + return getFactory().createInvokeStatement(ctx.procName.getText(), toSourceLocation(ctx)); + } + + @Override + public S visitBreakStatement(BreakStatementContext ctx) { + return getFactory().createBreakStatement(toSourceLocation(ctx)); + } + + @Override + public S visitTurnAction(TurnActionContext ctx) { + return getFactory().createTurnStatement(expressionVisitor.visit(ctx.angle), toSourceLocation(ctx)); + } + + @Override + public S visitMoveAction(MoveActionContext ctx) { + return getFactory().createMoveStatement(toSourceLocation(ctx)); + } + + @Override + public S visitJumpAction(JumpActionContext ctx) { + return getFactory().createJumpStatement(toSourceLocation(ctx)); + } + + @Override + public S visitEatAction(EatActionContext ctx) { + return getFactory().createEatStatement(toSourceLocation(ctx)); + } + + @Override + public S visitFireAction(FireActionContext ctx) { + return getFactory().createFireStatement(toSourceLocation(ctx)); + } + + } + + private class ExpressionVisitor extends WormsProgramBaseVisitor { + + @Override + public E visitReadVariableExpression(ReadVariableExpressionContext ctx) { + return getFactory().createReadVariableExpression(ctx.variable.getText(), toSourceLocation(ctx)); + } + + @Override + public E visitConstantExpression(ConstantExpressionContext ctx) { + return getFactory().createDoubleLiteralExpression(Double.parseDouble(ctx.value.getText()), + toSourceLocation(ctx)); + } + + @Override + public E visitTrueLiteralExpression(TrueLiteralExpressionContext ctx) { + return getFactory().createBooleanLiteralExpression(true, toSourceLocation(ctx)); + } + + @Override + public E visitFalseLiteralExpression(FalseLiteralExpressionContext ctx) { + return getFactory().createBooleanLiteralExpression(false, toSourceLocation(ctx)); + } + + @Override + public E visitNullExpression(NullExpressionContext ctx) { + return getFactory().createNullExpression(toSourceLocation(ctx)); + } + + @Override + public E visitSelfExpression(SelfExpressionContext ctx) { + return getFactory().createSelfExpression(toSourceLocation(ctx)); + } + + @Override + public E visitParenExpression(ParenExpressionContext ctx) { + return expressionVisitor.visit(ctx.subExpr); + } + + @Override + public E visitAddSubExpression(AddSubExpressionContext ctx) { + switch (ctx.op.getType()) { + case WormsProgramLexer.ADD: + return getFactory().createAdditionExpression(expressionVisitor.visit(ctx.left), + expressionVisitor.visit(ctx.right), toSourceLocation(ctx)); + case WormsProgramLexer.SUB: + return getFactory().createSubtractionExpression(expressionVisitor.visit(ctx.left), + expressionVisitor.visit(ctx.right), toSourceLocation(ctx)); + default: + throw new IllegalArgumentException("Unknown operator: " + ctx.op); + } + } + + @Override + public E visitMulDivExpression(MulDivExpressionContext ctx) { + switch (ctx.op.getType()) { + case WormsProgramLexer.MUL: + return getFactory().createMultiplicationExpression(expressionVisitor.visit(ctx.left), + expressionVisitor.visit(ctx.right), toSourceLocation(ctx)); + case WormsProgramLexer.DIV: + return getFactory().createDivisionExpression(expressionVisitor.visit(ctx.left), + expressionVisitor.visit(ctx.right), toSourceLocation(ctx)); + default: + throw new IllegalArgumentException("Unknown operator: " + ctx.op); + } + } + + @Override + public E visitSqrtExpression(SqrtExpressionContext ctx) { + return getFactory().createSqrtExpression(expressionVisitor.visit(ctx.expr), toSourceLocation(ctx)); + } + + @Override + public E visitSinExpression(SinExpressionContext ctx) { + return getFactory().createSinExpression(expressionVisitor.visit(ctx.expr), toSourceLocation(ctx)); + } + + @Override + public E visitCosExpression(CosExpressionContext ctx) { + return getFactory().createCosExpression(expressionVisitor.visit(ctx.expr), toSourceLocation(ctx)); + } + + @Override + public E visitAndOrExpression(AndOrExpressionContext ctx) { + switch (ctx.op.getType()) { + case WormsProgramLexer.AND: + return getFactory().createAndExpression(expressionVisitor.visit(ctx.left), + expressionVisitor.visit(ctx.right), toSourceLocation(ctx)); + case WormsProgramLexer.OR: + return getFactory().createOrExpression(expressionVisitor.visit(ctx.left), + expressionVisitor.visit(ctx.right), toSourceLocation(ctx)); + default: + throw new IllegalArgumentException("Unknown operator: " + ctx.op); + } + } + + @Override + public E visitNotExpression(NotExpressionContext ctx) { + return getFactory().createNotExpression(expressionVisitor.visit(ctx.expr), toSourceLocation(ctx)); + } + + @Override + public E visitComparisonExpression(ComparisonExpressionContext ctx) { + switch (ctx.op.getType()) { + case WormsProgramLexer.LT: + return getFactory().createLessThanExpression(expressionVisitor.visit(ctx.left), + expressionVisitor.visit(ctx.right), toSourceLocation(ctx)); + case WormsProgramLexer.LTE: + return getFactory().createLessThanOrEqualExpression(expressionVisitor.visit(ctx.left), + expressionVisitor.visit(ctx.right), toSourceLocation(ctx)); + case WormsProgramLexer.GT: + return getFactory().createGreaterThanExpression(expressionVisitor.visit(ctx.left), + expressionVisitor.visit(ctx.right), toSourceLocation(ctx)); + case WormsProgramLexer.GTE: + return getFactory().createGreaterThanOrEqualExpression(expressionVisitor.visit(ctx.left), + expressionVisitor.visit(ctx.right), toSourceLocation(ctx)); + case WormsProgramLexer.EQ: + return getFactory().createEqualityExpression(expressionVisitor.visit(ctx.left), + expressionVisitor.visit(ctx.right), toSourceLocation(ctx)); + case WormsProgramLexer.NEQ: + return getFactory().createInequalityExpression(expressionVisitor.visit(ctx.left), + expressionVisitor.visit(ctx.right), toSourceLocation(ctx)); + default: + throw new IllegalArgumentException("Unknown operand: " + ctx.op); + } + + } + + @Override + public E visitGetXExpression(GetXExpressionContext ctx) { + return getFactory().createGetXExpression(expressionVisitor.visit(ctx.expr), toSourceLocation(ctx)); + } + + @Override + public E visitGetYExpression(GetYExpressionContext ctx) { + return getFactory().createGetYExpression(expressionVisitor.visit(ctx.expr), toSourceLocation(ctx)); + } + + @Override + public E visitGetRadiusExpression(GetRadiusExpressionContext ctx) { + return getFactory().createGetRadiusExpression(expressionVisitor.visit(ctx.expr), toSourceLocation(ctx)); + } + + @Override + public E visitGetDirectionExpression(GetDirectionExpressionContext ctx) { + return getFactory().createGetDirectionExpression(expressionVisitor.visit(ctx.expr), toSourceLocation(ctx)); + } + + @Override + public E visitGetAPExpression(GetAPExpressionContext ctx) { + return getFactory().createGetActionPointsExpression(expressionVisitor.visit(ctx.expr), + toSourceLocation(ctx)); + } + + @Override + public E visitGetMaxAPExpression(GetMaxAPExpressionContext ctx) { + return getFactory().createGetMaxActionPointsExpression(expressionVisitor.visit(ctx.expr), + toSourceLocation(ctx)); + } + + @Override + public E visitGetHPExpression(GetHPExpressionContext ctx) { + return getFactory().createHitPointsExpression(expressionVisitor.visit(ctx.expr), toSourceLocation(ctx)); + } + + @Override + public E visitSameTeamExpression(SameTeamExpressionContext ctx) { + return getFactory().createSameTeamExpression(expressionVisitor.visit(ctx.expr), toSourceLocation(ctx)); + } + + @Override + public E visitSearchObjExpression(SearchObjExpressionContext ctx) { + return getFactory().createSearchObjectExpression(expressionVisitor.visit(ctx.expr), toSourceLocation(ctx)); + } + + @Override + public E visitDistanceExpression(DistanceExpressionContext ctx) { + return getFactory().createDistanceExpression(expressionVisitor.visit(ctx.expr), toSourceLocation(ctx)); + } + + @Override + public E visitIsWormExpression(IsWormExpressionContext ctx) { + return getFactory().createIsWormExpression(expressionVisitor.visit(ctx.expr), toSourceLocation(ctx)); + } + + @Override + public E visitIsFoodExpression(IsFoodExpressionContext ctx) { + return getFactory().createIsFoodExpression(expressionVisitor.visit(ctx.expr), toSourceLocation(ctx)); + } + + @Override + public E visitIsProjectileExpression(IsProjectileExpressionContext ctx) { + return getFactory().createIsProjectileExpression(expressionVisitor.visit(ctx.expr), toSourceLocation(ctx)); + } + + } + + private final IProgramFactory factory; + + private final ProcedureDefinitionVisitor procDefVisitor = new ProcedureDefinitionVisitor(); + private final StatementVisitor statementVisitor = new StatementVisitor(); + private final ExpressionVisitor expressionVisitor = new ExpressionVisitor(); + + private S main; + private List

    procedures; + + public ParserVisitor(IProgramFactory factory) { + if (factory == null) { + throw new NullPointerException(); + } + this.factory = factory; + } + + private SourceLocation toSourceLocation(ParserRuleContext ctx) { + int line = ctx.getStart().getLine(); + int column = ctx.getStart().getCharPositionInLine(); + return new SourceLocation(line, column); + } + + public IProgramFactory getFactory() { + return factory; + } + + public int toInt(Token z) { + return Integer.parseInt(z.getText()); + } + + public S getMain() { + return main; + } + + public List

    getProcedures() { + return Collections.unmodifiableList(procedures); + } + +} \ No newline at end of file diff --git a/OGP1718-Worms/src-provided/worms/programs/internal/parser/WormsProgram.g4 b/OGP1718-Worms/src-provided/worms/programs/internal/parser/WormsProgram.g4 new file mode 100755 index 0000000..4ceae35 --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/internal/parser/WormsProgram.g4 @@ -0,0 +1,200 @@ +// ANTLR v4 Grammar for controling Worms. +// Check the tutorial at http://jnb.ociweb.com/jnb/jnbJun2008.html +// or http://www.antlr.org/ for details. + + +grammar WormsProgram; + +@header { + package worms.programs.internal.parser.generated; +} + + +// ------------------------------------------------------------------------ +// --- Eval and Related Definitions --------------------------------------- +// ------------------------------------------------------------------------ +program: (procdef+=proceduredef)* + (programBody+=statement)* +; + +proceduredef: DEF procname=IDENTIFIER COLON? + body=statement +; + +statement: assignmentStatement + | whileStatement + | ifStatement + | printStatement + | sequenceStatement + | invokeStatement + | breakStatement + | actionStatement +; + +assignmentStatement: variableName=IDENTIFIER ASSIGN value=expression ';' +; + +whileStatement: WHILE condition=expression COLON? + body=statement +; + +ifStatement: IF condition=expression COLON? + ifbody=statement + (ELSE COLON? + elsebody=statement)? +; + +printStatement: PRINT value=expression ';' +; + +sequenceStatement: LEFT_BRACE (stmts+=statement)* RIGHT_BRACE +; + +invokeStatement: INVOKE procName=IDENTIFIER ';' +; + + +breakStatement: BREAK ';' +; + + +actionStatement: TURN angle=expression ';' #turnAction + | MOVE ';' #moveAction + | JUMP ';' #jumpAction + | EAT ';' #eatAction + | FIRE ';' #fireAction +; + +// order here sets order of operations (important for left-recursive expressions!) +expression: variable=IDENTIFIER #readVariableExpression + | value=NUMBER #constantExpression + | TRUE #trueLiteralExpression + | FALSE #falseLiteralExpression + | NULL #nullExpression + | SELF #selfExpression + | LEFT_PAREN subExpr=expression RIGHT_PAREN #parenExpression + | left=expression op=(MUL | DIV) right=expression #mulDivExpression + | left=expression op=(ADD | SUB) right=expression #addSubExpression + | left=expression op=(LT | LTE | GT | GTE | EQ | NEQ) right=expression #comparisonExpression + | left=expression op=(AND | OR) right=expression #andOrExpression + | SQRT LEFT_PAREN expr=expression RIGHT_PAREN #sqrtExpression + | SIN LEFT_PAREN expr=expression RIGHT_PAREN #sinExpression + | COS LEFT_PAREN expr=expression RIGHT_PAREN #cosExpression + | NOT expr=expression #notExpression + | GETX expr=expression #getXExpression + | GETY expr=expression #getYExpression + | GETRADIUS expr=expression #getRadiusExpression + | GETDIR expr=expression #getDirectionExpression + | GETAP expr=expression #getAPExpression + | GETMAXAP expr=expression #getMaxAPExpression + | GETHP expr=expression #getHPExpression + | SAMETEAM expr=expression #sameTeamExpression + | SEARCHOBJ expr=expression #searchObjExpression + | DISTANCE expr=expression #distanceExpression + | ISWORM expr=expression #isWormExpression + | ISFOOD expr=expression #isFoodExpression + | ISPROJECTILE expr=expression #isProjectileExpression +; + +// ------------------------------------------------------------------------ +// --- Specifiers ----------------------------------------------- +// ------------------------------------------------------------------------ + +NULL: 'null'; +SELF: 'self'; +TRUE: 'true'; +FALSE: 'false'; + +// ------------------------------------------------------------------------ +// --- Unary Operations --------------------------------------------------- +// ------------------------------------------------------------------------ +SQRT: 'sqrt'; +SIN: 'sin'; +COS: 'cos'; +NOT: '!'; +GETX: 'getx'; +GETY: 'gety'; +GETRADIUS: 'getradius'; +GETDIR: 'getdir'; +GETAP: 'getap'; +GETMAXAP: 'getmaxap'; +GETHP: 'gethp'; +SAMETEAM: 'sameteam'; +SEARCHOBJ: 'searchobj'; +DISTANCE: 'distance'; +ISWORM: 'isworm'; +ISFOOD: 'isfood'; +ISPROJECTILE: 'isprojectile'; + +// ------------------------------------------------------------------------ +// --- Actions ----------------------------------------------- +// ------------------------------------------------------------------------ +TURN: 'turn'; +MOVE: 'move'; +JUMP: 'jump'; +EAT: 'eat'; +FIRE: 'fire'; + + +// ------------------------------------------------------------------------ +// --- Control Flow ------------------------------------------------------- +// ------------------------------------------------------------------------ +DEF: 'def'; +IF: 'if'; +INVOKE: 'invoke'; +THEN: 'then'; +ELSE: 'else'; +WHILE: 'while'; +BREAK: 'break'; +PRINT: 'print'; + + +// ------------------------------------------------------------------------ +// --- Assignment and Arithmetics ----------------------------------------- +// ------------------------------------------------------------------------ +ASSIGN: ':='; +ADD: '+'; +SUB: '-'; +MUL: '*'; +DIV: '/'; +AND: '&&'; +OR: '||'; +LT: '<'; +LTE: '<='; +GT: '>'; +GTE: '>='; +EQ: '=='; +NEQ: '!='; + +// ------------------------------------------------------------------------ +// --- Literals and Variables --------------------------------------------- +// ------------------------------------------------------------------------ + +NUMBER: INTEGER | FLOAT; +FLOAT: INTEGER '.' ('0'..'9')+; +INTEGER: ('-'|'+')? ('0'..'9')+; + +IDENTIFIER: LETTER (LETTER | DIGIT | '_')*; +fragment LETTER: LOWER | UPPER; +fragment LOWER: 'a'..'z'; +fragment UPPER: 'A'..'Z'; +fragment DIGIT: '0'..'9'; + +LEFT_PAREN: '('; +RIGHT_PAREN: ')'; +LEFT_BRACE: '{'; +RIGHT_BRACE: '}'; +COLON: ':'; + +// ------------------------------------------------------------------------ +// --- Syntactical Ballast ------------------------------------------------ +// ------------------------------------------------------------------------ + +// Skip runs of newline, space and tab characters. +WHITESPACE: [ \t\r\n]+ -> skip; + +// Single-line comments begin with //, are followed by any characters +// other than those in a newline, and are terminated by newline characters. +SINGLE_COMMENT: '//' ~('\r' | '\n')* NEWLINE -> skip; +fragment NEWLINE: ('\r'? '\n')+; + diff --git a/OGP1718-Worms/src-provided/worms/programs/internal/parser/example/ExamplePrinter.java b/OGP1718-Worms/src-provided/worms/programs/internal/parser/example/ExamplePrinter.java new file mode 100755 index 0000000..d5db737 --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/internal/parser/example/ExamplePrinter.java @@ -0,0 +1,42 @@ +package worms.programs.internal.parser.example; + +import java.io.IOException; + +import worms.programs.IProgramFactory; +import worms.programs.ParseOutcome; +import worms.programs.ProgramParser; + +public class ExamplePrinter { + public static void main(String[] args) throws IOException { + IProgramFactory factory = PrintingObjectFactory.create(); + ProgramParser parser = ProgramParser.create(factory); + + /* + ParseOutcome outcome = parser.parseString( + "def controlled_move:" + + " if getap self > 100.0:" + + " { jump; print getx self; print gety self; }" + + " else move;" + + "" + + "max_distance := 10.0;" + + "while true: {" + + " w := searchobj 0.0;" + + " if isworm w: {" + + " if sameteam w:" + + " invoke controlled_move;" + + " else if distance w < max_distance:" + + " fire;" + + " else" + + " { turn d; max_distance := max_distance + 0.1; }" + + " }" + + "}"); + */ + //ParseOutcome outcome = parser.parseFile("programs/program_example.txt"); + //ParseOutcome outcome = parser.parseFile("programs/syntax_test.txt"); + ParseOutcome outcome = parser.parseFile("programs/program.txt"); + + System.out.println(outcome); + + } + +} diff --git a/OGP1718-Worms/src-provided/worms/programs/internal/parser/example/PrintingObject.java b/OGP1718-Worms/src-provided/worms/programs/internal/parser/example/PrintingObject.java new file mode 100755 index 0000000..2183b4c --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/internal/parser/example/PrintingObject.java @@ -0,0 +1,80 @@ +package worms.programs.internal.parser.example; + +import java.util.List; +import java.util.StringTokenizer; +import java.util.stream.Collectors; + +import worms.programs.SourceLocation; + +public class PrintingObject { + + private boolean indented = false; + + private final StringBuilder repr = new StringBuilder(); + + public PrintingObject(SourceLocation loc, String method, Object... args) { + if (loc != null) { + method = loc + " " + method; + } + if (args.length > 1) { + indented(method + "("); + indented = true; + for (int i = 0; i < args.length; i++) { + indented(repr(args[i]), args.length > 1 && i < args.length - 1); + } + indented = false; + indented(")"); + } else { + String msg = method + "( "; + if (args.length > 0) { + msg += repr(args[0]).toString().trim(); + } + msg += " )"; + indented(msg); + } + } + + private String repr(Object object) { + if (object instanceof String) { + object = "\"" + object + "\""; + } else if (object instanceof List) { + object = String.format("Arrays.toList(%s)", ((List) object) + .stream().map(this::repr) + .collect(Collectors.joining(", ### Arrays.toList\n"))); + } + if (object != null) { + return object.toString(); + } else { + return "null"; + } + } + + @Override + public String toString() { + return repr.toString(); + } + + private void indented(Object object) { + indented(object, false); + } + + private void indented(Object object, boolean appendComma) { + if (object != null) { + String str = object.toString(); + StringTokenizer tok = new StringTokenizer(str, "\n"); + while (tok.hasMoreTokens()) { + if (indented) + repr.append("| "); + repr.append(tok.nextToken()); + if (!tok.hasMoreTokens() && appendComma) { + repr.append(","); + } + repr.append("\n"); + } + } else { + if (indented) + repr.append(" null"); + } + + } +} diff --git a/OGP1718-Worms/src-provided/worms/programs/internal/parser/example/PrintingObjectFactory.java b/OGP1718-Worms/src-provided/worms/programs/internal/parser/example/PrintingObjectFactory.java new file mode 100755 index 0000000..1950b1c --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/internal/parser/example/PrintingObjectFactory.java @@ -0,0 +1,49 @@ +package worms.programs.internal.parser.example; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.Arrays; +import java.util.List; + +import worms.programs.IProgramFactory; +import worms.programs.SourceLocation; + + +public class PrintingObjectFactory { + + /** + * Creates an implementation of IProgramFactory where the implementation of + * each interface method (except createProgram) just creates a + * PrintingObject with all arguments. + */ + @SuppressWarnings("unchecked") + public static IProgramFactory create() { + + InvocationHandler handler = new InvocationHandler() { + + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + if (method.getName().equals("createProgram")) { + List functions = (List)args[0]; + PrintingObject main = (PrintingObject) args[1]; + return new PrintingProgram(functions, main); + } + if (args != null) { + SourceLocation sourceLocation = (SourceLocation) args[args.length - 1]; + if (args.length >= 1) { + return new PrintingObject(sourceLocation, method.getName(), + Arrays.copyOfRange(args, 0, args.length - 1)); + } else { + return new PrintingObject(sourceLocation, method.getName()); + } + } else { + return new PrintingObject(null, method.getName()); + } + } + }; + + return (IProgramFactory) Proxy.newProxyInstance( + IProgramFactory.class.getClassLoader(), new Class[] { IProgramFactory.class }, handler); + } +} diff --git a/OGP1718-Worms/src-provided/worms/programs/internal/parser/example/PrintingProgram.java b/OGP1718-Worms/src-provided/worms/programs/internal/parser/example/PrintingProgram.java new file mode 100755 index 0000000..685d7c5 --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/internal/parser/example/PrintingProgram.java @@ -0,0 +1,22 @@ +package worms.programs.internal.parser.example; + +import java.util.List; + +public class PrintingProgram { + + private List procedures; + private PrintingObject main; + + public PrintingProgram(List procedures, PrintingObject main) { + if (main == null) { + throw new NullPointerException("main null"); + } + this.main = main; + this.procedures = procedures; + } + + @Override + public String toString() { + return "Procedures: " + procedures.toString() + "\nMain:" + main.toString(); + } +} \ No newline at end of file diff --git a/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgram.interp b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgram.interp new file mode 100755 index 0000000..e3d1b4b --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgram.interp @@ -0,0 +1,141 @@ +token literal names: +null +';' +'null' +'self' +'true' +'false' +'sqrt' +'sin' +'cos' +'!' +'getx' +'gety' +'getradius' +'getdir' +'getap' +'getmaxap' +'gethp' +'sameteam' +'searchobj' +'distance' +'isworm' +'isfood' +'isprojectile' +'turn' +'move' +'jump' +'eat' +'fire' +'def' +'if' +'invoke' +'then' +'else' +'while' +'break' +'print' +':=' +'+' +'-' +'*' +'/' +'&&' +'||' +'<' +'<=' +'>' +'>=' +'==' +'!=' +null +null +null +null +'(' +')' +'{' +'}' +':' +null +null + +token symbolic names: +null +null +NULL +SELF +TRUE +FALSE +SQRT +SIN +COS +NOT +GETX +GETY +GETRADIUS +GETDIR +GETAP +GETMAXAP +GETHP +SAMETEAM +SEARCHOBJ +DISTANCE +ISWORM +ISFOOD +ISPROJECTILE +TURN +MOVE +JUMP +EAT +FIRE +DEF +IF +INVOKE +THEN +ELSE +WHILE +BREAK +PRINT +ASSIGN +ADD +SUB +MUL +DIV +AND +OR +LT +LTE +GT +GTE +EQ +NEQ +NUMBER +FLOAT +INTEGER +IDENTIFIER +LEFT_PAREN +RIGHT_PAREN +LEFT_BRACE +RIGHT_BRACE +COLON +WHITESPACE +SINGLE_COMMENT + +rule names: +program +proceduredef +statement +assignmentStatement +whileStatement +ifStatement +printStatement +sequenceStatement +invokeStatement +breakStatement +actionStatement +expression + + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 3, 61, 188, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 3, 2, 7, 2, 28, 10, 2, 12, 2, 14, 2, 31, 11, 2, 3, 2, 7, 2, 34, 10, 2, 12, 2, 14, 2, 37, 11, 2, 3, 3, 3, 3, 3, 3, 5, 3, 42, 10, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 5, 4, 54, 10, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 5, 6, 64, 10, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 5, 7, 71, 10, 7, 3, 7, 3, 7, 3, 7, 5, 7, 76, 10, 7, 3, 7, 5, 7, 79, 10, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 7, 9, 87, 10, 9, 12, 9, 14, 9, 90, 11, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 5, 12, 113, 10, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 5, 13, 169, 10, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 7, 13, 183, 10, 13, 12, 13, 14, 13, 186, 11, 13, 3, 13, 2, 3, 24, 14, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 2, 6, 3, 2, 41, 42, 3, 2, 39, 40, 3, 2, 45, 50, 3, 2, 43, 44, 2, 221, 2, 29, 3, 2, 2, 2, 4, 38, 3, 2, 2, 2, 6, 53, 3, 2, 2, 2, 8, 55, 3, 2, 2, 2, 10, 60, 3, 2, 2, 2, 12, 67, 3, 2, 2, 2, 14, 80, 3, 2, 2, 2, 16, 84, 3, 2, 2, 2, 18, 93, 3, 2, 2, 2, 20, 97, 3, 2, 2, 2, 22, 112, 3, 2, 2, 2, 24, 168, 3, 2, 2, 2, 26, 28, 5, 4, 3, 2, 27, 26, 3, 2, 2, 2, 28, 31, 3, 2, 2, 2, 29, 27, 3, 2, 2, 2, 29, 30, 3, 2, 2, 2, 30, 35, 3, 2, 2, 2, 31, 29, 3, 2, 2, 2, 32, 34, 5, 6, 4, 2, 33, 32, 3, 2, 2, 2, 34, 37, 3, 2, 2, 2, 35, 33, 3, 2, 2, 2, 35, 36, 3, 2, 2, 2, 36, 3, 3, 2, 2, 2, 37, 35, 3, 2, 2, 2, 38, 39, 7, 30, 2, 2, 39, 41, 7, 54, 2, 2, 40, 42, 7, 59, 2, 2, 41, 40, 3, 2, 2, 2, 41, 42, 3, 2, 2, 2, 42, 43, 3, 2, 2, 2, 43, 44, 5, 6, 4, 2, 44, 5, 3, 2, 2, 2, 45, 54, 5, 8, 5, 2, 46, 54, 5, 10, 6, 2, 47, 54, 5, 12, 7, 2, 48, 54, 5, 14, 8, 2, 49, 54, 5, 16, 9, 2, 50, 54, 5, 18, 10, 2, 51, 54, 5, 20, 11, 2, 52, 54, 5, 22, 12, 2, 53, 45, 3, 2, 2, 2, 53, 46, 3, 2, 2, 2, 53, 47, 3, 2, 2, 2, 53, 48, 3, 2, 2, 2, 53, 49, 3, 2, 2, 2, 53, 50, 3, 2, 2, 2, 53, 51, 3, 2, 2, 2, 53, 52, 3, 2, 2, 2, 54, 7, 3, 2, 2, 2, 55, 56, 7, 54, 2, 2, 56, 57, 7, 38, 2, 2, 57, 58, 5, 24, 13, 2, 58, 59, 7, 3, 2, 2, 59, 9, 3, 2, 2, 2, 60, 61, 7, 35, 2, 2, 61, 63, 5, 24, 13, 2, 62, 64, 7, 59, 2, 2, 63, 62, 3, 2, 2, 2, 63, 64, 3, 2, 2, 2, 64, 65, 3, 2, 2, 2, 65, 66, 5, 6, 4, 2, 66, 11, 3, 2, 2, 2, 67, 68, 7, 31, 2, 2, 68, 70, 5, 24, 13, 2, 69, 71, 7, 59, 2, 2, 70, 69, 3, 2, 2, 2, 70, 71, 3, 2, 2, 2, 71, 72, 3, 2, 2, 2, 72, 78, 5, 6, 4, 2, 73, 75, 7, 34, 2, 2, 74, 76, 7, 59, 2, 2, 75, 74, 3, 2, 2, 2, 75, 76, 3, 2, 2, 2, 76, 77, 3, 2, 2, 2, 77, 79, 5, 6, 4, 2, 78, 73, 3, 2, 2, 2, 78, 79, 3, 2, 2, 2, 79, 13, 3, 2, 2, 2, 80, 81, 7, 37, 2, 2, 81, 82, 5, 24, 13, 2, 82, 83, 7, 3, 2, 2, 83, 15, 3, 2, 2, 2, 84, 88, 7, 57, 2, 2, 85, 87, 5, 6, 4, 2, 86, 85, 3, 2, 2, 2, 87, 90, 3, 2, 2, 2, 88, 86, 3, 2, 2, 2, 88, 89, 3, 2, 2, 2, 89, 91, 3, 2, 2, 2, 90, 88, 3, 2, 2, 2, 91, 92, 7, 58, 2, 2, 92, 17, 3, 2, 2, 2, 93, 94, 7, 32, 2, 2, 94, 95, 7, 54, 2, 2, 95, 96, 7, 3, 2, 2, 96, 19, 3, 2, 2, 2, 97, 98, 7, 36, 2, 2, 98, 99, 7, 3, 2, 2, 99, 21, 3, 2, 2, 2, 100, 101, 7, 25, 2, 2, 101, 102, 5, 24, 13, 2, 102, 103, 7, 3, 2, 2, 103, 113, 3, 2, 2, 2, 104, 105, 7, 26, 2, 2, 105, 113, 7, 3, 2, 2, 106, 107, 7, 27, 2, 2, 107, 113, 7, 3, 2, 2, 108, 109, 7, 28, 2, 2, 109, 113, 7, 3, 2, 2, 110, 111, 7, 29, 2, 2, 111, 113, 7, 3, 2, 2, 112, 100, 3, 2, 2, 2, 112, 104, 3, 2, 2, 2, 112, 106, 3, 2, 2, 2, 112, 108, 3, 2, 2, 2, 112, 110, 3, 2, 2, 2, 113, 23, 3, 2, 2, 2, 114, 115, 8, 13, 1, 2, 115, 169, 7, 54, 2, 2, 116, 169, 7, 51, 2, 2, 117, 169, 7, 6, 2, 2, 118, 169, 7, 7, 2, 2, 119, 169, 7, 4, 2, 2, 120, 169, 7, 5, 2, 2, 121, 122, 7, 55, 2, 2, 122, 123, 5, 24, 13, 2, 123, 124, 7, 56, 2, 2, 124, 169, 3, 2, 2, 2, 125, 126, 7, 8, 2, 2, 126, 127, 7, 55, 2, 2, 127, 128, 5, 24, 13, 2, 128, 129, 7, 56, 2, 2, 129, 169, 3, 2, 2, 2, 130, 131, 7, 9, 2, 2, 131, 132, 7, 55, 2, 2, 132, 133, 5, 24, 13, 2, 133, 134, 7, 56, 2, 2, 134, 169, 3, 2, 2, 2, 135, 136, 7, 10, 2, 2, 136, 137, 7, 55, 2, 2, 137, 138, 5, 24, 13, 2, 138, 139, 7, 56, 2, 2, 139, 169, 3, 2, 2, 2, 140, 141, 7, 11, 2, 2, 141, 169, 5, 24, 13, 16, 142, 143, 7, 12, 2, 2, 143, 169, 5, 24, 13, 15, 144, 145, 7, 13, 2, 2, 145, 169, 5, 24, 13, 14, 146, 147, 7, 14, 2, 2, 147, 169, 5, 24, 13, 13, 148, 149, 7, 15, 2, 2, 149, 169, 5, 24, 13, 12, 150, 151, 7, 16, 2, 2, 151, 169, 5, 24, 13, 11, 152, 153, 7, 17, 2, 2, 153, 169, 5, 24, 13, 10, 154, 155, 7, 18, 2, 2, 155, 169, 5, 24, 13, 9, 156, 157, 7, 19, 2, 2, 157, 169, 5, 24, 13, 8, 158, 159, 7, 20, 2, 2, 159, 169, 5, 24, 13, 7, 160, 161, 7, 21, 2, 2, 161, 169, 5, 24, 13, 6, 162, 163, 7, 22, 2, 2, 163, 169, 5, 24, 13, 5, 164, 165, 7, 23, 2, 2, 165, 169, 5, 24, 13, 4, 166, 167, 7, 24, 2, 2, 167, 169, 5, 24, 13, 3, 168, 114, 3, 2, 2, 2, 168, 116, 3, 2, 2, 2, 168, 117, 3, 2, 2, 2, 168, 118, 3, 2, 2, 2, 168, 119, 3, 2, 2, 2, 168, 120, 3, 2, 2, 2, 168, 121, 3, 2, 2, 2, 168, 125, 3, 2, 2, 2, 168, 130, 3, 2, 2, 2, 168, 135, 3, 2, 2, 2, 168, 140, 3, 2, 2, 2, 168, 142, 3, 2, 2, 2, 168, 144, 3, 2, 2, 2, 168, 146, 3, 2, 2, 2, 168, 148, 3, 2, 2, 2, 168, 150, 3, 2, 2, 2, 168, 152, 3, 2, 2, 2, 168, 154, 3, 2, 2, 2, 168, 156, 3, 2, 2, 2, 168, 158, 3, 2, 2, 2, 168, 160, 3, 2, 2, 2, 168, 162, 3, 2, 2, 2, 168, 164, 3, 2, 2, 2, 168, 166, 3, 2, 2, 2, 169, 184, 3, 2, 2, 2, 170, 171, 12, 23, 2, 2, 171, 172, 9, 2, 2, 2, 172, 183, 5, 24, 13, 24, 173, 174, 12, 22, 2, 2, 174, 175, 9, 3, 2, 2, 175, 183, 5, 24, 13, 23, 176, 177, 12, 21, 2, 2, 177, 178, 9, 4, 2, 2, 178, 183, 5, 24, 13, 22, 179, 180, 12, 20, 2, 2, 180, 181, 9, 5, 2, 2, 181, 183, 5, 24, 13, 21, 182, 170, 3, 2, 2, 2, 182, 173, 3, 2, 2, 2, 182, 176, 3, 2, 2, 2, 182, 179, 3, 2, 2, 2, 183, 186, 3, 2, 2, 2, 184, 182, 3, 2, 2, 2, 184, 185, 3, 2, 2, 2, 185, 25, 3, 2, 2, 2, 186, 184, 3, 2, 2, 2, 15, 29, 35, 41, 53, 63, 70, 75, 78, 88, 112, 168, 182, 184] \ No newline at end of file diff --git a/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgram.tokens b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgram.tokens new file mode 100755 index 0000000..a4780f1 --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgram.tokens @@ -0,0 +1,112 @@ +T__0=1 +NULL=2 +SELF=3 +TRUE=4 +FALSE=5 +SQRT=6 +SIN=7 +COS=8 +NOT=9 +GETX=10 +GETY=11 +GETRADIUS=12 +GETDIR=13 +GETAP=14 +GETMAXAP=15 +GETHP=16 +SAMETEAM=17 +SEARCHOBJ=18 +DISTANCE=19 +ISWORM=20 +ISFOOD=21 +ISPROJECTILE=22 +TURN=23 +MOVE=24 +JUMP=25 +EAT=26 +FIRE=27 +DEF=28 +IF=29 +INVOKE=30 +THEN=31 +ELSE=32 +WHILE=33 +BREAK=34 +PRINT=35 +ASSIGN=36 +ADD=37 +SUB=38 +MUL=39 +DIV=40 +AND=41 +OR=42 +LT=43 +LTE=44 +GT=45 +GTE=46 +EQ=47 +NEQ=48 +NUMBER=49 +FLOAT=50 +INTEGER=51 +IDENTIFIER=52 +LEFT_PAREN=53 +RIGHT_PAREN=54 +LEFT_BRACE=55 +RIGHT_BRACE=56 +COLON=57 +WHITESPACE=58 +SINGLE_COMMENT=59 +';'=1 +'null'=2 +'self'=3 +'true'=4 +'false'=5 +'sqrt'=6 +'sin'=7 +'cos'=8 +'!'=9 +'getx'=10 +'gety'=11 +'getradius'=12 +'getdir'=13 +'getap'=14 +'getmaxap'=15 +'gethp'=16 +'sameteam'=17 +'searchobj'=18 +'distance'=19 +'isworm'=20 +'isfood'=21 +'isprojectile'=22 +'turn'=23 +'move'=24 +'jump'=25 +'eat'=26 +'fire'=27 +'def'=28 +'if'=29 +'invoke'=30 +'then'=31 +'else'=32 +'while'=33 +'break'=34 +'print'=35 +':='=36 +'+'=37 +'-'=38 +'*'=39 +'/'=40 +'&&'=41 +'||'=42 +'<'=43 +'<='=44 +'>'=45 +'>='=46 +'=='=47 +'!='=48 +'('=53 +')'=54 +'{'=55 +'}'=56 +':'=57 diff --git a/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramBaseVisitor.java b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramBaseVisitor.java new file mode 100755 index 0000000..eed84d5 --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramBaseVisitor.java @@ -0,0 +1,317 @@ +// Generated from WormsProgram.g4 by ANTLR 4.7.1 + + package worms.programs.internal.parser.generated; + +import org.antlr.v4.runtime.tree.AbstractParseTreeVisitor; + +/** + * This class provides an empty implementation of {@link WormsProgramVisitor}, + * which can be extended to create a visitor which only needs to handle a subset + * of the available methods. + * + * @param The return type of the visit operation. Use {@link Void} for + * operations with no return type. + */ +public class WormsProgramBaseVisitor extends AbstractParseTreeVisitor implements WormsProgramVisitor { + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitProgram(WormsProgramParser.ProgramContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitProceduredef(WormsProgramParser.ProceduredefContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitStatement(WormsProgramParser.StatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitAssignmentStatement(WormsProgramParser.AssignmentStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitWhileStatement(WormsProgramParser.WhileStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitIfStatement(WormsProgramParser.IfStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitPrintStatement(WormsProgramParser.PrintStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitSequenceStatement(WormsProgramParser.SequenceStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitInvokeStatement(WormsProgramParser.InvokeStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitBreakStatement(WormsProgramParser.BreakStatementContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitTurnAction(WormsProgramParser.TurnActionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitMoveAction(WormsProgramParser.MoveActionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitJumpAction(WormsProgramParser.JumpActionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitEatAction(WormsProgramParser.EatActionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitFireAction(WormsProgramParser.FireActionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitDistanceExpression(WormsProgramParser.DistanceExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitCosExpression(WormsProgramParser.CosExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitGetYExpression(WormsProgramParser.GetYExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitAndOrExpression(WormsProgramParser.AndOrExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitIsWormExpression(WormsProgramParser.IsWormExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitNotExpression(WormsProgramParser.NotExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitComparisonExpression(WormsProgramParser.ComparisonExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitParenExpression(WormsProgramParser.ParenExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitGetRadiusExpression(WormsProgramParser.GetRadiusExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitTrueLiteralExpression(WormsProgramParser.TrueLiteralExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitNullExpression(WormsProgramParser.NullExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitSqrtExpression(WormsProgramParser.SqrtExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitSinExpression(WormsProgramParser.SinExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitSameTeamExpression(WormsProgramParser.SameTeamExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitIsProjectileExpression(WormsProgramParser.IsProjectileExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitIsFoodExpression(WormsProgramParser.IsFoodExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitConstantExpression(WormsProgramParser.ConstantExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitSearchObjExpression(WormsProgramParser.SearchObjExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitGetXExpression(WormsProgramParser.GetXExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitReadVariableExpression(WormsProgramParser.ReadVariableExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitMulDivExpression(WormsProgramParser.MulDivExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitGetDirectionExpression(WormsProgramParser.GetDirectionExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitSelfExpression(WormsProgramParser.SelfExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitGetHPExpression(WormsProgramParser.GetHPExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitAddSubExpression(WormsProgramParser.AddSubExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitGetMaxAPExpression(WormsProgramParser.GetMaxAPExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitGetAPExpression(WormsProgramParser.GetAPExpressionContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

    The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

    + */ + @Override public T visitFalseLiteralExpression(WormsProgramParser.FalseLiteralExpressionContext ctx) { return visitChildren(ctx); } +} \ No newline at end of file diff --git a/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramLexer.interp b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramLexer.interp new file mode 100755 index 0000000..5386a5e --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramLexer.interp @@ -0,0 +1,199 @@ +token literal names: +null +';' +'null' +'self' +'true' +'false' +'sqrt' +'sin' +'cos' +'!' +'getx' +'gety' +'getradius' +'getdir' +'getap' +'getmaxap' +'gethp' +'sameteam' +'searchobj' +'distance' +'isworm' +'isfood' +'isprojectile' +'turn' +'move' +'jump' +'eat' +'fire' +'def' +'if' +'invoke' +'then' +'else' +'while' +'break' +'print' +':=' +'+' +'-' +'*' +'/' +'&&' +'||' +'<' +'<=' +'>' +'>=' +'==' +'!=' +null +null +null +null +'(' +')' +'{' +'}' +':' +null +null + +token symbolic names: +null +null +NULL +SELF +TRUE +FALSE +SQRT +SIN +COS +NOT +GETX +GETY +GETRADIUS +GETDIR +GETAP +GETMAXAP +GETHP +SAMETEAM +SEARCHOBJ +DISTANCE +ISWORM +ISFOOD +ISPROJECTILE +TURN +MOVE +JUMP +EAT +FIRE +DEF +IF +INVOKE +THEN +ELSE +WHILE +BREAK +PRINT +ASSIGN +ADD +SUB +MUL +DIV +AND +OR +LT +LTE +GT +GTE +EQ +NEQ +NUMBER +FLOAT +INTEGER +IDENTIFIER +LEFT_PAREN +RIGHT_PAREN +LEFT_BRACE +RIGHT_BRACE +COLON +WHITESPACE +SINGLE_COMMENT + +rule names: +T__0 +NULL +SELF +TRUE +FALSE +SQRT +SIN +COS +NOT +GETX +GETY +GETRADIUS +GETDIR +GETAP +GETMAXAP +GETHP +SAMETEAM +SEARCHOBJ +DISTANCE +ISWORM +ISFOOD +ISPROJECTILE +TURN +MOVE +JUMP +EAT +FIRE +DEF +IF +INVOKE +THEN +ELSE +WHILE +BREAK +PRINT +ASSIGN +ADD +SUB +MUL +DIV +AND +OR +LT +LTE +GT +GTE +EQ +NEQ +NUMBER +FLOAT +INTEGER +IDENTIFIER +LETTER +LOWER +UPPER +DIGIT +LEFT_PAREN +RIGHT_PAREN +LEFT_BRACE +RIGHT_BRACE +COLON +WHITESPACE +SINGLE_COMMENT +NEWLINE + +channel names: +DEFAULT_TOKEN_CHANNEL +HIDDEN + +mode names: +DEFAULT_MODE + +atn: +[3, 24715, 42794, 33075, 47597, 16764, 15335, 30598, 22884, 2, 61, 447, 8, 1, 4, 2, 9, 2, 4, 3, 9, 3, 4, 4, 9, 4, 4, 5, 9, 5, 4, 6, 9, 6, 4, 7, 9, 7, 4, 8, 9, 8, 4, 9, 9, 9, 4, 10, 9, 10, 4, 11, 9, 11, 4, 12, 9, 12, 4, 13, 9, 13, 4, 14, 9, 14, 4, 15, 9, 15, 4, 16, 9, 16, 4, 17, 9, 17, 4, 18, 9, 18, 4, 19, 9, 19, 4, 20, 9, 20, 4, 21, 9, 21, 4, 22, 9, 22, 4, 23, 9, 23, 4, 24, 9, 24, 4, 25, 9, 25, 4, 26, 9, 26, 4, 27, 9, 27, 4, 28, 9, 28, 4, 29, 9, 29, 4, 30, 9, 30, 4, 31, 9, 31, 4, 32, 9, 32, 4, 33, 9, 33, 4, 34, 9, 34, 4, 35, 9, 35, 4, 36, 9, 36, 4, 37, 9, 37, 4, 38, 9, 38, 4, 39, 9, 39, 4, 40, 9, 40, 4, 41, 9, 41, 4, 42, 9, 42, 4, 43, 9, 43, 4, 44, 9, 44, 4, 45, 9, 45, 4, 46, 9, 46, 4, 47, 9, 47, 4, 48, 9, 48, 4, 49, 9, 49, 4, 50, 9, 50, 4, 51, 9, 51, 4, 52, 9, 52, 4, 53, 9, 53, 4, 54, 9, 54, 4, 55, 9, 55, 4, 56, 9, 56, 4, 57, 9, 57, 4, 58, 9, 58, 4, 59, 9, 59, 4, 60, 9, 60, 4, 61, 9, 61, 4, 62, 9, 62, 4, 63, 9, 63, 4, 64, 9, 64, 4, 65, 9, 65, 3, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 3, 4, 3, 4, 3, 4, 3, 4, 3, 5, 3, 5, 3, 5, 3, 5, 3, 5, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 6, 3, 7, 3, 7, 3, 7, 3, 7, 3, 7, 3, 8, 3, 8, 3, 8, 3, 8, 3, 9, 3, 9, 3, 9, 3, 9, 3, 10, 3, 10, 3, 11, 3, 11, 3, 11, 3, 11, 3, 11, 3, 12, 3, 12, 3, 12, 3, 12, 3, 12, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 13, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 14, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 15, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 16, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 17, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 18, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 19, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 20, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 21, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 22, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 23, 3, 24, 3, 24, 3, 24, 3, 24, 3, 24, 3, 25, 3, 25, 3, 25, 3, 25, 3, 25, 3, 26, 3, 26, 3, 26, 3, 26, 3, 26, 3, 27, 3, 27, 3, 27, 3, 27, 3, 28, 3, 28, 3, 28, 3, 28, 3, 28, 3, 29, 3, 29, 3, 29, 3, 29, 3, 30, 3, 30, 3, 30, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 31, 3, 32, 3, 32, 3, 32, 3, 32, 3, 32, 3, 33, 3, 33, 3, 33, 3, 33, 3, 33, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 34, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 35, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 36, 3, 37, 3, 37, 3, 37, 3, 38, 3, 38, 3, 39, 3, 39, 3, 40, 3, 40, 3, 41, 3, 41, 3, 42, 3, 42, 3, 42, 3, 43, 3, 43, 3, 43, 3, 44, 3, 44, 3, 45, 3, 45, 3, 45, 3, 46, 3, 46, 3, 47, 3, 47, 3, 47, 3, 48, 3, 48, 3, 48, 3, 49, 3, 49, 3, 49, 3, 50, 3, 50, 5, 50, 374, 10, 50, 3, 51, 3, 51, 3, 51, 6, 51, 379, 10, 51, 13, 51, 14, 51, 380, 3, 52, 5, 52, 384, 10, 52, 3, 52, 6, 52, 387, 10, 52, 13, 52, 14, 52, 388, 3, 53, 3, 53, 3, 53, 3, 53, 7, 53, 395, 10, 53, 12, 53, 14, 53, 398, 11, 53, 3, 54, 3, 54, 5, 54, 402, 10, 54, 3, 55, 3, 55, 3, 56, 3, 56, 3, 57, 3, 57, 3, 58, 3, 58, 3, 59, 3, 59, 3, 60, 3, 60, 3, 61, 3, 61, 3, 62, 3, 62, 3, 63, 6, 63, 421, 10, 63, 13, 63, 14, 63, 422, 3, 63, 3, 63, 3, 64, 3, 64, 3, 64, 3, 64, 7, 64, 431, 10, 64, 12, 64, 14, 64, 434, 11, 64, 3, 64, 3, 64, 3, 64, 3, 64, 3, 65, 5, 65, 441, 10, 65, 3, 65, 6, 65, 444, 10, 65, 13, 65, 14, 65, 445, 2, 2, 66, 3, 3, 5, 4, 7, 5, 9, 6, 11, 7, 13, 8, 15, 9, 17, 10, 19, 11, 21, 12, 23, 13, 25, 14, 27, 15, 29, 16, 31, 17, 33, 18, 35, 19, 37, 20, 39, 21, 41, 22, 43, 23, 45, 24, 47, 25, 49, 26, 51, 27, 53, 28, 55, 29, 57, 30, 59, 31, 61, 32, 63, 33, 65, 34, 67, 35, 69, 36, 71, 37, 73, 38, 75, 39, 77, 40, 79, 41, 81, 42, 83, 43, 85, 44, 87, 45, 89, 46, 91, 47, 93, 48, 95, 49, 97, 50, 99, 51, 101, 52, 103, 53, 105, 54, 107, 2, 109, 2, 111, 2, 113, 2, 115, 55, 117, 56, 119, 57, 121, 58, 123, 59, 125, 60, 127, 61, 129, 2, 3, 2, 5, 4, 2, 45, 45, 47, 47, 5, 2, 11, 12, 15, 15, 34, 34, 4, 2, 12, 12, 15, 15, 2, 453, 2, 3, 3, 2, 2, 2, 2, 5, 3, 2, 2, 2, 2, 7, 3, 2, 2, 2, 2, 9, 3, 2, 2, 2, 2, 11, 3, 2, 2, 2, 2, 13, 3, 2, 2, 2, 2, 15, 3, 2, 2, 2, 2, 17, 3, 2, 2, 2, 2, 19, 3, 2, 2, 2, 2, 21, 3, 2, 2, 2, 2, 23, 3, 2, 2, 2, 2, 25, 3, 2, 2, 2, 2, 27, 3, 2, 2, 2, 2, 29, 3, 2, 2, 2, 2, 31, 3, 2, 2, 2, 2, 33, 3, 2, 2, 2, 2, 35, 3, 2, 2, 2, 2, 37, 3, 2, 2, 2, 2, 39, 3, 2, 2, 2, 2, 41, 3, 2, 2, 2, 2, 43, 3, 2, 2, 2, 2, 45, 3, 2, 2, 2, 2, 47, 3, 2, 2, 2, 2, 49, 3, 2, 2, 2, 2, 51, 3, 2, 2, 2, 2, 53, 3, 2, 2, 2, 2, 55, 3, 2, 2, 2, 2, 57, 3, 2, 2, 2, 2, 59, 3, 2, 2, 2, 2, 61, 3, 2, 2, 2, 2, 63, 3, 2, 2, 2, 2, 65, 3, 2, 2, 2, 2, 67, 3, 2, 2, 2, 2, 69, 3, 2, 2, 2, 2, 71, 3, 2, 2, 2, 2, 73, 3, 2, 2, 2, 2, 75, 3, 2, 2, 2, 2, 77, 3, 2, 2, 2, 2, 79, 3, 2, 2, 2, 2, 81, 3, 2, 2, 2, 2, 83, 3, 2, 2, 2, 2, 85, 3, 2, 2, 2, 2, 87, 3, 2, 2, 2, 2, 89, 3, 2, 2, 2, 2, 91, 3, 2, 2, 2, 2, 93, 3, 2, 2, 2, 2, 95, 3, 2, 2, 2, 2, 97, 3, 2, 2, 2, 2, 99, 3, 2, 2, 2, 2, 101, 3, 2, 2, 2, 2, 103, 3, 2, 2, 2, 2, 105, 3, 2, 2, 2, 2, 115, 3, 2, 2, 2, 2, 117, 3, 2, 2, 2, 2, 119, 3, 2, 2, 2, 2, 121, 3, 2, 2, 2, 2, 123, 3, 2, 2, 2, 2, 125, 3, 2, 2, 2, 2, 127, 3, 2, 2, 2, 3, 131, 3, 2, 2, 2, 5, 133, 3, 2, 2, 2, 7, 138, 3, 2, 2, 2, 9, 143, 3, 2, 2, 2, 11, 148, 3, 2, 2, 2, 13, 154, 3, 2, 2, 2, 15, 159, 3, 2, 2, 2, 17, 163, 3, 2, 2, 2, 19, 167, 3, 2, 2, 2, 21, 169, 3, 2, 2, 2, 23, 174, 3, 2, 2, 2, 25, 179, 3, 2, 2, 2, 27, 189, 3, 2, 2, 2, 29, 196, 3, 2, 2, 2, 31, 202, 3, 2, 2, 2, 33, 211, 3, 2, 2, 2, 35, 217, 3, 2, 2, 2, 37, 226, 3, 2, 2, 2, 39, 236, 3, 2, 2, 2, 41, 245, 3, 2, 2, 2, 43, 252, 3, 2, 2, 2, 45, 259, 3, 2, 2, 2, 47, 272, 3, 2, 2, 2, 49, 277, 3, 2, 2, 2, 51, 282, 3, 2, 2, 2, 53, 287, 3, 2, 2, 2, 55, 291, 3, 2, 2, 2, 57, 296, 3, 2, 2, 2, 59, 300, 3, 2, 2, 2, 61, 303, 3, 2, 2, 2, 63, 310, 3, 2, 2, 2, 65, 315, 3, 2, 2, 2, 67, 320, 3, 2, 2, 2, 69, 326, 3, 2, 2, 2, 71, 332, 3, 2, 2, 2, 73, 338, 3, 2, 2, 2, 75, 341, 3, 2, 2, 2, 77, 343, 3, 2, 2, 2, 79, 345, 3, 2, 2, 2, 81, 347, 3, 2, 2, 2, 83, 349, 3, 2, 2, 2, 85, 352, 3, 2, 2, 2, 87, 355, 3, 2, 2, 2, 89, 357, 3, 2, 2, 2, 91, 360, 3, 2, 2, 2, 93, 362, 3, 2, 2, 2, 95, 365, 3, 2, 2, 2, 97, 368, 3, 2, 2, 2, 99, 373, 3, 2, 2, 2, 101, 375, 3, 2, 2, 2, 103, 383, 3, 2, 2, 2, 105, 390, 3, 2, 2, 2, 107, 401, 3, 2, 2, 2, 109, 403, 3, 2, 2, 2, 111, 405, 3, 2, 2, 2, 113, 407, 3, 2, 2, 2, 115, 409, 3, 2, 2, 2, 117, 411, 3, 2, 2, 2, 119, 413, 3, 2, 2, 2, 121, 415, 3, 2, 2, 2, 123, 417, 3, 2, 2, 2, 125, 420, 3, 2, 2, 2, 127, 426, 3, 2, 2, 2, 129, 443, 3, 2, 2, 2, 131, 132, 7, 61, 2, 2, 132, 4, 3, 2, 2, 2, 133, 134, 7, 112, 2, 2, 134, 135, 7, 119, 2, 2, 135, 136, 7, 110, 2, 2, 136, 137, 7, 110, 2, 2, 137, 6, 3, 2, 2, 2, 138, 139, 7, 117, 2, 2, 139, 140, 7, 103, 2, 2, 140, 141, 7, 110, 2, 2, 141, 142, 7, 104, 2, 2, 142, 8, 3, 2, 2, 2, 143, 144, 7, 118, 2, 2, 144, 145, 7, 116, 2, 2, 145, 146, 7, 119, 2, 2, 146, 147, 7, 103, 2, 2, 147, 10, 3, 2, 2, 2, 148, 149, 7, 104, 2, 2, 149, 150, 7, 99, 2, 2, 150, 151, 7, 110, 2, 2, 151, 152, 7, 117, 2, 2, 152, 153, 7, 103, 2, 2, 153, 12, 3, 2, 2, 2, 154, 155, 7, 117, 2, 2, 155, 156, 7, 115, 2, 2, 156, 157, 7, 116, 2, 2, 157, 158, 7, 118, 2, 2, 158, 14, 3, 2, 2, 2, 159, 160, 7, 117, 2, 2, 160, 161, 7, 107, 2, 2, 161, 162, 7, 112, 2, 2, 162, 16, 3, 2, 2, 2, 163, 164, 7, 101, 2, 2, 164, 165, 7, 113, 2, 2, 165, 166, 7, 117, 2, 2, 166, 18, 3, 2, 2, 2, 167, 168, 7, 35, 2, 2, 168, 20, 3, 2, 2, 2, 169, 170, 7, 105, 2, 2, 170, 171, 7, 103, 2, 2, 171, 172, 7, 118, 2, 2, 172, 173, 7, 122, 2, 2, 173, 22, 3, 2, 2, 2, 174, 175, 7, 105, 2, 2, 175, 176, 7, 103, 2, 2, 176, 177, 7, 118, 2, 2, 177, 178, 7, 123, 2, 2, 178, 24, 3, 2, 2, 2, 179, 180, 7, 105, 2, 2, 180, 181, 7, 103, 2, 2, 181, 182, 7, 118, 2, 2, 182, 183, 7, 116, 2, 2, 183, 184, 7, 99, 2, 2, 184, 185, 7, 102, 2, 2, 185, 186, 7, 107, 2, 2, 186, 187, 7, 119, 2, 2, 187, 188, 7, 117, 2, 2, 188, 26, 3, 2, 2, 2, 189, 190, 7, 105, 2, 2, 190, 191, 7, 103, 2, 2, 191, 192, 7, 118, 2, 2, 192, 193, 7, 102, 2, 2, 193, 194, 7, 107, 2, 2, 194, 195, 7, 116, 2, 2, 195, 28, 3, 2, 2, 2, 196, 197, 7, 105, 2, 2, 197, 198, 7, 103, 2, 2, 198, 199, 7, 118, 2, 2, 199, 200, 7, 99, 2, 2, 200, 201, 7, 114, 2, 2, 201, 30, 3, 2, 2, 2, 202, 203, 7, 105, 2, 2, 203, 204, 7, 103, 2, 2, 204, 205, 7, 118, 2, 2, 205, 206, 7, 111, 2, 2, 206, 207, 7, 99, 2, 2, 207, 208, 7, 122, 2, 2, 208, 209, 7, 99, 2, 2, 209, 210, 7, 114, 2, 2, 210, 32, 3, 2, 2, 2, 211, 212, 7, 105, 2, 2, 212, 213, 7, 103, 2, 2, 213, 214, 7, 118, 2, 2, 214, 215, 7, 106, 2, 2, 215, 216, 7, 114, 2, 2, 216, 34, 3, 2, 2, 2, 217, 218, 7, 117, 2, 2, 218, 219, 7, 99, 2, 2, 219, 220, 7, 111, 2, 2, 220, 221, 7, 103, 2, 2, 221, 222, 7, 118, 2, 2, 222, 223, 7, 103, 2, 2, 223, 224, 7, 99, 2, 2, 224, 225, 7, 111, 2, 2, 225, 36, 3, 2, 2, 2, 226, 227, 7, 117, 2, 2, 227, 228, 7, 103, 2, 2, 228, 229, 7, 99, 2, 2, 229, 230, 7, 116, 2, 2, 230, 231, 7, 101, 2, 2, 231, 232, 7, 106, 2, 2, 232, 233, 7, 113, 2, 2, 233, 234, 7, 100, 2, 2, 234, 235, 7, 108, 2, 2, 235, 38, 3, 2, 2, 2, 236, 237, 7, 102, 2, 2, 237, 238, 7, 107, 2, 2, 238, 239, 7, 117, 2, 2, 239, 240, 7, 118, 2, 2, 240, 241, 7, 99, 2, 2, 241, 242, 7, 112, 2, 2, 242, 243, 7, 101, 2, 2, 243, 244, 7, 103, 2, 2, 244, 40, 3, 2, 2, 2, 245, 246, 7, 107, 2, 2, 246, 247, 7, 117, 2, 2, 247, 248, 7, 121, 2, 2, 248, 249, 7, 113, 2, 2, 249, 250, 7, 116, 2, 2, 250, 251, 7, 111, 2, 2, 251, 42, 3, 2, 2, 2, 252, 253, 7, 107, 2, 2, 253, 254, 7, 117, 2, 2, 254, 255, 7, 104, 2, 2, 255, 256, 7, 113, 2, 2, 256, 257, 7, 113, 2, 2, 257, 258, 7, 102, 2, 2, 258, 44, 3, 2, 2, 2, 259, 260, 7, 107, 2, 2, 260, 261, 7, 117, 2, 2, 261, 262, 7, 114, 2, 2, 262, 263, 7, 116, 2, 2, 263, 264, 7, 113, 2, 2, 264, 265, 7, 108, 2, 2, 265, 266, 7, 103, 2, 2, 266, 267, 7, 101, 2, 2, 267, 268, 7, 118, 2, 2, 268, 269, 7, 107, 2, 2, 269, 270, 7, 110, 2, 2, 270, 271, 7, 103, 2, 2, 271, 46, 3, 2, 2, 2, 272, 273, 7, 118, 2, 2, 273, 274, 7, 119, 2, 2, 274, 275, 7, 116, 2, 2, 275, 276, 7, 112, 2, 2, 276, 48, 3, 2, 2, 2, 277, 278, 7, 111, 2, 2, 278, 279, 7, 113, 2, 2, 279, 280, 7, 120, 2, 2, 280, 281, 7, 103, 2, 2, 281, 50, 3, 2, 2, 2, 282, 283, 7, 108, 2, 2, 283, 284, 7, 119, 2, 2, 284, 285, 7, 111, 2, 2, 285, 286, 7, 114, 2, 2, 286, 52, 3, 2, 2, 2, 287, 288, 7, 103, 2, 2, 288, 289, 7, 99, 2, 2, 289, 290, 7, 118, 2, 2, 290, 54, 3, 2, 2, 2, 291, 292, 7, 104, 2, 2, 292, 293, 7, 107, 2, 2, 293, 294, 7, 116, 2, 2, 294, 295, 7, 103, 2, 2, 295, 56, 3, 2, 2, 2, 296, 297, 7, 102, 2, 2, 297, 298, 7, 103, 2, 2, 298, 299, 7, 104, 2, 2, 299, 58, 3, 2, 2, 2, 300, 301, 7, 107, 2, 2, 301, 302, 7, 104, 2, 2, 302, 60, 3, 2, 2, 2, 303, 304, 7, 107, 2, 2, 304, 305, 7, 112, 2, 2, 305, 306, 7, 120, 2, 2, 306, 307, 7, 113, 2, 2, 307, 308, 7, 109, 2, 2, 308, 309, 7, 103, 2, 2, 309, 62, 3, 2, 2, 2, 310, 311, 7, 118, 2, 2, 311, 312, 7, 106, 2, 2, 312, 313, 7, 103, 2, 2, 313, 314, 7, 112, 2, 2, 314, 64, 3, 2, 2, 2, 315, 316, 7, 103, 2, 2, 316, 317, 7, 110, 2, 2, 317, 318, 7, 117, 2, 2, 318, 319, 7, 103, 2, 2, 319, 66, 3, 2, 2, 2, 320, 321, 7, 121, 2, 2, 321, 322, 7, 106, 2, 2, 322, 323, 7, 107, 2, 2, 323, 324, 7, 110, 2, 2, 324, 325, 7, 103, 2, 2, 325, 68, 3, 2, 2, 2, 326, 327, 7, 100, 2, 2, 327, 328, 7, 116, 2, 2, 328, 329, 7, 103, 2, 2, 329, 330, 7, 99, 2, 2, 330, 331, 7, 109, 2, 2, 331, 70, 3, 2, 2, 2, 332, 333, 7, 114, 2, 2, 333, 334, 7, 116, 2, 2, 334, 335, 7, 107, 2, 2, 335, 336, 7, 112, 2, 2, 336, 337, 7, 118, 2, 2, 337, 72, 3, 2, 2, 2, 338, 339, 7, 60, 2, 2, 339, 340, 7, 63, 2, 2, 340, 74, 3, 2, 2, 2, 341, 342, 7, 45, 2, 2, 342, 76, 3, 2, 2, 2, 343, 344, 7, 47, 2, 2, 344, 78, 3, 2, 2, 2, 345, 346, 7, 44, 2, 2, 346, 80, 3, 2, 2, 2, 347, 348, 7, 49, 2, 2, 348, 82, 3, 2, 2, 2, 349, 350, 7, 40, 2, 2, 350, 351, 7, 40, 2, 2, 351, 84, 3, 2, 2, 2, 352, 353, 7, 126, 2, 2, 353, 354, 7, 126, 2, 2, 354, 86, 3, 2, 2, 2, 355, 356, 7, 62, 2, 2, 356, 88, 3, 2, 2, 2, 357, 358, 7, 62, 2, 2, 358, 359, 7, 63, 2, 2, 359, 90, 3, 2, 2, 2, 360, 361, 7, 64, 2, 2, 361, 92, 3, 2, 2, 2, 362, 363, 7, 64, 2, 2, 363, 364, 7, 63, 2, 2, 364, 94, 3, 2, 2, 2, 365, 366, 7, 63, 2, 2, 366, 367, 7, 63, 2, 2, 367, 96, 3, 2, 2, 2, 368, 369, 7, 35, 2, 2, 369, 370, 7, 63, 2, 2, 370, 98, 3, 2, 2, 2, 371, 374, 5, 103, 52, 2, 372, 374, 5, 101, 51, 2, 373, 371, 3, 2, 2, 2, 373, 372, 3, 2, 2, 2, 374, 100, 3, 2, 2, 2, 375, 376, 5, 103, 52, 2, 376, 378, 7, 48, 2, 2, 377, 379, 4, 50, 59, 2, 378, 377, 3, 2, 2, 2, 379, 380, 3, 2, 2, 2, 380, 378, 3, 2, 2, 2, 380, 381, 3, 2, 2, 2, 381, 102, 3, 2, 2, 2, 382, 384, 9, 2, 2, 2, 383, 382, 3, 2, 2, 2, 383, 384, 3, 2, 2, 2, 384, 386, 3, 2, 2, 2, 385, 387, 4, 50, 59, 2, 386, 385, 3, 2, 2, 2, 387, 388, 3, 2, 2, 2, 388, 386, 3, 2, 2, 2, 388, 389, 3, 2, 2, 2, 389, 104, 3, 2, 2, 2, 390, 396, 5, 107, 54, 2, 391, 395, 5, 107, 54, 2, 392, 395, 5, 113, 57, 2, 393, 395, 7, 97, 2, 2, 394, 391, 3, 2, 2, 2, 394, 392, 3, 2, 2, 2, 394, 393, 3, 2, 2, 2, 395, 398, 3, 2, 2, 2, 396, 394, 3, 2, 2, 2, 396, 397, 3, 2, 2, 2, 397, 106, 3, 2, 2, 2, 398, 396, 3, 2, 2, 2, 399, 402, 5, 109, 55, 2, 400, 402, 5, 111, 56, 2, 401, 399, 3, 2, 2, 2, 401, 400, 3, 2, 2, 2, 402, 108, 3, 2, 2, 2, 403, 404, 4, 99, 124, 2, 404, 110, 3, 2, 2, 2, 405, 406, 4, 67, 92, 2, 406, 112, 3, 2, 2, 2, 407, 408, 4, 50, 59, 2, 408, 114, 3, 2, 2, 2, 409, 410, 7, 42, 2, 2, 410, 116, 3, 2, 2, 2, 411, 412, 7, 43, 2, 2, 412, 118, 3, 2, 2, 2, 413, 414, 7, 125, 2, 2, 414, 120, 3, 2, 2, 2, 415, 416, 7, 127, 2, 2, 416, 122, 3, 2, 2, 2, 417, 418, 7, 60, 2, 2, 418, 124, 3, 2, 2, 2, 419, 421, 9, 3, 2, 2, 420, 419, 3, 2, 2, 2, 421, 422, 3, 2, 2, 2, 422, 420, 3, 2, 2, 2, 422, 423, 3, 2, 2, 2, 423, 424, 3, 2, 2, 2, 424, 425, 8, 63, 2, 2, 425, 126, 3, 2, 2, 2, 426, 427, 7, 49, 2, 2, 427, 428, 7, 49, 2, 2, 428, 432, 3, 2, 2, 2, 429, 431, 10, 4, 2, 2, 430, 429, 3, 2, 2, 2, 431, 434, 3, 2, 2, 2, 432, 430, 3, 2, 2, 2, 432, 433, 3, 2, 2, 2, 433, 435, 3, 2, 2, 2, 434, 432, 3, 2, 2, 2, 435, 436, 5, 129, 65, 2, 436, 437, 3, 2, 2, 2, 437, 438, 8, 64, 2, 2, 438, 128, 3, 2, 2, 2, 439, 441, 7, 15, 2, 2, 440, 439, 3, 2, 2, 2, 440, 441, 3, 2, 2, 2, 441, 442, 3, 2, 2, 2, 442, 444, 7, 12, 2, 2, 443, 440, 3, 2, 2, 2, 444, 445, 3, 2, 2, 2, 445, 443, 3, 2, 2, 2, 445, 446, 3, 2, 2, 2, 446, 130, 3, 2, 2, 2, 14, 2, 373, 380, 383, 388, 394, 396, 401, 422, 432, 440, 445, 3, 8, 2, 2] \ No newline at end of file diff --git a/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramLexer.java b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramLexer.java new file mode 100755 index 0000000..6f3be40 --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramLexer.java @@ -0,0 +1,280 @@ +// Generated from WormsProgram.g4 by ANTLR 4.7.1 + + package worms.programs.internal.parser.generated; + +import org.antlr.v4.runtime.Lexer; +import org.antlr.v4.runtime.CharStream; +import org.antlr.v4.runtime.Token; +import org.antlr.v4.runtime.TokenStream; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.misc.*; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +public class WormsProgramLexer extends Lexer { + static { RuntimeMetaData.checkVersion("4.7.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + T__0=1, NULL=2, SELF=3, TRUE=4, FALSE=5, SQRT=6, SIN=7, COS=8, NOT=9, + GETX=10, GETY=11, GETRADIUS=12, GETDIR=13, GETAP=14, GETMAXAP=15, GETHP=16, + SAMETEAM=17, SEARCHOBJ=18, DISTANCE=19, ISWORM=20, ISFOOD=21, ISPROJECTILE=22, + TURN=23, MOVE=24, JUMP=25, EAT=26, FIRE=27, DEF=28, IF=29, INVOKE=30, + THEN=31, ELSE=32, WHILE=33, BREAK=34, PRINT=35, ASSIGN=36, ADD=37, SUB=38, + MUL=39, DIV=40, AND=41, OR=42, LT=43, LTE=44, GT=45, GTE=46, EQ=47, NEQ=48, + NUMBER=49, FLOAT=50, INTEGER=51, IDENTIFIER=52, LEFT_PAREN=53, RIGHT_PAREN=54, + LEFT_BRACE=55, RIGHT_BRACE=56, COLON=57, WHITESPACE=58, SINGLE_COMMENT=59; + public static String[] channelNames = { + "DEFAULT_TOKEN_CHANNEL", "HIDDEN" + }; + + public static String[] modeNames = { + "DEFAULT_MODE" + }; + + public static final String[] ruleNames = { + "T__0", "NULL", "SELF", "TRUE", "FALSE", "SQRT", "SIN", "COS", "NOT", + "GETX", "GETY", "GETRADIUS", "GETDIR", "GETAP", "GETMAXAP", "GETHP", "SAMETEAM", + "SEARCHOBJ", "DISTANCE", "ISWORM", "ISFOOD", "ISPROJECTILE", "TURN", "MOVE", + "JUMP", "EAT", "FIRE", "DEF", "IF", "INVOKE", "THEN", "ELSE", "WHILE", + "BREAK", "PRINT", "ASSIGN", "ADD", "SUB", "MUL", "DIV", "AND", "OR", "LT", + "LTE", "GT", "GTE", "EQ", "NEQ", "NUMBER", "FLOAT", "INTEGER", "IDENTIFIER", + "LETTER", "LOWER", "UPPER", "DIGIT", "LEFT_PAREN", "RIGHT_PAREN", "LEFT_BRACE", + "RIGHT_BRACE", "COLON", "WHITESPACE", "SINGLE_COMMENT", "NEWLINE" + }; + + private static final String[] _LITERAL_NAMES = { + null, "';'", "'null'", "'self'", "'true'", "'false'", "'sqrt'", "'sin'", + "'cos'", "'!'", "'getx'", "'gety'", "'getradius'", "'getdir'", "'getap'", + "'getmaxap'", "'gethp'", "'sameteam'", "'searchobj'", "'distance'", "'isworm'", + "'isfood'", "'isprojectile'", "'turn'", "'move'", "'jump'", "'eat'", "'fire'", + "'def'", "'if'", "'invoke'", "'then'", "'else'", "'while'", "'break'", + "'print'", "':='", "'+'", "'-'", "'*'", "'/'", "'&&'", "'||'", "'<'", + "'<='", "'>'", "'>='", "'=='", "'!='", null, null, null, null, "'('", + "')'", "'{'", "'}'", "':'" + }; + private static final String[] _SYMBOLIC_NAMES = { + null, null, "NULL", "SELF", "TRUE", "FALSE", "SQRT", "SIN", "COS", "NOT", + "GETX", "GETY", "GETRADIUS", "GETDIR", "GETAP", "GETMAXAP", "GETHP", "SAMETEAM", + "SEARCHOBJ", "DISTANCE", "ISWORM", "ISFOOD", "ISPROJECTILE", "TURN", "MOVE", + "JUMP", "EAT", "FIRE", "DEF", "IF", "INVOKE", "THEN", "ELSE", "WHILE", + "BREAK", "PRINT", "ASSIGN", "ADD", "SUB", "MUL", "DIV", "AND", "OR", "LT", + "LTE", "GT", "GTE", "EQ", "NEQ", "NUMBER", "FLOAT", "INTEGER", "IDENTIFIER", + "LEFT_PAREN", "RIGHT_PAREN", "LEFT_BRACE", "RIGHT_BRACE", "COLON", "WHITESPACE", + "SINGLE_COMMENT" + }; + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + + public WormsProgramLexer(CharStream input) { + super(input); + _interp = new LexerATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + + @Override + public String getGrammarFileName() { return "WormsProgram.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public String[] getChannelNames() { return channelNames; } + + @Override + public String[] getModeNames() { return modeNames; } + + @Override + public ATN getATN() { return _ATN; } + + public static final String _serializedATN = + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2=\u01bf\b\1\4\2\t"+ + "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ + "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ + "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ + "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ + "\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t+\4"+ + ",\t,\4-\t-\4.\t.\4/\t/\4\60\t\60\4\61\t\61\4\62\t\62\4\63\t\63\4\64\t"+ + "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+ + "\4>\t>\4?\t?\4@\t@\4A\tA\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3"+ + "\4\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7\3\b"+ + "\3\b\3\b\3\b\3\t\3\t\3\t\3\t\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\f\3\f"+ + "\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3"+ + "\16\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3"+ + "\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3"+ + "\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3"+ + "\23\3\23\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\25\3"+ + "\25\3\25\3\25\3\25\3\26\3\26\3\26\3\26\3\26\3\26\3\26\3\27\3\27\3\27\3"+ + "\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3"+ + "\30\3\31\3\31\3\31\3\31\3\31\3\32\3\32\3\32\3\32\3\32\3\33\3\33\3\33\3"+ + "\33\3\34\3\34\3\34\3\34\3\34\3\35\3\35\3\35\3\35\3\36\3\36\3\36\3\37\3"+ + "\37\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3\"\3\"\3\""+ + "\3\"\3\"\3\"\3#\3#\3#\3#\3#\3#\3$\3$\3$\3$\3$\3$\3%\3%\3%\3&\3&\3\'\3"+ + "\'\3(\3(\3)\3)\3*\3*\3*\3+\3+\3+\3,\3,\3-\3-\3-\3.\3.\3/\3/\3/\3\60\3"+ + "\60\3\60\3\61\3\61\3\61\3\62\3\62\5\62\u0176\n\62\3\63\3\63\3\63\6\63"+ + "\u017b\n\63\r\63\16\63\u017c\3\64\5\64\u0180\n\64\3\64\6\64\u0183\n\64"+ + "\r\64\16\64\u0184\3\65\3\65\3\65\3\65\7\65\u018b\n\65\f\65\16\65\u018e"+ + "\13\65\3\66\3\66\5\66\u0192\n\66\3\67\3\67\38\38\39\39\3:\3:\3;\3;\3<"+ + "\3<\3=\3=\3>\3>\3?\6?\u01a5\n?\r?\16?\u01a6\3?\3?\3@\3@\3@\3@\7@\u01af"+ + "\n@\f@\16@\u01b2\13@\3@\3@\3@\3@\3A\5A\u01b9\nA\3A\6A\u01bc\nA\rA\16A"+ + "\u01bd\2\2B\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n\23\13\25\f\27\r\31\16\33"+ + "\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30/\31\61\32\63\33\65\34\67"+ + "\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.[/]\60_\61a\62c\63e\64g\65"+ + "i\66k\2m\2o\2q\2s\67u8w9y:{;}<\177=\u0081\2\3\2\5\4\2--//\5\2\13\f\17"+ + "\17\"\"\4\2\f\f\17\17\2\u01c5\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2\2\2\2\t"+ + "\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2\23\3\2\2"+ + "\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3\2\2\2\2"+ + "\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3\2\2\2\2"+ + "+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65\3\2\2\2"+ + "\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3\2\2\2\2"+ + "C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2\2\2O\3"+ + "\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2[\3\2\2"+ + "\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3\2\2\2\2"+ + "i\3\2\2\2\2s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3"+ + "\2\2\2\2\177\3\2\2\2\3\u0083\3\2\2\2\5\u0085\3\2\2\2\7\u008a\3\2\2\2\t"+ + "\u008f\3\2\2\2\13\u0094\3\2\2\2\r\u009a\3\2\2\2\17\u009f\3\2\2\2\21\u00a3"+ + "\3\2\2\2\23\u00a7\3\2\2\2\25\u00a9\3\2\2\2\27\u00ae\3\2\2\2\31\u00b3\3"+ + "\2\2\2\33\u00bd\3\2\2\2\35\u00c4\3\2\2\2\37\u00ca\3\2\2\2!\u00d3\3\2\2"+ + "\2#\u00d9\3\2\2\2%\u00e2\3\2\2\2\'\u00ec\3\2\2\2)\u00f5\3\2\2\2+\u00fc"+ + "\3\2\2\2-\u0103\3\2\2\2/\u0110\3\2\2\2\61\u0115\3\2\2\2\63\u011a\3\2\2"+ + "\2\65\u011f\3\2\2\2\67\u0123\3\2\2\29\u0128\3\2\2\2;\u012c\3\2\2\2=\u012f"+ + "\3\2\2\2?\u0136\3\2\2\2A\u013b\3\2\2\2C\u0140\3\2\2\2E\u0146\3\2\2\2G"+ + "\u014c\3\2\2\2I\u0152\3\2\2\2K\u0155\3\2\2\2M\u0157\3\2\2\2O\u0159\3\2"+ + "\2\2Q\u015b\3\2\2\2S\u015d\3\2\2\2U\u0160\3\2\2\2W\u0163\3\2\2\2Y\u0165"+ + "\3\2\2\2[\u0168\3\2\2\2]\u016a\3\2\2\2_\u016d\3\2\2\2a\u0170\3\2\2\2c"+ + "\u0175\3\2\2\2e\u0177\3\2\2\2g\u017f\3\2\2\2i\u0186\3\2\2\2k\u0191\3\2"+ + "\2\2m\u0193\3\2\2\2o\u0195\3\2\2\2q\u0197\3\2\2\2s\u0199\3\2\2\2u\u019b"+ + "\3\2\2\2w\u019d\3\2\2\2y\u019f\3\2\2\2{\u01a1\3\2\2\2}\u01a4\3\2\2\2\177"+ + "\u01aa\3\2\2\2\u0081\u01bb\3\2\2\2\u0083\u0084\7=\2\2\u0084\4\3\2\2\2"+ + "\u0085\u0086\7p\2\2\u0086\u0087\7w\2\2\u0087\u0088\7n\2\2\u0088\u0089"+ + "\7n\2\2\u0089\6\3\2\2\2\u008a\u008b\7u\2\2\u008b\u008c\7g\2\2\u008c\u008d"+ + "\7n\2\2\u008d\u008e\7h\2\2\u008e\b\3\2\2\2\u008f\u0090\7v\2\2\u0090\u0091"+ + "\7t\2\2\u0091\u0092\7w\2\2\u0092\u0093\7g\2\2\u0093\n\3\2\2\2\u0094\u0095"+ + "\7h\2\2\u0095\u0096\7c\2\2\u0096\u0097\7n\2\2\u0097\u0098\7u\2\2\u0098"+ + "\u0099\7g\2\2\u0099\f\3\2\2\2\u009a\u009b\7u\2\2\u009b\u009c\7s\2\2\u009c"+ + "\u009d\7t\2\2\u009d\u009e\7v\2\2\u009e\16\3\2\2\2\u009f\u00a0\7u\2\2\u00a0"+ + "\u00a1\7k\2\2\u00a1\u00a2\7p\2\2\u00a2\20\3\2\2\2\u00a3\u00a4\7e\2\2\u00a4"+ + "\u00a5\7q\2\2\u00a5\u00a6\7u\2\2\u00a6\22\3\2\2\2\u00a7\u00a8\7#\2\2\u00a8"+ + "\24\3\2\2\2\u00a9\u00aa\7i\2\2\u00aa\u00ab\7g\2\2\u00ab\u00ac\7v\2\2\u00ac"+ + "\u00ad\7z\2\2\u00ad\26\3\2\2\2\u00ae\u00af\7i\2\2\u00af\u00b0\7g\2\2\u00b0"+ + "\u00b1\7v\2\2\u00b1\u00b2\7{\2\2\u00b2\30\3\2\2\2\u00b3\u00b4\7i\2\2\u00b4"+ + "\u00b5\7g\2\2\u00b5\u00b6\7v\2\2\u00b6\u00b7\7t\2\2\u00b7\u00b8\7c\2\2"+ + "\u00b8\u00b9\7f\2\2\u00b9\u00ba\7k\2\2\u00ba\u00bb\7w\2\2\u00bb\u00bc"+ + "\7u\2\2\u00bc\32\3\2\2\2\u00bd\u00be\7i\2\2\u00be\u00bf\7g\2\2\u00bf\u00c0"+ + "\7v\2\2\u00c0\u00c1\7f\2\2\u00c1\u00c2\7k\2\2\u00c2\u00c3\7t\2\2\u00c3"+ + "\34\3\2\2\2\u00c4\u00c5\7i\2\2\u00c5\u00c6\7g\2\2\u00c6\u00c7\7v\2\2\u00c7"+ + "\u00c8\7c\2\2\u00c8\u00c9\7r\2\2\u00c9\36\3\2\2\2\u00ca\u00cb\7i\2\2\u00cb"+ + "\u00cc\7g\2\2\u00cc\u00cd\7v\2\2\u00cd\u00ce\7o\2\2\u00ce\u00cf\7c\2\2"+ + "\u00cf\u00d0\7z\2\2\u00d0\u00d1\7c\2\2\u00d1\u00d2\7r\2\2\u00d2 \3\2\2"+ + "\2\u00d3\u00d4\7i\2\2\u00d4\u00d5\7g\2\2\u00d5\u00d6\7v\2\2\u00d6\u00d7"+ + "\7j\2\2\u00d7\u00d8\7r\2\2\u00d8\"\3\2\2\2\u00d9\u00da\7u\2\2\u00da\u00db"+ + "\7c\2\2\u00db\u00dc\7o\2\2\u00dc\u00dd\7g\2\2\u00dd\u00de\7v\2\2\u00de"+ + "\u00df\7g\2\2\u00df\u00e0\7c\2\2\u00e0\u00e1\7o\2\2\u00e1$\3\2\2\2\u00e2"+ + "\u00e3\7u\2\2\u00e3\u00e4\7g\2\2\u00e4\u00e5\7c\2\2\u00e5\u00e6\7t\2\2"+ + "\u00e6\u00e7\7e\2\2\u00e7\u00e8\7j\2\2\u00e8\u00e9\7q\2\2\u00e9\u00ea"+ + "\7d\2\2\u00ea\u00eb\7l\2\2\u00eb&\3\2\2\2\u00ec\u00ed\7f\2\2\u00ed\u00ee"+ + "\7k\2\2\u00ee\u00ef\7u\2\2\u00ef\u00f0\7v\2\2\u00f0\u00f1\7c\2\2\u00f1"+ + "\u00f2\7p\2\2\u00f2\u00f3\7e\2\2\u00f3\u00f4\7g\2\2\u00f4(\3\2\2\2\u00f5"+ + "\u00f6\7k\2\2\u00f6\u00f7\7u\2\2\u00f7\u00f8\7y\2\2\u00f8\u00f9\7q\2\2"+ + "\u00f9\u00fa\7t\2\2\u00fa\u00fb\7o\2\2\u00fb*\3\2\2\2\u00fc\u00fd\7k\2"+ + "\2\u00fd\u00fe\7u\2\2\u00fe\u00ff\7h\2\2\u00ff\u0100\7q\2\2\u0100\u0101"+ + "\7q\2\2\u0101\u0102\7f\2\2\u0102,\3\2\2\2\u0103\u0104\7k\2\2\u0104\u0105"+ + "\7u\2\2\u0105\u0106\7r\2\2\u0106\u0107\7t\2\2\u0107\u0108\7q\2\2\u0108"+ + "\u0109\7l\2\2\u0109\u010a\7g\2\2\u010a\u010b\7e\2\2\u010b\u010c\7v\2\2"+ + "\u010c\u010d\7k\2\2\u010d\u010e\7n\2\2\u010e\u010f\7g\2\2\u010f.\3\2\2"+ + "\2\u0110\u0111\7v\2\2\u0111\u0112\7w\2\2\u0112\u0113\7t\2\2\u0113\u0114"+ + "\7p\2\2\u0114\60\3\2\2\2\u0115\u0116\7o\2\2\u0116\u0117\7q\2\2\u0117\u0118"+ + "\7x\2\2\u0118\u0119\7g\2\2\u0119\62\3\2\2\2\u011a\u011b\7l\2\2\u011b\u011c"+ + "\7w\2\2\u011c\u011d\7o\2\2\u011d\u011e\7r\2\2\u011e\64\3\2\2\2\u011f\u0120"+ + "\7g\2\2\u0120\u0121\7c\2\2\u0121\u0122\7v\2\2\u0122\66\3\2\2\2\u0123\u0124"+ + "\7h\2\2\u0124\u0125\7k\2\2\u0125\u0126\7t\2\2\u0126\u0127\7g\2\2\u0127"+ + "8\3\2\2\2\u0128\u0129\7f\2\2\u0129\u012a\7g\2\2\u012a\u012b\7h\2\2\u012b"+ + ":\3\2\2\2\u012c\u012d\7k\2\2\u012d\u012e\7h\2\2\u012e<\3\2\2\2\u012f\u0130"+ + "\7k\2\2\u0130\u0131\7p\2\2\u0131\u0132\7x\2\2\u0132\u0133\7q\2\2\u0133"+ + "\u0134\7m\2\2\u0134\u0135\7g\2\2\u0135>\3\2\2\2\u0136\u0137\7v\2\2\u0137"+ + "\u0138\7j\2\2\u0138\u0139\7g\2\2\u0139\u013a\7p\2\2\u013a@\3\2\2\2\u013b"+ + "\u013c\7g\2\2\u013c\u013d\7n\2\2\u013d\u013e\7u\2\2\u013e\u013f\7g\2\2"+ + "\u013fB\3\2\2\2\u0140\u0141\7y\2\2\u0141\u0142\7j\2\2\u0142\u0143\7k\2"+ + "\2\u0143\u0144\7n\2\2\u0144\u0145\7g\2\2\u0145D\3\2\2\2\u0146\u0147\7"+ + "d\2\2\u0147\u0148\7t\2\2\u0148\u0149\7g\2\2\u0149\u014a\7c\2\2\u014a\u014b"+ + "\7m\2\2\u014bF\3\2\2\2\u014c\u014d\7r\2\2\u014d\u014e\7t\2\2\u014e\u014f"+ + "\7k\2\2\u014f\u0150\7p\2\2\u0150\u0151\7v\2\2\u0151H\3\2\2\2\u0152\u0153"+ + "\7<\2\2\u0153\u0154\7?\2\2\u0154J\3\2\2\2\u0155\u0156\7-\2\2\u0156L\3"+ + "\2\2\2\u0157\u0158\7/\2\2\u0158N\3\2\2\2\u0159\u015a\7,\2\2\u015aP\3\2"+ + "\2\2\u015b\u015c\7\61\2\2\u015cR\3\2\2\2\u015d\u015e\7(\2\2\u015e\u015f"+ + "\7(\2\2\u015fT\3\2\2\2\u0160\u0161\7~\2\2\u0161\u0162\7~\2\2\u0162V\3"+ + "\2\2\2\u0163\u0164\7>\2\2\u0164X\3\2\2\2\u0165\u0166\7>\2\2\u0166\u0167"+ + "\7?\2\2\u0167Z\3\2\2\2\u0168\u0169\7@\2\2\u0169\\\3\2\2\2\u016a\u016b"+ + "\7@\2\2\u016b\u016c\7?\2\2\u016c^\3\2\2\2\u016d\u016e\7?\2\2\u016e\u016f"+ + "\7?\2\2\u016f`\3\2\2\2\u0170\u0171\7#\2\2\u0171\u0172\7?\2\2\u0172b\3"+ + "\2\2\2\u0173\u0176\5g\64\2\u0174\u0176\5e\63\2\u0175\u0173\3\2\2\2\u0175"+ + "\u0174\3\2\2\2\u0176d\3\2\2\2\u0177\u0178\5g\64\2\u0178\u017a\7\60\2\2"+ + "\u0179\u017b\4\62;\2\u017a\u0179\3\2\2\2\u017b\u017c\3\2\2\2\u017c\u017a"+ + "\3\2\2\2\u017c\u017d\3\2\2\2\u017df\3\2\2\2\u017e\u0180\t\2\2\2\u017f"+ + "\u017e\3\2\2\2\u017f\u0180\3\2\2\2\u0180\u0182\3\2\2\2\u0181\u0183\4\62"+ + ";\2\u0182\u0181\3\2\2\2\u0183\u0184\3\2\2\2\u0184\u0182\3\2\2\2\u0184"+ + "\u0185\3\2\2\2\u0185h\3\2\2\2\u0186\u018c\5k\66\2\u0187\u018b\5k\66\2"+ + "\u0188\u018b\5q9\2\u0189\u018b\7a\2\2\u018a\u0187\3\2\2\2\u018a\u0188"+ + "\3\2\2\2\u018a\u0189\3\2\2\2\u018b\u018e\3\2\2\2\u018c\u018a\3\2\2\2\u018c"+ + "\u018d\3\2\2\2\u018dj\3\2\2\2\u018e\u018c\3\2\2\2\u018f\u0192\5m\67\2"+ + "\u0190\u0192\5o8\2\u0191\u018f\3\2\2\2\u0191\u0190\3\2\2\2\u0192l\3\2"+ + "\2\2\u0193\u0194\4c|\2\u0194n\3\2\2\2\u0195\u0196\4C\\\2\u0196p\3\2\2"+ + "\2\u0197\u0198\4\62;\2\u0198r\3\2\2\2\u0199\u019a\7*\2\2\u019at\3\2\2"+ + "\2\u019b\u019c\7+\2\2\u019cv\3\2\2\2\u019d\u019e\7}\2\2\u019ex\3\2\2\2"+ + "\u019f\u01a0\7\177\2\2\u01a0z\3\2\2\2\u01a1\u01a2\7<\2\2\u01a2|\3\2\2"+ + "\2\u01a3\u01a5\t\3\2\2\u01a4\u01a3\3\2\2\2\u01a5\u01a6\3\2\2\2\u01a6\u01a4"+ + "\3\2\2\2\u01a6\u01a7\3\2\2\2\u01a7\u01a8\3\2\2\2\u01a8\u01a9\b?\2\2\u01a9"+ + "~\3\2\2\2\u01aa\u01ab\7\61\2\2\u01ab\u01ac\7\61\2\2\u01ac\u01b0\3\2\2"+ + "\2\u01ad\u01af\n\4\2\2\u01ae\u01ad\3\2\2\2\u01af\u01b2\3\2\2\2\u01b0\u01ae"+ + "\3\2\2\2\u01b0\u01b1\3\2\2\2\u01b1\u01b3\3\2\2\2\u01b2\u01b0\3\2\2\2\u01b3"+ + "\u01b4\5\u0081A\2\u01b4\u01b5\3\2\2\2\u01b5\u01b6\b@\2\2\u01b6\u0080\3"+ + "\2\2\2\u01b7\u01b9\7\17\2\2\u01b8\u01b7\3\2\2\2\u01b8\u01b9\3\2\2\2\u01b9"+ + "\u01ba\3\2\2\2\u01ba\u01bc\7\f\2\2\u01bb\u01b8\3\2\2\2\u01bc\u01bd\3\2"+ + "\2\2\u01bd\u01bb\3\2\2\2\u01bd\u01be\3\2\2\2\u01be\u0082\3\2\2\2\16\2"+ + "\u0175\u017c\u017f\u0184\u018a\u018c\u0191\u01a6\u01b0\u01b8\u01bd\3\b"+ + "\2\2"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramLexer.tokens b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramLexer.tokens new file mode 100755 index 0000000..a4780f1 --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramLexer.tokens @@ -0,0 +1,112 @@ +T__0=1 +NULL=2 +SELF=3 +TRUE=4 +FALSE=5 +SQRT=6 +SIN=7 +COS=8 +NOT=9 +GETX=10 +GETY=11 +GETRADIUS=12 +GETDIR=13 +GETAP=14 +GETMAXAP=15 +GETHP=16 +SAMETEAM=17 +SEARCHOBJ=18 +DISTANCE=19 +ISWORM=20 +ISFOOD=21 +ISPROJECTILE=22 +TURN=23 +MOVE=24 +JUMP=25 +EAT=26 +FIRE=27 +DEF=28 +IF=29 +INVOKE=30 +THEN=31 +ELSE=32 +WHILE=33 +BREAK=34 +PRINT=35 +ASSIGN=36 +ADD=37 +SUB=38 +MUL=39 +DIV=40 +AND=41 +OR=42 +LT=43 +LTE=44 +GT=45 +GTE=46 +EQ=47 +NEQ=48 +NUMBER=49 +FLOAT=50 +INTEGER=51 +IDENTIFIER=52 +LEFT_PAREN=53 +RIGHT_PAREN=54 +LEFT_BRACE=55 +RIGHT_BRACE=56 +COLON=57 +WHITESPACE=58 +SINGLE_COMMENT=59 +';'=1 +'null'=2 +'self'=3 +'true'=4 +'false'=5 +'sqrt'=6 +'sin'=7 +'cos'=8 +'!'=9 +'getx'=10 +'gety'=11 +'getradius'=12 +'getdir'=13 +'getap'=14 +'getmaxap'=15 +'gethp'=16 +'sameteam'=17 +'searchobj'=18 +'distance'=19 +'isworm'=20 +'isfood'=21 +'isprojectile'=22 +'turn'=23 +'move'=24 +'jump'=25 +'eat'=26 +'fire'=27 +'def'=28 +'if'=29 +'invoke'=30 +'then'=31 +'else'=32 +'while'=33 +'break'=34 +'print'=35 +':='=36 +'+'=37 +'-'=38 +'*'=39 +'/'=40 +'&&'=41 +'||'=42 +'<'=43 +'<='=44 +'>'=45 +'>='=46 +'=='=47 +'!='=48 +'('=53 +')'=54 +'{'=55 +'}'=56 +':'=57 diff --git a/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramParser.java b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramParser.java new file mode 100755 index 0000000..ba4c1e0 --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramParser.java @@ -0,0 +1,1757 @@ +// Generated from WormsProgram.g4 by ANTLR 4.7.1 + + package worms.programs.internal.parser.generated; + +import org.antlr.v4.runtime.atn.*; +import org.antlr.v4.runtime.dfa.DFA; +import org.antlr.v4.runtime.*; +import org.antlr.v4.runtime.misc.*; +import org.antlr.v4.runtime.tree.*; +import java.util.List; +import java.util.Iterator; +import java.util.ArrayList; + +@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) +public class WormsProgramParser extends Parser { + static { RuntimeMetaData.checkVersion("4.7.1", RuntimeMetaData.VERSION); } + + protected static final DFA[] _decisionToDFA; + protected static final PredictionContextCache _sharedContextCache = + new PredictionContextCache(); + public static final int + T__0=1, NULL=2, SELF=3, TRUE=4, FALSE=5, SQRT=6, SIN=7, COS=8, NOT=9, + GETX=10, GETY=11, GETRADIUS=12, GETDIR=13, GETAP=14, GETMAXAP=15, GETHP=16, + SAMETEAM=17, SEARCHOBJ=18, DISTANCE=19, ISWORM=20, ISFOOD=21, ISPROJECTILE=22, + TURN=23, MOVE=24, JUMP=25, EAT=26, FIRE=27, DEF=28, IF=29, INVOKE=30, + THEN=31, ELSE=32, WHILE=33, BREAK=34, PRINT=35, ASSIGN=36, ADD=37, SUB=38, + MUL=39, DIV=40, AND=41, OR=42, LT=43, LTE=44, GT=45, GTE=46, EQ=47, NEQ=48, + NUMBER=49, FLOAT=50, INTEGER=51, IDENTIFIER=52, LEFT_PAREN=53, RIGHT_PAREN=54, + LEFT_BRACE=55, RIGHT_BRACE=56, COLON=57, WHITESPACE=58, SINGLE_COMMENT=59; + public static final int + RULE_program = 0, RULE_proceduredef = 1, RULE_statement = 2, RULE_assignmentStatement = 3, + RULE_whileStatement = 4, RULE_ifStatement = 5, RULE_printStatement = 6, + RULE_sequenceStatement = 7, RULE_invokeStatement = 8, RULE_breakStatement = 9, + RULE_actionStatement = 10, RULE_expression = 11; + public static final String[] ruleNames = { + "program", "proceduredef", "statement", "assignmentStatement", "whileStatement", + "ifStatement", "printStatement", "sequenceStatement", "invokeStatement", + "breakStatement", "actionStatement", "expression" + }; + + private static final String[] _LITERAL_NAMES = { + null, "';'", "'null'", "'self'", "'true'", "'false'", "'sqrt'", "'sin'", + "'cos'", "'!'", "'getx'", "'gety'", "'getradius'", "'getdir'", "'getap'", + "'getmaxap'", "'gethp'", "'sameteam'", "'searchobj'", "'distance'", "'isworm'", + "'isfood'", "'isprojectile'", "'turn'", "'move'", "'jump'", "'eat'", "'fire'", + "'def'", "'if'", "'invoke'", "'then'", "'else'", "'while'", "'break'", + "'print'", "':='", "'+'", "'-'", "'*'", "'/'", "'&&'", "'||'", "'<'", + "'<='", "'>'", "'>='", "'=='", "'!='", null, null, null, null, "'('", + "')'", "'{'", "'}'", "':'" + }; + private static final String[] _SYMBOLIC_NAMES = { + null, null, "NULL", "SELF", "TRUE", "FALSE", "SQRT", "SIN", "COS", "NOT", + "GETX", "GETY", "GETRADIUS", "GETDIR", "GETAP", "GETMAXAP", "GETHP", "SAMETEAM", + "SEARCHOBJ", "DISTANCE", "ISWORM", "ISFOOD", "ISPROJECTILE", "TURN", "MOVE", + "JUMP", "EAT", "FIRE", "DEF", "IF", "INVOKE", "THEN", "ELSE", "WHILE", + "BREAK", "PRINT", "ASSIGN", "ADD", "SUB", "MUL", "DIV", "AND", "OR", "LT", + "LTE", "GT", "GTE", "EQ", "NEQ", "NUMBER", "FLOAT", "INTEGER", "IDENTIFIER", + "LEFT_PAREN", "RIGHT_PAREN", "LEFT_BRACE", "RIGHT_BRACE", "COLON", "WHITESPACE", + "SINGLE_COMMENT" + }; + public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); + + /** + * @deprecated Use {@link #VOCABULARY} instead. + */ + @Deprecated + public static final String[] tokenNames; + static { + tokenNames = new String[_SYMBOLIC_NAMES.length]; + for (int i = 0; i < tokenNames.length; i++) { + tokenNames[i] = VOCABULARY.getLiteralName(i); + if (tokenNames[i] == null) { + tokenNames[i] = VOCABULARY.getSymbolicName(i); + } + + if (tokenNames[i] == null) { + tokenNames[i] = ""; + } + } + } + + @Override + @Deprecated + public String[] getTokenNames() { + return tokenNames; + } + + @Override + + public Vocabulary getVocabulary() { + return VOCABULARY; + } + + @Override + public String getGrammarFileName() { return "WormsProgram.g4"; } + + @Override + public String[] getRuleNames() { return ruleNames; } + + @Override + public String getSerializedATN() { return _serializedATN; } + + @Override + public ATN getATN() { return _ATN; } + + public WormsProgramParser(TokenStream input) { + super(input); + _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); + } + public static class ProgramContext extends ParserRuleContext { + public ProceduredefContext proceduredef; + public List procdef = new ArrayList(); + public StatementContext statement; + public List programBody = new ArrayList(); + public List proceduredef() { + return getRuleContexts(ProceduredefContext.class); + } + public ProceduredefContext proceduredef(int i) { + return getRuleContext(ProceduredefContext.class,i); + } + public List statement() { + return getRuleContexts(StatementContext.class); + } + public StatementContext statement(int i) { + return getRuleContext(StatementContext.class,i); + } + public ProgramContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_program; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitProgram(this); + else return visitor.visitChildren(this); + } + } + + public final ProgramContext program() throws RecognitionException { + ProgramContext _localctx = new ProgramContext(_ctx, getState()); + enterRule(_localctx, 0, RULE_program); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(27); + _errHandler.sync(this); + _la = _input.LA(1); + while (_la==DEF) { + { + { + setState(24); + ((ProgramContext)_localctx).proceduredef = proceduredef(); + ((ProgramContext)_localctx).procdef.add(((ProgramContext)_localctx).proceduredef); + } + } + setState(29); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(33); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TURN) | (1L << MOVE) | (1L << JUMP) | (1L << EAT) | (1L << FIRE) | (1L << IF) | (1L << INVOKE) | (1L << WHILE) | (1L << BREAK) | (1L << PRINT) | (1L << IDENTIFIER) | (1L << LEFT_BRACE))) != 0)) { + { + { + setState(30); + ((ProgramContext)_localctx).statement = statement(); + ((ProgramContext)_localctx).programBody.add(((ProgramContext)_localctx).statement); + } + } + setState(35); + _errHandler.sync(this); + _la = _input.LA(1); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ProceduredefContext extends ParserRuleContext { + public Token procname; + public StatementContext body; + public TerminalNode DEF() { return getToken(WormsProgramParser.DEF, 0); } + public TerminalNode IDENTIFIER() { return getToken(WormsProgramParser.IDENTIFIER, 0); } + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public TerminalNode COLON() { return getToken(WormsProgramParser.COLON, 0); } + public ProceduredefContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_proceduredef; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitProceduredef(this); + else return visitor.visitChildren(this); + } + } + + public final ProceduredefContext proceduredef() throws RecognitionException { + ProceduredefContext _localctx = new ProceduredefContext(_ctx, getState()); + enterRule(_localctx, 2, RULE_proceduredef); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(36); + match(DEF); + setState(37); + ((ProceduredefContext)_localctx).procname = match(IDENTIFIER); + setState(39); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COLON) { + { + setState(38); + match(COLON); + } + } + + setState(41); + ((ProceduredefContext)_localctx).body = statement(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class StatementContext extends ParserRuleContext { + public AssignmentStatementContext assignmentStatement() { + return getRuleContext(AssignmentStatementContext.class,0); + } + public WhileStatementContext whileStatement() { + return getRuleContext(WhileStatementContext.class,0); + } + public IfStatementContext ifStatement() { + return getRuleContext(IfStatementContext.class,0); + } + public PrintStatementContext printStatement() { + return getRuleContext(PrintStatementContext.class,0); + } + public SequenceStatementContext sequenceStatement() { + return getRuleContext(SequenceStatementContext.class,0); + } + public InvokeStatementContext invokeStatement() { + return getRuleContext(InvokeStatementContext.class,0); + } + public BreakStatementContext breakStatement() { + return getRuleContext(BreakStatementContext.class,0); + } + public ActionStatementContext actionStatement() { + return getRuleContext(ActionStatementContext.class,0); + } + public StatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_statement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitStatement(this); + else return visitor.visitChildren(this); + } + } + + public final StatementContext statement() throws RecognitionException { + StatementContext _localctx = new StatementContext(_ctx, getState()); + enterRule(_localctx, 4, RULE_statement); + try { + setState(51); + _errHandler.sync(this); + switch (_input.LA(1)) { + case IDENTIFIER: + enterOuterAlt(_localctx, 1); + { + setState(43); + assignmentStatement(); + } + break; + case WHILE: + enterOuterAlt(_localctx, 2); + { + setState(44); + whileStatement(); + } + break; + case IF: + enterOuterAlt(_localctx, 3); + { + setState(45); + ifStatement(); + } + break; + case PRINT: + enterOuterAlt(_localctx, 4); + { + setState(46); + printStatement(); + } + break; + case LEFT_BRACE: + enterOuterAlt(_localctx, 5); + { + setState(47); + sequenceStatement(); + } + break; + case INVOKE: + enterOuterAlt(_localctx, 6); + { + setState(48); + invokeStatement(); + } + break; + case BREAK: + enterOuterAlt(_localctx, 7); + { + setState(49); + breakStatement(); + } + break; + case TURN: + case MOVE: + case JUMP: + case EAT: + case FIRE: + enterOuterAlt(_localctx, 8); + { + setState(50); + actionStatement(); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AssignmentStatementContext extends ParserRuleContext { + public Token variableName; + public ExpressionContext value; + public TerminalNode ASSIGN() { return getToken(WormsProgramParser.ASSIGN, 0); } + public TerminalNode IDENTIFIER() { return getToken(WormsProgramParser.IDENTIFIER, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public AssignmentStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_assignmentStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitAssignmentStatement(this); + else return visitor.visitChildren(this); + } + } + + public final AssignmentStatementContext assignmentStatement() throws RecognitionException { + AssignmentStatementContext _localctx = new AssignmentStatementContext(_ctx, getState()); + enterRule(_localctx, 6, RULE_assignmentStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(53); + ((AssignmentStatementContext)_localctx).variableName = match(IDENTIFIER); + setState(54); + match(ASSIGN); + setState(55); + ((AssignmentStatementContext)_localctx).value = expression(0); + setState(56); + match(T__0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class WhileStatementContext extends ParserRuleContext { + public ExpressionContext condition; + public StatementContext body; + public TerminalNode WHILE() { return getToken(WormsProgramParser.WHILE, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public StatementContext statement() { + return getRuleContext(StatementContext.class,0); + } + public TerminalNode COLON() { return getToken(WormsProgramParser.COLON, 0); } + public WhileStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_whileStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitWhileStatement(this); + else return visitor.visitChildren(this); + } + } + + public final WhileStatementContext whileStatement() throws RecognitionException { + WhileStatementContext _localctx = new WhileStatementContext(_ctx, getState()); + enterRule(_localctx, 8, RULE_whileStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(58); + match(WHILE); + setState(59); + ((WhileStatementContext)_localctx).condition = expression(0); + setState(61); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COLON) { + { + setState(60); + match(COLON); + } + } + + setState(63); + ((WhileStatementContext)_localctx).body = statement(); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class IfStatementContext extends ParserRuleContext { + public ExpressionContext condition; + public StatementContext ifbody; + public StatementContext elsebody; + public TerminalNode IF() { return getToken(WormsProgramParser.IF, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public List statement() { + return getRuleContexts(StatementContext.class); + } + public StatementContext statement(int i) { + return getRuleContext(StatementContext.class,i); + } + public List COLON() { return getTokens(WormsProgramParser.COLON); } + public TerminalNode COLON(int i) { + return getToken(WormsProgramParser.COLON, i); + } + public TerminalNode ELSE() { return getToken(WormsProgramParser.ELSE, 0); } + public IfStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_ifStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitIfStatement(this); + else return visitor.visitChildren(this); + } + } + + public final IfStatementContext ifStatement() throws RecognitionException { + IfStatementContext _localctx = new IfStatementContext(_ctx, getState()); + enterRule(_localctx, 10, RULE_ifStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(65); + match(IF); + setState(66); + ((IfStatementContext)_localctx).condition = expression(0); + setState(68); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COLON) { + { + setState(67); + match(COLON); + } + } + + setState(70); + ((IfStatementContext)_localctx).ifbody = statement(); + setState(76); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,7,_ctx) ) { + case 1: + { + setState(71); + match(ELSE); + setState(73); + _errHandler.sync(this); + _la = _input.LA(1); + if (_la==COLON) { + { + setState(72); + match(COLON); + } + } + + setState(75); + ((IfStatementContext)_localctx).elsebody = statement(); + } + break; + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class PrintStatementContext extends ParserRuleContext { + public ExpressionContext value; + public TerminalNode PRINT() { return getToken(WormsProgramParser.PRINT, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public PrintStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_printStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitPrintStatement(this); + else return visitor.visitChildren(this); + } + } + + public final PrintStatementContext printStatement() throws RecognitionException { + PrintStatementContext _localctx = new PrintStatementContext(_ctx, getState()); + enterRule(_localctx, 12, RULE_printStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(78); + match(PRINT); + setState(79); + ((PrintStatementContext)_localctx).value = expression(0); + setState(80); + match(T__0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class SequenceStatementContext extends ParserRuleContext { + public StatementContext statement; + public List stmts = new ArrayList(); + public TerminalNode LEFT_BRACE() { return getToken(WormsProgramParser.LEFT_BRACE, 0); } + public TerminalNode RIGHT_BRACE() { return getToken(WormsProgramParser.RIGHT_BRACE, 0); } + public List statement() { + return getRuleContexts(StatementContext.class); + } + public StatementContext statement(int i) { + return getRuleContext(StatementContext.class,i); + } + public SequenceStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_sequenceStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitSequenceStatement(this); + else return visitor.visitChildren(this); + } + } + + public final SequenceStatementContext sequenceStatement() throws RecognitionException { + SequenceStatementContext _localctx = new SequenceStatementContext(_ctx, getState()); + enterRule(_localctx, 14, RULE_sequenceStatement); + int _la; + try { + enterOuterAlt(_localctx, 1); + { + setState(82); + match(LEFT_BRACE); + setState(86); + _errHandler.sync(this); + _la = _input.LA(1); + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << TURN) | (1L << MOVE) | (1L << JUMP) | (1L << EAT) | (1L << FIRE) | (1L << IF) | (1L << INVOKE) | (1L << WHILE) | (1L << BREAK) | (1L << PRINT) | (1L << IDENTIFIER) | (1L << LEFT_BRACE))) != 0)) { + { + { + setState(83); + ((SequenceStatementContext)_localctx).statement = statement(); + ((SequenceStatementContext)_localctx).stmts.add(((SequenceStatementContext)_localctx).statement); + } + } + setState(88); + _errHandler.sync(this); + _la = _input.LA(1); + } + setState(89); + match(RIGHT_BRACE); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class InvokeStatementContext extends ParserRuleContext { + public Token procName; + public TerminalNode INVOKE() { return getToken(WormsProgramParser.INVOKE, 0); } + public TerminalNode IDENTIFIER() { return getToken(WormsProgramParser.IDENTIFIER, 0); } + public InvokeStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_invokeStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitInvokeStatement(this); + else return visitor.visitChildren(this); + } + } + + public final InvokeStatementContext invokeStatement() throws RecognitionException { + InvokeStatementContext _localctx = new InvokeStatementContext(_ctx, getState()); + enterRule(_localctx, 16, RULE_invokeStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(91); + match(INVOKE); + setState(92); + ((InvokeStatementContext)_localctx).procName = match(IDENTIFIER); + setState(93); + match(T__0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class BreakStatementContext extends ParserRuleContext { + public TerminalNode BREAK() { return getToken(WormsProgramParser.BREAK, 0); } + public BreakStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_breakStatement; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitBreakStatement(this); + else return visitor.visitChildren(this); + } + } + + public final BreakStatementContext breakStatement() throws RecognitionException { + BreakStatementContext _localctx = new BreakStatementContext(_ctx, getState()); + enterRule(_localctx, 18, RULE_breakStatement); + try { + enterOuterAlt(_localctx, 1); + { + setState(95); + match(BREAK); + setState(96); + match(T__0); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ActionStatementContext extends ParserRuleContext { + public ActionStatementContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_actionStatement; } + + public ActionStatementContext() { } + public void copyFrom(ActionStatementContext ctx) { + super.copyFrom(ctx); + } + } + public static class MoveActionContext extends ActionStatementContext { + public TerminalNode MOVE() { return getToken(WormsProgramParser.MOVE, 0); } + public MoveActionContext(ActionStatementContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitMoveAction(this); + else return visitor.visitChildren(this); + } + } + public static class TurnActionContext extends ActionStatementContext { + public ExpressionContext angle; + public TerminalNode TURN() { return getToken(WormsProgramParser.TURN, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public TurnActionContext(ActionStatementContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitTurnAction(this); + else return visitor.visitChildren(this); + } + } + public static class EatActionContext extends ActionStatementContext { + public TerminalNode EAT() { return getToken(WormsProgramParser.EAT, 0); } + public EatActionContext(ActionStatementContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitEatAction(this); + else return visitor.visitChildren(this); + } + } + public static class FireActionContext extends ActionStatementContext { + public TerminalNode FIRE() { return getToken(WormsProgramParser.FIRE, 0); } + public FireActionContext(ActionStatementContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitFireAction(this); + else return visitor.visitChildren(this); + } + } + public static class JumpActionContext extends ActionStatementContext { + public TerminalNode JUMP() { return getToken(WormsProgramParser.JUMP, 0); } + public JumpActionContext(ActionStatementContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitJumpAction(this); + else return visitor.visitChildren(this); + } + } + + public final ActionStatementContext actionStatement() throws RecognitionException { + ActionStatementContext _localctx = new ActionStatementContext(_ctx, getState()); + enterRule(_localctx, 20, RULE_actionStatement); + try { + setState(110); + _errHandler.sync(this); + switch (_input.LA(1)) { + case TURN: + _localctx = new TurnActionContext(_localctx); + enterOuterAlt(_localctx, 1); + { + setState(98); + match(TURN); + setState(99); + ((TurnActionContext)_localctx).angle = expression(0); + setState(100); + match(T__0); + } + break; + case MOVE: + _localctx = new MoveActionContext(_localctx); + enterOuterAlt(_localctx, 2); + { + setState(102); + match(MOVE); + setState(103); + match(T__0); + } + break; + case JUMP: + _localctx = new JumpActionContext(_localctx); + enterOuterAlt(_localctx, 3); + { + setState(104); + match(JUMP); + setState(105); + match(T__0); + } + break; + case EAT: + _localctx = new EatActionContext(_localctx); + enterOuterAlt(_localctx, 4); + { + setState(106); + match(EAT); + setState(107); + match(T__0); + } + break; + case FIRE: + _localctx = new FireActionContext(_localctx); + enterOuterAlt(_localctx, 5); + { + setState(108); + match(FIRE); + setState(109); + match(T__0); + } + break; + default: + throw new NoViableAltException(this); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class ExpressionContext extends ParserRuleContext { + public ExpressionContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_expression; } + + public ExpressionContext() { } + public void copyFrom(ExpressionContext ctx) { + super.copyFrom(ctx); + } + } + public static class DistanceExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode DISTANCE() { return getToken(WormsProgramParser.DISTANCE, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public DistanceExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitDistanceExpression(this); + else return visitor.visitChildren(this); + } + } + public static class CosExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode COS() { return getToken(WormsProgramParser.COS, 0); } + public TerminalNode LEFT_PAREN() { return getToken(WormsProgramParser.LEFT_PAREN, 0); } + public TerminalNode RIGHT_PAREN() { return getToken(WormsProgramParser.RIGHT_PAREN, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public CosExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitCosExpression(this); + else return visitor.visitChildren(this); + } + } + public static class GetYExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode GETY() { return getToken(WormsProgramParser.GETY, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public GetYExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitGetYExpression(this); + else return visitor.visitChildren(this); + } + } + public static class AndOrExpressionContext extends ExpressionContext { + public ExpressionContext left; + public Token op; + public ExpressionContext right; + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public TerminalNode AND() { return getToken(WormsProgramParser.AND, 0); } + public TerminalNode OR() { return getToken(WormsProgramParser.OR, 0); } + public AndOrExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitAndOrExpression(this); + else return visitor.visitChildren(this); + } + } + public static class IsWormExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode ISWORM() { return getToken(WormsProgramParser.ISWORM, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public IsWormExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitIsWormExpression(this); + else return visitor.visitChildren(this); + } + } + public static class NotExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode NOT() { return getToken(WormsProgramParser.NOT, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public NotExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitNotExpression(this); + else return visitor.visitChildren(this); + } + } + public static class ComparisonExpressionContext extends ExpressionContext { + public ExpressionContext left; + public Token op; + public ExpressionContext right; + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public TerminalNode LT() { return getToken(WormsProgramParser.LT, 0); } + public TerminalNode LTE() { return getToken(WormsProgramParser.LTE, 0); } + public TerminalNode GT() { return getToken(WormsProgramParser.GT, 0); } + public TerminalNode GTE() { return getToken(WormsProgramParser.GTE, 0); } + public TerminalNode EQ() { return getToken(WormsProgramParser.EQ, 0); } + public TerminalNode NEQ() { return getToken(WormsProgramParser.NEQ, 0); } + public ComparisonExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitComparisonExpression(this); + else return visitor.visitChildren(this); + } + } + public static class ParenExpressionContext extends ExpressionContext { + public ExpressionContext subExpr; + public TerminalNode LEFT_PAREN() { return getToken(WormsProgramParser.LEFT_PAREN, 0); } + public TerminalNode RIGHT_PAREN() { return getToken(WormsProgramParser.RIGHT_PAREN, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public ParenExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitParenExpression(this); + else return visitor.visitChildren(this); + } + } + public static class GetRadiusExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode GETRADIUS() { return getToken(WormsProgramParser.GETRADIUS, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public GetRadiusExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitGetRadiusExpression(this); + else return visitor.visitChildren(this); + } + } + public static class TrueLiteralExpressionContext extends ExpressionContext { + public TerminalNode TRUE() { return getToken(WormsProgramParser.TRUE, 0); } + public TrueLiteralExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitTrueLiteralExpression(this); + else return visitor.visitChildren(this); + } + } + public static class NullExpressionContext extends ExpressionContext { + public TerminalNode NULL() { return getToken(WormsProgramParser.NULL, 0); } + public NullExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitNullExpression(this); + else return visitor.visitChildren(this); + } + } + public static class SqrtExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode SQRT() { return getToken(WormsProgramParser.SQRT, 0); } + public TerminalNode LEFT_PAREN() { return getToken(WormsProgramParser.LEFT_PAREN, 0); } + public TerminalNode RIGHT_PAREN() { return getToken(WormsProgramParser.RIGHT_PAREN, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public SqrtExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitSqrtExpression(this); + else return visitor.visitChildren(this); + } + } + public static class SinExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode SIN() { return getToken(WormsProgramParser.SIN, 0); } + public TerminalNode LEFT_PAREN() { return getToken(WormsProgramParser.LEFT_PAREN, 0); } + public TerminalNode RIGHT_PAREN() { return getToken(WormsProgramParser.RIGHT_PAREN, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public SinExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitSinExpression(this); + else return visitor.visitChildren(this); + } + } + public static class SameTeamExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode SAMETEAM() { return getToken(WormsProgramParser.SAMETEAM, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public SameTeamExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitSameTeamExpression(this); + else return visitor.visitChildren(this); + } + } + public static class IsProjectileExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode ISPROJECTILE() { return getToken(WormsProgramParser.ISPROJECTILE, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public IsProjectileExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitIsProjectileExpression(this); + else return visitor.visitChildren(this); + } + } + public static class IsFoodExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode ISFOOD() { return getToken(WormsProgramParser.ISFOOD, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public IsFoodExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitIsFoodExpression(this); + else return visitor.visitChildren(this); + } + } + public static class ConstantExpressionContext extends ExpressionContext { + public Token value; + public TerminalNode NUMBER() { return getToken(WormsProgramParser.NUMBER, 0); } + public ConstantExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitConstantExpression(this); + else return visitor.visitChildren(this); + } + } + public static class SearchObjExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode SEARCHOBJ() { return getToken(WormsProgramParser.SEARCHOBJ, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public SearchObjExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitSearchObjExpression(this); + else return visitor.visitChildren(this); + } + } + public static class GetXExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode GETX() { return getToken(WormsProgramParser.GETX, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public GetXExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitGetXExpression(this); + else return visitor.visitChildren(this); + } + } + public static class ReadVariableExpressionContext extends ExpressionContext { + public Token variable; + public TerminalNode IDENTIFIER() { return getToken(WormsProgramParser.IDENTIFIER, 0); } + public ReadVariableExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitReadVariableExpression(this); + else return visitor.visitChildren(this); + } + } + public static class MulDivExpressionContext extends ExpressionContext { + public ExpressionContext left; + public Token op; + public ExpressionContext right; + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public TerminalNode MUL() { return getToken(WormsProgramParser.MUL, 0); } + public TerminalNode DIV() { return getToken(WormsProgramParser.DIV, 0); } + public MulDivExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitMulDivExpression(this); + else return visitor.visitChildren(this); + } + } + public static class GetDirectionExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode GETDIR() { return getToken(WormsProgramParser.GETDIR, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public GetDirectionExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitGetDirectionExpression(this); + else return visitor.visitChildren(this); + } + } + public static class SelfExpressionContext extends ExpressionContext { + public TerminalNode SELF() { return getToken(WormsProgramParser.SELF, 0); } + public SelfExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitSelfExpression(this); + else return visitor.visitChildren(this); + } + } + public static class GetHPExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode GETHP() { return getToken(WormsProgramParser.GETHP, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public GetHPExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitGetHPExpression(this); + else return visitor.visitChildren(this); + } + } + public static class AddSubExpressionContext extends ExpressionContext { + public ExpressionContext left; + public Token op; + public ExpressionContext right; + public List expression() { + return getRuleContexts(ExpressionContext.class); + } + public ExpressionContext expression(int i) { + return getRuleContext(ExpressionContext.class,i); + } + public TerminalNode ADD() { return getToken(WormsProgramParser.ADD, 0); } + public TerminalNode SUB() { return getToken(WormsProgramParser.SUB, 0); } + public AddSubExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitAddSubExpression(this); + else return visitor.visitChildren(this); + } + } + public static class GetMaxAPExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode GETMAXAP() { return getToken(WormsProgramParser.GETMAXAP, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public GetMaxAPExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitGetMaxAPExpression(this); + else return visitor.visitChildren(this); + } + } + public static class GetAPExpressionContext extends ExpressionContext { + public ExpressionContext expr; + public TerminalNode GETAP() { return getToken(WormsProgramParser.GETAP, 0); } + public ExpressionContext expression() { + return getRuleContext(ExpressionContext.class,0); + } + public GetAPExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitGetAPExpression(this); + else return visitor.visitChildren(this); + } + } + public static class FalseLiteralExpressionContext extends ExpressionContext { + public TerminalNode FALSE() { return getToken(WormsProgramParser.FALSE, 0); } + public FalseLiteralExpressionContext(ExpressionContext ctx) { copyFrom(ctx); } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof WormsProgramVisitor ) return ((WormsProgramVisitor)visitor).visitFalseLiteralExpression(this); + else return visitor.visitChildren(this); + } + } + + public final ExpressionContext expression() throws RecognitionException { + return expression(0); + } + + private ExpressionContext expression(int _p) throws RecognitionException { + ParserRuleContext _parentctx = _ctx; + int _parentState = getState(); + ExpressionContext _localctx = new ExpressionContext(_ctx, _parentState); + ExpressionContext _prevctx = _localctx; + int _startState = 22; + enterRecursionRule(_localctx, 22, RULE_expression, _p); + int _la; + try { + int _alt; + enterOuterAlt(_localctx, 1); + { + setState(166); + _errHandler.sync(this); + switch (_input.LA(1)) { + case IDENTIFIER: + { + _localctx = new ReadVariableExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + + setState(113); + ((ReadVariableExpressionContext)_localctx).variable = match(IDENTIFIER); + } + break; + case NUMBER: + { + _localctx = new ConstantExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(114); + ((ConstantExpressionContext)_localctx).value = match(NUMBER); + } + break; + case TRUE: + { + _localctx = new TrueLiteralExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(115); + match(TRUE); + } + break; + case FALSE: + { + _localctx = new FalseLiteralExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(116); + match(FALSE); + } + break; + case NULL: + { + _localctx = new NullExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(117); + match(NULL); + } + break; + case SELF: + { + _localctx = new SelfExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(118); + match(SELF); + } + break; + case LEFT_PAREN: + { + _localctx = new ParenExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(119); + match(LEFT_PAREN); + setState(120); + ((ParenExpressionContext)_localctx).subExpr = expression(0); + setState(121); + match(RIGHT_PAREN); + } + break; + case SQRT: + { + _localctx = new SqrtExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(123); + match(SQRT); + setState(124); + match(LEFT_PAREN); + setState(125); + ((SqrtExpressionContext)_localctx).expr = expression(0); + setState(126); + match(RIGHT_PAREN); + } + break; + case SIN: + { + _localctx = new SinExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(128); + match(SIN); + setState(129); + match(LEFT_PAREN); + setState(130); + ((SinExpressionContext)_localctx).expr = expression(0); + setState(131); + match(RIGHT_PAREN); + } + break; + case COS: + { + _localctx = new CosExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(133); + match(COS); + setState(134); + match(LEFT_PAREN); + setState(135); + ((CosExpressionContext)_localctx).expr = expression(0); + setState(136); + match(RIGHT_PAREN); + } + break; + case NOT: + { + _localctx = new NotExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(138); + match(NOT); + setState(139); + ((NotExpressionContext)_localctx).expr = expression(14); + } + break; + case GETX: + { + _localctx = new GetXExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(140); + match(GETX); + setState(141); + ((GetXExpressionContext)_localctx).expr = expression(13); + } + break; + case GETY: + { + _localctx = new GetYExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(142); + match(GETY); + setState(143); + ((GetYExpressionContext)_localctx).expr = expression(12); + } + break; + case GETRADIUS: + { + _localctx = new GetRadiusExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(144); + match(GETRADIUS); + setState(145); + ((GetRadiusExpressionContext)_localctx).expr = expression(11); + } + break; + case GETDIR: + { + _localctx = new GetDirectionExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(146); + match(GETDIR); + setState(147); + ((GetDirectionExpressionContext)_localctx).expr = expression(10); + } + break; + case GETAP: + { + _localctx = new GetAPExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(148); + match(GETAP); + setState(149); + ((GetAPExpressionContext)_localctx).expr = expression(9); + } + break; + case GETMAXAP: + { + _localctx = new GetMaxAPExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(150); + match(GETMAXAP); + setState(151); + ((GetMaxAPExpressionContext)_localctx).expr = expression(8); + } + break; + case GETHP: + { + _localctx = new GetHPExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(152); + match(GETHP); + setState(153); + ((GetHPExpressionContext)_localctx).expr = expression(7); + } + break; + case SAMETEAM: + { + _localctx = new SameTeamExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(154); + match(SAMETEAM); + setState(155); + ((SameTeamExpressionContext)_localctx).expr = expression(6); + } + break; + case SEARCHOBJ: + { + _localctx = new SearchObjExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(156); + match(SEARCHOBJ); + setState(157); + ((SearchObjExpressionContext)_localctx).expr = expression(5); + } + break; + case DISTANCE: + { + _localctx = new DistanceExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(158); + match(DISTANCE); + setState(159); + ((DistanceExpressionContext)_localctx).expr = expression(4); + } + break; + case ISWORM: + { + _localctx = new IsWormExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(160); + match(ISWORM); + setState(161); + ((IsWormExpressionContext)_localctx).expr = expression(3); + } + break; + case ISFOOD: + { + _localctx = new IsFoodExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(162); + match(ISFOOD); + setState(163); + ((IsFoodExpressionContext)_localctx).expr = expression(2); + } + break; + case ISPROJECTILE: + { + _localctx = new IsProjectileExpressionContext(_localctx); + _ctx = _localctx; + _prevctx = _localctx; + setState(164); + match(ISPROJECTILE); + setState(165); + ((IsProjectileExpressionContext)_localctx).expr = expression(1); + } + break; + default: + throw new NoViableAltException(this); + } + _ctx.stop = _input.LT(-1); + setState(182); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,12,_ctx); + while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { + if ( _alt==1 ) { + if ( _parseListeners!=null ) triggerExitRuleEvent(); + _prevctx = _localctx; + { + setState(180); + _errHandler.sync(this); + switch ( getInterpreter().adaptivePredict(_input,11,_ctx) ) { + case 1: + { + _localctx = new MulDivExpressionContext(new ExpressionContext(_parentctx, _parentState)); + ((MulDivExpressionContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(168); + if (!(precpred(_ctx, 21))) throw new FailedPredicateException(this, "precpred(_ctx, 21)"); + setState(169); + ((MulDivExpressionContext)_localctx).op = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==MUL || _la==DIV) ) { + ((MulDivExpressionContext)_localctx).op = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(170); + ((MulDivExpressionContext)_localctx).right = expression(22); + } + break; + case 2: + { + _localctx = new AddSubExpressionContext(new ExpressionContext(_parentctx, _parentState)); + ((AddSubExpressionContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(171); + if (!(precpred(_ctx, 20))) throw new FailedPredicateException(this, "precpred(_ctx, 20)"); + setState(172); + ((AddSubExpressionContext)_localctx).op = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==ADD || _la==SUB) ) { + ((AddSubExpressionContext)_localctx).op = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(173); + ((AddSubExpressionContext)_localctx).right = expression(21); + } + break; + case 3: + { + _localctx = new ComparisonExpressionContext(new ExpressionContext(_parentctx, _parentState)); + ((ComparisonExpressionContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(174); + if (!(precpred(_ctx, 19))) throw new FailedPredicateException(this, "precpred(_ctx, 19)"); + setState(175); + ((ComparisonExpressionContext)_localctx).op = _input.LT(1); + _la = _input.LA(1); + if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << LT) | (1L << LTE) | (1L << GT) | (1L << GTE) | (1L << EQ) | (1L << NEQ))) != 0)) ) { + ((ComparisonExpressionContext)_localctx).op = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(176); + ((ComparisonExpressionContext)_localctx).right = expression(20); + } + break; + case 4: + { + _localctx = new AndOrExpressionContext(new ExpressionContext(_parentctx, _parentState)); + ((AndOrExpressionContext)_localctx).left = _prevctx; + pushNewRecursionContext(_localctx, _startState, RULE_expression); + setState(177); + if (!(precpred(_ctx, 18))) throw new FailedPredicateException(this, "precpred(_ctx, 18)"); + setState(178); + ((AndOrExpressionContext)_localctx).op = _input.LT(1); + _la = _input.LA(1); + if ( !(_la==AND || _la==OR) ) { + ((AndOrExpressionContext)_localctx).op = (Token)_errHandler.recoverInline(this); + } + else { + if ( _input.LA(1)==Token.EOF ) matchedEOF = true; + _errHandler.reportMatch(this); + consume(); + } + setState(179); + ((AndOrExpressionContext)_localctx).right = expression(19); + } + break; + } + } + } + setState(184); + _errHandler.sync(this); + _alt = getInterpreter().adaptivePredict(_input,12,_ctx); + } + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + unrollRecursionContexts(_parentctx); + } + return _localctx; + } + + public boolean sempred(RuleContext _localctx, int ruleIndex, int predIndex) { + switch (ruleIndex) { + case 11: + return expression_sempred((ExpressionContext)_localctx, predIndex); + } + return true; + } + private boolean expression_sempred(ExpressionContext _localctx, int predIndex) { + switch (predIndex) { + case 0: + return precpred(_ctx, 21); + case 1: + return precpred(_ctx, 20); + case 2: + return precpred(_ctx, 19); + case 3: + return precpred(_ctx, 18); + } + return true; + } + + public static final String _serializedATN = + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3=\u00bc\4\2\t\2\4"+ + "\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13\t"+ + "\13\4\f\t\f\4\r\t\r\3\2\7\2\34\n\2\f\2\16\2\37\13\2\3\2\7\2\"\n\2\f\2"+ + "\16\2%\13\2\3\3\3\3\3\3\5\3*\n\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3"+ + "\4\5\4\66\n\4\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\5\6@\n\6\3\6\3\6\3\7\3\7"+ + "\3\7\5\7G\n\7\3\7\3\7\3\7\5\7L\n\7\3\7\5\7O\n\7\3\b\3\b\3\b\3\b\3\t\3"+ + "\t\7\tW\n\t\f\t\16\tZ\13\t\3\t\3\t\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\f"+ + "\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f\5\fq\n\f\3\r\3\r\3\r\3\r"+ + "\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3"+ + "\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r"+ + "\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\5\r\u00a9"+ + "\n\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\7\r\u00b7\n\r\f\r"+ + "\16\r\u00ba\13\r\3\r\2\3\30\16\2\4\6\b\n\f\16\20\22\24\26\30\2\6\3\2)"+ + "*\3\2\'(\3\2-\62\3\2+,\2\u00dd\2\35\3\2\2\2\4&\3\2\2\2\6\65\3\2\2\2\b"+ + "\67\3\2\2\2\n<\3\2\2\2\fC\3\2\2\2\16P\3\2\2\2\20T\3\2\2\2\22]\3\2\2\2"+ + "\24a\3\2\2\2\26p\3\2\2\2\30\u00a8\3\2\2\2\32\34\5\4\3\2\33\32\3\2\2\2"+ + "\34\37\3\2\2\2\35\33\3\2\2\2\35\36\3\2\2\2\36#\3\2\2\2\37\35\3\2\2\2 "+ + "\"\5\6\4\2! \3\2\2\2\"%\3\2\2\2#!\3\2\2\2#$\3\2\2\2$\3\3\2\2\2%#\3\2\2"+ + "\2&\'\7\36\2\2\')\7\66\2\2(*\7;\2\2)(\3\2\2\2)*\3\2\2\2*+\3\2\2\2+,\5"+ + "\6\4\2,\5\3\2\2\2-\66\5\b\5\2.\66\5\n\6\2/\66\5\f\7\2\60\66\5\16\b\2\61"+ + "\66\5\20\t\2\62\66\5\22\n\2\63\66\5\24\13\2\64\66\5\26\f\2\65-\3\2\2\2"+ + "\65.\3\2\2\2\65/\3\2\2\2\65\60\3\2\2\2\65\61\3\2\2\2\65\62\3\2\2\2\65"+ + "\63\3\2\2\2\65\64\3\2\2\2\66\7\3\2\2\2\678\7\66\2\289\7&\2\29:\5\30\r"+ + "\2:;\7\3\2\2;\t\3\2\2\2<=\7#\2\2=?\5\30\r\2>@\7;\2\2?>\3\2\2\2?@\3\2\2"+ + "\2@A\3\2\2\2AB\5\6\4\2B\13\3\2\2\2CD\7\37\2\2DF\5\30\r\2EG\7;\2\2FE\3"+ + "\2\2\2FG\3\2\2\2GH\3\2\2\2HN\5\6\4\2IK\7\"\2\2JL\7;\2\2KJ\3\2\2\2KL\3"+ + "\2\2\2LM\3\2\2\2MO\5\6\4\2NI\3\2\2\2NO\3\2\2\2O\r\3\2\2\2PQ\7%\2\2QR\5"+ + "\30\r\2RS\7\3\2\2S\17\3\2\2\2TX\79\2\2UW\5\6\4\2VU\3\2\2\2WZ\3\2\2\2X"+ + "V\3\2\2\2XY\3\2\2\2Y[\3\2\2\2ZX\3\2\2\2[\\\7:\2\2\\\21\3\2\2\2]^\7 \2"+ + "\2^_\7\66\2\2_`\7\3\2\2`\23\3\2\2\2ab\7$\2\2bc\7\3\2\2c\25\3\2\2\2de\7"+ + "\31\2\2ef\5\30\r\2fg\7\3\2\2gq\3\2\2\2hi\7\32\2\2iq\7\3\2\2jk\7\33\2\2"+ + "kq\7\3\2\2lm\7\34\2\2mq\7\3\2\2no\7\35\2\2oq\7\3\2\2pd\3\2\2\2ph\3\2\2"+ + "\2pj\3\2\2\2pl\3\2\2\2pn\3\2\2\2q\27\3\2\2\2rs\b\r\1\2s\u00a9\7\66\2\2"+ + "t\u00a9\7\63\2\2u\u00a9\7\6\2\2v\u00a9\7\7\2\2w\u00a9\7\4\2\2x\u00a9\7"+ + "\5\2\2yz\7\67\2\2z{\5\30\r\2{|\78\2\2|\u00a9\3\2\2\2}~\7\b\2\2~\177\7"+ + "\67\2\2\177\u0080\5\30\r\2\u0080\u0081\78\2\2\u0081\u00a9\3\2\2\2\u0082"+ + "\u0083\7\t\2\2\u0083\u0084\7\67\2\2\u0084\u0085\5\30\r\2\u0085\u0086\7"+ + "8\2\2\u0086\u00a9\3\2\2\2\u0087\u0088\7\n\2\2\u0088\u0089\7\67\2\2\u0089"+ + "\u008a\5\30\r\2\u008a\u008b\78\2\2\u008b\u00a9\3\2\2\2\u008c\u008d\7\13"+ + "\2\2\u008d\u00a9\5\30\r\20\u008e\u008f\7\f\2\2\u008f\u00a9\5\30\r\17\u0090"+ + "\u0091\7\r\2\2\u0091\u00a9\5\30\r\16\u0092\u0093\7\16\2\2\u0093\u00a9"+ + "\5\30\r\r\u0094\u0095\7\17\2\2\u0095\u00a9\5\30\r\f\u0096\u0097\7\20\2"+ + "\2\u0097\u00a9\5\30\r\13\u0098\u0099\7\21\2\2\u0099\u00a9\5\30\r\n\u009a"+ + "\u009b\7\22\2\2\u009b\u00a9\5\30\r\t\u009c\u009d\7\23\2\2\u009d\u00a9"+ + "\5\30\r\b\u009e\u009f\7\24\2\2\u009f\u00a9\5\30\r\7\u00a0\u00a1\7\25\2"+ + "\2\u00a1\u00a9\5\30\r\6\u00a2\u00a3\7\26\2\2\u00a3\u00a9\5\30\r\5\u00a4"+ + "\u00a5\7\27\2\2\u00a5\u00a9\5\30\r\4\u00a6\u00a7\7\30\2\2\u00a7\u00a9"+ + "\5\30\r\3\u00a8r\3\2\2\2\u00a8t\3\2\2\2\u00a8u\3\2\2\2\u00a8v\3\2\2\2"+ + "\u00a8w\3\2\2\2\u00a8x\3\2\2\2\u00a8y\3\2\2\2\u00a8}\3\2\2\2\u00a8\u0082"+ + "\3\2\2\2\u00a8\u0087\3\2\2\2\u00a8\u008c\3\2\2\2\u00a8\u008e\3\2\2\2\u00a8"+ + "\u0090\3\2\2\2\u00a8\u0092\3\2\2\2\u00a8\u0094\3\2\2\2\u00a8\u0096\3\2"+ + "\2\2\u00a8\u0098\3\2\2\2\u00a8\u009a\3\2\2\2\u00a8\u009c\3\2\2\2\u00a8"+ + "\u009e\3\2\2\2\u00a8\u00a0\3\2\2\2\u00a8\u00a2\3\2\2\2\u00a8\u00a4\3\2"+ + "\2\2\u00a8\u00a6\3\2\2\2\u00a9\u00b8\3\2\2\2\u00aa\u00ab\f\27\2\2\u00ab"+ + "\u00ac\t\2\2\2\u00ac\u00b7\5\30\r\30\u00ad\u00ae\f\26\2\2\u00ae\u00af"+ + "\t\3\2\2\u00af\u00b7\5\30\r\27\u00b0\u00b1\f\25\2\2\u00b1\u00b2\t\4\2"+ + "\2\u00b2\u00b7\5\30\r\26\u00b3\u00b4\f\24\2\2\u00b4\u00b5\t\5\2\2\u00b5"+ + "\u00b7\5\30\r\25\u00b6\u00aa\3\2\2\2\u00b6\u00ad\3\2\2\2\u00b6\u00b0\3"+ + "\2\2\2\u00b6\u00b3\3\2\2\2\u00b7\u00ba\3\2\2\2\u00b8\u00b6\3\2\2\2\u00b8"+ + "\u00b9\3\2\2\2\u00b9\31\3\2\2\2\u00ba\u00b8\3\2\2\2\17\35#)\65?FKNXp\u00a8"+ + "\u00b6\u00b8"; + public static final ATN _ATN = + new ATNDeserializer().deserialize(_serializedATN.toCharArray()); + static { + _decisionToDFA = new DFA[_ATN.getNumberOfDecisions()]; + for (int i = 0; i < _ATN.getNumberOfDecisions(); i++) { + _decisionToDFA[i] = new DFA(_ATN.getDecisionState(i), i); + } + } +} \ No newline at end of file diff --git a/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramVisitor.java b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramVisitor.java new file mode 100755 index 0000000..c023634 --- /dev/null +++ b/OGP1718-Worms/src-provided/worms/programs/internal/parser/generated/WormsProgramVisitor.java @@ -0,0 +1,306 @@ +// Generated from WormsProgram.g4 by ANTLR 4.7.1 + + package worms.programs.internal.parser.generated; + +import org.antlr.v4.runtime.tree.ParseTreeVisitor; + +/** + * This interface defines a complete generic visitor for a parse tree produced + * by {@link WormsProgramParser}. + * + * @param The return type of the visit operation. Use {@link Void} for + * operations with no return type. + */ +public interface WormsProgramVisitor extends ParseTreeVisitor { + /** + * Visit a parse tree produced by {@link WormsProgramParser#program}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitProgram(WormsProgramParser.ProgramContext ctx); + /** + * Visit a parse tree produced by {@link WormsProgramParser#proceduredef}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitProceduredef(WormsProgramParser.ProceduredefContext ctx); + /** + * Visit a parse tree produced by {@link WormsProgramParser#statement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitStatement(WormsProgramParser.StatementContext ctx); + /** + * Visit a parse tree produced by {@link WormsProgramParser#assignmentStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAssignmentStatement(WormsProgramParser.AssignmentStatementContext ctx); + /** + * Visit a parse tree produced by {@link WormsProgramParser#whileStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitWhileStatement(WormsProgramParser.WhileStatementContext ctx); + /** + * Visit a parse tree produced by {@link WormsProgramParser#ifStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIfStatement(WormsProgramParser.IfStatementContext ctx); + /** + * Visit a parse tree produced by {@link WormsProgramParser#printStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitPrintStatement(WormsProgramParser.PrintStatementContext ctx); + /** + * Visit a parse tree produced by {@link WormsProgramParser#sequenceStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSequenceStatement(WormsProgramParser.SequenceStatementContext ctx); + /** + * Visit a parse tree produced by {@link WormsProgramParser#invokeStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitInvokeStatement(WormsProgramParser.InvokeStatementContext ctx); + /** + * Visit a parse tree produced by {@link WormsProgramParser#breakStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitBreakStatement(WormsProgramParser.BreakStatementContext ctx); + /** + * Visit a parse tree produced by the {@code turnAction} + * labeled alternative in {@link WormsProgramParser#actionStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTurnAction(WormsProgramParser.TurnActionContext ctx); + /** + * Visit a parse tree produced by the {@code moveAction} + * labeled alternative in {@link WormsProgramParser#actionStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMoveAction(WormsProgramParser.MoveActionContext ctx); + /** + * Visit a parse tree produced by the {@code jumpAction} + * labeled alternative in {@link WormsProgramParser#actionStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitJumpAction(WormsProgramParser.JumpActionContext ctx); + /** + * Visit a parse tree produced by the {@code eatAction} + * labeled alternative in {@link WormsProgramParser#actionStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitEatAction(WormsProgramParser.EatActionContext ctx); + /** + * Visit a parse tree produced by the {@code fireAction} + * labeled alternative in {@link WormsProgramParser#actionStatement}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFireAction(WormsProgramParser.FireActionContext ctx); + /** + * Visit a parse tree produced by the {@code distanceExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitDistanceExpression(WormsProgramParser.DistanceExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code cosExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitCosExpression(WormsProgramParser.CosExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code getYExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitGetYExpression(WormsProgramParser.GetYExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code andOrExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAndOrExpression(WormsProgramParser.AndOrExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code isWormExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIsWormExpression(WormsProgramParser.IsWormExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code notExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNotExpression(WormsProgramParser.NotExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code comparisonExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitComparisonExpression(WormsProgramParser.ComparisonExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code parenExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitParenExpression(WormsProgramParser.ParenExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code getRadiusExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitGetRadiusExpression(WormsProgramParser.GetRadiusExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code trueLiteralExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitTrueLiteralExpression(WormsProgramParser.TrueLiteralExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code nullExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitNullExpression(WormsProgramParser.NullExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code sqrtExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSqrtExpression(WormsProgramParser.SqrtExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code sinExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSinExpression(WormsProgramParser.SinExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code sameTeamExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSameTeamExpression(WormsProgramParser.SameTeamExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code isProjectileExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIsProjectileExpression(WormsProgramParser.IsProjectileExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code isFoodExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitIsFoodExpression(WormsProgramParser.IsFoodExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code constantExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitConstantExpression(WormsProgramParser.ConstantExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code searchObjExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSearchObjExpression(WormsProgramParser.SearchObjExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code getXExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitGetXExpression(WormsProgramParser.GetXExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code readVariableExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitReadVariableExpression(WormsProgramParser.ReadVariableExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code mulDivExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitMulDivExpression(WormsProgramParser.MulDivExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code getDirectionExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitGetDirectionExpression(WormsProgramParser.GetDirectionExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code selfExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitSelfExpression(WormsProgramParser.SelfExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code getHPExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitGetHPExpression(WormsProgramParser.GetHPExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code addSubExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAddSubExpression(WormsProgramParser.AddSubExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code getMaxAPExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitGetMaxAPExpression(WormsProgramParser.GetMaxAPExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code getAPExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitGetAPExpression(WormsProgramParser.GetAPExpressionContext ctx); + /** + * Visit a parse tree produced by the {@code falseLiteralExpression} + * labeled alternative in {@link WormsProgramParser#expression}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitFalseLiteralExpression(WormsProgramParser.FalseLiteralExpressionContext ctx); +} \ No newline at end of file diff --git a/OGP1718-Worms/src-provided/worms/util/ModelException.java b/OGP1718-Worms/src-provided/worms/util/ModelException.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/src-provided/worms/util/MustNotImplementException.java b/OGP1718-Worms/src-provided/worms/util/MustNotImplementException.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/tests/worms/model/PartialPart2FacadeTest.java b/OGP1718-Worms/tests/worms/model/PartialPart2FacadeTest.java old mode 100644 new mode 100755 diff --git a/OGP1718-Worms/tests/worms/model/PartialPart3FacadeTest.java b/OGP1718-Worms/tests/worms/model/PartialPart3FacadeTest.java new file mode 100755 index 0000000..4128c71 --- /dev/null +++ b/OGP1718-Worms/tests/worms/model/PartialPart3FacadeTest.java @@ -0,0 +1,42 @@ +package worms.model; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import worms.facade.Facade; +import worms.facade.IFacade; +import worms.internal.gui.game.IActionHandler; +import worms.model.Worm; +import worms.programs.IProgramFactory; +import worms.programs.ProgramParser; + +public class PartialPart3FacadeTest { + + private static final double EPS = 1e-4; + + private IFacade facade; + + @Before + public void setup() { + facade = new Facade(); + } + + + @Test + public void testProgram() { + World world = facade.createWorld(100.0, 100.0, new boolean[][] { {true}, {false} }); + IProgramFactory programFactory = facade.createProgramFactory(); + + Program program = ProgramParser.parseProgramFromString("x := 0; while x < 1.5: { x := x + 0.1; } turn x;", programFactory); + Worm worm = facade.createWorm(world, new double[] { 50.0, 50.51 }, 0, 0.5, "TestWorm", null); + IActionHandler handler = new SimpleActionHandler(facade); + facade.loadProgramOnWorm(worm, program, handler); + double oldOrientation = facade.getOrientation(worm); + facade.startGame(world); // this will run the program + double newOrientation = facade.getOrientation(worm); + assertEquals(oldOrientation + 1.5, newOrientation, EPS); + } + +} diff --git a/OGP1718-Worms/tests/worms/model/SimpleActionHandler.java b/OGP1718-Worms/tests/worms/model/SimpleActionHandler.java new file mode 100755 index 0000000..cb384af --- /dev/null +++ b/OGP1718-Worms/tests/worms/model/SimpleActionHandler.java @@ -0,0 +1,95 @@ +package worms.model; + +import worms.facade.IFacade; +import worms.internal.gui.GUIConstants; +import worms.internal.gui.game.IActionHandler; +import worms.util.ModelException; + +/** + * A simple action handler that just calls the necessary methods on the facade. + * Useful for writing tests; there's no other reason to use this. + */ +public class SimpleActionHandler implements IActionHandler { + + private final IFacade facade; + + public SimpleActionHandler(IFacade facade) { + this.facade = facade; + } + + @Override + public boolean turn(Worm worm, double angle) { + try { + facade.turn(worm, angle); + return true; + } catch (ModelException e) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } + throw e; + } + } + + @Override + public void print(String message) { + System.out.println(message); + } + + @Override + public boolean move(Worm worm) { + try { + facade.move(worm); + if (facade.canFall(worm)) { + facade.fall(worm); + } + return true; + } catch (ModelException e) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } + throw e; + } + } + + @Override + public boolean jump(Worm worm) { + try { + facade.jump(worm, GUIConstants.JUMP_TIME_STEP); + if (facade.canFall(worm)) { + facade.fall(worm); + } + return true; + } catch (ModelException e) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } + throw e; + } + } + + @Override + public boolean fire(Worm worm) { + try { + facade.fire(worm); + return true; + } catch (ModelException e) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } + throw e; + } + } + + @Override + public boolean eat(Worm worm) { + try { + facade.eat(worm); + return true; + } catch (ModelException e) { + if (e.getCause() instanceof RuntimeException) { + throw (RuntimeException) e.getCause(); + } + throw e; + } + } +} \ No newline at end of file