/* $Id$ * ---------------------------------------------------------------------- * */ %{ open Ast %} %token Space %token Token %token Type %token Lname %token Uname %token Separator %token Lparen %token Rparen %token Comma %token Colon %token Code %token Error %token Alt %token Loop_plus %token Loop_star %token Dollar %token Lbracket %token Rbracket%token Eof %start text %type 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. * * *)