ParseGen grammar for quirk21. [Revision 1] This grammar is designed for action routines that take arguments. Revision history: Revision 1, 4 October 2004: Corrected productions for argtype. *terminals eof id charliteral floatliteral intliteral stringliteral . ( ) [ ] * + , - / : ; = == ! sharp ne lt le gt ge arrow assign allof and begin boolean case char do else end export false float for from functions if in int lambda let letrec new of oneof or then to true types variables void where while { } *productions ::= where eof #mkProgram ::= export from #mkMod ::= #emptyList ::= where #identity ::= types #mkTypeDecs ::= variables #mkVarDecs ::= functions #mkFunDecs ::= = #mkVarDec ::= = #mkVarDec ::= = #mkTypeDec ::= #identity ::= #identity ::= #mk_argtype ::= #mk_argtype ::= #mk_complete ::= [ ] #mk_arraytype ::= #mkTypeId ::= #identity ::= boolean #mkBooleanType ::= char #mkCharType ::= int #mkIntType ::= float #mkFloatType ::= [ ] #mkArrayType ::= ( arrow ) #mkFunctionType ::= void #mkVoidType ::= #identity ::= oneof { } #mkSumType ::= allof { } #mkProductType ::= : #mkFieldDec ::= lambda ( ) : . #mkLambdaExp ::= : #mkFormal ::= : #mkField ::= #mk_right ::= #identity ::= let in #mkLetExp ::= letrec in #mkLetrecExp ::= new #identity ::= case of else #mkCaseExp ::= if then else #mkIfExp ::= while do #mkWhileExp ::= for to do #mkForExp ::= begin end #mkCompoundExp ::= [ ] #mk_newarray1 ::= #mk_newexp ::= [ ] #mk_newarray1 ::= [ ] #mk_new_array ::= { } #mk_new_struct ::= #mk_complete ::= #mk_partial ::= : then #mkCase ::= #mk_right ::= #mk_complete ::= #mk_partial ::= #mk_right ::= #mk_complete ::= #mk_partial ::= #mk_noassoc ::= #mk_complete ::= #mk_partial ::= #mk_left ::= #mk_complete ::= #mk_partial #mk_partial ::= #mk_left ::= #mk_complete ::= #mk_partial #mk_partial ::= #mk_unary ::= #mkLiteral ::= ( ) #mk_factor ::= #mk_factor ::= #mk_complete ::= ( ) #mk_call ::= . #mk_qualified ::= [ ] #mk_aref ::= true #mkTrue ::= false #mkFalse ::= charliteral #mkCharLiteral ::= stringliteral #mkStringLiteral ::= intliteral #mkIntLiteral ::= floatliteral #mkFloatLiteral ::= #emptyList ::= #cons ::= #cons ::= #emptyList ::= , #identity ::= #cons ::= #emptyList ::= #identity ::= #cons ::= #emptyList ::= ; #identity ::= #emptyList ::= #cons ::= #emptyList ::= , #cons ::= #cons ::= #emptyList ::= #identity ::= #cons ::= #emptyList ::= #identity ::= #cons ::= #emptyList ::= #identity ::= #emptyList ::= #identity ::= #cons ::= #emptyList ::= * #cons ::= #cons ::= #emptyList ::= , #cons ::= #emptyList ::= #identity ::= #cons ::= #emptyList ::= , #cons ::= #cons ::= #emptyList ::= , #cons ::= #cons ::= #emptyList ::= #identity ::= assign #mkop_assign ::= or #mkop_or ::= and #mkop_and ::= == #mkop_equal ::= ne #mkop_ne ::= lt #mkop_less ::= le #mkop_le ::= gt #mkop_greater ::= ge #mkop_ge ::= + #mkop_plus ::= - #mkop_minus ::= * #mkop_times ::= / #mkop_divide ::= ! #mkop_not ::= - #mkop_minus ::= sharp #mkop_sharp ::= id #mkId *end