Advertisement
Five_NT

plp

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