Implement tactics.
[goals.git] / src / parser.mly
index 5a2ce9b..3a17124 100644 (file)
@@ -36,6 +36,7 @@ open Printf
 %token RIGHT_PAREN
 %token <Ast.substs> STRING
 %token <string> TACTIC
+%token TACTIC_KEYWORD
 
 (* Start nonterminals. *)
 %start <Ast.env> file
@@ -67,24 +68,29 @@ stmt:
       let name, params = $1 in
       name, Ast.EGoal ($loc, (params, [], [], Some $2))
     }
+    | TACTIC_KEYWORD TACTIC params_decl EQUALS CODE
+    {
+      $2, Ast.ETactic ($loc, ($3, $5))
+    }
     | LET ID EQUALS expr { $2, $4 }
     ;
 
 goal_stmt:
-    | GOAL ID option(param_decl) EQUALS
+    | GOAL ID option(params_decl) EQUALS
     { $2, match $3 with None -> [] | Some ps -> ps }
     ;
-param_decl:
-    | LEFT_PAREN separated_list(COMMA, ID) RIGHT_PAREN { $2 }
+params_decl:
+    | LEFT_PAREN separated_list(COMMA, param_decl) RIGHT_PAREN { $2 }
     ;
+param_decl:
+    | ID         { $1 }
 
 patterns:
     | separated_list(COMMA, pattern) { $1 }
     ;
 pattern:
-    | STRING     { Ast.PTactic ($loc, "file", [$1]) }
+    | STRING     { Ast.PTactic ($loc, "*file", [$1]) }
     | ID pattern_params { Ast.PTactic ($loc, $1, $2) }
-    | ID         { Ast.PVar ($loc, $1) }
     ;
 pattern_params:
     | LEFT_PAREN separated_list(COMMA, pattern_param) RIGHT_PAREN { $2 }
@@ -94,9 +100,9 @@ pattern_param:
     ;
 
 expr:
-    | ID params  { Ast.ECall ($loc, $1, $2) }
+    | ID params  { Ast.ECallGoal ($loc, $1, $2) }
     | ID         { Ast.EVar ($loc, $1) }
-    | TACTIC params { Ast.ETactic ($loc, $1, $2) }
+    | TACTIC params { Ast.ECallTactic ($loc, $1, $2) }
     | STRING     { Ast.ESubsts ($loc, $1) }
     | LEFT_ARRAY barelist RIGHT_ARRAY { Ast.EList ($loc, $2) }
     ;