home: hub: minipeg

Download patch

ref: 06daa31cb089e073a869cc9f105318178c64f99d
parent: 5031195edcfd6b0b5ef30d7830199c27801d5ba3
author: Gregory Pakosz <gregory.pakosz@gmail.com>
date: Wed Mar 28 19:00:00 CDT 2012

imported peg-0.1.8

--- a/README.md
+++ b/README.md
@@ -26,6 +26,8 @@
 
 ## Version history
 
+* **0.1.8** ([zip](peg/zipball/0.1.8), [tar.gz](peg/tarball/0.1.8)) &mdash; 2012-03-29  
+Allow nested, matched braces within actions.
 * **0.1.7** ([zip](peg/zipball/0.1.7), [tar.gz](peg/tarball/0.1.7)) &mdash; 2011-11-25  
 Fix matching of 8-bit chars to allow utf-8 sequences in matching expressions (thanks to Grégory Pakosz).
 * **0.1.6** ([zip](peg/zipball/0.1.6), [tar.gz](peg/tarball/0.1.6)) &mdash; 2011-11-24  
--- a/leg.c
+++ b/leg.c
@@ -1,4 +1,4 @@
-/* A recursive-descent parser generated by peg 0.1.4 */
+/* A recursive-descent parser generated by peg 0.1.2 */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -198,7 +198,7 @@
     yyleng= 0;
   else
     {
-      while (yytextlen < (yyleng + 1))
+      while (yytextlen < (yyleng - 1))
 	{
 	  yytextlen *= 2;
 	  yytext= realloc(yytext, yytextlen);
@@ -449,15 +449,12 @@
   yyprintf((stderr, "%s\n", "braces"));
   {  int yypos14= yypos, yythunkpos14= yythunkpos;  if (!yymatchChar('{')) goto l15;
   l16:;	
-  {  int yypos17= yypos, yythunkpos17= yythunkpos;
-  {  int yypos18= yypos, yythunkpos18= yythunkpos;  if (!yymatchChar('}')) goto l18;  goto l17;
-  l18:;	  yypos= yypos18; yythunkpos= yythunkpos18;
-  }  if (!yymatchDot()) goto l17;  goto l16;
+  {  int yypos17= yypos, yythunkpos17= yythunkpos;  if (!yy_braces()) goto l17;  goto l16;
   l17:;	  yypos= yypos17; yythunkpos= yythunkpos17;
   }  if (!yymatchChar('}')) goto l15;  goto l14;
   l15:;	  yypos= yypos14; yythunkpos= yythunkpos14;
-  {  int yypos19= yypos, yythunkpos19= yythunkpos;  if (!yymatchChar('}')) goto l19;  goto l13;
-  l19:;	  yypos= yypos19; yythunkpos= yythunkpos19;
+  {  int yypos18= yypos, yythunkpos18= yythunkpos;  if (!yymatchChar('}')) goto l18;  goto l13;
+  l18:;	  yypos= yypos18; yythunkpos= yythunkpos18;
   }  if (!yymatchDot()) goto l13;
   }
   l14:;	
@@ -470,13 +467,13 @@
 YY_RULE(int) yy_range()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
   yyprintf((stderr, "%s\n", "range"));
-  {  int yypos21= yypos, yythunkpos21= yythunkpos;  if (!yy_char()) goto l22;  if (!yymatchChar('-')) goto l22;  if (!yy_char()) goto l22;  goto l21;
-  l22:;	  yypos= yypos21; yythunkpos= yythunkpos21;  if (!yy_char()) goto l20;
+  {  int yypos20= yypos, yythunkpos20= yythunkpos;  if (!yy_char()) goto l21;  if (!yymatchChar('-')) goto l21;  if (!yy_char()) goto l21;  goto l20;
+  l21:;	  yypos= yypos20; yythunkpos= yythunkpos20;  if (!yy_char()) goto l19;
   }
-  l21:;	
+  l20:;	
   yyprintf((stderr, "  ok   %s @ %s\n", "range", yybuf+yypos));
   return 1;
-  l20:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l19:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "range", yybuf+yypos));
   return 0;
 }
@@ -483,65 +480,65 @@
 YY_RULE(int) yy_char()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
   yyprintf((stderr, "%s\n", "char"));
-  {  int yypos24= yypos, yythunkpos24= yythunkpos;  if (!yymatchChar('\\')) goto l25;  if (!yymatchClass((unsigned char *)"\000\000\000\000\204\040\000\000\000\000\000\070\146\100\124\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l25;  goto l24;
-  l25:;	  yypos= yypos24; yythunkpos= yythunkpos24;  if (!yymatchChar('\\')) goto l26;  if (!yymatchClass((unsigned char *)"\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l26;  if (!yymatchClass((unsigned char *)"\000\000\000\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l26;  if (!yymatchClass((unsigned char *)"\000\000\000\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l26;  goto l24;
-  l26:;	  yypos= yypos24; yythunkpos= yythunkpos24;  if (!yymatchChar('\\')) goto l27;  if (!yymatchClass((unsigned char *)"\000\000\000\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l27;
-  {  int yypos28= yypos, yythunkpos28= yythunkpos;  if (!yymatchClass((unsigned char *)"\000\000\000\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l28;  goto l29;
-  l28:;	  yypos= yypos28; yythunkpos= yythunkpos28;
+  {  int yypos23= yypos, yythunkpos23= yythunkpos;  if (!yymatchChar('\\')) goto l24;  if (!yymatchClass((unsigned char *)"\000\000\000\000\204\040\000\000\000\000\000\070\146\100\124\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l24;  goto l23;
+  l24:;	  yypos= yypos23; yythunkpos= yythunkpos23;  if (!yymatchChar('\\')) goto l25;  if (!yymatchClass((unsigned char *)"\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l25;  if (!yymatchClass((unsigned char *)"\000\000\000\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l25;  if (!yymatchClass((unsigned char *)"\000\000\000\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l25;  goto l23;
+  l25:;	  yypos= yypos23; yythunkpos= yythunkpos23;  if (!yymatchChar('\\')) goto l26;  if (!yymatchClass((unsigned char *)"\000\000\000\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l26;
+  {  int yypos27= yypos, yythunkpos27= yythunkpos;  if (!yymatchClass((unsigned char *)"\000\000\000\000\000\000\377\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l27;  goto l28;
+  l27:;	  yypos= yypos27; yythunkpos= yythunkpos27;
   }
-  l29:;	  goto l24;
-  l27:;	  yypos= yypos24; yythunkpos= yythunkpos24;
-  {  int yypos30= yypos, yythunkpos30= yythunkpos;  if (!yymatchChar('\\')) goto l30;  goto l23;
-  l30:;	  yypos= yypos30; yythunkpos= yythunkpos30;
-  }  if (!yymatchDot()) goto l23;
+  l28:;	  goto l23;
+  l26:;	  yypos= yypos23; yythunkpos= yythunkpos23;
+  {  int yypos29= yypos, yythunkpos29= yythunkpos;  if (!yymatchChar('\\')) goto l29;  goto l22;
+  l29:;	  yypos= yypos29; yythunkpos= yythunkpos29;
+  }  if (!yymatchDot()) goto l22;
   }
-  l24:;	
+  l23:;	
   yyprintf((stderr, "  ok   %s @ %s\n", "char", yybuf+yypos));
   return 1;
-  l23:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l22:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "char", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_END()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "END"));  if (!yymatchChar('>')) goto l31;  if (!yy__()) goto l31;
+  yyprintf((stderr, "%s\n", "END"));  if (!yymatchChar('>')) goto l30;  if (!yy__()) goto l30;
   yyprintf((stderr, "  ok   %s @ %s\n", "END", yybuf+yypos));
   return 1;
-  l31:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l30:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "END", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_BEGIN()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "BEGIN"));  if (!yymatchChar('<')) goto l32;  if (!yy__()) goto l32;
+  yyprintf((stderr, "%s\n", "BEGIN"));  if (!yymatchChar('<')) goto l31;  if (!yy__()) goto l31;
   yyprintf((stderr, "  ok   %s @ %s\n", "BEGIN", yybuf+yypos));
   return 1;
-  l32:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l31:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "BEGIN", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_DOT()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "DOT"));  if (!yymatchChar('.')) goto l33;  if (!yy__()) goto l33;
+  yyprintf((stderr, "%s\n", "DOT"));  if (!yymatchChar('.')) goto l32;  if (!yy__()) goto l32;
   yyprintf((stderr, "  ok   %s @ %s\n", "DOT", yybuf+yypos));
   return 1;
-  l33:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l32:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "DOT", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_class()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "class"));  if (!yymatchChar('[')) goto l34;  yyText(yybegin, yyend);  if (!(YY_BEGIN)) goto l34;
-  l35:;	
-  {  int yypos36= yypos, yythunkpos36= yythunkpos;
-  {  int yypos37= yypos, yythunkpos37= yythunkpos;  if (!yymatchChar(']')) goto l37;  goto l36;
-  l37:;	  yypos= yypos37; yythunkpos= yythunkpos37;
-  }  if (!yy_range()) goto l36;  goto l35;
+  yyprintf((stderr, "%s\n", "class"));  if (!yymatchChar('[')) goto l33;  yyText(yybegin, yyend);  if (!(YY_BEGIN)) goto l33;
+  l34:;	
+  {  int yypos35= yypos, yythunkpos35= yythunkpos;
+  {  int yypos36= yypos, yythunkpos36= yythunkpos;  if (!yymatchChar(']')) goto l36;  goto l35;
   l36:;	  yypos= yypos36; yythunkpos= yythunkpos36;
-  }  yyText(yybegin, yyend);  if (!(YY_END)) goto l34;  if (!yymatchChar(']')) goto l34;  if (!yy__()) goto l34;
+  }  if (!yy_range()) goto l35;  goto l34;
+  l35:;	  yypos= yypos35; yythunkpos= yythunkpos35;
+  }  yyText(yybegin, yyend);  if (!(YY_END)) goto l33;  if (!yymatchChar(']')) goto l33;  if (!yy__()) goto l33;
   yyprintf((stderr, "  ok   %s @ %s\n", "class", yybuf+yypos));
   return 1;
-  l34:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l33:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "class", yybuf+yypos));
   return 0;
 }
@@ -548,81 +545,81 @@
 YY_RULE(int) yy_literal()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
   yyprintf((stderr, "%s\n", "literal"));
-  {  int yypos39= yypos, yythunkpos39= yythunkpos;  if (!yymatchClass((unsigned char *)"\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l40;  yyText(yybegin, yyend);  if (!(YY_BEGIN)) goto l40;
-  l41:;	
-  {  int yypos42= yypos, yythunkpos42= yythunkpos;
-  {  int yypos43= yypos, yythunkpos43= yythunkpos;  if (!yymatchClass((unsigned char *)"\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l43;  goto l42;
-  l43:;	  yypos= yypos43; yythunkpos= yythunkpos43;
-  }  if (!yy_char()) goto l42;  goto l41;
+  {  int yypos38= yypos, yythunkpos38= yythunkpos;  if (!yymatchClass((unsigned char *)"\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l39;  yyText(yybegin, yyend);  if (!(YY_BEGIN)) goto l39;
+  l40:;	
+  {  int yypos41= yypos, yythunkpos41= yythunkpos;
+  {  int yypos42= yypos, yythunkpos42= yythunkpos;  if (!yymatchClass((unsigned char *)"\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l42;  goto l41;
   l42:;	  yypos= yypos42; yythunkpos= yythunkpos42;
-  }  yyText(yybegin, yyend);  if (!(YY_END)) goto l40;  if (!yymatchClass((unsigned char *)"\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l40;  if (!yy__()) goto l40;  goto l39;
-  l40:;	  yypos= yypos39; yythunkpos= yythunkpos39;  if (!yymatchClass((unsigned char *)"\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l38;  yyText(yybegin, yyend);  if (!(YY_BEGIN)) goto l38;
-  l44:;	
-  {  int yypos45= yypos, yythunkpos45= yythunkpos;
-  {  int yypos46= yypos, yythunkpos46= yythunkpos;  if (!yymatchClass((unsigned char *)"\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l46;  goto l45;
-  l46:;	  yypos= yypos46; yythunkpos= yythunkpos46;
-  }  if (!yy_char()) goto l45;  goto l44;
+  }  if (!yy_char()) goto l41;  goto l40;
+  l41:;	  yypos= yypos41; yythunkpos= yythunkpos41;
+  }  yyText(yybegin, yyend);  if (!(YY_END)) goto l39;  if (!yymatchClass((unsigned char *)"\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l39;  if (!yy__()) goto l39;  goto l38;
+  l39:;	  yypos= yypos38; yythunkpos= yythunkpos38;  if (!yymatchClass((unsigned char *)"\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l37;  yyText(yybegin, yyend);  if (!(YY_BEGIN)) goto l37;
+  l43:;	
+  {  int yypos44= yypos, yythunkpos44= yythunkpos;
+  {  int yypos45= yypos, yythunkpos45= yythunkpos;  if (!yymatchClass((unsigned char *)"\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l45;  goto l44;
   l45:;	  yypos= yypos45; yythunkpos= yythunkpos45;
-  }  yyText(yybegin, yyend);  if (!(YY_END)) goto l38;  if (!yymatchClass((unsigned char *)"\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l38;  if (!yy__()) goto l38;
+  }  if (!yy_char()) goto l44;  goto l43;
+  l44:;	  yypos= yypos44; yythunkpos= yythunkpos44;
+  }  yyText(yybegin, yyend);  if (!(YY_END)) goto l37;  if (!yymatchClass((unsigned char *)"\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l37;  if (!yy__()) goto l37;
   }
-  l39:;	
+  l38:;	
   yyprintf((stderr, "  ok   %s @ %s\n", "literal", yybuf+yypos));
   return 1;
-  l38:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l37:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "literal", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_CLOSE()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "CLOSE"));  if (!yymatchChar(')')) goto l47;  if (!yy__()) goto l47;
+  yyprintf((stderr, "%s\n", "CLOSE"));  if (!yymatchChar(')')) goto l46;  if (!yy__()) goto l46;
   yyprintf((stderr, "  ok   %s @ %s\n", "CLOSE", yybuf+yypos));
   return 1;
-  l47:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l46:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "CLOSE", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_OPEN()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "OPEN"));  if (!yymatchChar('(')) goto l48;  if (!yy__()) goto l48;
+  yyprintf((stderr, "%s\n", "OPEN"));  if (!yymatchChar('(')) goto l47;  if (!yy__()) goto l47;
   yyprintf((stderr, "  ok   %s @ %s\n", "OPEN", yybuf+yypos));
   return 1;
-  l48:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l47:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "OPEN", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_COLON()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "COLON"));  if (!yymatchChar(':')) goto l49;  if (!yy__()) goto l49;
+  yyprintf((stderr, "%s\n", "COLON"));  if (!yymatchChar(':')) goto l48;  if (!yy__()) goto l48;
   yyprintf((stderr, "  ok   %s @ %s\n", "COLON", yybuf+yypos));
   return 1;
-  l49:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l48:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "COLON", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_PLUS()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "PLUS"));  if (!yymatchChar('+')) goto l50;  if (!yy__()) goto l50;
+  yyprintf((stderr, "%s\n", "PLUS"));  if (!yymatchChar('+')) goto l49;  if (!yy__()) goto l49;
   yyprintf((stderr, "  ok   %s @ %s\n", "PLUS", yybuf+yypos));
   return 1;
-  l50:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l49:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "PLUS", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_STAR()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "STAR"));  if (!yymatchChar('*')) goto l51;  if (!yy__()) goto l51;
+  yyprintf((stderr, "%s\n", "STAR"));  if (!yymatchChar('*')) goto l50;  if (!yy__()) goto l50;
   yyprintf((stderr, "  ok   %s @ %s\n", "STAR", yybuf+yypos));
   return 1;
-  l51:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l50:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "STAR", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_QUESTION()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "QUESTION"));  if (!yymatchChar('?')) goto l52;  if (!yy__()) goto l52;
+  yyprintf((stderr, "%s\n", "QUESTION"));  if (!yymatchChar('?')) goto l51;  if (!yy__()) goto l51;
   yyprintf((stderr, "  ok   %s @ %s\n", "QUESTION", yybuf+yypos));
   return 1;
-  l52:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l51:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "QUESTION", yybuf+yypos));
   return 0;
 }
@@ -629,75 +626,75 @@
 YY_RULE(int) yy_primary()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
   yyprintf((stderr, "%s\n", "primary"));
-  {  int yypos54= yypos, yythunkpos54= yythunkpos;  if (!yy_identifier()) goto l55;  yyDo(yy_1_primary, yybegin, yyend);  if (!yy_COLON()) goto l55;  if (!yy_identifier()) goto l55;
-  {  int yypos56= yypos, yythunkpos56= yythunkpos;  if (!yy_EQUAL()) goto l56;  goto l55;
-  l56:;	  yypos= yypos56; yythunkpos= yythunkpos56;
-  }  yyDo(yy_2_primary, yybegin, yyend);  goto l54;
-  l55:;	  yypos= yypos54; yythunkpos= yythunkpos54;  if (!yy_identifier()) goto l57;
-  {  int yypos58= yypos, yythunkpos58= yythunkpos;  if (!yy_EQUAL()) goto l58;  goto l57;
-  l58:;	  yypos= yypos58; yythunkpos= yythunkpos58;
-  }  yyDo(yy_3_primary, yybegin, yyend);  goto l54;
-  l57:;	  yypos= yypos54; yythunkpos= yythunkpos54;  if (!yy_OPEN()) goto l59;  if (!yy_expression()) goto l59;  if (!yy_CLOSE()) goto l59;  goto l54;
-  l59:;	  yypos= yypos54; yythunkpos= yythunkpos54;  if (!yy_literal()) goto l60;  yyDo(yy_4_primary, yybegin, yyend);  goto l54;
-  l60:;	  yypos= yypos54; yythunkpos= yythunkpos54;  if (!yy_class()) goto l61;  yyDo(yy_5_primary, yybegin, yyend);  goto l54;
-  l61:;	  yypos= yypos54; yythunkpos= yythunkpos54;  if (!yy_DOT()) goto l62;  yyDo(yy_6_primary, yybegin, yyend);  goto l54;
-  l62:;	  yypos= yypos54; yythunkpos= yythunkpos54;  if (!yy_action()) goto l63;  yyDo(yy_7_primary, yybegin, yyend);  goto l54;
-  l63:;	  yypos= yypos54; yythunkpos= yythunkpos54;  if (!yy_BEGIN()) goto l64;  yyDo(yy_8_primary, yybegin, yyend);  goto l54;
-  l64:;	  yypos= yypos54; yythunkpos= yythunkpos54;  if (!yy_END()) goto l53;  yyDo(yy_9_primary, yybegin, yyend);
+  {  int yypos53= yypos, yythunkpos53= yythunkpos;  if (!yy_identifier()) goto l54;  yyDo(yy_1_primary, yybegin, yyend);  if (!yy_COLON()) goto l54;  if (!yy_identifier()) goto l54;
+  {  int yypos55= yypos, yythunkpos55= yythunkpos;  if (!yy_EQUAL()) goto l55;  goto l54;
+  l55:;	  yypos= yypos55; yythunkpos= yythunkpos55;
+  }  yyDo(yy_2_primary, yybegin, yyend);  goto l53;
+  l54:;	  yypos= yypos53; yythunkpos= yythunkpos53;  if (!yy_identifier()) goto l56;
+  {  int yypos57= yypos, yythunkpos57= yythunkpos;  if (!yy_EQUAL()) goto l57;  goto l56;
+  l57:;	  yypos= yypos57; yythunkpos= yythunkpos57;
+  }  yyDo(yy_3_primary, yybegin, yyend);  goto l53;
+  l56:;	  yypos= yypos53; yythunkpos= yythunkpos53;  if (!yy_OPEN()) goto l58;  if (!yy_expression()) goto l58;  if (!yy_CLOSE()) goto l58;  goto l53;
+  l58:;	  yypos= yypos53; yythunkpos= yythunkpos53;  if (!yy_literal()) goto l59;  yyDo(yy_4_primary, yybegin, yyend);  goto l53;
+  l59:;	  yypos= yypos53; yythunkpos= yythunkpos53;  if (!yy_class()) goto l60;  yyDo(yy_5_primary, yybegin, yyend);  goto l53;
+  l60:;	  yypos= yypos53; yythunkpos= yythunkpos53;  if (!yy_DOT()) goto l61;  yyDo(yy_6_primary, yybegin, yyend);  goto l53;
+  l61:;	  yypos= yypos53; yythunkpos= yythunkpos53;  if (!yy_action()) goto l62;  yyDo(yy_7_primary, yybegin, yyend);  goto l53;
+  l62:;	  yypos= yypos53; yythunkpos= yythunkpos53;  if (!yy_BEGIN()) goto l63;  yyDo(yy_8_primary, yybegin, yyend);  goto l53;
+  l63:;	  yypos= yypos53; yythunkpos= yythunkpos53;  if (!yy_END()) goto l52;  yyDo(yy_9_primary, yybegin, yyend);
   }
-  l54:;	
+  l53:;	
   yyprintf((stderr, "  ok   %s @ %s\n", "primary", yybuf+yypos));
   return 1;
-  l53:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l52:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "primary", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_NOT()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "NOT"));  if (!yymatchChar('!')) goto l65;  if (!yy__()) goto l65;
+  yyprintf((stderr, "%s\n", "NOT"));  if (!yymatchChar('!')) goto l64;  if (!yy__()) goto l64;
   yyprintf((stderr, "  ok   %s @ %s\n", "NOT", yybuf+yypos));
   return 1;
-  l65:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l64:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "NOT", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_suffix()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "suffix"));  if (!yy_primary()) goto l66;
-  {  int yypos67= yypos, yythunkpos67= yythunkpos;
-  {  int yypos69= yypos, yythunkpos69= yythunkpos;  if (!yy_QUESTION()) goto l70;  yyDo(yy_1_suffix, yybegin, yyend);  goto l69;
-  l70:;	  yypos= yypos69; yythunkpos= yythunkpos69;  if (!yy_STAR()) goto l71;  yyDo(yy_2_suffix, yybegin, yyend);  goto l69;
-  l71:;	  yypos= yypos69; yythunkpos= yythunkpos69;  if (!yy_PLUS()) goto l67;  yyDo(yy_3_suffix, yybegin, yyend);
+  yyprintf((stderr, "%s\n", "suffix"));  if (!yy_primary()) goto l65;
+  {  int yypos66= yypos, yythunkpos66= yythunkpos;
+  {  int yypos68= yypos, yythunkpos68= yythunkpos;  if (!yy_QUESTION()) goto l69;  yyDo(yy_1_suffix, yybegin, yyend);  goto l68;
+  l69:;	  yypos= yypos68; yythunkpos= yythunkpos68;  if (!yy_STAR()) goto l70;  yyDo(yy_2_suffix, yybegin, yyend);  goto l68;
+  l70:;	  yypos= yypos68; yythunkpos= yythunkpos68;  if (!yy_PLUS()) goto l66;  yyDo(yy_3_suffix, yybegin, yyend);
   }
-  l69:;	  goto l68;
-  l67:;	  yypos= yypos67; yythunkpos= yythunkpos67;
+  l68:;	  goto l67;
+  l66:;	  yypos= yypos66; yythunkpos= yythunkpos66;
   }
-  l68:;	
+  l67:;	
   yyprintf((stderr, "  ok   %s @ %s\n", "suffix", yybuf+yypos));
   return 1;
-  l66:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l65:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "suffix", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_action()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "action"));  if (!yymatchChar('{')) goto l72;  yyText(yybegin, yyend);  if (!(YY_BEGIN)) goto l72;
-  l73:;	
-  {  int yypos74= yypos, yythunkpos74= yythunkpos;  if (!yy_braces()) goto l74;  goto l73;
-  l74:;	  yypos= yypos74; yythunkpos= yythunkpos74;
-  }  yyText(yybegin, yyend);  if (!(YY_END)) goto l72;  if (!yymatchChar('}')) goto l72;  if (!yy__()) goto l72;
+  yyprintf((stderr, "%s\n", "action"));  if (!yymatchChar('{')) goto l71;  yyText(yybegin, yyend);  if (!(YY_BEGIN)) goto l71;
+  l72:;	
+  {  int yypos73= yypos, yythunkpos73= yythunkpos;  if (!yy_braces()) goto l73;  goto l72;
+  l73:;	  yypos= yypos73; yythunkpos= yythunkpos73;
+  }  yyText(yybegin, yyend);  if (!(YY_END)) goto l71;  if (!yymatchChar('}')) goto l71;  if (!yy__()) goto l71;
   yyprintf((stderr, "  ok   %s @ %s\n", "action", yybuf+yypos));
   return 1;
-  l72:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l71:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "action", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_AND()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "AND"));  if (!yymatchChar('&')) goto l75;  if (!yy__()) goto l75;
+  yyprintf((stderr, "%s\n", "AND"));  if (!yymatchChar('&')) goto l74;  if (!yy__()) goto l74;
   yyprintf((stderr, "  ok   %s @ %s\n", "AND", yybuf+yypos));
   return 1;
-  l75:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l74:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "AND", yybuf+yypos));
   return 0;
 }
@@ -704,90 +701,90 @@
 YY_RULE(int) yy_prefix()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
   yyprintf((stderr, "%s\n", "prefix"));
-  {  int yypos77= yypos, yythunkpos77= yythunkpos;  if (!yy_AND()) goto l78;  if (!yy_action()) goto l78;  yyDo(yy_1_prefix, yybegin, yyend);  goto l77;
-  l78:;	  yypos= yypos77; yythunkpos= yythunkpos77;  if (!yy_AND()) goto l79;  if (!yy_suffix()) goto l79;  yyDo(yy_2_prefix, yybegin, yyend);  goto l77;
-  l79:;	  yypos= yypos77; yythunkpos= yythunkpos77;  if (!yy_NOT()) goto l80;  if (!yy_suffix()) goto l80;  yyDo(yy_3_prefix, yybegin, yyend);  goto l77;
-  l80:;	  yypos= yypos77; yythunkpos= yythunkpos77;  if (!yy_suffix()) goto l76;
+  {  int yypos76= yypos, yythunkpos76= yythunkpos;  if (!yy_AND()) goto l77;  if (!yy_action()) goto l77;  yyDo(yy_1_prefix, yybegin, yyend);  goto l76;
+  l77:;	  yypos= yypos76; yythunkpos= yythunkpos76;  if (!yy_AND()) goto l78;  if (!yy_suffix()) goto l78;  yyDo(yy_2_prefix, yybegin, yyend);  goto l76;
+  l78:;	  yypos= yypos76; yythunkpos= yythunkpos76;  if (!yy_NOT()) goto l79;  if (!yy_suffix()) goto l79;  yyDo(yy_3_prefix, yybegin, yyend);  goto l76;
+  l79:;	  yypos= yypos76; yythunkpos= yythunkpos76;  if (!yy_suffix()) goto l75;
   }
-  l77:;	
+  l76:;	
   yyprintf((stderr, "  ok   %s @ %s\n", "prefix", yybuf+yypos));
   return 1;
-  l76:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l75:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "prefix", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_BAR()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "BAR"));  if (!yymatchChar('|')) goto l81;  if (!yy__()) goto l81;
+  yyprintf((stderr, "%s\n", "BAR"));  if (!yymatchChar('|')) goto l80;  if (!yy__()) goto l80;
   yyprintf((stderr, "  ok   %s @ %s\n", "BAR", yybuf+yypos));
   return 1;
-  l81:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l80:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "BAR", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_sequence()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "sequence"));  if (!yy_prefix()) goto l82;
-  l83:;	
-  {  int yypos84= yypos, yythunkpos84= yythunkpos;  if (!yy_prefix()) goto l84;  yyDo(yy_1_sequence, yybegin, yyend);  goto l83;
-  l84:;	  yypos= yypos84; yythunkpos= yythunkpos84;
+  yyprintf((stderr, "%s\n", "sequence"));  if (!yy_prefix()) goto l81;
+  l82:;	
+  {  int yypos83= yypos, yythunkpos83= yythunkpos;  if (!yy_prefix()) goto l83;  yyDo(yy_1_sequence, yybegin, yyend);  goto l82;
+  l83:;	  yypos= yypos83; yythunkpos= yythunkpos83;
   }
   yyprintf((stderr, "  ok   %s @ %s\n", "sequence", yybuf+yypos));
   return 1;
-  l82:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l81:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "sequence", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_SEMICOLON()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "SEMICOLON"));  if (!yymatchChar(';')) goto l85;  if (!yy__()) goto l85;
+  yyprintf((stderr, "%s\n", "SEMICOLON"));  if (!yymatchChar(';')) goto l84;  if (!yy__()) goto l84;
   yyprintf((stderr, "  ok   %s @ %s\n", "SEMICOLON", yybuf+yypos));
   return 1;
-  l85:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l84:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "SEMICOLON", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_expression()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "expression"));  if (!yy_sequence()) goto l86;
-  l87:;	
-  {  int yypos88= yypos, yythunkpos88= yythunkpos;  if (!yy_BAR()) goto l88;  if (!yy_sequence()) goto l88;  yyDo(yy_1_expression, yybegin, yyend);  goto l87;
-  l88:;	  yypos= yypos88; yythunkpos= yythunkpos88;
+  yyprintf((stderr, "%s\n", "expression"));  if (!yy_sequence()) goto l85;
+  l86:;	
+  {  int yypos87= yypos, yythunkpos87= yythunkpos;  if (!yy_BAR()) goto l87;  if (!yy_sequence()) goto l87;  yyDo(yy_1_expression, yybegin, yyend);  goto l86;
+  l87:;	  yypos= yypos87; yythunkpos= yythunkpos87;
   }
   yyprintf((stderr, "  ok   %s @ %s\n", "expression", yybuf+yypos));
   return 1;
-  l86:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l85:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "expression", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_EQUAL()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "EQUAL"));  if (!yymatchChar('=')) goto l89;  if (!yy__()) goto l89;
+  yyprintf((stderr, "%s\n", "EQUAL"));  if (!yymatchChar('=')) goto l88;  if (!yy__()) goto l88;
   yyprintf((stderr, "  ok   %s @ %s\n", "EQUAL", yybuf+yypos));
   return 1;
-  l89:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l88:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "EQUAL", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_identifier()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "identifier"));  yyText(yybegin, yyend);  if (!(YY_BEGIN)) goto l90;  if (!yymatchClass((unsigned char *)"\000\000\000\000\000\040\000\000\376\377\377\207\376\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l90;
-  l91:;	
-  {  int yypos92= yypos, yythunkpos92= yythunkpos;  if (!yymatchClass((unsigned char *)"\000\000\000\000\000\040\377\003\376\377\377\207\376\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l92;  goto l91;
-  l92:;	  yypos= yypos92; yythunkpos= yythunkpos92;
-  }  yyText(yybegin, yyend);  if (!(YY_END)) goto l90;  if (!yy__()) goto l90;
+  yyprintf((stderr, "%s\n", "identifier"));  yyText(yybegin, yyend);  if (!(YY_BEGIN)) goto l89;  if (!yymatchClass((unsigned char *)"\000\000\000\000\000\040\000\000\376\377\377\207\376\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l89;
+  l90:;	
+  {  int yypos91= yypos, yythunkpos91= yythunkpos;  if (!yymatchClass((unsigned char *)"\000\000\000\000\000\040\377\003\376\377\377\207\376\377\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000")) goto l91;  goto l90;
+  l91:;	  yypos= yypos91; yythunkpos= yythunkpos91;
+  }  yyText(yybegin, yyend);  if (!(YY_END)) goto l89;  if (!yy__()) goto l89;
   yyprintf((stderr, "  ok   %s @ %s\n", "identifier", yybuf+yypos));
   return 1;
-  l90:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l89:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "identifier", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_RPERCENT()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "RPERCENT"));  if (!yymatchString("%}")) goto l93;  if (!yy__()) goto l93;
+  yyprintf((stderr, "%s\n", "RPERCENT"));  if (!yymatchString("%}")) goto l92;  if (!yy__()) goto l92;
   yyprintf((stderr, "  ok   %s @ %s\n", "RPERCENT", yybuf+yypos));
   return 1;
-  l93:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l92:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "RPERCENT", yybuf+yypos));
   return 0;
 }
@@ -794,54 +791,54 @@
 YY_RULE(int) yy_end_of_file()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
   yyprintf((stderr, "%s\n", "end_of_file"));
-  {  int yypos95= yypos, yythunkpos95= yythunkpos;  if (!yymatchDot()) goto l95;  goto l94;
-  l95:;	  yypos= yypos95; yythunkpos= yythunkpos95;
+  {  int yypos94= yypos, yythunkpos94= yythunkpos;  if (!yymatchDot()) goto l94;  goto l93;
+  l94:;	  yypos= yypos94; yythunkpos= yythunkpos94;
   }
   yyprintf((stderr, "  ok   %s @ %s\n", "end_of_file", yybuf+yypos));
   return 1;
-  l94:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l93:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "end_of_file", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_trailer()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "trailer"));  if (!yymatchString("%%")) goto l96;  yyText(yybegin, yyend);  if (!(YY_BEGIN)) goto l96;
-  l97:;	
-  {  int yypos98= yypos, yythunkpos98= yythunkpos;  if (!yymatchDot()) goto l98;  goto l97;
-  l98:;	  yypos= yypos98; yythunkpos= yythunkpos98;
-  }  yyText(yybegin, yyend);  if (!(YY_END)) goto l96;  yyDo(yy_1_trailer, yybegin, yyend);
+  yyprintf((stderr, "%s\n", "trailer"));  if (!yymatchString("%%")) goto l95;  yyText(yybegin, yyend);  if (!(YY_BEGIN)) goto l95;
+  l96:;	
+  {  int yypos97= yypos, yythunkpos97= yythunkpos;  if (!yymatchDot()) goto l97;  goto l96;
+  l97:;	  yypos= yypos97; yythunkpos= yythunkpos97;
+  }  yyText(yybegin, yyend);  if (!(YY_END)) goto l95;  yyDo(yy_1_trailer, yybegin, yyend);
   yyprintf((stderr, "  ok   %s @ %s\n", "trailer", yybuf+yypos));
   return 1;
-  l96:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l95:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "trailer", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_definition()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "definition"));  if (!yy_identifier()) goto l99;  yyDo(yy_1_definition, yybegin, yyend);  if (!yy_EQUAL()) goto l99;  if (!yy_expression()) goto l99;  yyDo(yy_2_definition, yybegin, yyend);
-  {  int yypos100= yypos, yythunkpos100= yythunkpos;  if (!yy_SEMICOLON()) goto l100;  goto l101;
-  l100:;	  yypos= yypos100; yythunkpos= yythunkpos100;
+  yyprintf((stderr, "%s\n", "definition"));  if (!yy_identifier()) goto l98;  yyDo(yy_1_definition, yybegin, yyend);  if (!yy_EQUAL()) goto l98;  if (!yy_expression()) goto l98;  yyDo(yy_2_definition, yybegin, yyend);
+  {  int yypos99= yypos, yythunkpos99= yythunkpos;  if (!yy_SEMICOLON()) goto l99;  goto l100;
+  l99:;	  yypos= yypos99; yythunkpos= yythunkpos99;
   }
-  l101:;	
+  l100:;	
   yyprintf((stderr, "  ok   %s @ %s\n", "definition", yybuf+yypos));
   return 1;
-  l99:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l98:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "definition", yybuf+yypos));
   return 0;
 }
 YY_RULE(int) yy_declaration()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "declaration"));  if (!yymatchString("%{")) goto l102;  yyText(yybegin, yyend);  if (!(YY_BEGIN)) goto l102;
-  l103:;	
-  {  int yypos104= yypos, yythunkpos104= yythunkpos;
-  {  int yypos105= yypos, yythunkpos105= yythunkpos;  if (!yymatchString("%}")) goto l105;  goto l104;
-  l105:;	  yypos= yypos105; yythunkpos= yythunkpos105;
-  }  if (!yymatchDot()) goto l104;  goto l103;
+  yyprintf((stderr, "%s\n", "declaration"));  if (!yymatchString("%{")) goto l101;  yyText(yybegin, yyend);  if (!(YY_BEGIN)) goto l101;
+  l102:;	
+  {  int yypos103= yypos, yythunkpos103= yythunkpos;
+  {  int yypos104= yypos, yythunkpos104= yythunkpos;  if (!yymatchString("%}")) goto l104;  goto l103;
   l104:;	  yypos= yypos104; yythunkpos= yythunkpos104;
-  }  yyText(yybegin, yyend);  if (!(YY_END)) goto l102;  if (!yy_RPERCENT()) goto l102;  yyDo(yy_1_declaration, yybegin, yyend);
+  }  if (!yymatchDot()) goto l103;  goto l102;
+  l103:;	  yypos= yypos103; yythunkpos= yythunkpos103;
+  }  yyText(yybegin, yyend);  if (!(YY_END)) goto l101;  if (!yy_RPERCENT()) goto l101;  yyDo(yy_1_declaration, yybegin, yyend);
   yyprintf((stderr, "  ok   %s @ %s\n", "declaration", yybuf+yypos));
   return 1;
-  l102:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l101:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "declaration", yybuf+yypos));
   return 0;
 }
@@ -848,13 +845,13 @@
 YY_RULE(int) yy__()
 {
   yyprintf((stderr, "%s\n", "_"));
-  l107:;	
-  {  int yypos108= yypos, yythunkpos108= yythunkpos;
-  {  int yypos109= yypos, yythunkpos109= yythunkpos;  if (!yy_space()) goto l110;  goto l109;
-  l110:;	  yypos= yypos109; yythunkpos= yythunkpos109;  if (!yy_comment()) goto l108;
+  l106:;	
+  {  int yypos107= yypos, yythunkpos107= yythunkpos;
+  {  int yypos108= yypos, yythunkpos108= yythunkpos;  if (!yy_space()) goto l109;  goto l108;
+  l109:;	  yypos= yypos108; yythunkpos= yythunkpos108;  if (!yy_comment()) goto l107;
   }
-  l109:;	  goto l107;
-  l108:;	  yypos= yypos108; yythunkpos= yythunkpos108;
+  l108:;	  goto l106;
+  l107:;	  yypos= yypos107; yythunkpos= yythunkpos107;
   }
   yyprintf((stderr, "  ok   %s @ %s\n", "_", yybuf+yypos));
   return 1;
@@ -861,26 +858,26 @@
 }
 YY_RULE(int) yy_grammar()
 {  int yypos0= yypos, yythunkpos0= yythunkpos;
-  yyprintf((stderr, "%s\n", "grammar"));  if (!yy__()) goto l111;
-  {  int yypos114= yypos, yythunkpos114= yythunkpos;  if (!yy_declaration()) goto l115;  goto l114;
-  l115:;	  yypos= yypos114; yythunkpos= yythunkpos114;  if (!yy_definition()) goto l111;
+  yyprintf((stderr, "%s\n", "grammar"));  if (!yy__()) goto l110;
+  {  int yypos113= yypos, yythunkpos113= yythunkpos;  if (!yy_declaration()) goto l114;  goto l113;
+  l114:;	  yypos= yypos113; yythunkpos= yythunkpos113;  if (!yy_definition()) goto l110;
   }
-  l114:;	
-  l112:;	
-  {  int yypos113= yypos, yythunkpos113= yythunkpos;
-  {  int yypos116= yypos, yythunkpos116= yythunkpos;  if (!yy_declaration()) goto l117;  goto l116;
-  l117:;	  yypos= yypos116; yythunkpos= yythunkpos116;  if (!yy_definition()) goto l113;
+  l113:;	
+  l111:;	
+  {  int yypos112= yypos, yythunkpos112= yythunkpos;
+  {  int yypos115= yypos, yythunkpos115= yythunkpos;  if (!yy_declaration()) goto l116;  goto l115;
+  l116:;	  yypos= yypos115; yythunkpos= yythunkpos115;  if (!yy_definition()) goto l112;
   }
-  l116:;	  goto l112;
-  l113:;	  yypos= yypos113; yythunkpos= yythunkpos113;
+  l115:;	  goto l111;
+  l112:;	  yypos= yypos112; yythunkpos= yythunkpos112;
   }
-  {  int yypos118= yypos, yythunkpos118= yythunkpos;  if (!yy_trailer()) goto l118;  goto l119;
-  l118:;	  yypos= yypos118; yythunkpos= yythunkpos118;
+  {  int yypos117= yypos, yythunkpos117= yythunkpos;  if (!yy_trailer()) goto l117;  goto l118;
+  l117:;	  yypos= yypos117; yythunkpos= yythunkpos117;
   }
-  l119:;	  if (!yy_end_of_file()) goto l111;
+  l118:;	  if (!yy_end_of_file()) goto l110;
   yyprintf((stderr, "  ok   %s @ %s\n", "grammar", yybuf+yypos));
   return 1;
-  l111:;	  yypos= yypos0; yythunkpos= yythunkpos0;
+  l110:;	  yypos= yypos0; yythunkpos= yythunkpos0;
   yyprintf((stderr, "  fail %s @ %s\n", "grammar", yybuf+yypos));
   return 0;
 }
--- a/leg.leg
+++ b/leg.leg
@@ -15,7 +15,7 @@
 # 
 # THE SOFTWARE IS PROVIDED 'AS IS'.  USE ENTIRELY AT YOUR OWN RISK.
 # 
-# Last edited: 2011-11-24 09:27:56 by piumarta on emilia
+# Last edited: 2012-03-23 03:16:17 by piumarta on emilia
 
 %{
 # include "tree.h"
@@ -118,7 +118,7 @@
 
 action=		'{' < braces* > '}' -
 
-braces=		'{' (!'}' .)* '}'
+braces=		'{' braces* '}'
 |		!'}' .
 
 EQUAL=		'=' -
--- a/version.h
+++ b/version.h
@@ -1,3 +1,3 @@
 #define PEG_MAJOR	0
 #define PEG_MINOR	1
-#define PEG_LEVEL	7
+#define PEG_LEVEL	8