Advertisement
Guest User

Untitled

a guest
Oct 26th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 2.69 KB | None | 0 0
  1. %{
  2.  
  3. open Quad
  4. open Common
  5. open Comp
  6. open Karel
  7.  
  8.  
  9. %}
  10.  
  11. /* Ensemble des non terminaux */
  12. %token BEGIN_PROG
  13. %token BEGIN_EXEC
  14. %token END_EXEC
  15. %token END_PROG
  16.  
  17. %token MOVE
  18. %token TURN_LEFT
  19. %token TURN_OFF
  20.  
  21. %token SEMI
  22. %token BEGIN
  23. %token END
  24.  
  25. %token PICK_BEEPER
  26. %token PUT_BEEPER
  27. %token NEXT_TO_A_BEEPER
  28. %token NOT_NEXT_TO_A_BEEPER
  29.  
  30.  
  31. %token FRONT_IS_CLEAR
  32. %token FRONT_IS_BLOCKED
  33. %token LEFT_IS_CLEAR
  34. %token LEFT_IS_BLOCKED
  35. %token RIGHT_IS_CLEAR
  36. %token RIGHT_IS_BLOCKED
  37.  
  38. %token FACING_NORTH
  39. %token NOT_FACING_NORTH
  40. %token FACING_EAST
  41. %token NOT_FACING_EAST
  42. %token FACING_WEST
  43. %token NOT_FACING_WEST
  44. %token FACING_SOUTH
  45. %token NOT_FACING_SOUTH
  46.  
  47. %token ANY_BEEPERS_IN_BEEPER_BAG
  48. %token NO_BEEPERS_IN_BEEPER_BAG
  49.  
  50. %token ITERATE
  51. %token TIMES
  52.  
  53. %token WHILE
  54. %token DO
  55.  
  56. %token IF
  57. %token THEN
  58. %token ELSE
  59.  
  60. %token DEFINE_NEW_INSTRUCTION
  61. %token AS
  62.  
  63. %token <string> ID
  64. %token <int> INT
  65.  
  66.  
  67. %type <unit> prog
  68. %start prog
  69.  
  70. %%
  71.  
  72. prog:   BEGIN_PROG subprgs BEGIN_EXEC stmts_opt END_EXEC END_PROG {
  73.     ()
  74. };
  75.  
  76. stmts_opt:
  77. |       { () }
  78. |   stmts { () }
  79. ;
  80.  
  81. stmts:
  82. | stmt                { () }
  83. |   stmts SEMI stmt { () }
  84. |   stmts SEMI        { () }
  85. ;
  86.  
  87. stmt:  
  88. | opened_stmt { () }
  89. | closed_stmt { () };
  90.  
  91.  
  92.  
  93. opened_stmt:       
  94. | IF test THEN stmt {()}
  95. |   IF test THEN closed_stmt ELSE opened_stmt   {()}
  96. |   ITERATE INT TIMES opened_stmt   {()}
  97. |   WHILE test DO opened_stmt   {()}
  98.  
  99.  
  100. closed_stmt:       
  101. |   simple_stmt {()}
  102. |   ITERATE INT TIMES closed_stmt   {()}
  103. |   WHILE test DO closed_stmt {()}
  104. |   BEGIN stmts END {()}
  105. |   IF test THEN closed_stmt ELSE closed_stmt {()}
  106.  
  107. simple_stmt:
  108.     | TURN_LEFT {
  109.         gen (INVOKE (turn_left, 0, 0))
  110.     }
  111.     |   TURN_OFF {
  112.         gen STOP
  113.     }
  114.     |   MOVE {
  115.         gen (INVOKE (move, 0, 0))
  116.     }
  117.     | PUT_BEEPER {
  118.         gen (INVOKE (put_beeper, 0, 0))
  119.     }
  120.     | PICK_BEEPER {
  121.         gen (INVOKE (pick_beeper, 0, 0))
  122.     }
  123.     | ID {
  124.         if (is_defined $1) then
  125.             ()
  126.         else
  127.             (raise (SyntaxError ("Le sous programme suivant n'existe pas : " ^ $1)))
  128.     };
  129.  
  130. test:
  131.     | FRONT_IS_CLEAR { () }
  132.     | FRONT_IS_BLOCKED { () }
  133.     | LEFT_IS_CLEAR { () }
  134.     | LEFT_IS_BLOCKED { () }
  135.     | RIGHT_IS_CLEAR { () }
  136.     | RIGHT_IS_BLOCKED { () }
  137.     | NEXT_TO_A_BEEPER { () }
  138.     | NOT_NEXT_TO_A_BEEPER { () }
  139.     | FACING_NORTH { () }
  140.     | NOT_FACING_NORTH { () }
  141.     | FACING_EAST { () }
  142.     | NOT_FACING_EAST { () }
  143.     | FACING_SOUTH { () }
  144.     | NOT_FACING_SOUTH { () }
  145.     | FACING_WEST { () }
  146.     | NOT_FACING_WEST { () }
  147.     | ANY_BEEPERS_IN_BEEPER_BAG { () }
  148.     | NO_BEEPERS_IN_BEEPER_BAG { () };
  149.  
  150. define_new:
  151.     | DEFINE_NEW_INSTRUCTION ID AS stmts {
  152.         if (is_defined $2) then
  153.             (raise (SyntaxError ("Le nom de sous-programme suivant est deja utilise : " ^ $2)))
  154.         else
  155.             (define $2 0)
  156.     };
  157.  
  158. subprgs:
  159.     | { () }
  160.     | define_new subprgs { () };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement