home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Tools / Languages / Caml Light 0.61 / Source / src / compiler / parser.mly < prev    next >
Encoding:
Text File  |  1994-07-07  |  16.4 KB  |  678 lines  |  [TEXT/MPS ]

  1. /* The parser definition */
  2.  
  3. %{
  4. #open "par_aux";;
  5. #open "const";;
  6. #open "globals";;
  7. #open "builtins";;
  8. #open "syntax";;
  9. #open "primdecl";;
  10. %}
  11.  
  12. /* Tokens */
  13.  
  14. %token <string> IDENT
  15. %token <string> INFIX
  16. %token <int> INT
  17. %token <char> CHAR
  18. %token <float> FLOAT
  19. %token <string> STRING
  20. %token EOF
  21. %token <string> MULTIPLICATIVE /* "/" "*." "/." */
  22. %token <string> ADDITIVE       /* "+" "+." */
  23. %token <string> SUBTRACTIVE    /* "-" "-." */
  24. %token <string> CONCATENATION  /* "^" "@" */
  25. %token <string> COMPARISON     /* "<>" "!=" "<" "<=" ">" ">=" etc */
  26. %token EQUAL          /* "=" */
  27. %token EQUALEQUAL     /* "==" */
  28. %token SHARP          /* "#" */
  29. %token BANG           /* "!" */
  30. %token AMPERSAND      /* "&" */
  31. %token QUOTE          /* "'" */
  32. %token LPAREN         /* "(" */
  33. %token RPAREN         /* ")" */
  34. %token STAR           /* "*" */
  35. %token COMMA          /* "," */
  36. %token MINUSGREATER   /* "->" */
  37. %token DOT            /* "." */
  38. %token DOTDOT         /* ".." */
  39. %token DOTLPAREN      /* ".(" */
  40. %token COLON          /* ":" */
  41. %token COLONCOLON     /* "::" */
  42. %token COLONEQUAL     /* ":=" */
  43. %token SEMI           /* ";" */
  44. %token SEMISEMI       /* ";;" */
  45. %token LESSMINUS      /* "<-" */
  46. %token LBRACKET       /* "[" */
  47. %token LBRACKETBAR    /* "[|" */
  48. %token LBRACKETLESS   /* "[<" */
  49. %token RBRACKET       /* "]" */
  50. %token UNDERSCORE     /* "_" */
  51. %token UNDERUNDER     /* "__" */
  52. %token LBRACE         /* "{" */
  53. %token BAR            /* "|" */
  54. %token BARRBRACKET    /* "|]" */
  55. %token GREATERRBRACKET/* ">]" */
  56. %token RBRACE         /* "}" */
  57. %token AND            /* "and" */
  58. %token AS             /* "as" */
  59. %token BEGIN          /* "begin" */
  60. %token DO             /* "do" */
  61. %token DONE           /* "done" */
  62. %token DOWNTO         /* "downto" */
  63. %token ELSE           /* "else" */
  64. %token END            /* "end" */
  65. %token EXCEPTION      /* "exception" */
  66. %token FOR            /* "for" */
  67. %token FUN            /* "fun" */
  68. %token FUNCTION       /* "function" */
  69. %token IF             /* "if" */
  70. %token IN             /* "in" */
  71. %token LET            /* "let" */
  72. %token MATCH          /* "match" */
  73. %token MUTABLE        /* "mutable" */
  74. %token NOT            /* "not" */
  75. %token OF             /* "of" */
  76. %token OR             /* "or" */
  77. %token PREFIX         /* "prefix" */
  78. %token REC            /* "rec" */
  79. %token THEN           /* "then" */
  80. %token TO             /* "to" */
  81. %token TRY            /* "try" */
  82. %token TYPE           /* "type" */
  83. %token VALUE          /* "value" */
  84. %token WHERE          /* "where" */
  85. %token WHILE          /* "while" */
  86. %token WITH           /* "with" */
  87.  
  88. /* Precedences and associativities. Lower precedences first. */
  89.  
  90. %right prec_let
  91. %right prec_define
  92. %right WHERE prec_where
  93. %right SEMI
  94. %right prec_list
  95. %right prec_if
  96. %right COLONEQUAL LESSMINUS
  97. %left  AS
  98. %left  BAR
  99. %right COMMA
  100. %right OR
  101. %left  AMPERSAND
  102. %left  NOT
  103. %left  COMPARISON EQUAL EQUALEQUAL
  104. %right CONCATENATION
  105. %right COLONCOLON
  106. %left  ADDITIVE SUBTRACTIVE
  107. %right prec_typearrow
  108. %left  STAR MULTIPLICATIVE
  109. %left  INFIX
  110. %right prec_uminus
  111. %right prec_app
  112. %left  DOT DOTLPAREN
  113. %right BANG
  114.  
  115. /* Entry points */
  116.  
  117. %start Implementation
  118. %type <syntax__impl_phrase> Implementation 
  119. %start Interface
  120. %type <syntax__intf_phrase> Interface
  121.  
  122. %%
  123.  
  124. /* One phrase from a module implementation */
  125.  
  126. Implementation :
  127.         Expr SEMISEMI
  128.           { make_impl(Zexpr $1) }
  129.       | LET Binding_list SEMISEMI  %prec prec_let
  130.           { make_impl(Zletdef(false, $2)) }
  131.       | LET REC Binding_list SEMISEMI  %prec prec_let
  132.           { make_impl(Zletdef(true, $3)) }
  133.       | TYPE Type_decl SEMISEMI
  134.           { make_impl(Ztypedef $2) }
  135.       | EXCEPTION Exc_decl SEMISEMI
  136.           { make_impl(Zexcdef $2) }
  137.       | SHARP Directive SEMISEMI
  138.           { make_impl(Zimpldirective $2) }
  139.       | EOF
  140.           { raise End_of_file }
  141. ;
  142.  
  143. /* One phrase from a module interface */
  144.  
  145. Interface :
  146.         VALUE Value_decl SEMISEMI
  147.           { make_intf(Zvaluedecl $2) }
  148.       | TYPE Type_decl SEMISEMI
  149.           { make_intf(Ztypedecl $2) }
  150.       | EXCEPTION Exc_decl  SEMISEMI
  151.           { make_intf(Zexcdecl $2) }
  152.       | SHARP Directive SEMISEMI
  153.           { make_intf(Zintfdirective $2) }
  154.       | EOF
  155.           { raise End_of_file }
  156. ;
  157.  
  158. /* Auxiliaries for expressions. Must appear before Expr, for correct
  159.    resolution of reduce/reduce conflicts. */
  160.  
  161. Simple_expr_list :
  162.         Simple_expr Simple_expr_list
  163.           { $1 :: $2 }
  164.       | Simple_expr
  165.           { [$1] }
  166. ;
  167.  
  168. Expr_comma_list :
  169.         Expr COMMA Expr_comma_list
  170.           { $1 :: $3 }
  171.       | Expr  %prec COMMA
  172.           { [$1] }
  173. ;
  174.  
  175. Expr_sm_list :
  176.         Expr_sm_list SEMI Expr  %prec prec_list
  177.           { $3 :: $1 }
  178.       | Expr  %prec prec_list
  179.           { [$1] }
  180. ;
  181.  
  182. Expr_label :
  183.         Ext_ident EQUAL Expr
  184.           { (find_label $1, $3)  }
  185. ;
  186.  
  187. Expr_label_list :
  188.         Expr_label_list SEMI Expr_label  %prec prec_list
  189.           { $3 :: $1 }
  190.       | Expr_label  %prec prec_list
  191.           { [$1] }
  192. ;
  193.  
  194. /* Expressions */
  195.  
  196. Expr :
  197.         Simple_expr
  198.           { $1 }
  199.       | Simple_expr Simple_expr_list   %prec prec_app
  200.           { make_apply ($1, $2) }
  201.       | Expr COMMA Expr_comma_list
  202.           { make_expr(Ztuple($1::$3)) }
  203.       | SUBTRACTIVE Expr  %prec prec_uminus
  204.           { make_unary_minus $1 $2 }
  205.       | NOT Expr
  206.           { make_unop "not" $2 }
  207.       | Ide LESSMINUS Expr
  208.           { make_expr (Zassign($1, $3)) }
  209.       | Expr INFIX Expr
  210.           { make_binop $2 $1 $3 }
  211.       | Expr MULTIPLICATIVE Expr
  212.           { make_binop $2 $1 $3 }
  213.       | Expr STAR Expr
  214.           { make_binop "*" $1 $3 }
  215.       | Expr ADDITIVE Expr
  216.           { make_binop $2 $1 $3 }
  217.       | Expr SUBTRACTIVE Expr
  218.           { make_binop $2 $1 $3 }
  219.       | Expr COLONCOLON Expr
  220.           { make_expr(Zconstruct1(constr_cons, make_expr(Ztuple [$1; $3]))) }
  221.       | Expr CONCATENATION Expr
  222.           { make_binop $2 $1 $3 }
  223.       | Expr COMPARISON Expr
  224.           { make_binop $2 $1 $3 }
  225.       | Expr EQUAL Expr
  226.           { make_binop "=" $1 $3 }
  227.       | Expr EQUALEQUAL Expr
  228.           { make_binop "==" $1 $3 }
  229.       | Expr COLONEQUAL Expr
  230.           { make_binop ":=" $1 $3 }
  231.       | Expr AMPERSAND Expr 
  232.           { make_expr(Zsequand($1, $3)) }
  233.       | Expr OR Expr
  234.           { make_expr(Zsequor($1, $3)) }
  235.       | Simple_expr DOT Ext_ident LESSMINUS Expr
  236.           { make_expr(Zrecord_update($1, find_label $3, $5)) }
  237.       | Simple_expr DOTLPAREN Expr RPAREN LESSMINUS Expr
  238.           { make_ternop "vect_assign" $1 $3 $6 }
  239.       | IF Expr THEN Expr ELSE Expr  %prec prec_if
  240.           { make_expr(Zcondition($2, $4, $6)) }
  241.       | IF Expr THEN Expr  %prec prec_if
  242.           { make_expr(Zcondition($2, $4, make_expr(Zconstruct0(constr_void)))) }
  243.       | WHILE Expr DO Expr DONE
  244.           { make_expr(Zwhile($2, $4)) }
  245.       | FOR Ide EQUAL Expr TO Expr DO Expr DONE
  246.           { make_expr(Zfor($2, $4, $6, true, $8)) }
  247.       | FOR Ide EQUAL Expr DOWNTO Expr DO Expr DONE
  248.           { make_expr(Zfor($2, $4, $6, false, $8)) }
  249.       | Expr SEMI Expr
  250.           { make_expr(Zsequence($1, $3)) }
  251.       | MATCH Expr WITH Function_match
  252.           { make_expr(Zapply(make_expr(Zfunction $4), [$2])) }
  253.       | MATCH Expr WITH Parser_match
  254.           { make_expr(Zapply(make_expr(Zparser $4), [$2])) }
  255.       | LET Binding_list IN Expr  %prec prec_let
  256.           { make_expr(Zlet(false, $2, $4)) }
  257.       | LET REC Binding_list IN Expr  %prec prec_let
  258.           { make_expr(Zlet(true, $3, $5)) }
  259.       | FUN Fun_match
  260.           { make_expr(Zfunction $2) }
  261.       | FUNCTION Function_match
  262.           { make_expr(Zfunction $2) }
  263.       | FUNCTION Parser_match
  264.           { make_expr(Zparser $2) }
  265.       | TRY Expr WITH Try_match
  266.       { make_expr(Ztrywith($2, $4)) }
  267.       | Expr WHERE Binding_list  %prec prec_where
  268.           { make_expr(Zlet(false, $3, $1)) }
  269.       | Expr WHERE REC Binding_list  %prec prec_where
  270.           { make_expr(Zlet(true, $4, $1)) }
  271. ;
  272.  
  273. Simple_expr :
  274.         Struct_constant
  275.           { make_expr(Zconstant $1) }
  276.       | Ext_ident
  277.           { expr_constr_or_ident $1 }
  278.       | LPAREN RPAREN
  279.           { make_expr(Zconstruct0(constr_void)) }
  280.       | LBRACKET Expr_sm_list RBRACKET
  281.           { make_list $2 }
  282.       | LBRACKET RBRACKET
  283.           { make_expr(Zconstruct0(constr_nil)) }
  284.       | LBRACKETBAR Expr_sm_list BARRBRACKET
  285.           { make_expr(Zvector(rev $2)) }
  286.       | LBRACKETBAR BARRBRACKET
  287.           { make_expr(Zvector []) }
  288.       | LBRACKETLESS Stream_expr GREATERRBRACKET
  289.           { make_expr(Zstream (rev $2)) }
  290.       | LBRACKETLESS GREATERRBRACKET
  291.           { make_expr(Zstream []) }
  292.       | LPAREN Expr COLON Type RPAREN
  293.           { make_expr(Zconstraint($2, $4)) }
  294.       | LPAREN Expr RPAREN
  295.           { $2 }
  296.       | BEGIN Expr END
  297.           { $2 }
  298.       | LBRACE Expr_label_list RBRACE
  299.           { make_expr (Zrecord $2) }
  300.       | BANG Simple_expr
  301.           { make_unop "!" $2 }
  302.       | Simple_expr DOT Ext_ident
  303.           { make_expr(Zrecord_access($1, find_label $3)) }
  304.       | Simple_expr DOTLPAREN Expr RPAREN  %prec DOT
  305.           { make_binop "vect_item" $1 $3 }
  306. ;
  307.  
  308. /* Constants */
  309.  
  310. Struct_constant :
  311.         Atomic_constant
  312.           { SCatom $1 }
  313. ;
  314.  
  315. Atomic_constant :
  316.         INT
  317.           { ACint $1 }
  318.       | FLOAT
  319.           { ACfloat $1 }
  320.       | STRING
  321.           { ACstring $1 }
  322.       | CHAR
  323.           { ACchar $1 }
  324. ;
  325.  
  326. /* Definitions by pattern matchings */
  327.  
  328. Fun_match :
  329.         Simple_pattern_list MINUSGREATER Expr BAR Fun_match
  330.           { ($1, $3) :: $5 }
  331.       | Simple_pattern_list MINUSGREATER Expr
  332.       { [$1, $3] }
  333. ;
  334.  
  335. Function_match :
  336.         Pattern MINUSGREATER Expr BAR Function_match
  337.           { ([$1], $3) :: $5 }
  338.       | Pattern MINUSGREATER Expr
  339.       { [[$1], $3] }
  340. ;
  341.  
  342. Try_match :
  343.         Pattern MINUSGREATER Expr BAR Try_match
  344.           { ($1, $3) :: $5 }
  345.       | Pattern MINUSGREATER Expr
  346.           { [$1, $3] }
  347. ;
  348.  
  349. Binding_list :
  350.         Binding AND Binding_list
  351.           { $1 :: $3 }
  352.       | Binding
  353.           { [$1] }
  354. ;
  355.  
  356. Binding :
  357.         Pattern EQUAL Expr  %prec prec_define
  358.           { ($1, $3) }
  359.       | Ide Simple_pattern_list EQUAL Expr  %prec prec_define
  360.           { (pat_constr_or_var $1, make_expr(Zfunction [$2, $4])) }
  361. ;
  362.  
  363. /* Patterns */
  364.  
  365. Pattern_sm_list :
  366.         Pattern SEMI Pattern_sm_list
  367.           { make_pat(Zconstruct1pat(constr_cons, make_pat(Ztuplepat[$1; $3]))) }
  368.       | Pattern
  369.           { make_pat(Zconstruct1pat(constr_cons,
  370.               make_pat(Ztuplepat [$1;
  371.                 make_pat(Zconstruct0pat(constr_nil))]))) }
  372. ;
  373.  
  374. Pattern_label_list :
  375.         Pattern_label SEMI Pattern_label_list
  376.           { $1 :: $3 }
  377.       | Pattern_label
  378.           { [$1] }
  379.       | UNDERSCORE
  380.           { [] }
  381. ;
  382.  
  383. Pattern_label :
  384.         Ext_ident EQUAL Pattern
  385.           { (find_label $1, $3) }
  386. ;
  387.  
  388. Pattern_comma_list :
  389.         Pattern COMMA Pattern_comma_list
  390.           { $1 :: $3 }
  391.       | Pattern  %prec COMMA
  392.           { [$1] }
  393. ;
  394.   
  395. Simple_pattern_list :
  396.         Simple_pattern Simple_pattern_list
  397.           { $1 :: $2 }
  398.       | Simple_pattern
  399.           { [$1] }
  400. ;
  401.  
  402. Pattern :
  403.         Simple_pattern
  404.           { $1 }
  405.       | Pattern AS IDENT
  406.           { make_pat(Zaliaspat($1, $3)) }
  407.       | Pattern COLONCOLON Pattern
  408.           { make_pat(Zconstruct1pat(constr_cons,
  409.               make_pat(Ztuplepat [$1; $3]))) }
  410.       | Pattern COMMA Pattern_comma_list
  411.           { make_pat(Ztuplepat($1 :: $3)) }
  412.       | Ext_ident Simple_pattern
  413.           { make_pat(Zconstruct1pat (find_constructor $1, $2)) }
  414.       | Pattern BAR Pattern
  415.           { make_pat(Zorpat($1, $3)) }
  416. ;
  417.  
  418. Simple_pattern :
  419.         Atomic_constant
  420.           { make_pat(Zconstantpat $1) }
  421.       | SUBTRACTIVE INT
  422.           { make_pat(Zconstantpat(ACint(minus_int $2))) }
  423.       | SUBTRACTIVE FLOAT
  424.           { make_pat(Zconstantpat(ACfloat(minus_float $2))) }
  425.       | UNDERSCORE
  426.           { make_pat(Zwildpat) }
  427.       | Ide
  428.           { pat_constr_or_var $1 }
  429.       | Qual_ident
  430.           { make_pat(Zconstruct0pat(find_constructor (GRmodname $1))) }
  431.       | LPAREN RPAREN
  432.           { make_pat(Zconstruct0pat(constr_void)) }
  433.       | LBRACKET RBRACKET
  434.           { make_pat(Zconstruct0pat(constr_nil)) }
  435.       | LBRACKET Pattern_sm_list RBRACKET
  436.           { $2 }
  437.       | LPAREN Pattern COLON Type RPAREN
  438.           { make_pat(Zconstraintpat($2, $4)) }
  439.       | LBRACE Pattern_label_list RBRACE
  440.           { make_pat(Zrecordpat $2) }
  441.       | LPAREN Pattern RPAREN
  442.           { $2 }
  443.       | CHAR DOTDOT CHAR
  444.           { make_range_pat (int_of_char $1) (int_of_char $3) }
  445. ;
  446.  
  447. /* Streams */
  448.  
  449. Stream_expr :
  450.         Stream_expr SEMI Stream_expr_component  %prec prec_list
  451.           { $3 :: $1 }
  452.       | Stream_expr_component  %prec prec_list
  453.           { [$1] }
  454. ;
  455.  
  456. Stream_expr_component :
  457.         Expr %prec prec_list
  458.           { Znonterm $1 }
  459.       | QUOTE Expr  %prec prec_list
  460.           { Zterm $2 }
  461. ;
  462.  
  463. Stream_pattern :
  464.         LBRACKETLESS GREATERRBRACKET
  465.           { [] }
  466.       | LBRACKETLESS Stream_pattern_component_list GREATERRBRACKET
  467.           { $2 }
  468. ;
  469.  
  470. Stream_pattern_component_list :
  471.         Stream_pattern_component
  472.           { [$1] }
  473.       | IDENT
  474.           { [Zstreampat $1] }
  475.       | Stream_pattern_component SEMI Stream_pattern_component_list
  476.           { $1 :: $3 }
  477. ;
  478.  
  479. Stream_pattern_component :
  480.         Simple_expr Simple_pattern
  481.           { Znontermpat($1, $2) }
  482.       | QUOTE Pattern
  483.           { Ztermpat $2 }
  484. ;
  485.  
  486. Parser_match :
  487.         Stream_pattern MINUSGREATER Expr BAR Parser_match
  488.           { ($1, $3) :: $5 }
  489.       | Stream_pattern MINUSGREATER Expr
  490.       { [$1, $3] }
  491. ;
  492.  
  493. /* Identifiers */
  494.  
  495. Ide :
  496.         IDENT
  497.           { $1 }
  498.       | PREFIX Infx
  499.           { $2 }
  500. ;
  501.  
  502. Infx :
  503.         INFIX           { $1 }
  504.       | ADDITIVE        { $1 }    | SUBTRACTIVE   { $1 }
  505.       | MULTIPLICATIVE  { $1}     | STAR          { "*" }
  506.       | CONCATENATION   { $1 }
  507.       | COMPARISON      { $1 }    | COLONCOLON    { "::" }
  508.       | COLONEQUAL      { ":=" }  | EQUAL         { "=" }
  509.       | EQUALEQUAL      { "==" }  | NOT           { "not" }
  510.       | BANG            { "!" }
  511. ;
  512.  
  513. Qual_ident :
  514.         IDENT UNDERUNDER Ide
  515.           { {qual=$1; id=$3} }
  516. ;
  517.  
  518. Ext_ident :
  519.         Qual_ident
  520.           { GRmodname $1 }
  521.       | Ide
  522.           { GRname $1 }
  523. ;
  524.  
  525. /* Type expressions */
  526.  
  527. Type :
  528.         Simple_type
  529.           { $1 }
  530.       | Type STAR Type_star_list
  531.           { make_typ(Ztypetuple($1 :: $3)) }
  532.       | Type MINUSGREATER Type  %prec prec_typearrow
  533.           { make_typ(Ztypearrow($1, $3)) }
  534. ;
  535.  
  536. Simple_type :
  537.         Type_var
  538.           { make_typ(Ztypevar $1) }
  539.       | Ext_ident
  540.           { make_typ(Ztypeconstr($1, [])) }
  541.       | Simple_type Ext_ident
  542.           { make_typ(Ztypeconstr($2, [$1])) }
  543.       | LPAREN Type COMMA Type_comma_list RPAREN Ext_ident
  544.           { make_typ(Ztypeconstr($6, $2 :: $4)) }
  545.       | LPAREN Type RPAREN
  546.           { $2 }
  547. ;
  548.  
  549. Type_star_list :
  550.         Simple_type
  551.           { [$1] }
  552.       | Simple_type STAR Type_star_list
  553.           { $1 :: $3 }
  554. ;
  555.  
  556. Type_var :
  557.         QUOTE IDENT
  558.           { $2 }
  559. ;
  560.  
  561. Type_comma_list :
  562.         Type COMMA Type_comma_list
  563.           { $1 :: $3 }
  564.       | Type
  565.           { [$1] }
  566. ;
  567.  
  568. /* Declarations */
  569.  
  570. Value_decl :
  571.         Value1_decl AND Value_decl
  572.           { $1 :: $3 }
  573.       | Value1_decl
  574.           { [$1] }
  575. ;
  576.  
  577. Type_decl :
  578.         Type1_decl AND Type_decl
  579.           { $1 :: $3 }
  580.       | Type1_decl
  581.           { [$1] }
  582. ;
  583.  
  584. Exc_decl :
  585.         Constr1_decl AND Exc_decl
  586.           { $1 :: $3 }
  587.       | Constr1_decl
  588.           { [$1] }
  589. ;
  590.  
  591. Constr_decl :
  592.         Constr1_decl BAR Constr_decl
  593.           { $1 :: $3 }
  594.       | Constr1_decl
  595.           { [$1] }
  596. ;
  597.  
  598. Label_decl :
  599.         Label1_decl SEMI Label_decl
  600.           { $1 :: $3 }
  601.       | Label1_decl
  602.           { [$1] }
  603. ;
  604.  
  605. Value1_decl :
  606.         Ide COLON Type
  607.           { ($1, $3, ValueNotPrim) }
  608.       | Ide COLON Type EQUAL Prim_decl
  609.           { ($1, $3, $5) }
  610. ;
  611.  
  612. Prim_decl :
  613.         INT STRING
  614.           { find_primitive $1 $2 }
  615. ;
  616.  
  617. Type1_decl :
  618.         Type_params IDENT Type1_def
  619.           { ($2, $1, $3) }
  620. ;
  621.  
  622. Type1_def :
  623.         /* epsilon */
  624.           { Zabstract_type Notmutable }
  625.       | MUTABLE
  626.           { Zabstract_type Mutable }
  627.       | EQUAL Constr_decl
  628.           { Zvariant_type $2 }
  629.       | EQUAL LBRACE Label_decl RBRACE
  630.           { Zrecord_type $3 }
  631.       | EQUALEQUAL Type
  632.           { Zabbrev_type $2 }
  633. ;
  634.  
  635. Constr1_decl :
  636.         IDENT OF Mutable_option Type
  637.           { Zconstr1decl($1, $4, $3) }
  638.       | IDENT
  639.           { Zconstr0decl $1 }
  640. ;
  641.  
  642. Label1_decl :
  643.         Mutable_option IDENT COLON Type
  644.           { ($2, $4, $1) }
  645. ;
  646.  
  647. Mutable_option :
  648.         MUTABLE
  649.           { Mutable }
  650.       | /* epsilon */
  651.           { Notmutable }
  652. ;
  653.  
  654. Type_params :
  655.         LPAREN Type_var_list RPAREN
  656.           { $2 }
  657.       | Type_var
  658.           { [$1] }
  659.       |
  660.           { [] }
  661. ;
  662.  
  663. Type_var_list :
  664.         Type_var COMMA Type_var_list
  665.           { $1 :: $3 }
  666.       | Type_var
  667.           { [$1] }
  668. ;
  669.        
  670. /* Directives */
  671.  
  672. Directive :
  673.         IDENT STRING
  674.           { Zdir($1, $2) }
  675. ;
  676.  
  677. %%
  678.