Combine declaration sub-rules
[tiger.ml.git] / tiger / src / lib / tiger / tiger_parser.mly
index 157a8a6..a415ae7 100644 (file)
@@ -82,13 +82,20 @@ exp:
     {
       sprintf "negation[%s]" $2
     }
-  | type_id LBRACK exp RBRACK OF exp
+  | ID LBRACK exp RBRACK OF exp
     {
-      sprintf "array[type[%s], size[%s], val[%s]]" $1 $3 $6
+      let type_id = $1 in
+      let exp_1 = $3 in
+      let exp_2 = $6 in
+      sprintf "array[type[%s], size[%s], val[%s]]" type_id exp_1 exp_2
     }
-  | type_id LBRACE rec_field_assignments RBRACE
+  | ID LBRACE rec_field_assignments RBRACE
     {
-      sprintf "record[type[%s], rec_field_assignments[%s]]" $1 $3
+      let type_id = $1 in
+      let rec_field_assignments = $3 in
+      sprintf
+        "record[type[%s], rec_field_assignments[%s]]"
+        type_id rec_field_assignments
     }
   | lvalue
     {
@@ -102,9 +109,16 @@ exp:
     {
       sprintf "string[%S]" $1
     }
-  | fun_call
+  | ID LPAREN RPAREN
     {
-      $1
+      let id = $1 in
+      sprintf "fun_call[%s, []]" id
+    }
+  | ID LPAREN fun_args RPAREN
+    {
+      let id = $1 in
+      let fun_args = $3 in
+      sprintf "fun_call[%s, %s]" id fun_args
     }
   | exp op exp
     {
@@ -125,7 +139,7 @@ exp:
     {
       sprintf "while[%s, do[%s]]" $2 $4
     }
-  | FOR id ASSIGN exp TO exp DO exp
+  | FOR ID ASSIGN exp TO exp DO exp
     {
       let id = $2 in
       let e1 = $4 in
@@ -137,27 +151,28 @@ exp:
     {
       "break[]"
     }
-  | LPAREN seq RPAREN
+  | LPAREN exps RPAREN
     {
-      sprintf "seq[%s]" $2
+      sprintf "exps[%s]" $2
     }
-  | LET decs IN seq END
+  | LET decs IN exps END
     {
       let decs = $2 in
-      let seq = $4 in
-      sprintf "let[decs[%s], in[seq[%s]]]" decs seq
+      let exps = $4 in
+      sprintf "let[decs[%s], in[exps[%s]]]" decs exps
     }
-  | unit
+  | LPAREN RPAREN
     {
-      $1
+      (* Perhaps "void"? *)
+      "unit[]"
     }
 
-seq:
+exps:
   | exp
     {
       sprintf "%s" $1
     }
-  | exp SEMICOLON seq
+  | exp SEMICOLON exps
     {
       sprintf "%s; %s" $1 $3
     }
@@ -173,66 +188,69 @@ decs:
     }
 
 dec:
-  | tydec  {$1}
-  | vardec {$1}
-  | fundec {$1}
-
-fundec:
-  | FUNCTION id LPAREN tyfields RPAREN EQ exp
+  /* Tydec */
+  | TYPE ID EQ ID
     {
-      let id       = $2 in
-      let tyfields = $4 in
-      let exp      = $7 in
-      sprintf "fundec[%s, tyfields[%s], exp[%s]]" id tyfields exp
+      let type_id_new = $2 in
+      let type_id_orig = $4 in
+      sprintf "tydec_alias[from[%s], to[%s]]" type_id_new type_id_orig
     }
-  | FUNCTION id LPAREN tyfields RPAREN COLON type_id EQ exp
+  | TYPE ID EQ LBRACE RBRACE
     {
-      let id       = $2 in
-      let tyfields = $4 in
-      let type_id  = $7 in
-      let exp      = $9 in
-      sprintf
-        "fundec[%s, tyfields[%s], type_id[%s], exp[%s]]"
-        id tyfields type_id exp
+      let type_id = $2 in
+      sprintf "tydec_empty_record[%s]" type_id
+    }
+  | TYPE ID EQ LBRACE tyfields RBRACE
+    {
+      let type_id = $2 in
+      let tyfields = $5 in
+      sprintf "tydec_record[%s, fields[%s]]" type_id tyfields
+    }
+  | TYPE ID EQ ARRAY OF ID
+    {
+      let type_id = $2 in
+      let element_type_id = $6 in
+      sprintf "tydec_array[%s, elements_of_type[%s]]" type_id element_type_id
     }
 
-vardec:
-  | VAR id ASSIGN exp
+  /* Vardec */
+  | VAR ID ASSIGN exp
     {
       let id = $2 in
       let exp = $4 in
       sprintf "vardec[%s, exp[%s]]" id exp
     }
-  | VAR id COLON type_id ASSIGN exp
+  | VAR ID COLON ID ASSIGN exp
     {
       let id = $2 in
-      let tyid = $4 in
+      let type_id = $4 in
       let exp = $6 in
-      sprintf "vardec[%s, type_id[%s], exp[%s]]" id tyid exp
+      sprintf "vardec[%s, type_id[%s], exp[%s]]" id type_id exp
     }
 
-tydec:
-  | TYPE type_id EQ ty
+  /* Fundec */
+  | FUNCTION ID LPAREN RPAREN EQ exp
     {
-      sprintf "tydec[%s, %s]" $2 $4
-    }
-
-ty:
-  | type_id
-    {$1}
-  | LBRACE RBRACE
-    {
-      "record[]"
+      let id       = $2 in
+      let exp      = $6 in
+      sprintf "fundec[%s, arguments[], exp[%s]]" id exp
     }
-  | LBRACE tyfields RBRACE
+  | FUNCTION ID LPAREN tyfields RPAREN EQ exp
     {
-      let tyfields = $2 in
-      sprintf "record[%s]" tyfields
+      let id       = $2 in
+      let tyfields = $4 in
+      let exp      = $7 in
+      sprintf "fundec[%s, arguments[%s], exp[%s]]" id tyfields exp
     }
-  | ARRAY OF type_id
+  | FUNCTION ID LPAREN tyfields RPAREN COLON ID EQ exp
     {
-      let type_id = $3 in
-      sprintf "array_of_type[%s]" type_id
+      let id       = $2 in
+      let tyfields = $4 in
+      let type_id  = $7 in
+      let exp      = $9 in
+      sprintf
+        "fundec[%s, tyfields[%s], type_id[%s], exp[%s]]"
+        id tyfields type_id exp
     }
 
 tyfields:
@@ -247,50 +265,26 @@ tyfields:
     }
 
 tyfield:
-  | id COLON type_id
+  | ID COLON ID
     {
       let id = $1 in
       let type_id = $3 in
       sprintf "tyfield[%s, %s]" id type_id
     }
 
-id:
-  | ID
-    {
-      sprintf "id[%S]" $1
-    }
-
-/* Perhaps "void"? */
-unit:
-  | LPAREN RPAREN
-    {
-      "unit[]"
-    }
-
-type_id:
-  | id
-    {
-      sprintf "type_id[%S]" $1
-    }
-
 rec_field_assignments:
-  | id EQ exp
-    {
-      sprintf "%S = %s" $1 $3
-    }
-  | id EQ exp COMMA rec_field_assignments
+  | ID EQ exp
     {
-      sprintf "%S = %s, %s" $1 $3 $5
-    }
-
-fun_call:
-  | id unit
-    {
-      sprintf "fun_call[%s, %s]" $1 $2
+      let id = $1 in
+      let exp = $3 in
+      sprintf "%S = %s" id exp
     }
-  | id LPAREN fun_args RPAREN
+  | ID EQ exp COMMA rec_field_assignments
     {
-      sprintf "fun_call[%s, %s]" $1 $3
+      let id = $1 in
+      let exp = $3 in
+      let rec_field_assignments = $5 in
+      sprintf "%S = %s, %s" id exp rec_field_assignments
     }
 
 fun_args:
@@ -318,17 +312,22 @@ op:
   | OR     {"|"}
 
 lvalue:
-  | id
+  | ID
     {
-      sprintf "lvalue[%s]" $1
+      let id = $1 in
+      sprintf "lvalue[%s]" id
     }
-  | lvalue DOT id
+  | lvalue DOT ID
     {
-      sprintf "get_record_field[%s, %s]" $1 $3
+      let record = $1 in
+      let field = $3 in
+      sprintf "get_record_field[%s, %s]" record field
     }
   | lvalue LBRACK exp RBRACK
     {
-      sprintf "get_array_subscript[%s, %s]" $1 $3
+      let array = $1 in
+      let subscript = $3 in
+      sprintf "get_array_subscript[%s, %s]" array subscript
     }
 
 %%
This page took 0.034589 seconds and 4 git commands to generate.