]> matita.cs.unibo.it Git - helm.git/blobdiff - helm/DEVEL/pxp/pxp/m2parsergen/parser.mly
Initial revision
[helm.git] / helm / DEVEL / pxp / pxp / m2parsergen / parser.mly
diff --git a/helm/DEVEL/pxp/pxp/m2parsergen/parser.mly b/helm/DEVEL/pxp/pxp/m2parsergen/parser.mly
new file mode 100644 (file)
index 0000000..7497c3a
--- /dev/null
@@ -0,0 +1,194 @@
+/* $Id$
+ * ----------------------------------------------------------------------
+ *
+ */
+
+%{
+  open Ast
+
+%}
+
+%token Space
+%token Token
+%token Type
+%token <string> Lname
+%token <string> Uname
+%token Separator
+%token Lparen
+%token Rparen
+%token Comma
+%token Colon
+%token <string * int * int> Code
+%token Error
+%token Alt
+%token Loop_plus
+%token Loop_star
+%token Dollar
+%token Lbracket
+%token Rbracket%token Eof
+
+%start text
+%type <Ast.text> text
+
+%%
+
+text:
+  declarations rules
+    { { text_decls = $1; text_rules = $2; } }
+
+declarations:
+  declaration declarations
+    { $1 :: $2 }
+| Separator
+    { [] }
+
+declaration:
+  Token Uname
+    { D_token $2 }
+| Token Type Uname
+    { D_typed_token $3 }
+
+rules:
+  rule rules
+    { $1 :: $2 }
+| Separator
+    { [] }
+
+rule:
+  Lname Lparen formal_arguments Colon branches
+    { { rule_name = $1;
+       rule_arguments = $3;
+       rule_branches = $5;
+      }
+    }
+
+formal_arguments:
+  Rparen
+    { [] }
+| Lname comma_formal_arguments
+    { $1 :: $2 }
+
+comma_formal_arguments:
+  Comma Lname comma_formal_arguments
+    { $2 :: $3 }
+| Rparen
+    { [] }
+
+branches:
+  branch alt_branches
+    { $1 :: $2 }
+
+alt_branches:
+  Alt branch alt_branches
+    { $2 :: $3 }
+|
+    { [] }
+
+branch:
+  simple_branch
+    { $1 }
+| Dollar Code simple_branch
+    { { $3 with branch_early_code = $2 } }
+
+simple_branch:
+  symbol Dollar Code patterns Code opt_error_handler
+    { { branch_selector = $1;
+        branch_early_code = ("",0,0);
+       branch_binding_code = $3;
+       branch_pattern = $4;
+       branch_result_code = $5;
+       branch_error_code = $6;
+      }
+    }
+| symbol patterns Code opt_error_handler
+    { { branch_selector = $1;
+        branch_early_code = ("",0,0);
+       branch_binding_code = ("", 0, 0);
+       branch_pattern = $2;
+       branch_result_code = $3;
+       branch_error_code = $4;
+      }
+    }
+
+patterns:
+  pattern patterns
+    { $1 :: $2 }
+| 
+    { [] }
+
+pattern:
+  symbol Loop_star
+    { { pat_symbol = $1;
+       pat_modifier = Repetition;
+      }
+    }
+| symbol Error
+    { { pat_symbol = $1;
+       pat_modifier = Option;
+      }
+    }
+| symbol
+    { { pat_symbol = $1;
+       pat_modifier = Exact;
+      }
+    }
+
+symbol:
+  Lname Colon Uname
+    { U_symbol($3, Some $1) }
+| Lname Colon Lname Lparen actual_arguments 
+    { L_symbol($3, $5, Some $1) }
+| Lname Colon Lbracket Lname Rbracket Lparen actual_arguments 
+    { L_indirect($4, $7, Some $1) }
+| Uname
+    { U_symbol($1, None) }
+| Lname Lparen actual_arguments 
+    { L_symbol($1, $3, None) }
+| Lbracket Lname Rbracket Lparen actual_arguments 
+    { L_indirect($2, $5, None) }
+
+
+actual_arguments:
+  Rparen
+    { [] }
+| Lname comma_actual_arguments
+    { $1 :: $2 }
+
+comma_actual_arguments:
+  Rparen
+    { [] }
+| Comma Lname comma_actual_arguments
+    { $2 :: $3 }
+
+opt_error_handler:
+  Error Code
+    { Some $2 }
+| 
+    { None }
+
+%%
+
+(* ======================================================================
+ * History:
+ * 
+ * $Log$
+ * Revision 1.1  2000/11/17 09:57:32  lpadovan
+ * Initial revision
+ *
+ * Revision 1.4  2000/05/09 00:03:22  gerd
+ *     Added [ ml_name ] symbols, where ml_name is an arbitrary
+ * OCaml identifier.
+ *
+ * Revision 1.3  2000/05/08 22:03:01  gerd
+ *     It is now possible to have a $ {{ }} sequence right BEFORE
+ * the first token. This code is executed just after the first token
+ * has been recognized.
+ *
+ * Revision 1.2  2000/05/06 21:51:46  gerd
+ *     New Dollar tag.
+ *
+ * Revision 1.1  2000/05/06 17:36:17  gerd
+ *     Initial revision.
+ *
+ * 
+ *)