Guest User

Untitled

a guest
Jun 13th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 4.69 KB | None | 0 0
  1. %{
  2.  
  3. open Ast
  4.  
  5. %}
  6. %token <string*int> INT IDENT TYPE STRING
  7. %token EOF
  8. %token <int> NEW
  9. %token <int> LET IN
  10. %token <int> DOT
  11. %token <int> AT
  12. %token <int> NEGATE
  13. %token <int> ISVOID
  14. %token <int> TIMES DIVIDE
  15. %token <int> PLUS MINUS
  16. %token <int> EQUALS LESSEQUAL LESSTHAN
  17. %token <int> NOT
  18. %token <int> GETS RARROW
  19.  
  20. %token <int> CLASS INHERITS
  21. %token <int> LBRACE RBRACE
  22. %token <int> LPAREN RPAREN
  23. %token <int> OF IF THEN ELSE ENDIF
  24. %token <int> CASE ENDCASE RARROW
  25. %token <int> WHILE BEGINLOOP ENDLOOP
  26. %token <int> TRUE FALSE
  27. %token <int> SEMIC COLON COMMA
  28.  
  29. %nonassoc NEW
  30. %left DOT
  31. %left AT
  32. %nonassoc NEGATE
  33. %nonassoc ISVOID
  34. %left TIMES DIVIDE
  35. %left PLUS MINUS
  36. %nonassoc EQUALS LESSEQUAL LESSTHAN
  37. %nonassoc NOT
  38. %right GETS
  39. //BULLSHIT(?)
  40. %left IN
  41.  
  42. %start main
  43. %type <Ast.ast> main
  44. %%
  45. main:
  46.    | class_list { Ast($1) }
  47.  
  48. class_list:
  49.    | class_def SEMIC class_list { $1 :: $3 }
  50.    | { [] }
  51.  
  52. class_def:
  53.    | CLASS TYPE LBRACE feature_list RBRACE
  54.                    { Class($4) }
  55.    | CLASS TYPE INHERITS TYPE LBRACE feature_list RBRACE
  56.                    { Class($6) }
  57.    
  58. feature_list:
  59.    | feature SEMIC feature_list { $1 :: $3 }
  60.    | { [] }
  61.    
  62. feature:
  63.    | IDENT COLON TYPE                  { let identname,_ = $1 in
  64.                                          let typename,_ = $3 in
  65.                                          Field(identname,typename,None) }
  66.                                  
  67.    | IDENT COLON TYPE GETS expr        { let identname,_ = $1 in
  68.                                          let typename,_ = $3 in
  69.                                          Field(identname, typename, Some($5)) }
  70.    
  71.    | IDENT LPAREN RPAREN COLON TYPE LBRACE expr RBRACE
  72.                                        { let ident,_ = $1 in
  73.                                          let return,_ = $5 in
  74.                                          Method (ident,[],return,$7) }
  75.                                          
  76.    | IDENT LPAREN formal_list RPAREN COLON TYPE LBRACE expr RBRACE
  77.                                        { let ident,_ = $1 in
  78.                                          let return,_ = $6 in
  79.                                          Method (ident,$3,return,$8) }
  80.  
  81.  
  82.  
  83. formal_list:
  84.    | formal COMMA formal_list { $1 :: $3 }
  85.    | formal { [$1] }
  86.  
  87. formal:
  88.    | IDENT COLON TYPE { let name1,line1 = $1 in  
  89.                         let name2,line2 = $3 in
  90.                         Formal(name1,name2,$2) }
  91.  
  92. expr:
  93.    | IDENT GETS expr     { let name,line = $1 in
  94.                            Assign(name, $3, line) }
  95.  
  96.    | expr AT maybe_type DOT IDENT LPAREN arg_list RPAREN
  97.                          { let name,line = $5 in
  98.                            Cast($1,$3, name, $7, line) }
  99.    | IDENT LPAREN arg_list RPAREN
  100.                          { let name,line = $1 in
  101.                            Call(name, $3, $2) }
  102.    | IF expr THEN expr ELSE expr ENDIF
  103.                          { If($2, $4, $6) }
  104.    | WHILE expr BEGINLOOP expr ENDLOOP
  105.                          { While($2,$4) }
  106.    | LBRACE block_list RBRACE
  107.                          { Block($2) }
  108.    | LET let_list IN expr
  109.                          { Let($2,$4,$1) }
  110.    | CASE expr OF case_list ENDCASE
  111.                          { Case($2, $4, $3) }
  112.    | NEW TYPE            { let name,line = $2 in
  113.                            New(name,line) }
  114.    | ISVOID expr         { IsVoid($2,$1) }
  115.    | expr PLUS expr      { Plus($1,$3,$2) }
  116.    | expr MINUS expr     { Minus($1,$3,$2) }
  117.    | expr TIMES expr     { Times($1,$3,$2) }
  118.    | expr DIVIDE expr    { Divide($1,$3,$2) }
  119.    | NEGATE expr         { Negate($2,$1) }
  120.    | expr LESSTHAN expr  { Less($1,$3,$2) }
  121.    | expr LESSEQUAL expr { LessEqual($1,$3,$2) }
  122.    | expr EQUALS expr    { Equal($1,$3,$2) }
  123.    | NOT expr            { Not($2,$1) }
  124.    | LPAREN expr RPAREN  { $2 }
  125.    | IDENT               { let name,line = $1 in
  126.                            Identifier(name,line) }
  127.    | INT                 { let name,line = $1 in  
  128.                            Integer(name,line) }
  129.    | STRING              { let name,line = $1 in
  130.                            String(name,line) }
  131.    | TRUE                { True($1) }
  132.    | FALSE               { False($1) }
  133.    
  134. let_list:
  135.    | let_ COMMA let_list { $1 :: $3 }
  136.    | let_ { [] }
  137.  
  138. let_:
  139.    | formal GETS expr {  ($1,Some($3)) }
  140.    | formal { ($1,None) }
  141.    
  142.    
  143. arg_list:
  144.    | expr COMMA arg_list { $1 :: $3 }
  145.    | expr { [$1] }
  146.    
  147. maybe_type:
  148.    | TYPE { let name,line = $1 in Some(name) }
  149.    | { None }
  150.    
  151. block_list:
  152.    | expr SEMIC block_list { $1 :: $3 }
  153.    | { [] }
  154.    
  155.    
  156. case_list:
  157.    | case SEMIC case_list { $1 :: $3 }
  158.    | case SEMIC { [$1] }
  159.  
  160. case:
  161.    | IDENT COLON TYPE RARROW expr { let idname,idline = $1 in
  162.                                     let typename,typeline = $3 in
  163.                                     CaseCase(idname,typename,$5,idline) }
Add Comment
Please, Sign In to add comment