diff --git a/util/mcgg/gram.y b/util/mcgg/gram.y index 84a899037..5f100c7d2 100644 --- a/util/mcgg/gram.y +++ b/util/mcgg/gram.y @@ -23,17 +23,19 @@ static int nextern = 0; %term PPERCENT %term PATTERNS -%term PAT %term WHEN %term EMIT +%term FRAGMENT %term COST +%term INS +%term OUTS %token INT %token ID %token CFRAGMENT +%token STRING %type cost -%type label %type lhs %type stringlist %type when @@ -69,15 +71,15 @@ patterns : /* nothing */ | patterns pattern ';' | patterns ';' - | patterns error ';' { yyerrok; } + | patterns error ';' { yyerrok; } ; pattern - : lhs '=' rhs when cost { rule($1, $3, nextern++, $4, $5); } + : lhs '=' rhs when ins outs emits cost { rule($1, $3, nextern++, $4, $8); } ; lhs - : ID { $$ = $1; nonterm($$); } + : ID { $$ = $1; nonterm($$); } ; rhs @@ -87,29 +89,63 @@ rhs ; labelledid - : ID { $$[0] = NULL; $$[1] = $1; } - | ID ':' ID { $$[0] = $1; $$[1] = $3; } + : ID { $$[0] = NULL; $$[1] = $1; } + | ID ':' ID { $$[0] = $1; $$[1] = $3; } ; when - : /* nothing */ { $$ = NULL; } - | WHEN stringlist { $$ = $2; } + : /* nothing */ { $$ = NULL; } + | WHEN stringlist { $$ = $2; } ; stringlist - : /* nothing */ { $$ = NULL; } - | CFRAGMENT stringlist { $$ = pushstring($1, $2); } + : /* nothing */ { $$ = NULL; } + | CFRAGMENT stringlist { $$ = pushstring($1, $2); } ; +ins + : /* nothing */ + | INS inslist + ; + +inslist + : inslist ',' in + | in + ; + +in + : ID ':' ID + ; + +outs + : /* nothing */ + | OUTS outslist + ; + +outslist + : outslist ',' out + | out + ; + +out + : ID ':' ID + ; + +emits + : /* nothing */ + | EMIT STRING + | FRAGMENT STRING + ; + cost - : /* lambda */ { $$ = 0; } - | COST INT { - if ($2 > maxcost) { - yyerror("%d exceeds maximum cost of %d\n", $2, maxcost); - $$ = maxcost; - } else - $$ = $2; - } + : /* lambda */ { $$ = 0; } + | COST INT { + if ($2 > maxcost) { + yyerror("%d exceeds maximum cost of %d\n", $2, maxcost); + $$ = maxcost; + } else + $$ = $2; + } ; %% #include diff --git a/util/mcgg/mcgg_generated_footer.h b/util/mcgg/mcgg_generated_footer.h index 7b9bbdb46..986ecd222 100644 --- a/util/mcgg/mcgg_generated_footer.h +++ b/util/mcgg/mcgg_generated_footer.h @@ -10,7 +10,12 @@ static void dumpCover(NODEPTR_TYPE p, int goalnt, int indent) { fprintf(stderr, "%s\n", burm_string[eruleno]); burm_kids(p, eruleno, kids); for (i = 0; nts[i]; i++) - dumpCover(kids[i], nts[i], indent + 1); + { + if (kids[i]) + dumpCover(kids[i], nts[i], indent + 1); + else + fprintf(stderr, "failed!\n"); + } #endif } diff --git a/util/mcgg/scan.l b/util/mcgg/scan.l index 3a067685b..ebcb9c107 100644 --- a/util/mcgg/scan.l +++ b/util/mcgg/scan.l @@ -55,11 +55,14 @@ static int braces = 0; "%start" return START; "PATTERNS" return PATTERNS; -"pat" return PAT; "when" return WHEN; +"ins" return INS; +"outs" return OUTS; "emit" return EMIT; +"fragment" return FRAGMENT; "cost" return COST; +\"[^"\n]*\" { yylval.string = strdup(yytext); return STRING; } [A-Za-z_][A-Za-z0-9_]* { yylval.string = strdup(yytext); return ID; } [0-9]+ { yylval.n = atoi(yytext); return INT; } [ \t\r\n]* ;