Advertisement
Five_NT

k

Dec 5th, 2016
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.29 KB | None | 0 0
  1. module IMP-SYNTAX
  2.  
  3. syntax AExp ::= Int | Id | String
  4. | "++" Id
  5. | Id "++"
  6. > "read" "(" ")"
  7. | Id "(" Params ")" [strict(2)]
  8. | AExp "/" AExp [left, strict, div]
  9. | AExp "*" AExp [left, strict, mult]
  10. > AExp "+" AExp [left, strict, plus]
  11. | AExp "-" AExp [left, strict, minus]
  12. | AExp "%" AExp [left, strict, mod]
  13. | "(" AExp ")" [bracket]
  14.  
  15. syntax BExp ::= Bool
  16. | "!" BExp [strict]
  17. | BExp "&&" BExp [strict(1)]
  18. | BExp "||" BExp [strict(1)]
  19. | AExp "<=" AExp [strict]
  20. | AExp ">=" AExp [strict]
  21. | AExp "<" AExp [strict]
  22. | AExp ">" AExp [strict]
  23. | AExp "==" AExp [strict]
  24. | "(" BExp ")" [bracket]
  25.  
  26. syntax Block ::= "{" "}"
  27. | "{" Stmt "}"
  28.  
  29. syntax Stmt ::= Block
  30. | "return" ";"
  31. | "return" AExp ";" [strict]
  32. | "print" "(" AExp ")" ";" [strict]
  33. | Id "=" AExp ";" [strict(2)]
  34. | "if" "(" BExp ")" Stmt "else" Stmt [strict(1)]
  35. | BExp "?" Stmt ":" Stmt [strict(1)]
  36. | "while" "(" BExp ")" Stmt [strict(1)]
  37. | "repeat" Stmt "until" BExp "end"
  38. > Stmt Stmt [left]
  39.  
  40. syntax Pgm ::= List{Decl,";"}
  41. syntax Decl ::= VarDecl | FunDecl
  42. syntax VarDecl ::= "int" Id
  43. syntax FunDecl ::= "function" Id "(" VarDecls ")" Block
  44. syntax VarDecls ::= List{VarDecl, ","}
  45. syntax Params ::= List{AExp, ","} [strict]
  46.  
  47. syntax Id ::= "main" [token]
  48. syntax KItem ::= "execute"
  49.  
  50. endmodule
  51.  
  52. module IMP
  53. imports IMP-SYNTAX
  54.  
  55. configuration <T>
  56. <k> $PGM:Pgm ~> execute </k>
  57. <env> .Map </env>
  58. <store> .Map </store>
  59. <in stream="stdin"> .List </in>
  60. <out stream="stdout"> .List </out>
  61. <fstack> .List </fstack>
  62. <return> dummy </return>
  63. </T>
  64.  
  65. syntax Val ::= Int | Bool | "dummy" | String
  66. syntax Vals ::= List{Val, ","}
  67. syntax KResult ::= Val | Vals
  68.  
  69. syntax Params ::= Vals
  70. syntax AExp ::= Val
  71.  
  72. // sequecing declarations
  73. rule D:Decl ; Ds:Pgm => D ~> Ds
  74.  
  75. // var decl
  76. rule <k> (int X:Id => .) ...</k>
  77. <env> Rho:Map => Rho[X <- !L:Int] </env>
  78. <store> Sigma => Sigma[!L <- 0] </store>
  79.  
  80. // fun decl
  81. syntax Lambda ::= "lambda" "(" VarDecls "," Block ")"
  82. rule <k> (function X:Id ( P:VarDecls ) B => .) ...</k>
  83. <env> Rho:Map => Rho[X <- !L:Int] </env>
  84. <store> Sigma:Map => Sigma[!L <- lambda(P, B)] </store>
  85.  
  86. // execute
  87. rule (.Pgm ~> execute) => main(.Params)
  88.  
  89. // function call setup
  90. syntax KItem ::= "saveEnv"
  91. syntax KItem ::= "mkDecl" "(" VarDecls "," Vals ")"
  92. rule <k> X:Id (Vs:Vals) => saveEnv ~> mkDecl(P, Vs) ~> B ...</k>
  93. <env>... X |-> L:Int </env>
  94. <store>... L |-> lambda(P, B) ...</store>
  95.  
  96. // save environment
  97. rule <k> saveEnv => . ...</k>
  98. <env> Rho </env>
  99. <fstack> (.List => ListItem(Rho)) ...</fstack>
  100.  
  101. // make declarations
  102. rule <k> mkDecl((int X:Id, P:VarDecls) , (V:Val, Vs:Vals)) => mkDecl(P, Vs) ...</k>
  103. <env> Rho:Map => Rho[X <- !L:Int] </env>
  104. <store> Sigma:Map => Sigma[!L <- V] </store>
  105.  
  106. rule mkDecl(.VarDecls, .Vals) => .
  107.  
  108. // return
  109. rule <k> return V:Val ; => V ...</k>
  110. <env> _ => Rho </env>
  111. <fstack> (ListItem(Rho) => .List) ...</fstack>
  112. <return> _ => V </return>
  113.  
  114. rule <k> return ; => dummy ...</k>
  115. <env> _ => Rho </env>
  116. <fstack> (ListItem(Rho) => .List) ...</fstack>
  117. <return> _ => dummy </return>
  118.  
  119. // AExp
  120. rule I1:Int + I2:Int => I1 +Int I2 [plus]
  121. rule I1:Int - I2:Int => I1 -Int I2 [minus]
  122. rule I1:Int * I2:Int => I1 *Int I2 [mult]
  123. rule I1:Int / I2:Int => I1 /Int I2 requires I2 =/=Int 0 [div]
  124. rule I1:Int % I2:Int => I1 %Int I2 [mod]
  125.  
  126. // ++x and x++
  127. rule <k> (++X:Id => I:Int +Int 1) ...</k>
  128. <env>... X |-> L:Int ...</env>
  129. <store>... L |-> (I:Int => I +Int 1) ...</store> [preincrement]
  130.  
  131. rule <k> (X:Id++ => I:Int) ...</k>
  132. <env>... X |-> L:Int ...</env>
  133. <store>... L |-> (I:Int => I +Int 1) ...</store> [postincrement]
  134.  
  135. // read
  136. rule <k> (read() => I)...</k>
  137. <in> (ListItem(I:Int) => .List) ...</in>
  138.  
  139. // print cu --output none
  140. syntax Printable ::= Int | String
  141. syntax AExp ::= Printable
  142. rule <k> (print(I:Printable); => .) ...</k>
  143. <out>... (.List => ListItem(I)) </out>
  144.  
  145. // BExp
  146. rule ! false => true
  147. rule ! true => false
  148. rule true && B => B
  149. rule false && _ => false
  150. rule false || B => B
  151. rule true || _ => true
  152. rule I1:Int <= I2:Int => I1 <=Int I2
  153. rule I1:Int == I2:Int => I1 ==Int I2
  154. rule I1:Int >= I2:Int => I1 >=Int I2
  155. rule I1:Int < I2:Int => I1 <Int I2
  156. rule I1:Int > I2:Int => I1 >Int I2
  157.  
  158. // sequences
  159. rule S1:Stmt S2:Stmt => S1 ~> S2
  160.  
  161. // assignment
  162. rule <k> (X = V:Int ; => .) ...</k>
  163. <env>... X |-> L ...</env>
  164. <store>... L |-> (_ => V) ...</store> [assignment]
  165.  
  166. // if
  167. rule if (true) S else _ => S
  168. rule if (false) _ else S => S
  169. // ? :
  170. rule (true) ? S : _ => S
  171. rule (false) ? _ : S => S
  172.  
  173. // lookup
  174. rule <k> (X => V) ...</k>
  175. <env>... X |-> L:Int ...</env>
  176. <store>... L |-> V ...</store>
  177.  
  178. // blocks
  179. rule { } => .
  180. rule { S:Stmt } => S
  181.  
  182. // while: loop unrolling
  183. rule while (B) S => if (B) { S while (B) S } else { }
  184. // repeat [] until [] end
  185. rule repeat S until (B) end => S if (B) { S while (B) S} else { }
  186.  
  187. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement