Lots of exploratory new grammar for instruction definitions and string and
authorDavid Given <dg@cowlark.com>
Sat, 24 Sep 2016 11:08:17 +0000 (13:08 +0200)
committerDavid Given <dg@cowlark.com>
Sat, 24 Sep 2016 11:08:17 +0000 (13:08 +0200)
fragment emission (none of which is hooked up to anything yet).

util/mcgg/gram.y
util/mcgg/mcgg_generated_footer.h
util/mcgg/scan.l

index 84a8990..5f100c7 100644 (file)
@@ -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 <n>          INT
 %token <string>     ID
 %token <string>     CFRAGMENT
+%token <string>     STRING
 
 %type  <n>          cost
-%type  <string>     label
 %type  <string>     lhs
 %type  <stringlist> stringlist
 %type  <stringlist> 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 <stdarg.h>
index 7b9bbdb..986ecd2 100644 (file)
@@ -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
 }
 
index 3a06768..ebcb9c1 100644 (file)
@@ -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]*                  ;