ParseGen grammar for quirk20. [Revision -5] This grammar is designed for action routines that take arguments. The nonterminal returns the current position. *terminals eof id typeid typeid2 charliteral floatliteral intliteral Stringliteral . ( ) [ ] * + , - / ; = == ! sharp ne lt le gt ge and or boolean char class constant double else false for from function if int new null proc public return static String to true unless void when while { } *productions ::= eof #cons ::= #emptyList ::= #identity ::= #mk_type ::= #mk_type ::= #mk_type ::= #mk_complete ::= [ ] #mk_arraytype ::= boolean #mkBooleanType ::= char #mkCharType ::= String #mkStringType ::= int #mkIntType ::= double #mkDoubleType ::= function ( from ( ) to ) #mkFunType ::= #identity ::= void #mkVoidType ::= class { } #mkClassDec ::= #mkBodyDec ::= constant = ; #mkConstDec ::= static = ; #mkGlobalDec ::= ; #identity ::= #identity ::= #mkFormal ::= #mkDefault ::= public #mkPublic ::= { } #mkBlock ::= #identity ::= #identity ::= = ; #mkVarDec ::= proc ( ) #mkFunDec ::= ; #mkSkip ::= ; #mkExpStm ::= if ( ) else #mkIfStm ::= when ( ) #mkWhenStm ::= unless ( ) #mkUnlessStm ::= while ( ) #mkWhileStm ::= for ( ; ) #mkForStm ::= return ; #mkReturnStm ::= #identity ::= #mk_right ::= #mk_complete ::= #mk_partial ::= #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 ::= new #identity ::= ( ) #mk_factor ::= #mk_factor ::= . #mk_qfactor ::= #mk_complete ::= ( ) #mk_call ::= . #mk_qualified ::= [ ] #mk_aref ::= #mk_new1 ::= [ #mk_new2 ::= [ #mk_new2 ::= ( ) #mk_new3 ::= [ #identity ::= ] #mk_new4 ::= ] [ #mk_new5 ::= null #mkNull ::= true #mkTrue ::= false #mkFalse ::= charliteral #mkCharLiteral ::= Stringliteral #mkStringLiteral ::= intliteral #mkIntLiteral ::= floatliteral #mkFloatLiteral ::= #emptyList ::= #cons ::= #emptyList ::= , #cons ::= #emptyList ::= #cons ::= #emptyList ::= #cons ::= #emptyList ::= #cons ::= #emptyList ::= #cons ::= #emptyList ::= , #cons ::= #emptyList ::= #cons ::= #emptyList ::= , #cons ::= = #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 ::= typeid #mkTypeId ::= typeid2 #mkTypeId *end