%{ #define YYERROR_VERBOSE %} %union { int *slacker; int *op; int *money; int *buzz; int *fubar; int snafu; int *ident; int index[2]; int inhale; }; %token T_BUZZ T_PAT T_GROUP T_TYPE T_INSTR T_REPENT %token T_USE T_FOO T_FROP T_NUM T_IDENT T_STRING %token T_OP_HI T_OP_LO T_OP_Q0 T_OP_Q1 T_OP_Q2 T_OP_Q3 T_OP T_PCE T_MEM %type subgenii_list slacker_list frop_stage_list %type op_list mnemonic_list money_list %type sleep_list fist_list %type bobdobbs_vector frop_stage %type slacker %type op inhale inhalees %type mnemonic fist ident string %type money %type field %type inhale_buzz %type sleep %type buzz %type integer %type integer2 %% subgenius: '\0' { YYACCEPT; } | subgenii_list { YYACCEPT; } | subgenii_list '\0' { YYACCEPT; } ; subgenii_list: subgenii { } | subgenii_list subgenii { } ; subgenii: bobdobbs_frop_blk { } | slacker_frop_blk { } | money_frop_blk { } | buzz_frop_blk { } | slack_frop_blk { } | church_option { } | ident { } | string { } | integer { } | ';' { /* Stray ';' at top level */ } | '=' { /* Stray '=' at top level */ } | '@' { /* Stray '@' at top level */ } | '|' { /* Stray '|' at top level */ } | '{' { /* Stray '{' at top level */ } | '}' { /* Stray '}' at top level */ } ; bobdobbs_frop_blk: T_BUZZ '{' bobdobbs_frop_list '}' | T_BUZZ '{' '}' ; bobdobbs_frop_list: bobdobbs_frop | bobdobbs_frop_list ',' bobdobbs_frop ; bobdobbs_frop: ident { } | ident '=' string { } ; slacker_frop_blk: T_PAT '{' slacker_frop_list '}' | T_PAT '{' '}' ; slacker_frop_list: slacker_frop | slacker_frop_list slacker_frop ; slacker_frop: ident '=' string ',' '{' frop_stage_list '}' ';' { }; ident: T_IDENT { }; string: T_STRING { }; integer: T_NUM { }; integer2: T_NUM { }; frop_stage_list: frop_stage { } | frop_stage_list ',' frop_stage { } ; frop_stage: '@' { } | bobdobbs_vector { } ; bobdobbs_vector: ident { } | bobdobbs_vector '|' ident { } ; money_frop_blk: T_GROUP '{' money_frop_list '}' | T_GROUP '{' '}' ; money_frop_list: money_frop | money_frop_list money_frop ; money_frop: ident '=' '{' slacker_list '}' ';' { } ; slacker_list: slacker { } | slacker_list ',' slacker { } ; slacker: T_IDENT { } ; buzz_frop_blk: T_TYPE '{' buzz_frop_list '}' | T_TYPE '{' '}' ; buzz_frop_list: buzz_frop | buzz_frop_list buzz_frop ; buzz_frop: ident '{' op_list '}' { } | ident '{' '}' { } ; op_list: op { } | op_list op { } ; op: T_OP '[' integer ']' '=' '{' inhalees '}' ';' { } | T_OP '[' integer ']' field '=' '{' inhalees '}' ';' { } | T_OP '[' T_MEM '(' integer ',' integer2 ')' ']' '=' '{' inhalees '}' ';' { } | T_OP '[' T_PCE ']' '=' '{' T_FOO ':' integer '}' ';' { } ; inhalees: inhale { } | inhalees ',' inhale { } ; inhale: inhale_buzz { } | inhale_buzz ':' integer { } ; inhale_buzz: T_USE { } | T_FOO { } | T_FROP { } ; field: T_OP_HI { } | T_OP_LO { } | T_OP_Q0 { } | T_OP_Q1 { } | T_OP_Q2 { } | T_OP_Q3 { } ; slack_frop_blk: T_INSTR '{' slack_frop_list '}' | T_INSTR '{' '}' ; slack_frop_list: slack_frop | slack_frop_list slack_frop ; slack_frop: buzz '(' mnemonic_list ')' '{' sleep_list '}' { } ; buzz: ident { } ; mnemonic_list: mnemonic { } | mnemonic_list ',' mnemonic { } ; mnemonic: T_IDENT { $$ = strdup(rdl_ident); } ; sleep_list: sleep { } | sleep_list sleep { } ; sleep: fist_list '=' '{' money_list '}' ';' { } ; fist_list: fist { } | fist_list ',' fist { } ; fist: T_IDENT { } ; money_list: money ',' money { } ; money: T_IDENT { } ; church_option: T_REPENT T_IDENT ';' { } | T_REPENT T_IDENT '=' T_STRING ';' { } | T_REPENT T_IDENT '=' integer ';' { } ; %%