Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
46
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.25 KB | None | 0 0
  1. %token ALICE
  2. %token FOUND
  3. %token WAS
  4. %token A
  5. %token AN
  6. %token TOO
  7. %token BECAME
  8. %token STOP
  9. %token DELIM
  10. %token ATE
  11. %token DRANK
  12.  
  13. %token NUMBER
  14. %token LETTER
  15. %token IDENT
  16.  
  17. %token ADD
  18. %token SUB
  19. %token MUL
  20. %token DIV
  21. %token MOD
  22. %token AND
  23. %token OR
  24. %token XOR
  25. %token NOT
  26. %token LPAR
  27. %token RPAR
  28.  
  29. %{
  30. enum Statement {
  31. s_decl (name:String,type:String);
  32. s_inc (name:String);
  33. s_dec (name:String);
  34. s_assign(name:String,value:Expr);
  35. s_cout (value:Expr);
  36. }
  37.  
  38. enum Op {
  39. op_add;
  40. op_sub;
  41. op_mul;
  42. op_div;
  43. op_mod;
  44. op_and;
  45. op_or;
  46. op_xor;
  47. op_not;
  48. }
  49.  
  50. enum Value {
  51. v_ident (x:String);
  52. v_number(x:Int);
  53. v_letter(x:Int);
  54. }
  55.  
  56. enum Expr {
  57. e_value (x:Value);
  58. a_unary (op:Op,b:Expr);
  59. a_binary(a:Expr,op:Op,b:Expr);
  60. }
  61. %}
  62.  
  63. start_symbol : program ;
  64.  
  65. program : state STOP %{ return [%0]; %}
  66. | state DELIM program %{ return [%0].concat(%2); %}
  67. | %{ return []; %}
  68. ;
  69.  
  70. state : IDENT WAS AN IDENT %{ return s_decl (%0,%3); %}
  71. | IDENT WAS A IDENT %{ return s_decl (%0,%3); %}
  72.  
  73. | IDENT WAS expr %{ return s_assign(%0,%2); %}
  74. | IDENT BECAME expr %{ return s_assign(%0,%2); %}
  75.  
  76. | IDENT DRANK %{ return s_dec (%0); %}
  77. | IDENT ATE %{ return s_inc (%0); %}
  78.  
  79. | ALICE FOUND expr %{ return s_cout(%2); %}
  80. ;
  81.  
  82. expr : expr OR e1 %{ return a_binary(%0,op_or,%1); %}
  83. | e1 %{ return %0; %}
  84. ;
  85.  
  86. e1 : e1 XOR e2 %{ return a_binary(%0,op_xor,%1); %}
  87. | e2 %{ return %0; %}
  88. ;
  89.  
  90. e2 : e2 AND e3 %{ return a_binary(%0,op_and,%1); %}
  91. | e3 %{ return %0; %}
  92. ;
  93.  
  94. e3 : e3 ADD e4 %{ return a_binary(%0,op_add,%1); %}
  95. | e3 SUB e4 %{ return a_binary(%0,op_sub,%1); %}
  96. | e4 %{ return %0; %}
  97. ;
  98.  
  99. e4 : e4 MUL e5 %{ return a_binary(%0,op_mul,%1); %}
  100. | e4 DIV e5 %{ return a_binary(%0,op_div,%1); %}
  101. | e4 MOD e5 %{ return a_binary(%0,op_mod,%1); %}
  102. | e5 %{ return %0; %}
  103. ;
  104.  
  105. e5 : datum %{ return a_value(%0); %}
  106. | ADD e5 %{ return a_unary(op_add,%1); %}
  107. | SUB e5 %{ return a_unary(op_sub,%1); %}
  108. | NOT e5 %{ return a_unary(op_not,%1); %}
  109. | LPAR expr RPAR %{ return %1; %}
  110. ;
  111.  
  112. datum : NUMBER %{ return v_ident (%0); %}
  113. | LETTER %{ return v_letter(%0); %}
  114. | IDENT %{ return v_letter(%0); %}
  115. ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement