[前][次][番号順一覧][スレッド一覧][生データ]

yarv-diff:286

From: ko1 atdot.net
Date: 20 Feb 2006 06:16:39 -0000
Subject: [yarv-diff:286] r450 - in trunk: . ext/syck lib lib/yaml

Author: ko1
Date: 2006-02-20 15:16:38 +0900 (Mon, 20 Feb 2006)
New Revision: 450

Modified:
   trunk/
   trunk/ext/syck/bytecode.c
   trunk/ext/syck/emitter.c
   trunk/ext/syck/gram.c
   trunk/ext/syck/gram.h
   trunk/ext/syck/handler.c
   trunk/ext/syck/implicit.c
   trunk/ext/syck/node.c
   trunk/ext/syck/rubyext.c
   trunk/ext/syck/syck.c
   trunk/ext/syck/syck.h
   trunk/ext/syck/token.c
   trunk/ext/syck/yaml2byte.c
   trunk/lib/yaml.rb
   trunk/lib/yaml/basenode.rb
   trunk/lib/yaml/error.rb
   trunk/lib/yaml/rubytypes.rb
   trunk/lib/yaml/stream.rb
   trunk/lib/yaml/syck.rb
   trunk/lib/yaml/types.rb
Log:



Property changes on: trunk
___________________________________________________________________
Name: svk:merge
   - 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:682
   + 81cd9672-7512-7e48-ae48-6936450e977d:/local/yarv/trunk:684

Modified: trunk/ext/syck/bytecode.c
===================================================================
--- trunk/ext/syck/bytecode.c	2006-02-20 06:15:42 UTC (rev 449)
+++ trunk/ext/syck/bytecode.c	2006-02-20 06:16:38 UTC (rev 450)
@@ -1,10 +1,10 @@
-/* Generated by re2c 0.9.3 on Fri Aug 13 11:47:50 2004 */
+/* Generated by re2c 0.9.10 on Mon Sep 19 23:21:26 2005 */
 #line 1 "bytecode.re"
 /*
  * bytecode.re
  *
  * $Author: why $
- * $Date: 2004/08/13 16:14:22 $
+ * $Date: 2005/09/20 06:50:19 $
  *
  * Copyright (C) 2003 why the lucky stiff
  */
@@ -89,7 +89,7 @@
 #define ENSURE_YAML_IOPEN(last_lvl, lvl_type, to_len, reset) \
         if ( last_lvl->spaces < to_len ) \
         { \
-            if ( last_lvl->status == syck_lvl_inline ) \
+            if ( last_lvl->status == syck_lvl_iseq || last_lvl->status == syck_lvl_imap ) \
             { \
                 goto Document; \
             } \
@@ -135,7 +135,6 @@
 sycklex_bytecode_utf8( YYSTYPE *sycklval, SyckParser *parser )
 {
     SyckLevel *lvl;
-    int doc_level = 0;
     syck_parser_ptr = parser;
     if ( YYCURSOR == NULL ) 
     {
@@ -149,7 +148,7 @@
         return t;
     }
 
-#line 173 "bytecode.re"
+#line 172 "bytecode.re"
 
 
     lvl = CURRENT_LEVEL();
@@ -158,22 +157,22 @@
         goto Document;
     }
 
-Header:
+/* Header: */
 
     YYTOKEN = YYCURSOR;
 
 
-#line 7 "<stdout>"
+#line 165 "<stdout>"
 {
 	YYCTYPE yych;
 	unsigned int yyaccept;
 	goto yy0;
-yy1:	++YYCURSOR;
+	++YYCURSOR;
 yy0:
 	if((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
 	yych = *YYCURSOR;
 	switch(yych){
-	case '\000':	goto yy2;
+	case 0x00:	goto yy2;
 	case 'D':	goto yy3;
 	default:	goto yy5;
 	}
@@ -184,22 +183,22 @@
 yy3:	yyaccept = 0;
 	yych = *(YYMARKER = ++YYCURSOR);
 	switch(yych){
-	case '\n':	goto yy6;
-	case '\r':	goto yy8;
+	case 0x0A:	goto yy6;
+	case 0x0D:	goto yy8;
 	default:	goto yy4;
 	}
 yy4:
-#line 200 "bytecode.re"
+#line 199 "bytecode.re"
 {   YYPOS(0);
             goto Document;
         }
-#line 37 "<stdout>"
+#line 195 "<stdout>"
 yy5:	yych = *++YYCURSOR;
 	goto yy4;
 yy6:	++YYCURSOR;
 	goto yy7;
 yy7:
-#line 187 "bytecode.re"
+#line 186 "bytecode.re"
 {   if ( lvl->status == syck_lvl_header )
             {
                 CHK_NL(YYCURSOR);
@@ -212,14 +211,14 @@
                 return 0;
             }
         }
-#line 56 "<stdout>"
+#line 214 "<stdout>"
 yy8:	++YYCURSOR;
 	switch((yych = *YYCURSOR)) {
-	case '\n':	goto yy6;
+	case 0x0A:	goto yy6;
 	default:	goto yy2;
 	}
 }
-#line 204 "bytecode.re"
+#line 203 "bytecode.re"
 
 
 Document:
@@ -233,19 +232,18 @@
         YYTOKEN = YYCURSOR;
 
 
-#line 65 "<stdout>"
+#line 235 "<stdout>"
 {
 	YYCTYPE yych;
-	unsigned int yyaccept;
 	goto yy9;
-yy10:	++YYCURSOR;
+	++YYCURSOR;
 yy9:
 	if((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
 	yych = *YYCURSOR;
 	switch(yych){
-	case '\000':	goto yy30;
-	case '\n':	goto yy27;
-	case '\r':	goto yy29;
+	case 0x00:	goto yy30;
+	case 0x0A:	goto yy27;
+	case 0x0D:	goto yy29;
 	case 'A':	goto yy19;
 	case 'D':	goto yy12;
 	case 'E':	goto yy16;
@@ -260,68 +258,68 @@
 	}
 yy11:yy12:	yych = *++YYCURSOR;
 	switch(yych){
-	case '\n':	goto yy41;
-	case '\r':	goto yy44;
+	case 0x0A:	goto yy41;
+	case 0x0D:	goto yy44;
 	default:	goto yy11;
 	}
 yy13:	yych = *++YYCURSOR;
 	switch(yych){
-	case '\n':	goto yy41;
-	case '\r':	goto yy43;
+	case 0x0A:	goto yy41;
+	case 0x0D:	goto yy43;
 	default:	goto yy11;
 	}
 yy14:	yych = *++YYCURSOR;
 	switch(yych){
-	case '\n':	goto yy38;
-	case '\r':	goto yy40;
+	case 0x0A:	goto yy38;
+	case 0x0D:	goto yy40;
 	default:	goto yy11;
 	}
 yy15:	yych = *++YYCURSOR;
 	switch(yych){
-	case '\n':	goto yy35;
-	case '\r':	goto yy37;
+	case 0x0A:	goto yy35;
+	case 0x0D:	goto yy37;
 	default:	goto yy11;
 	}
 yy16:	yych = *++YYCURSOR;
 	switch(yych){
-	case '\n':	goto yy32;
-	case '\r':	goto yy34;
+	case 0x0A:	goto yy32;
+	case 0x0D:	goto yy34;
 	default:	goto yy11;
 	}
 yy17:	++YYCURSOR;
 	goto yy18;
 yy18:
-#line 289 "bytecode.re"
+#line 288 "bytecode.re"
 {   ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_str); 
             goto Scalar;
         }
-#line 127 "<stdout>"
+#line 296 "<stdout>"
 yy19:	++YYCURSOR;
 	goto yy20;
 yy20:
-#line 293 "bytecode.re"
+#line 292 "bytecode.re"
 {   ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_open);
             sycklval->name = get_inline( parser );
             syck_hdlr_remove_anchor( parser, sycklval->name );
             CHK_NL(YYCURSOR);
             return YAML_ANCHOR;
         }
-#line 138 "<stdout>"
+#line 307 "<stdout>"
 yy21:	++YYCURSOR;
 	goto yy22;
 yy22:
-#line 300 "bytecode.re"
+#line 299 "bytecode.re"
 {   ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_str);
             sycklval->name = get_inline( parser );
             POP_LEVEL();
             if ( *( YYCURSOR - 1 ) == '\n' ) YYCURSOR--;
             return YAML_ALIAS;
         }
-#line 149 "<stdout>"
+#line 318 "<stdout>"
 yy23:	++YYCURSOR;
 	goto yy24;
 yy24:
-#line 307 "bytecode.re"
+#line 306 "bytecode.re"
 {   char *qstr;
             ADD_BYTE_LEVEL(lvl, lvl->spaces + 1, syck_lvl_open);
             qstr = get_inline( parser );
@@ -381,17 +379,17 @@
             sycklval->name = qstr;
             return YAML_TAGURI;
         }
-#line 213 "<stdout>"
+#line 382 "<stdout>"
 yy25:	++YYCURSOR;
 	goto yy26;
 yy26:
-#line 367 "bytecode.re"
+#line 366 "bytecode.re"
 {   goto Comment; }
-#line 219 "<stdout>"
+#line 388 "<stdout>"
 yy27:	++YYCURSOR;
 	goto yy28;
 yy28:
-#line 369 "bytecode.re"
+#line 368 "bytecode.re"
 {   CHK_NL(YYCURSOR);
             if ( lvl->status == syck_lvl_seq )
             {
@@ -404,25 +402,25 @@
             }
             goto Document;
         }
-#line 236 "<stdout>"
+#line 405 "<stdout>"
 yy29:	yych = *++YYCURSOR;
 	switch(yych){
-	case '\n':	goto yy27;
+	case 0x0A:	goto yy27;
 	default:	goto yy11;
 	}
 yy30:	++YYCURSOR;
 	goto yy31;
 yy31:
-#line 382 "bytecode.re"
+#line 381 "bytecode.re"
 {   ENSURE_YAML_IEND(lvl, -1);
             YYPOS(0);
             return 0;
         }
-#line 250 "<stdout>"
+#line 419 "<stdout>"
 yy32:	++YYCURSOR;
 	goto yy33;
 yy33:
-#line 253 "bytecode.re"
+#line 252 "bytecode.re"
 {   if ( lvl->status == syck_lvl_seq && lvl->ncount == 0 )
             {
                 lvl->ncount++;
@@ -458,16 +456,16 @@
             CHK_NL(YYCURSOR);
             return YAML_IEND;
         }
-#line 290 "<stdout>"
+#line 459 "<stdout>"
 yy34:	yych = *++YYCURSOR;
 	switch(yych){
-	case '\n':	goto yy32;
+	case 0x0A:	goto yy32;
 	default:	goto yy11;
 	}
 yy35:	++YYCURSOR;
 	goto yy36;
 yy36:
-#line 238 "bytecode.re"
+#line 237 "bytecode.re"
 {   int complex = 0;
             if ( lvl->ncount % 2 == 0 && ( lvl->status == syck_lvl_map || lvl->status == syck_lvl_seq ) )
             {
@@ -482,16 +480,16 @@
             }
             return YAML_IOPEN;
         }
-#line 314 "<stdout>"
+#line 483 "<stdout>"
 yy37:	yych = *++YYCURSOR;
 	switch(yych){
-	case '\n':	goto yy35;
+	case 0x0A:	goto yy35;
 	default:	goto yy11;
 	}
 yy38:	++YYCURSOR;
 	goto yy39;
 yy39:
-#line 223 "bytecode.re"
+#line 222 "bytecode.re"
 {   int complex = 0;
             if ( lvl->ncount % 2 == 0 && ( lvl->status == syck_lvl_map || lvl->status == syck_lvl_seq ) )
             {
@@ -506,33 +504,33 @@
             }
             return YAML_IOPEN;
         }
-#line 338 "<stdout>"
+#line 507 "<stdout>"
 yy40:	yych = *++YYCURSOR;
 	switch(yych){
-	case '\n':	goto yy38;
+	case 0x0A:	goto yy38;
 	default:	goto yy11;
 	}
 yy41:	++YYCURSOR;
 	goto yy42;
 yy42:
-#line 218 "bytecode.re"
+#line 217 "bytecode.re"
 {   ENSURE_YAML_IEND(lvl, -1);
                 YYPOS(0);
                 return 0;
             }
-#line 352 "<stdout>"
+#line 521 "<stdout>"
 yy43:	yych = *++YYCURSOR;
 	switch(yych){
-	case '\n':	goto yy41;
+	case 0x0A:	goto yy41;
 	default:	goto yy11;
 	}
 yy44:	++YYCURSOR;
 	switch((yych = *YYCURSOR)) {
-	case '\n':	goto yy41;
+	case 0x0A:	goto yy41;
 	default:	goto yy11;
 	}
 }
-#line 387 "bytecode.re"
+#line 386 "bytecode.re"
 
 
     }
@@ -542,17 +540,17 @@
         YYTOKEN = YYCURSOR;
 
 
-#line 366 "<stdout>"
+#line 543 "<stdout>"
 {
 	YYCTYPE yych;
 	unsigned int yyaccept;
 	goto yy45;
-yy46:	++YYCURSOR;
+	++YYCURSOR;
 yy45:
 	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
 	yych = *YYCURSOR;
 	switch(yych){
-	case '\000':	goto yy47;
+	case 0x00:	goto yy47;
 	case 'V':	goto yy48;
 	default:	goto yy50;
 	}
@@ -641,15 +639,15 @@
 	default:	goto yy49;
 	}
 yy49:
-#line 400 "bytecode.re"
+#line 399 "bytecode.re"
 {   YYCURSOR = YYTOKEN;
                return YAML_DOCSEP;
            }
-#line 469 "<stdout>"
+#line 646 "<stdout>"
 yy50:	yych = *++YYCURSOR;
 	goto yy49;
 yy51:	++YYCURSOR;
-	if(YYLIMIT == YYCURSOR) YYFILL(1);
+	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
 	yych = *YYCURSOR;
 	goto yy52;
 yy52:	switch(yych){
@@ -809,12 +807,12 @@
 	default:	goto yy47;
 	}
 yy54:	++YYCURSOR;
-	if(YYLIMIT == YYCURSOR) YYFILL(1);
+	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
 	yych = *YYCURSOR;
 	goto yy55;
 yy55:	switch(yych){
-	case '\n':	goto yy56;
-	case '\r':	goto yy58;
+	case 0x0A:	goto yy56;
+	case 0x0D:	goto yy58;
 	case '.':
 	case '/':
 	case '0':
@@ -895,17 +893,17 @@
 yy56:	++YYCURSOR;
 	goto yy57;
 yy57:
-#line 397 "bytecode.re"
+#line 396 "bytecode.re"
 {   CHK_NL(YYCURSOR);
                goto Directive; }
-#line 724 "<stdout>"
+#line 899 "<stdout>"
 yy58:	++YYCURSOR;
 	switch((yych = *YYCURSOR)) {
-	case '\n':	goto yy56;
+	case 0x0A:	goto yy56;
 	default:	goto yy47;
 	}
 }
-#line 403 "bytecode.re"
+#line 402 "bytecode.re"
 
 
     }
@@ -915,44 +913,43 @@
         YYTOKEN = YYCURSOR;
 
 
-#line 733 "<stdout>"
+#line 916 "<stdout>"
 {
 	YYCTYPE yych;
-	unsigned int yyaccept;
 	goto yy59;
-yy60:	++YYCURSOR;
+	++YYCURSOR;
 yy59:
 	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
 	yych = *YYCURSOR;
 	switch(yych){
-	case '\000':	goto yy61;
-	case '\n':	goto yy62;
-	case '\r':	goto yy64;
+	case 0x00:	goto yy61;
+	case 0x0A:	goto yy62;
+	case 0x0D:	goto yy64;
 	default:	goto yy66;
 	}
 yy61:yy62:	++YYCURSOR;
 	goto yy63;
 yy63:
-#line 413 "bytecode.re"
+#line 412 "bytecode.re"
 {   CHK_NL(YYCURSOR);
                 goto Document; }
-#line 754 "<stdout>"
+#line 936 "<stdout>"
 yy64:	++YYCURSOR;
 	switch((yych = *YYCURSOR)) {
-	case '\n':	goto yy67;
+	case 0x0A:	goto yy67;
 	default:	goto yy65;
 	}
 yy65:
-#line 416 "bytecode.re"
+#line 415 "bytecode.re"
 {   goto Comment; }
-#line 763 "<stdout>"
+#line 945 "<stdout>"
 yy66:	yych = *++YYCURSOR;
 	goto yy65;
 yy67:	++YYCURSOR;
 	yych = *YYCURSOR;
 	goto yy63;
 }
-#line 418 "bytecode.re"
+#line 417 "bytecode.re"
 
 
     }
@@ -970,19 +967,18 @@
     tok = YYCURSOR;
 
 
-#line 771 "<stdout>"
+#line 970 "<stdout>"
 {
 	YYCTYPE yych;
-	unsigned int yyaccept;
 	goto yy68;
-yy69:	++YYCURSOR;
+	++YYCURSOR;
 yy68:
 	if((YYLIMIT - YYCURSOR) < 3) YYFILL(3);
 	yych = *YYCURSOR;
 	switch(yych){
-	case '\000':	goto yy74;
-	case '\n':	goto yy70;
-	case '\r':	goto yy72;
+	case 0x00:	goto yy74;
+	case 0x0A:	goto yy70;
+	case 0x0D:	goto yy72;
 	default:	goto yy76;
 	}
 yy70:	++YYCURSOR;
@@ -993,30 +989,30 @@
 	default:	goto yy71;
 	}
 yy71:
-#line 462 "bytecode.re"
+#line 461 "bytecode.re"
 {   YYCURSOR = tok;
             goto ScalarEnd; 
         }
-#line 798 "<stdout>"
+#line 996 "<stdout>"
 yy72:	++YYCURSOR;
 	switch((yych = *YYCURSOR)) {
-	case '\n':	goto yy77;
+	case 0x0A:	goto yy77;
 	default:	goto yy73;
 	}
 yy73:
-#line 470 "bytecode.re"
+#line 469 "bytecode.re"
 {   CAT(str, cap, idx, tok[0]);
             goto Scalar2; 
         }
-#line 809 "<stdout>"
+#line 1007 "<stdout>"
 yy74:	++YYCURSOR;
 	goto yy75;
 yy75:
-#line 466 "bytecode.re"
+#line 465 "bytecode.re"
 {   YYCURSOR = tok;
             goto ScalarEnd;
         }
-#line 817 "<stdout>"
+#line 1015 "<stdout>"
 yy76:	yych = *++YYCURSOR;
 	goto yy73;
 yy77:	yych = *++YYCURSOR;
@@ -1029,10 +1025,10 @@
 yy78:	++YYCURSOR;
 	goto yy79;
 yy79:
-#line 436 "bytecode.re"
+#line 435 "bytecode.re"
 {   CHK_NL(tok+1);
             goto Scalar2; }
-#line 833 "<stdout>"
+#line 1031 "<stdout>"
 yy80:	++YYCURSOR;
 	if(YYLIMIT == YYCURSOR) YYFILL(1);
 	yych = *YYCURSOR;
@@ -1051,7 +1047,7 @@
 	default:	goto yy82;
 	}
 yy82:
-#line 439 "bytecode.re"
+#line 438 "bytecode.re"
 {   CHK_NL(tok+1);
             if ( tok + 2 < YYCURSOR )
             {
@@ -1069,18 +1065,18 @@
             }
             goto Scalar2;
         }
-#line 871 "<stdout>"
+#line 1068 "<stdout>"
 yy83:	++YYCURSOR;
 	goto yy84;
 yy84:
-#line 457 "bytecode.re"
+#line 456 "bytecode.re"
 {   CHK_NL(tok+1);
             CAT(str, cap, idx, '\0');
             goto Scalar2; 
         }
-#line 880 "<stdout>"
+#line 1077 "<stdout>"
 }
-#line 474 "bytecode.re"
+#line 473 "bytecode.re"
 
 
 ScalarEnd:
@@ -1115,54 +1111,53 @@
         tok = YYCURSOR;
 
 
-#line 884 "<stdout>"
+#line 1114 "<stdout>"
 {
 	YYCTYPE yych;
-	unsigned int yyaccept;
 	goto yy85;
-yy86:	++YYCURSOR;
+	++YYCURSOR;
 yy85:
 	if((YYLIMIT - YYCURSOR) < 2) YYFILL(2);
 	yych = *YYCURSOR;
 	switch(yych){
-	case '\000':	goto yy91;
-	case '\n':	goto yy87;
-	case '\r':	goto yy89;
+	case 0x00:	goto yy91;
+	case 0x0A:	goto yy87;
+	case 0x0D:	goto yy89;
 	default:	goto yy93;
 	}
 yy87:	++YYCURSOR;
 	goto yy88;
 yy88:
-#line 509 "bytecode.re"
+#line 508 "bytecode.re"
 {   CHK_NL(YYCURSOR);
                 return str; }
-#line 905 "<stdout>"
+#line 1134 "<stdout>"
 yy89:	++YYCURSOR;
 	switch((yych = *YYCURSOR)) {
-	case '\n':	goto yy94;
+	case 0x0A:	goto yy94;
 	default:	goto yy90;
 	}
 yy90:
-#line 516 "bytecode.re"
+#line 515 "bytecode.re"
 {   CAT(str, cap, idx, tok[0]);
                 goto Inline; 
             }
-#line 916 "<stdout>"
+#line 1145 "<stdout>"
 yy91:	++YYCURSOR;
 	goto yy92;
 yy92:
-#line 512 "bytecode.re"
+#line 511 "bytecode.re"
 {   YYCURSOR = tok;
                 return str;
             }
-#line 924 "<stdout>"
+#line 1153 "<stdout>"
 yy93:	yych = *++YYCURSOR;
 	goto yy90;
 yy94:	++YYCURSOR;
 	yych = *YYCURSOR;
 	goto yy88;
 }
-#line 520 "bytecode.re"
+#line 519 "bytecode.re"
 
 
     }

Modified: trunk/ext/syck/emitter.c
===================================================================
--- trunk/ext/syck/emitter.c	2006-02-20 06:15:42 UTC (rev 449)
+++ trunk/ext/syck/emitter.c	2006-02-20 06:16:38 UTC (rev 450)
@@ -1,8 +1,8 @@
 /*
  * emitter.c
  *
- * $Author: why $
- * $Date: 2004/05/06 06:29:56 $
+ * $Author: ocean $
+ * $Date: 2006/02/02 15:02:49 $
  *
  * Copyright (C) 2003 why the lucky stiff
  * 
@@ -18,16 +18,11 @@
 
 #define DEFAULT_ANCHOR_FORMAT "id%03d"
 
+const char hex_table[] = 
+"0123456789ABCDEF";
 static char b64_table[] =
 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
-struct adjust_arg {
-    /* Position to start adjusting */
-    long startpos;
-    /* Adjusting by an offset */
-    int offset;
-};
-
 /*
  * Built-in base64 (from Ruby's pack.c)
  */
@@ -36,7 +31,7 @@
 {
     long i = 0;
     int padding = '=';
-    char *buff = S_ALLOCA_N(char, len * 4 / 3 + 6);
+    char *buff = S_ALLOC_N(char, len * 4 / 3 + 6);
 
     while (len >= 3) {
         buff[i++] = b64_table[077 & (*s >> 2)];
@@ -116,25 +111,29 @@
     SyckEmitter *e;
     e = S_ALLOC( SyckEmitter );
     e->headless = 0;
-    e->seq_map = 0;
     e->use_header = 0;
     e->use_version = 0;
     e->sort_keys = 0;
     e->anchor_format = NULL;
     e->explicit_typing = 0;
     e->best_width = 80;
-    e->block_style = block_arbitrary;
+    e->style = scalar_none;
     e->stage = doc_open;
     e->indent = 2;
     e->level = -1;
-    e->ignore_id = 0;
     e->anchors = NULL;
     e->markers = NULL;
+    e->anchored = NULL;
     e->bufsize = SYCK_BUFFERSIZE;
     e->buffer = NULL;
     e->marker = NULL;
     e->bufpos = 0;
-    e->handler = NULL;
+    e->emitter_handler = NULL;
+    e->output_handler = NULL;
+    e->lvl_idx = 0;
+    e->lvl_capa = ALLOC_CT;
+    e->levels = S_ALLOC_N( SyckLevel, e->lvl_capa ); 
+    syck_emitter_reset_levels( e );
     e->bonus = NULL;
     return e;
 }
@@ -146,13 +145,6 @@
     return ST_CONTINUE;
 }
 
-int
-syck_st_free_markers( char *key, SyckEmitterNode *n, char *arg )
-{
-    S_FREE( n );
-    return ST_CONTINUE;
-}
-
 void
 syck_emitter_st_free( SyckEmitter *e )
 {
@@ -166,36 +158,106 @@
         e->anchors = NULL;
     }
 
+    if ( e->anchored != NULL )
+    {
+        st_free_table( e->anchored );
+        e->anchored = NULL;
+    }
+
     /*
      * Free the markers tables
      */
     if ( e->markers != NULL )
     {
-        st_foreach( e->markers, syck_st_free_markers, 0 );
         st_free_table( e->markers );
         e->markers = NULL;
     }
 }
 
+SyckLevel *
+syck_emitter_current_level( SyckEmitter *e )
+{
+    return &e->levels[e->lvl_idx-1];
+}
+
+SyckLevel *
+syck_emitter_parent_level( SyckEmitter *e )
+{
+    return &e->levels[e->lvl_idx-2];
+}
+
 void
-syck_emitter_ignore_id( SyckEmitter *e, SYMID id )
+syck_emitter_pop_level( SyckEmitter *e )
 {
-    e->ignore_id = id;
+    ASSERT( e != NULL );
+
+    /* The root level should never be popped */
+    if ( e->lvl_idx <= 1 ) return;
+
+    e->lvl_idx -= 1;
+    free( e->levels[e->lvl_idx].domain );
 }
 
+void 
+syck_emitter_add_level( SyckEmitter *e, int len, enum syck_level_status status )
+{
+    ASSERT( e != NULL );
+    if ( e->lvl_idx + 1 > e->lvl_capa )
+    {
+        e->lvl_capa += ALLOC_CT;
+        S_REALLOC_N( e->levels, SyckLevel, e->lvl_capa );
+    }
+
+    ASSERT( len > e->levels[e->lvl_idx-1].spaces );
+    e->levels[e->lvl_idx].spaces = len;
+    e->levels[e->lvl_idx].ncount = 0;
+    e->levels[e->lvl_idx].domain = syck_strndup( e->levels[e->lvl_idx-1].domain, strlen( e->levels[e->lvl_idx-1].domain ) );
+    e->levels[e->lvl_idx].status = status;
+    e->levels[e->lvl_idx].anctag = 0;
+    e->lvl_idx += 1;
+}
+
 void
-syck_emitter_handler( SyckEmitter *e, SyckOutputHandler hdlr )
+syck_emitter_reset_levels( SyckEmitter *e )
 {
-    e->handler = hdlr;
+    while ( e->lvl_idx > 1 )
+    {
+        syck_emitter_pop_level( e );
+    }
+
+    if ( e->lvl_idx < 1 )
+    {
+        e->lvl_idx = 1;
+        e->levels[0].spaces = -1;
+        e->levels[0].ncount = 0;
+        e->levels[0].domain = syck_strndup( "", 0 );
+        e->levels[0].anctag = 0;
+    }
+    e->levels[0].status = syck_lvl_header;
 }
 
 void
+syck_emitter_handler( SyckEmitter *e, SyckEmitterHandler hdlr )
+{
+    e->emitter_handler = hdlr;
+}
+
+void
+syck_output_handler( SyckEmitter *e, SyckOutputHandler hdlr )
+{
+    e->output_handler = hdlr;
+}
+
+void
 syck_free_emitter( SyckEmitter *e )
 {
     /*
      * Free tables
      */
     syck_emitter_st_free( e );
+    syck_emitter_reset_levels( e );
+    S_FREE( e->levels[0].domain );
+    S_FREE( e->levels );
     if ( e->buffer != NULL )
     {
         S_FREE( e->buffer );
@@ -276,169 +338,905 @@
     }
 
     /*
+     * Commit buffer.
+     */
+    if ( check_room > e->marker - e->buffer )
+    {
+        check_room = e->marker - e->buffer;
+    }
+    (e->output_handler)( e, e->buffer, check_room );
+    e->bufpos += check_room;
+    e->marker -= check_room;
+}
+
+/*
+ * Start emitting from the given node, check for anchoring and then
+ * issue the callback to the emitter handler.
+ */
+void
+syck_emit( SyckEmitter *e, st_data_t n )
+{
+    SYMID oid;
+    char *anchor_name = NULL;
+    int indent = 0;
+    long x = 0;
+    SyckLevel *lvl = syck_emitter_current_level( e );
+    
+    /*
      * Determine headers.
      */
-    if ( ( e->stage == doc_open && ( e->headless == 0 || e->use_header == 1 ) ) || 
-         e->stage == doc_need_header )
+    if ( e->stage == doc_open && ( e->headless == 0 || e->use_header == 1 ) )
     {
         if ( e->use_version == 1 )
         {
             char *header = S_ALLOC_N( char, 64 );
             S_MEMZERO( header, char, 64 );
             sprintf( header, "--- %%YAML:%d.%d ", SYCK_YAML_MAJOR, SYCK_YAML_MINOR );
-            (e->handler)( e, header, strlen( header ) );
+            syck_emitter_write( e, header, strlen( header ) );
             S_FREE( header );
         }
         else
         {
-            (e->handler)( e, "--- ", 4 );
+            syck_emitter_write( e, "--- ", 4 );
         }
         e->stage = doc_processing;
     }
 
-    /*
-     * Commit buffer.
-     */
-    if ( check_room > e->marker - e->buffer )
+    /* Add new level */
+    if ( lvl->spaces >= 0 ) {
+        indent = lvl->spaces + e->indent;
+    }
+    syck_emitter_add_level( e, indent, syck_lvl_open );
+    lvl = syck_emitter_current_level( e );
+
+    /* Look for anchor */
+    if ( e->anchors != NULL &&
+        st_lookup( e->markers, n, (st_data_t *)&oid ) &&
+        st_lookup( e->anchors, (st_data_t)oid, (st_data_t *)&anchor_name ) )
     {
-        check_room = e->marker - e->buffer;
+        if ( e->anchored == NULL )
+        {
+            e->anchored = st_init_numtable();
+        }
+
+        if ( ! st_lookup( e->anchored, (st_data_t)anchor_name, (st_data_t *)&x ) )
+        {
+            char *an = S_ALLOC_N( char, strlen( anchor_name ) + 3 );
+            sprintf( an, "&%s ", anchor_name );
+            syck_emitter_write( e, an, strlen( anchor_name ) + 2 );
+            free( an );
+
+            x = 1;
+            st_insert( e->anchored, (st_data_t)anchor_name, (st_data_t)x );
+            lvl->anctag = 1;
+        }
+        else
+        {
+            char *an = S_ALLOC_N( char, strlen( anchor_name ) + 2 );
+            sprintf( an, "*%s", anchor_name );
+            syck_emitter_write( e, an, strlen( anchor_name ) + 1 );
+            free( an );
+
+            goto end_emit;
+        }
     }
-    (e->handler)( e, e->buffer, check_room );
-    e->bufpos += check_room;
-    e->marker -= check_room;
+
+    (e->emitter_handler)( e, n );
+
+    /* Pop the level */
+end_emit:
+    syck_emitter_pop_level( e );
+    if ( e->lvl_idx == 1 ) {
+        syck_emitter_write( e, "\n", 1 );
+        e->headless = 0;
+        e->stage = doc_open;
+    }
 }
 
 /*
- * Emit a simple, unquoted string.
+ * Determine what tag needs to be written, based on the taguri of the node
+ * and the implicit tag which would be assigned to this node.  If a tag is
+ * required, write the tag.
  */
-void
-syck_emitter_simple( SyckEmitter *e, char *str, long len )
+void syck_emit_tag( SyckEmitter *e, char *tag, char *ignore )
 {
-    e->seq_map = 0;
-    syck_emitter_write( e, str, len );
+    SyckLevel *lvl;
+    if ( tag == NULL ) return;
+    if ( ignore != NULL && syck_tagcmp( tag, ignore ) == 0 && e->explicit_typing == 0 ) return;
+    lvl = syck_emitter_current_level( e );
+
+    /* implicit */
+    if ( strlen( tag ) == 0 ) {
+        syck_emitter_write( e, "! ", 2 );
+
+    /* global types */
+    } else if ( strncmp( tag, "tag:", 4 ) == 0 ) {
+        int taglen = strlen( tag );
+        syck_emitter_write( e, "!", 1 );
+        if ( strncmp( tag + 4, YAML_DOMAIN, strlen( YAML_DOMAIN ) ) == 0 ) {
+            int skip = 4 + strlen( YAML_DOMAIN ) + 1;
+            syck_emitter_write( e, tag + skip, taglen - skip );
+        } else {
+            char *subd = tag + 4;
+            while ( *subd != ':' && *subd != '\0' ) subd++;
+            if ( *subd == ':' ) {
+                if ( subd - tag > ( strlen( YAML_DOMAIN ) + 5 ) &&
+                     strncmp( subd - strlen( YAML_DOMAIN ), YAML_DOMAIN, strlen( YAML_DOMAIN ) ) == 0 ) {
+                    syck_emitter_write( e, tag + 4, subd - strlen( YAML_DOMAIN ) - ( tag + 4 ) - 1 );
+                    syck_emitter_write( e, "/", 1 );
+                    syck_emitter_write( e, subd + 1, ( tag + taglen ) - ( subd + 1 ) );
+                } else {
+                    syck_emitter_write( e, tag + 4, subd - ( tag + 4 ) );
+                    syck_emitter_write( e, "/", 1 );
+                    syck_emitter_write( e, subd + 1, ( tag + taglen ) - ( subd + 1 ) );
+                }
+            } else {
+                /* TODO: Invalid tag (no colon after domain) */
+                return;
+            }
+        }
+        syck_emitter_write( e, " ", 1 );
+
+    /* private types */
+    } else if ( strncmp( tag, "x-private:", 10 ) == 0 ) {
+        syck_emitter_write( e, "!!", 2 );
+        syck_emitter_write( e, tag + 10, strlen( tag ) - 10 );
+        syck_emitter_write( e, " ", 1 );
+    }
+    lvl->anctag = 1;
 }
 
+/* 
+ * Emit a newline and an appropriately spaced indent.
+ */
+void syck_emit_indent( SyckEmitter *e )
+{
+    int i;
+    SyckLevel *lvl = syck_emitter_current_level( e );
+    if ( e->bufpos == 0 && ( e->marker - e->buffer ) == 0 ) return;
+    if ( lvl->spaces >= 0 ) {
+        char *spcs = S_ALLOC_N( char, lvl->spaces + 2 );
+
+        spcs[0] = '\n'; spcs[lvl->spaces + 1] = '\0';
+        for ( i = 0; i < lvl->spaces; i++ ) spcs[i+1] = ' ';
+        syck_emitter_write( e, spcs, lvl->spaces + 1 );
+        free( spcs );
+    }
+}
+
+/* Clear the scan */
+#define SCAN_NONE       0
+/* All printable characters? */
+#define SCAN_NONPRINT   1
+/* Any indented lines? */
+#define SCAN_INDENTED   2
+/* Larger than the requested width? */
+#define SCAN_WIDE       4
+/* Opens or closes with whitespace? */
+#define SCAN_WHITEEDGE  8
+/* Contains a newline */
+#define SCAN_NEWLINE    16
+/* Contains a single quote */
+#define SCAN_SINGLEQ    32
+/* Contains a double quote */
+#define SCAN_DOUBLEQ    64
+/* Starts with a token */
+#define SCAN_INDIC_S    128
+/* Contains a flow indicator */
+#define SCAN_INDIC_C    256
+/* Ends without newlines */
+#define SCAN_NONL_E     512
+/* Ends with many newlines */
+#define SCAN_MANYNL_E   1024
+/* Contains flow map indicators */
+#define SCAN_FLOWMAP    2048
+/* Contains flow seq indicators */
+#define SCAN_FLOWSEQ    4096
+/* Contains a valid doc separator */
+#define SCAN_DOCSEP     8192
+
 /*
- * Shift the offsets of all applicable anchors
+ * Basic printable test for LATIN-1 characters.
  */
 int
-syck_adjust_anchors( char *key, SyckEmitterNode *n, struct adjust_arg *arg )
+syck_scan_scalar( int req_width, char *cursor, long len )
 {
-    if ( arg->startpos < n->pos )
+    long i = 0, start = 0;
+    int flags = SCAN_NONE;
+
+    if ( len < 1 )  return flags;
+
+    /* c-indicators from the spec */
+    if ( cursor[0] == '[' || cursor[0] == ']' ||
+         cursor[0] == '{' || cursor[0] == '}' ||
+         cursor[0] == '!' || cursor[0] == '*' ||
+         cursor[0] == '&' || cursor[0] == '|' ||
+         cursor[0] == '>' || cursor[0] == '\'' ||
+         cursor[0] == '"' || cursor[0] == '#' ||
+         cursor[0] == '%' || cursor[0] == '@' ||
+         cursor[0] == '&' ) {
+            flags |= SCAN_INDIC_S;
+    }
+    if ( ( cursor[0] == '-' || cursor[0] == ':' ||
+           cursor[0] == '?' || cursor[0] == ',' ) &&
+           ( cursor[1] == ' ' || cursor[1] == '\n' || len == 1 ) )
     {
-        n->pos += arg->offset;
+            flags |= SCAN_INDIC_S;
     }
-    return ST_CONTINUE;
+
+    /* whitespace edges */
+    if ( cursor[len-1] != '\n' ) {
+        flags |= SCAN_NONL_E;
+    } else if ( len > 1 && cursor[len-2] == '\n' ) {
+        flags |= SCAN_MANYNL_E;
+    }
+    if ( 
+        ( len > 0 && ( cursor[0] == ' ' || cursor[0] == '\t' ) ) ||
+        ( len > 1 && ( cursor[len-1] == ' ' || cursor[len-1] == '\t' ) )
+    ) {
+        flags |= SCAN_WHITEEDGE;
+    }
+
+    /* opening doc sep */
+    if ( len >= 3 && strncmp( cursor, "---", 3 ) == 0 )
+        flags |= SCAN_DOCSEP;
+
+    /* scan string */
+    for ( i = 0; i < len; i++ ) {
+
+        if ( ! ( cursor[i] == 0x9 ||
+                 cursor[i] == 0xA ||
+                 cursor[i] == 0xD ||
+               ( cursor[i] >= 0x20 && cursor[i] <= 0x7E ) )
+        ) {
+            flags |= SCAN_NONPRINT;
+        }
+        else if ( cursor[i] == '\n' ) {
+            flags |= SCAN_NEWLINE;
+            if ( len - i >= 3 && strncmp( &cursor[i+1], "---", 3 ) == 0 )
+                flags |= SCAN_DOCSEP;
+            if ( cursor[i+1] == ' ' || cursor[i+1] == '\t' ) 
+                flags |= SCAN_INDENTED;
+            if ( req_width > 0 && i - start > req_width )
+                flags |= SCAN_WIDE;
+            start = i;
+        }
+        else if ( cursor[i] == '\'' )
+        {
+            flags |= SCAN_SINGLEQ;
+        }
+        else if ( cursor[i] == '"' )
+        {
+            flags |= SCAN_DOUBLEQ;
+        }
+        else if ( cursor[i] == ']' )
+        {
+            flags |= SCAN_FLOWSEQ;
+        }
+        else if ( cursor[i] == '}' )
+        {
+            flags |= SCAN_FLOWMAP;
+        }
+        /* remember, if plain collections get implemented, to add nb-plain-flow-char */
+        else if ( ( cursor[i] == ' ' && cursor[i+1] == '#' ) ||
+                  ( cursor[i] == ':' && 
+                    ( cursor[i+1] == ' ' || cursor[i+1] == '\n' || i == len - 1 ) ) )
+        {
+            flags |= SCAN_INDIC_C;
+        }
+        else if ( cursor[i] == ',' && 
+                  ( cursor[i+1] == ' ' || cursor[i+1] == '\n' || i == len - 1 ) )
+        {
+            flags |= SCAN_FLOWMAP;
+            flags |= SCAN_FLOWSEQ;
+        }
+    }
+
+    /* printf( "---STR---\n%s\nFLAGS: %d\n", cursor, flags ); */
+    return flags;
 }
-
 /*
- * call on start of an object's marshalling
- * (handles anchors, returns an alias)
+ * All scalars should be emitted through this function, which determines an appropriate style,
+ * tag and indent.
  */
-char *
-syck_emitter_start_obj( SyckEmitter *e, SYMID oid )
+void syck_emit_scalar( SyckEmitter *e, char *tag, enum scalar_style force_style, int force_indent, int force_width,
+                       char keep_nl, char *str, long len )
 {
-    SyckEmitterNode *n = NULL;
-    char *anchor_name = NULL;
+    enum scalar_style favor_style = scalar_literal;
+    SyckLevel *parent = syck_emitter_parent_level( e );
+    SyckLevel *lvl = syck_emitter_current_level( e );
+    int scan = 0;
+    char *implicit;
+    
+    if ( str == NULL ) str = "";
 
-    e->level++;
-    if ( oid != e->ignore_id )
+    /* No empty nulls as map keys */
+    if ( len == 0 && ( parent->status == syck_lvl_map || parent->status == syck_lvl_imap ) && 
+         parent->ncount % 2 == 1 && syck_tagcmp( tag, "tag:yaml.org,2002:null" ) == 0 ) 
     {
-        /*
-         * Look for anchors
-         */
-        if ( e->markers == NULL )
+        str = "~";
+        len = 1;
+    }
+
+    scan = syck_scan_scalar( force_width, str, len );
+    implicit = syck_match_implicit( str, len );
+
+    /* quote strings which default to implicits */
+    implicit = syck_taguri( YAML_DOMAIN, implicit, strlen( implicit ) );
+    if ( syck_tagcmp( tag, implicit ) != 0 && syck_tagcmp( tag, "tag:yaml.org,2002:str" ) == 0 ) {
+        force_style = scalar_2quote;
+    } else {
+        /* complex key */
+        if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 &&
+             ( !( tag == NULL || 
+             ( implicit != NULL && syck_tagcmp( tag, implicit ) == 0 && e->explicit_typing == 0 ) ) ) ) 
         {
-            e->markers = st_init_numtable();
+            syck_emitter_write( e, "? ", 2 );
+            parent->status = syck_lvl_mapx;
         }
+        syck_emit_tag( e, tag, implicit );
+    }
+    S_FREE( implicit );
 
-        /*
-         * Markers table initially marks the string position of the
-         * object.  Doesn't yet create an anchor, simply notes the
-         * position.
-         */
-        if ( ! st_lookup( e->markers, (st_data_t)oid, (st_data_t *)&n ) )
+    /* if still arbitrary, sniff a good block style. */
+    if ( force_style == scalar_none ) {
+        if ( scan & SCAN_NEWLINE ) {
+            force_style = scalar_literal;
+        } else {
+            force_style = scalar_plain;
+        }
+    }
+
+    if ( e->style == scalar_fold ) {
+        favor_style = scalar_fold;
+    }
+
+    /* Determine block style */
+    if ( scan & SCAN_NONPRINT ) {
+        force_style = scalar_2quote;
+    } else if ( scan & SCAN_WHITEEDGE ) {
+        force_style = scalar_2quote;
+    } else if ( force_style != scalar_fold && ( scan & SCAN_INDENTED ) ) {
+        force_style = scalar_literal;
+    } else if ( force_style == scalar_plain && ( scan & SCAN_NEWLINE ) ) {
+        force_style = favor_style;
+    } else if ( force_style == scalar_plain && parent->status == syck_lvl_iseq && ( scan & SCAN_FLOWSEQ ) ) {
+        force_style = scalar_2quote;
+    } else if ( force_style == scalar_plain && parent->status == syck_lvl_imap && ( scan & SCAN_FLOWMAP ) ) {
+        force_style = scalar_2quote;
+    /* } else if ( force_style == scalar_fold && ( ! ( scan & SCAN_WIDE ) ) ) {
+        force_style = scalar_literal; */
+    } else if ( force_style == scalar_plain && ( scan & SCAN_INDIC_S || scan & SCAN_INDIC_C ) ) {
+        if ( scan & SCAN_NEWLINE ) {
+            force_style = favor_style;
+        } else {
+            force_style = scalar_2quote;
+        }
+    }
+
+    if ( force_indent > 0 ) {
+        lvl->spaces = parent->spaces + force_indent;
+    } else if ( scan & SCAN_DOCSEP ) {
+        lvl->spaces = parent->spaces + e->indent;
+    }
+
+    /* For now, all ambiguous keys are going to be double-quoted */
+    if ( ( parent->status == syck_lvl_map || parent->status == syck_lvl_mapx ) && parent->ncount % 2 == 1 ) {
+        if ( force_style != scalar_plain ) {
+            force_style = scalar_2quote;
+        }
+    }
+
+    /* If the parent is an inline, double quote anything complex */
+    if ( parent->status == syck_lvl_imap || parent->status == syck_lvl_iseq ) {
+        if ( force_style != scalar_plain && force_style != scalar_1quote ) {
+            force_style = scalar_2quote;
+        }
+    }
+
+    /* Fix the ending newlines */
+    if ( scan & SCAN_NONL_E ) {
+        keep_nl = NL_CHOMP;
+    } else if ( scan & SCAN_MANYNL_E ) {
+        keep_nl = NL_KEEP;
+    }
+
+    /* Write the text node */
+    switch ( force_style )
+    {
+        case scalar_1quote:
+            syck_emit_1quoted( e, force_width, str, len );
+        break;
+
+        case scalar_none:
+        case scalar_2quote:
+            syck_emit_2quoted( e, force_width, str, len );
+        break;
+
+        case scalar_fold:
+            syck_emit_folded( e, force_width, keep_nl, str, len );
+        break;
+
+        case scalar_literal:
+            syck_emit_literal( e, keep_nl, str, len );
+        break;
+
+        case scalar_plain:
+            syck_emitter_write( e, str, len );
+        break;
+    }
+
+    if ( parent->status == syck_lvl_mapx )
+    {
+        syck_emitter_write( e, "\n", 1 );
+    }
+}
+
+void
+syck_emitter_escape( SyckEmitter *e, char *src, long len )
+{
+    int i;
+    for( i = 0; i < len; i++ )
+    {
+        if( (src[i] < 0x20) || (0x7E < src[i]) )
         {
-            /*
-             * Store all markers
-             */
-            n = S_ALLOC( SyckEmitterNode );
-            n->is_shortcut = 0;
-            n->indent = e->level * e->indent;
-            n->pos = e->bufpos + ( e->marker - e->buffer );
-            st_insert( e->markers, (st_data_t)oid, (st_data_t)n );
+            syck_emitter_write( e, "\\", 1 );
+            if( '\0' == src[i] )
+                syck_emitter_write( e, "0", 1 );
+            else
+            {
+                syck_emitter_write( e, "x", 1 );
+                syck_emitter_write( e, (char *)hex_table + ((src[i] & 0xF0) >> 4), 1 );
+                syck_emitter_write( e, (char *)hex_table + (src[i] & 0x0F), 1 );
+            }
         }
         else
         {
-            if ( e->anchors == NULL )
-            {
-                e->anchors = st_init_numtable();
+            syck_emitter_write( e, src + i, 1 );
+            if( '\\' == src[i] )
+                syck_emitter_write( e, "\\", 1 );
+        }
+    }
+}
+
+/*
+ * Outputs a single-quoted block.
+ */
+void syck_emit_1quoted( SyckEmitter *e, int width, char *str, long len )
+{
+    char do_indent = 0;
+    char *mark = str;
+    char *start = str;
+    char *end = str;
+    syck_emitter_write( e, "'", 1 );
+    while ( mark < str + len ) {
+        if ( do_indent ) {
+            syck_emit_indent( e );
+            do_indent = 0;
+        }
+        switch ( *mark ) {
+            case '\'':  syck_emitter_write( e, "'", 1 ); break;
+
+            case '\n':
+                end = mark + 1;
+                if ( *start != ' ' && *start != '\n' && *end != '\n' && *end != ' ' ) {
+                    syck_emitter_write( e, "\n\n", 2 );
+                } else {
+                    syck_emitter_write( e, "\n", 1 );
+                }
+                do_indent = 1;
+                start = mark + 1;
+            break;
+
+            case ' ':
+                if ( width > 0 && *start != ' ' && mark - end > width ) {
+                    do_indent = 1;
+                    end = mark + 1;
+                } else {
+                    syck_emitter_write( e, " ", 1 );
+                }
+            break;
+
+            default:
+                syck_emitter_write( e, mark, 1 );
+            break;
+        }
+        mark++;
+    }
+    syck_emitter_write( e, "'", 1 );
+}
+
+/*
+ * Outputs a double-quoted block.
+ */
+void syck_emit_2quoted( SyckEmitter *e, int width, char *str, long len )
+{
+    char do_indent = 0;
+    char *mark = str;
+    char *start = str;
+    char *end = str;
+    syck_emitter_write( e, "\"", 1 );
+    while ( mark < str + len ) {
+        if ( do_indent > 0 ) {
+            if ( do_indent == 2 ) {
+                syck_emitter_write( e, "\\", 1 );
             }
+            syck_emit_indent( e );
+            do_indent = 0;
+        }
+        switch ( *mark ) {
 
-            if ( ! st_lookup( e->anchors, (st_data_t)oid, (st_data_t *)&anchor_name ) )
-            {
-                int idx = 0;
-                /*
-                 * Second time hitting this object, let's give it an anchor
-                 */
-                idx = e->anchors->num_entries + 1;
+            /* Escape sequences allowed within double quotes. */
+            case '"':  syck_emitter_write( e, "\\\"", 2 ); break;
+            case '\\': syck_emitter_write( e, "\\\\", 2 ); break;
+            case '\0': syck_emitter_write( e, "\\0",  2 ); break;
+            case '\a': syck_emitter_write( e, "\\a",  2 ); break;
+            case '\b': syck_emitter_write( e, "\\b",  2 ); break;
+            case '\f': syck_emitter_write( e, "\\f",  2 ); break;
+            case '\r': syck_emitter_write( e, "\\r",  2 ); break;
+            case '\t': syck_emitter_write( e, "\\t",  2 ); break;
+            case '\v': syck_emitter_write( e, "\\v",  2 ); break;
+            case 0x1b: syck_emitter_write( e, "\\e",  2 ); break;
 
-                /*
-                 * Create the anchor tag
-                 */
-                if ( n->pos >= e->bufpos )
-                {
-                    int alen;
-                    struct adjust_arg *args = S_ALLOC( struct adjust_arg );
-                    char *start = e->buffer + ( n->pos - e->bufpos );
+            case '\n':
+                end = mark + 1;
+                syck_emitter_write( e, "\\n", 2 );
+                do_indent = 2;
+                start = mark + 1;
+                if ( start < str + len && ( *start == ' ' || *start == '\n' ) ) {
+                    do_indent = 0;
+                }
+            break;
 
-                    char *anc = ( e->anchor_format == NULL ? DEFAULT_ANCHOR_FORMAT : e->anchor_format );
-                    anchor_name = S_ALLOC_N( char, strlen( anc ) + 10 );
-                    S_MEMZERO( anchor_name, char, strlen( anc ) + 10 );
-                    sprintf( anchor_name, anc, idx );
+            case ' ':
+                if ( width > 0 && *start != ' ' && mark - end > width ) {
+                    do_indent = 1;
+                    end = mark + 1;
+                } else {
+                    syck_emitter_write( e, " ", 1 );
+                }
+            break;
 
-                    /*
-                     * Need to flush the buffer some, if there is not room for the anchor.
-                     */
-                    alen = strlen( anchor_name ) + 2;
-                    syck_emitter_flush( e, alen );
+            default:
+                syck_emitter_escape( e, mark, 1 );
+            break;
+        }
+        mark++;
+    }
+    syck_emitter_write( e, "\"", 1 );
+}
 
-                    /*
-                     * Write the anchor into the buffer
-                     */
-                    S_MEMMOVE( start + alen, start, char, e->marker - start );
-                    S_MEMCPY( start + 1, anchor_name, char, strlen( anchor_name ) );
-                    start[0] = '&';
-                    start[alen - 1] = ' ';
-                    e->marker += alen;
+/*
+ * Outputs a literal block.
+ */
+void syck_emit_literal( SyckEmitter *e, char keep_nl, char *str, long len )
+{
+    char *mark = str;
+    char *start = str;
+    char *end = str;
+    syck_emitter_write( e, "|", 1 );
+    if ( keep_nl == NL_CHOMP ) {
+        syck_emitter_write( e, "-", 1 );
+    } else if ( keep_nl == NL_KEEP ) {
+        syck_emitter_write( e, "+", 1 );
+    }
+    syck_emit_indent( e );
+    while ( mark < str + len ) {
+        if ( *mark == '\n' ) {
+            end = mark;
+            if ( *start != ' ' && *start != '\n' && *end != '\n' && *end != ' ' ) end += 1;
+            syck_emitter_write( e, start, end - start );
+            if ( mark + 1 == str + len ) {
+                if ( keep_nl != NL_KEEP ) syck_emitter_write( e, "\n", 1 );
+            } else {
+                syck_emit_indent( e );
+            }
+            start = mark + 1;
+        }
+        mark++;
+    }
+    end = str + len;
+    if ( start < end ) {
+        syck_emitter_write( e, start, end - start );
+    }
+}
 
-                    /*
-                     * Cycle through anchors, modify for the size of the anchor.
-                     */
-                    args->startpos = n->pos;
-                    args->offset = alen;
-                    st_foreach( e->markers, syck_adjust_anchors, (st_data_t)args );
-                    S_FREE( args );
+/*
+ * Outputs a folded block.
+ */
+void syck_emit_folded( SyckEmitter *e, int width, char keep_nl, char *str, long len )
+{
+    char *mark = str;
+    char *start = str;
+    char *end = str;
+    syck_emitter_write( e, ">", 1 );
+    if ( keep_nl == NL_CHOMP ) {
+        syck_emitter_write( e, "-", 1 );
+    } else if ( keep_nl == NL_KEEP ) {
+        syck_emitter_write( e, "+", 1 );
+    }
+    syck_emit_indent( e );
+    if ( width <= 0 ) width = e->best_width;
+    while ( mark < str + len ) {
+        switch ( *mark ) {
+            case '\n':
+                syck_emitter_write( e, end, mark - end );
+                end = mark + 1;
+                if ( *start != ' ' && *start != '\n' && *end != '\n' && *end != ' ' ) {
+                    syck_emitter_write( e, "\n", 1 );
+                }
+                if ( mark + 1 == str + len ) {
+                    if ( keep_nl != NL_KEEP ) syck_emitter_write( e, "\n", 1 );
+                } else {
+                    syck_emit_indent( e );
+                }
+                start = mark + 1;
+            break;
 
-                    /*
-                     * Insert into anchors table
-                     */
-                    st_insert( e->anchors, (st_data_t)oid, (st_data_t)anchor_name );
+            case ' ':
+                if ( *start != ' ' ) {
+                    if ( mark - end > width ) {
+                        syck_emitter_write( e, end, mark - end );
+                        syck_emit_indent( e );
+                        end = mark + 1;
+                    }
                 }
+            break;
+        }
+        mark++;
+    }
+    if ( end < mark ) {
+        syck_emitter_write( e, end, mark - end );
+    }
+}
+
+/*
+ * Begins emission of a sequence.
+ */
+void syck_emit_seq( SyckEmitter *e, char *tag, enum seq_style style )
+{
+    SyckLevel *parent = syck_emitter_parent_level( e );
+    SyckLevel *lvl = syck_emitter_current_level( e );
+    syck_emit_tag( e, tag, "tag:yaml.org,2002:seq" );
+    if ( style == seq_inline || ( parent->status == syck_lvl_imap || parent->status == syck_lvl_iseq ) ) {
+        syck_emitter_write( e, "[", 1 );
+        lvl->status = syck_lvl_iseq;
+    } else {
+        /* complex key */
+        if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 ) {
+            syck_emitter_write( e, "? ", 2 );
+            parent->status = syck_lvl_mapx;
+        }
+        lvl->status = syck_lvl_seq;
+    }
+}
+
+/*
+ * Begins emission of a mapping.
+ */
+void syck_emit_map( SyckEmitter *e, char *tag, enum map_style style )
+{
+    SyckLevel *parent = syck_emitter_parent_level( e );
+    SyckLevel *lvl = syck_emitter_current_level( e );
+    syck_emit_tag( e, tag, "tag:yaml.org,2002:map" );
+    if ( style == map_inline || ( parent->status == syck_lvl_imap || parent->status == syck_lvl_iseq ) ) {
+        syck_emitter_write( e, "{", 1 );
+        lvl->status = syck_lvl_imap;
+    } else {
+        /* complex key */
+        if ( parent->status == syck_lvl_map && parent->ncount % 2 == 1 ) {
+            syck_emitter_write( e, "? ", 2 );
+            parent->status = syck_lvl_mapx;
+        }
+        lvl->status = syck_lvl_map;
+    }
+}
+
+/*
+ * Handles emitting of a collection item (for both
+ * sequences and maps)
+ */
+void syck_emit_item( SyckEmitter *e, st_data_t n )
+{
+    SyckLevel *lvl = syck_emitter_current_level( e );
+    switch ( lvl->status )
+    {
+        case syck_lvl_seq:
+        {
+            SyckLevel *parent = syck_emitter_parent_level( e );
+
+            /* seq-in-map shortcut -- the lvl->anctag check should be unneccesary but
+             * there is a nasty shift/reduce in the parser on this point and
+             * i'm not ready to tickle it. */
+            if ( lvl->anctag == 0 && parent->status == syck_lvl_map && lvl->ncount == 0 ) {
+                lvl->spaces = parent->spaces;
             }
 
+            /* seq-in-seq shortcut */
+            else if ( lvl->anctag == 0 && parent->status == syck_lvl_seq && lvl->ncount == 0 ) {
+                int spcs = ( lvl->spaces - parent->spaces ) - 2;
+                if ( spcs >= 0 ) {
+                    int i = 0;
+                    for ( i = 0; i < spcs; i++ ) {
+                        syck_emitter_write( e, " ", 1 );
+                    }
+                    syck_emitter_write( e, "- ", 2 );
+                    break;
+                }
+            }
+
+            syck_emit_indent( e );
+            syck_emitter_write( e, "- ", 2 );
         }
+        break;
+
+        case syck_lvl_iseq:
+        {
+            if ( lvl->ncount > 0 ) {
+                syck_emitter_write( e, ", ", 2 );
+            }
+        }
+        break;
+
+        case syck_lvl_map:
+        {
+            SyckLevel *parent = syck_emitter_parent_level( e );
+
+            /* map-in-seq shortcut */
+            if ( lvl->anctag == 0 && parent->status == syck_lvl_seq && lvl->ncount == 0 ) {
+                int spcs = ( lvl->spaces - parent->spaces ) - 2;
+                if ( spcs >= 0 ) {
+                    int i = 0;
+                    for ( i = 0; i < spcs; i++ ) {
+                        syck_emitter_write( e, " ", 1 );
+                    }
+                    break;
+                }
+            }
+
+            if ( lvl->ncount % 2 == 0 ) {
+                syck_emit_indent( e );
+            } else {
+                syck_emitter_write( e, ": ", 2 );
+            }
+        }
+        break;
+
+        case syck_lvl_mapx:
+        {
+            if ( lvl->ncount % 2 == 0 ) {
+                syck_emit_indent( e );
+                lvl->status = syck_lvl_map;
+            } else {
+                int i;
+                if ( lvl->spaces > 0 ) {
+                    char *spcs = S_ALLOC_N( char, lvl->spaces + 1 );
+
+                    spcs[lvl->spaces] = '\0';
+                    for ( i = 0; i < lvl->spaces; i++ ) spcs[i] = ' ';
+                    syck_emitter_write( e, spcs, lvl->spaces );
+                    S_FREE( spcs );
+                }
+                syck_emitter_write( e, ": ", 2 );
+            }
+        }
+        break;
+
+        case syck_lvl_imap:
+        {
+            if ( lvl->ncount > 0 ) {
+                if ( lvl->ncount % 2 == 0 ) {
+                    syck_emitter_write( e, ", ", 2 );
+                } else {
+                    syck_emitter_write( e, ": ", 2 );
+                }
+            }
+        }
+        break;
+
+        default: break;
     }
+    lvl->ncount++;
 
-    return anchor_name;
+    syck_emit( e, n );
 }
 
 /*
- * call on completion of an object's marshalling
+ * Closes emission of a collection.
  */
-void
-syck_emitter_end_obj( SyckEmitter *e )
+void syck_emit_end( SyckEmitter *e )
 {
-    e->level--;
+    SyckLevel *lvl = syck_emitter_current_level( e );
+    SyckLevel *parent = syck_emitter_parent_level( e );
+    switch ( lvl->status )
+    {
+        case syck_lvl_seq:
+            if ( lvl->ncount == 0 ) {
+                syck_emitter_write( e, "[]\n", 3 );
+            } else if ( parent->status == syck_lvl_mapx ) {
+                syck_emitter_write( e, "\n", 1 );
+            }
+        break;
+
+        case syck_lvl_iseq:
+            syck_emitter_write( e, "]\n", 1 );
+        break;
+
+        case syck_lvl_map:
+            if ( lvl->ncount == 0 ) {
+                syck_emitter_write( e, "{}\n", 3 );
+            } else if ( lvl->ncount % 2 == 1 ) {
+                syck_emitter_write( e, ":\n", 1 );
+            } else if ( parent->status == syck_lvl_mapx ) {
+                syck_emitter_write( e, "\n", 1 );
+            }
+        break;
+
+        case syck_lvl_imap:
+            syck_emitter_write( e, "}\n", 1 );
+        break;
+
+        default: break;
+    }
 }
 
+/*
+ * Fill markers table with emitter nodes in the
+ * soon-to-be-emitted tree.
+ */
+SYMID
+syck_emitter_mark_node( SyckEmitter *e, st_data_t n )
+{
+    SYMID oid = 0;
+    char *anchor_name = NULL;
+
+    /*
+     * Ensure markers table is initialized.
+     */
+    if ( e->markers == NULL )
+    {
+        e->markers = st_init_numtable();
+    }
+
+    /*
+     * Markers table initially marks the string position of the
+     * object.  Doesn't yet create an anchor, simply notes the
+     * position.
+     */
+    if ( ! st_lookup( e->markers, n, (st_data_t *)&oid ) )
+    {
+        /*
+         * Store all markers
+         */
+        oid = e->markers->num_entries + 1;
+        st_insert( e->markers, n, (st_data_t)oid );
+    }
+    else
+    {
+        if ( e->anchors == NULL )
+        {
+            e->anchors = st_init_numtable();
+        }
+
+        if ( ! st_lookup( e->anchors, (st_data_t)oid, (st_data_t *)&anchor_name ) )
+        {
+            int idx = 0;
+            char *anc = ( e->anchor_format == NULL ? DEFAULT_ANCHOR_FORMAT : e->anchor_format );
+
+            /*
+             * Second time hitting this object, let's give it an anchor
+             */
+            idx = e->anchors->num_entries + 1;
+            anchor_name = S_ALLOC_N( char, strlen( anc ) + 10 );
+            S_MEMZERO( anchor_name, char, strlen( anc ) + 10 );
+            sprintf( anchor_name, anc, idx );
+
+            /*
+             * Insert into anchors table
+             */
+            st_insert( e->anchors, (st_data_t)oid, (st_data_t)anchor_name );
+        }
+    }
+    return oid;
+}
+

Modified: trunk/ext/syck/gram.c
===================================================================
--- trunk/ext/syck/gram.c	2006-02-20 06:15:42 UTC (rev 449)
+++ trunk/ext/syck/gram.c	2006-02-20 06:16:38 UTC (rev 450)
@@ -1,7 +1,7 @@
-/* A Bison parser, made from gram.y, by GNU bison 1.75.  */
+/* A Bison parser, made by GNU Bison 1.875d.  */
 
 /* Skeleton parser for Yacc-like parsing with Bison,
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -34,10 +34,13 @@
    USER NAME SPACE" below.  */
 
 /* Identify Bison output.  */
-#define YYBISON	1
+#define YYBISON 1
 
+/* Skeleton name.  */
+#define YYSKELETON_NAME "yacc.c"
+
 /* Pure parsers.  */
-#define YYPURE	1
+#define YYPURE 1
 
 /* Using locations.  */
 #define YYLSP_NEEDED 0
@@ -95,6 +98,8 @@
 
 #include "syck.h"
 
+void apply_seq_in_map( SyckParser *parser, SyckNode *n );
+
 #define YYPARSE_PARAM   parser
 #define YYLEX_PARAM     parser
 
@@ -123,51 +128,49 @@
 # define YYERROR_VERBOSE 0
 #endif
 
-#ifndef YYSTYPE
-#line 33 "gram.y"
-typedef union {
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 35 "gram.y"
+typedef union YYSTYPE {
     SYMID nodeId;
     SyckNode *nodeData;
     char *name;
-} yystype;
-/* Line 193 of /usr/local/share/bison/yacc.c.  */
-#line 135 "y.tab.c"
-# define YYSTYPE yystype
+} YYSTYPE;
+/* Line 191 of yacc.c.  */
+#line 140 "gram.c"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
 # define YYSTYPE_IS_TRIVIAL 1
 #endif
 
-#ifndef YYLTYPE
-typedef struct yyltype
-{
-  int first_line;
-  int first_column;
-  int last_line;
-  int last_column;
-} yyltype;
-# define YYLTYPE yyltype
-# define YYLTYPE_IS_TRIVIAL 1
-#endif
 
+
 /* Copy the second part of user declarations.  */
 
 
-/* Line 213 of /usr/local/share/bison/yacc.c.  */
-#line 156 "y.tab.c"
+/* Line 214 of yacc.c.  */
+#line 152 "gram.c"
 
 #if ! defined (yyoverflow) || YYERROR_VERBOSE
 
+# ifndef YYFREE
+#  define YYFREE free
+# endif
+# ifndef YYMALLOC
+#  define YYMALLOC malloc
+# endif
+
 /* The parser invokes alloca or malloc; define the necessary symbols.  */
 
-# if YYSTACK_USE_ALLOCA
-#  define YYSTACK_ALLOC alloca
+# ifdef YYSTACK_USE_ALLOCA
+#  if YYSTACK_USE_ALLOCA
+#   define YYSTACK_ALLOC alloca
+#  endif
 # else
-#  ifndef YYSTACK_USE_ALLOCA
-#   if defined (alloca) || defined (_ALLOCA_H)
-#    define YYSTACK_ALLOC alloca
-#   else
-#    ifdef __GNUC__
-#     define YYSTACK_ALLOC __builtin_alloca
-#    endif
+#  if defined (alloca) || defined (_ALLOCA_H)
+#   define YYSTACK_ALLOC alloca
+#  else
+#   ifdef __GNUC__
+#    define YYSTACK_ALLOC __builtin_alloca
 #   endif
 #  endif
 # endif
@@ -180,36 +183,36 @@
 #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
 #   define YYSIZE_T size_t
 #  endif
-#  define YYSTACK_ALLOC malloc
-#  define YYSTACK_FREE free
+#  define YYSTACK_ALLOC YYMALLOC
+#  define YYSTACK_FREE YYFREE
 # endif
 #endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */
 
 
 #if (! defined (yyoverflow) \
      && (! defined (__cplusplus) \
-	 || (YYLTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
+	 || (defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL)))
 
 /* A type that is properly aligned for any stack member.  */
 union yyalloc
 {
-  short yyss;
+  short int yyss;
   YYSTYPE yyvs;
   };
 
 /* The size of the maximum gap between one aligned stack and the next.  */
-# define YYSTACK_GAP_MAX (sizeof (union yyalloc) - 1)
+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
 
 /* The size of an array large to enough to hold all stacks, each with
    N elements.  */
 # define YYSTACK_BYTES(N) \
-     ((N) * (sizeof (short) + sizeof (YYSTYPE))				\
-      + YYSTACK_GAP_MAX)
+     ((N) * (sizeof (short int) + sizeof (YYSTYPE))			\
+      + YYSTACK_GAP_MAXIMUM)
 
 /* Copy COUNT objects from FROM to TO.  The source and destination do
    not overlap.  */
 # ifndef YYCOPY
-#  if 1 < __GNUC__
+#  if defined (__GNUC__) && 1 < __GNUC__
 #   define YYCOPY(To, From, Count) \
       __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
 #  else
@@ -218,7 +221,7 @@
 	{					\
 	  register YYSIZE_T yyi;		\
 	  for (yyi = 0; yyi < (Count); yyi++)	\
-	    (To)[yyi] = (From)[yyi];	\
+	    (To)[yyi] = (From)[yyi];		\
 	}					\
       while (0)
 #  endif
@@ -235,7 +238,7 @@
 	YYSIZE_T yynewbytes;						\
 	YYCOPY (&yyptr->Stack, Stack, yysize);				\
 	Stack = &yyptr->Stack;						\
-	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAX;	\
+	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
 	yyptr += yynewbytes / sizeof (*yyptr);				\
       }									\
     while (0)
@@ -245,19 +248,20 @@
 #if defined (__STDC__) || defined (__cplusplus)
    typedef signed char yysigned_char;
 #else
-   typedef short yysigned_char;
+   typedef short int yysigned_char;
 #endif
 
 /* YYFINAL -- State number of the termination state. */
-#define YYFINAL  38
-#define YYLAST   422
+#define YYFINAL  52
+/* YYLAST -- Last index in YYTABLE.  */
+#define YYLAST   396
 
 /* YYNTOKENS -- Number of terminals. */
 #define YYNTOKENS  23
 /* YYNNTS -- Number of nonterminals. */
-#define YYNNTS  28
+#define YYNNTS  29
 /* YYNRULES -- Number of rules. */
-#define YYNRULES  75
+#define YYNRULES  79
 /* YYNRULES -- Number of states. */
 #define YYNSTATES  128
 
@@ -265,8 +269,8 @@
 #define YYUNDEFTOK  2
 #define YYMAXUTOK   269
 
-#define YYTRANSLATE(X) \
-  ((unsigned)(X) <= YYMAXUTOK ? yytranslate[X] : YYUNDEFTOK)
+#define YYTRANSLATE(YYX) 						\
+  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
 
 /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
 static const unsigned char yytranslate[] =
@@ -305,54 +309,55 @@
    YYRHS.  */
 static const unsigned char yyprhs[] =
 {
-       0,     0,     3,     5,     8,     9,    11,    13,    15,    19,
-      21,    24,    27,    30,    34,    36,    39,    40,    42,    45,
-      47,    49,    51,    54,    57,    60,    63,    66,    68,    70,
-      72,    76,    78,    80,    82,    84,    86,    90,    93,    95,
-      99,   102,   106,   109,   113,   116,   118,   122,   125,   129,
-     132,   134,   138,   140,   142,   146,   150,   154,   157,   161,
-     164,   168,   171,   175,   177,   183,   185,   189,   193,   196,
-     200,   204,   207,   209,   213,   215
+       0,     0,     3,     5,     8,     9,    11,    13,    15,    18,
+      21,    24,    28,    30,    32,    36,    37,    40,    43,    46,
+      49,    51,    54,    56,    58,    60,    63,    66,    69,    72,
+      75,    77,    79,    81,    85,    87,    89,    91,    93,    95,
+      99,   103,   106,   110,   113,   117,   120,   124,   127,   129,
+     133,   136,   140,   143,   145,   149,   151,   153,   157,   161,
+     165,   168,   172,   175,   179,   182,   184,   188,   190,   194,
+     196,   200,   204,   207,   211,   215,   218,   220,   224,   226
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS. */
 static const yysigned_char yyrhs[] =
 {
-      24,     0,    -1,    26,    -1,    11,    28,    -1,    -1,    33,
-      -1,    27,    -1,    34,    -1,    29,    26,    32,    -1,    34,
-      -1,     5,    27,    -1,     6,    27,    -1,     3,    27,    -1,
-      29,    27,    32,    -1,    25,    -1,    29,    30,    -1,    -1,
-      12,    -1,    29,    13,    -1,    14,    -1,    13,    -1,    14,
-      -1,    31,    32,    -1,     5,    33,    -1,     6,    33,    -1,
-       7,    33,    -1,     3,    33,    -1,     4,    -1,     8,    -1,
-       9,    -1,    29,    33,    32,    -1,    10,    -1,    35,    -1,
-      39,    -1,    42,    -1,    48,    -1,    29,    37,    30,    -1,
-      15,    28,    -1,    38,    -1,     5,    31,    37,    -1,     5,
-      37,    -1,     6,    31,    37,    -1,     6,    37,    -1,     3,
-      31,    37,    -1,     3,    37,    -1,    36,    -1,    38,    31,
-      36,    -1,    38,    31,    -1,    17,    40,    18,    -1,    17,
-      18,    -1,    41,    -1,    40,    21,    41,    -1,    25,    -1,
-      47,    -1,    29,    43,    30,    -1,    29,    46,    30,    -1,
-       5,    31,    46,    -1,     5,    43,    -1,     6,    31,    46,
-      -1,     6,    43,    -1,     3,    31,    46,    -1,     3,    43,
-      -1,    33,    16,    28,    -1,    44,    -1,    22,    25,    31,
-      16,    28,    -1,    45,    -1,    46,    31,    36,    -1,    46,
-      31,    45,    -1,    46,    31,    -1,    25,    16,    28,    -1,
-      19,    49,    20,    -1,    19,    20,    -1,    50,    -1,    49,
-      21,    50,    -1,    25,    -1,    47,    -1
+      24,     0,    -1,    25,    -1,    11,    27,    -1,    -1,    33,
+      -1,    26,    -1,    34,    -1,     5,    26,    -1,     6,    26,
+      -1,     3,    26,    -1,    29,    26,    32,    -1,    25,    -1,
+      28,    -1,    29,    28,    30,    -1,    -1,     7,    28,    -1,
+       5,    28,    -1,     6,    28,    -1,     3,    28,    -1,    12,
+      -1,    29,    13,    -1,    14,    -1,    13,    -1,    14,    -1,
+      31,    32,    -1,     5,    33,    -1,     6,    33,    -1,     7,
+      33,    -1,     3,    33,    -1,     4,    -1,     8,    -1,     9,
+      -1,    29,    33,    32,    -1,    10,    -1,    35,    -1,    39,
+      -1,    42,    -1,    49,    -1,    29,    37,    30,    -1,    29,
+      38,    30,    -1,    15,    27,    -1,     5,    31,    38,    -1,
+       5,    37,    -1,     6,    31,    38,    -1,     6,    37,    -1,
+       3,    31,    38,    -1,     3,    37,    -1,    36,    -1,    38,
+      31,    36,    -1,    38,    31,    -1,    17,    40,    18,    -1,
+      17,    18,    -1,    41,    -1,    40,    21,    41,    -1,    25,
+      -1,    48,    -1,    29,    43,    30,    -1,    29,    47,    30,
+      -1,     5,    31,    47,    -1,     5,    43,    -1,     6,    31,
+      47,    -1,     6,    43,    -1,     3,    31,    47,    -1,     3,
+      43,    -1,    33,    -1,    22,    25,    31,    -1,    27,    -1,
+      44,    16,    45,    -1,    46,    -1,    47,    31,    36,    -1,
+      47,    31,    46,    -1,    47,    31,    -1,    25,    16,    27,
+      -1,    19,    50,    20,    -1,    19,    20,    -1,    51,    -1,
+      50,    21,    51,    -1,    25,    -1,    48,    -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
-static const unsigned short yyrline[] =
+static const unsigned short int yyrline[] =
 {
-       0,    54,    54,    58,    62,    68,    69,    72,    73,    79,
-      80,    85,    90,    99,   105,   106,   111,   121,   122,   125,
-     128,   131,   132,   140,   145,   150,   158,   162,   170,   183,
-     184,   194,   195,   196,   197,   198,   204,   210,   216,   217,
-     222,   227,   232,   237,   241,   247,   251,   256,   265,   269,
-     275,   279,   286,   287,   293,   298,   305,   310,   315,   320,
-     325,   329,   335,   350,   351,   368,   369,   381,   389,   398,
-     406,   410,   416,   417,   426,   433
+       0,    56,    56,    60,    65,    70,    71,    74,    75,    80,
+      85,    94,   100,   101,   104,   109,   113,   121,   126,   131,
+     145,   146,   149,   152,   155,   156,   164,   169,   174,   182,
+     186,   194,   207,   208,   218,   219,   220,   221,   222,   228,
+     232,   238,   244,   249,   254,   259,   264,   268,   274,   278,
+     283,   292,   296,   302,   306,   313,   314,   320,   325,   332,
+     337,   342,   347,   352,   356,   362,   363,   369,   379,   396,
+     397,   409,   417,   426,   434,   438,   444,   445,   454,   461
 };
 #endif
 
@@ -361,24 +366,24 @@
    First, the terminals, then, starting at YYNTOKENS, nonterminals. */
 static const char *const yytname[] =
 {
-  "$end", "error", "$undefined", "YAML_ANCHOR", "YAML_ALIAS", 
-  "YAML_TRANSFER", "YAML_TAGURI", "YAML_ITRANSFER", "YAML_WORD", 
-  "YAML_PLAIN", "YAML_BLOCK", "YAML_DOCSEP", "YAML_IOPEN", "YAML_INDENT", 
-  "YAML_IEND", "'-'", "':'", "'['", "']'", "'{'", "'}'", "','", "'?'", 
-  "$accept", "doc", "atom", "doc_struct_rep", "ind_rep", "atom_or_empty", 
-  "indent_open", "indent_end", "indent_sep", "indent_flex_end", 
-  "word_rep", "struct_rep", "implicit_seq", "basic_seq", "top_imp_seq", 
-  "in_implicit_seq", "inline_seq", "in_inline_seq", "inline_seq_atom", 
-  "implicit_map", "top_imp_map", "basic_mapping", "complex_mapping", 
-  "in_implicit_map", "basic_mapping2", "inline_map", "in_inline_map", 
-  "inline_map_atom", 0
+  "$end", "error", "$undefined", "YAML_ANCHOR", "YAML_ALIAS",
+  "YAML_TRANSFER", "YAML_TAGURI", "YAML_ITRANSFER", "YAML_WORD",
+  "YAML_PLAIN", "YAML_BLOCK", "YAML_DOCSEP", "YAML_IOPEN", "YAML_INDENT",
+  "YAML_IEND", "'-'", "':'", "'['", "']'", "'{'", "'}'", "','", "'?'",
+  "$accept", "doc", "atom", "ind_rep", "atom_or_empty", "empty",
+  "indent_open", "indent_end", "indent_sep", "indent_flex_end", "word_rep",
+  "struct_rep", "implicit_seq", "basic_seq", "top_imp_seq",
+  "in_implicit_seq", "inline_seq", "in_inline_seq", "inline_seq_atom",
+  "implicit_map", "top_imp_map", "complex_key", "complex_value",
+  "complex_mapping", "in_implicit_map", "basic_mapping", "inline_map",
+  "in_inline_map", "inline_map_atom", 0
 };
 #endif
 
 # ifdef YYPRINT
 /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
    token YYLEX-NUM.  */
-static const unsigned short yytoknum[] =
+static const unsigned short int yytoknum[] =
 {
        0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
      265,   266,   267,   268,   269,    45,    58,    91,    93,   123,
@@ -389,27 +394,27 @@
 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
 static const unsigned char yyr1[] =
 {
-       0,    23,    24,    24,    24,    25,    25,    26,    26,    27,
-      27,    27,    27,    27,    28,    28,    28,    29,    29,    30,
-      31,    32,    32,    33,    33,    33,    33,    33,    33,    33,
-      33,    34,    34,    34,    34,    34,    35,    36,    37,    37,
-      37,    37,    37,    37,    37,    38,    38,    38,    39,    39,
-      40,    40,    41,    41,    42,    42,    43,    43,    43,    43,
-      43,    43,    44,    45,    45,    46,    46,    46,    46,    47,
-      48,    48,    49,    49,    50,    50
+       0,    23,    24,    24,    24,    25,    25,    26,    26,    26,
+      26,    26,    27,    27,    28,    28,    28,    28,    28,    28,
+      29,    29,    30,    31,    32,    32,    33,    33,    33,    33,
+      33,    33,    33,    33,    34,    34,    34,    34,    34,    35,
+      35,    36,    37,    37,    37,    37,    37,    37,    38,    38,
+      38,    39,    39,    40,    40,    41,    41,    42,    42,    43,
+      43,    43,    43,    43,    43,    44,    44,    45,    46,    47,
+      47,    47,    47,    48,    49,    49,    50,    50,    51,    51
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
 static const unsigned char yyr2[] =
 {
-       0,     2,     1,     2,     0,     1,     1,     1,     3,     1,
-       2,     2,     2,     3,     1,     2,     0,     1,     2,     1,
-       1,     1,     2,     2,     2,     2,     2,     1,     1,     1,
-       3,     1,     1,     1,     1,     1,     3,     2,     1,     3,
-       2,     3,     2,     3,     2,     1,     3,     2,     3,     2,
-       1,     3,     1,     1,     3,     3,     3,     2,     3,     2,
-       3,     2,     3,     1,     5,     1,     3,     3,     2,     3,
-       3,     2,     1,     3,     1,     1
+       0,     2,     1,     2,     0,     1,     1,     1,     2,     2,
+       2,     3,     1,     1,     3,     0,     2,     2,     2,     2,
+       1,     2,     1,     1,     1,     2,     2,     2,     2,     2,
+       1,     1,     1,     3,     1,     1,     1,     1,     1,     3,
+       3,     2,     3,     2,     3,     2,     3,     2,     1,     3,
+       2,     3,     2,     1,     3,     1,     1,     3,     3,     3,
+       2,     3,     2,     3,     2,     1,     3,     1,     3,     1,
+       3,     3,     2,     3,     3,     2,     1,     3,     1,     1
 };
 
 /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -417,173 +422,167 @@
    means the default is an error.  */
 static const unsigned char yydefact[] =
 {
-       4,    31,    16,    17,     0,     0,     0,     2,     0,     7,
-      32,    33,    34,    35,     0,    27,     0,     0,     0,    28,
-      29,    14,     6,     3,     0,     5,     9,    49,    52,     0,
-       0,    50,    53,    71,    74,    75,     0,    72,     1,     0,
-       0,     0,    18,    16,     0,     0,     0,     0,    45,     0,
-      38,     0,    63,    65,     0,    12,    26,    10,    23,    11,
-      24,     0,     0,     0,     0,    25,     0,     0,     0,    19,
-       0,    15,     0,    16,    48,     0,    70,     0,    20,     0,
-      44,    61,     0,    40,    57,     0,    42,    59,    37,     0,
-      21,     0,     8,    16,    36,    47,    54,    55,    68,     0,
-      13,    30,    69,    51,    73,     0,     0,     0,    43,    60,
-      39,    56,    41,    58,     0,    22,    62,    46,    66,    67,
-       0,     0,     0,    16,     0,     0,     0,    64
+       4,     0,    30,     0,     0,     0,    31,    32,    34,    15,
+      20,     0,     0,     0,     2,     6,     0,     5,     7,    35,
+      36,    37,    38,    10,    29,     8,    26,     9,    27,     0,
+       0,     0,     0,    28,    15,    15,    15,    15,    12,     3,
+      13,    15,    52,    55,     0,    53,    56,    75,    78,    79,
+       0,    76,     1,     0,     0,     0,    21,    15,     0,     0,
+      65,    48,     0,     0,     0,     0,    69,     0,     0,    19,
+      17,    18,    15,    15,    15,    16,    15,    15,    15,    15,
+       0,    15,    51,     0,    74,     0,    23,     0,    47,    64,
+       0,    43,    60,     0,    45,    62,    41,     0,    24,     0,
+      11,    33,    22,    39,    40,    50,    57,    15,    58,    72,
+      14,    73,    54,    77,    65,    46,    63,    42,    59,    44,
+      61,    66,    25,    49,    67,    68,    70,    71
 };
 
 /* YYDEFGOTO[NTERM-NUM]. */
 static const yysigned_char yydefgoto[] =
 {
-      -1,     6,    21,    45,    22,    23,    64,    71,    91,   101,
-      25,    26,    10,    48,    49,    50,    11,    30,    31,    12,
-      51,    52,    53,    54,    32,    13,    36,    37
+      -1,    13,    38,    15,    39,    40,    16,   103,    99,   101,
+      17,    18,    19,    61,    62,    63,    20,    44,    45,    21,
+      64,    65,   125,    66,    67,    46,    22,    50,    51
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -77
-static const short yypact[] =
+#define YYPACT_NINF -97
+static const short int yypact[] =
 {
-     163,   -77,   356,   -77,   339,   304,     7,   -77,   224,   -77,
-     -77,   -77,   -77,   -77,   356,   -77,   356,   356,   410,   -77,
-     -77,   -77,   -77,   -77,   204,   -77,   -77,   -77,   -15,   244,
-      24,   -77,   -77,   -77,   -15,   -77,    30,   -77,   -77,   373,
-     373,   373,   -77,   356,   356,    41,   224,    -3,   -77,    18,
-      21,    18,   -77,   -77,    46,   -77,   -77,   -77,   -77,   -77,
-     -77,   410,   410,   410,   399,   -77,   322,   322,   322,   -77,
-      41,   -77,    14,   356,   -77,   356,   -77,   356,   -77,   264,
-     -77,   -77,   264,   -77,   -77,   264,   -77,   -77,   -77,    21,
-     -77,    41,   -77,   356,   -77,    33,   -77,   -77,   284,    41,
-     -77,   -77,   -77,   -77,   -77,   386,   386,   386,   -77,    21,
-     -77,    21,   -77,    21,    22,   -77,   -77,   -77,   -77,   -77,
-      20,    20,    20,   356,    91,    91,    91,   -77
+     250,   318,   -97,   318,   318,   374,   -97,   -97,   -97,   335,
+     -97,   267,   232,     7,   -97,   -97,   192,   -97,   -97,   -97,
+     -97,   -97,   -97,   -97,   -97,   -97,   -97,   -97,   -97,   374,
+     374,   374,   352,   -97,   335,   335,   335,   384,   -97,   -97,
+     -97,   212,   -97,    10,     0,   -97,   -97,   -97,    10,   -97,
+      -4,   -97,   -97,   284,   284,   284,   -97,   335,   318,    30,
+      30,   -97,    -2,    36,    -2,    16,   -97,    36,    30,   -97,
+     -97,   -97,   384,   384,   384,   -97,   363,   301,   301,   301,
+      -2,   335,   -97,   318,   -97,   318,   -97,   158,   -97,   -97,
+     158,   -97,   -97,   158,   -97,   -97,   -97,    24,   -97,    30,
+     -97,   -97,   -97,   -97,   -97,    26,   -97,   335,   -97,   158,
+     -97,   -97,   -97,   -97,   -97,    24,    24,    24,    24,    24,
+      24,   -97,   -97,   -97,   -97,   -97,   -97,   -97
 };
 
 /* YYPGOTO[NTERM-NUM].  */
-static const short yypgoto[] =
+static const yysigned_char yypgoto[] =
 {
-     -77,   -77,     5,    56,   138,   -40,     0,    25,    59,   -34,
-      23,    12,   -77,   -76,    71,   -77,   -77,   -77,   -14,   -77,
-      75,   -77,   -33,   -64,     1,   -77,   -77,    -7
+     -97,   -97,     8,    81,   -56,   109,    33,   -53,    74,   -54,
+      -1,   -97,   -97,   -96,   -31,   -32,   -97,   -97,   -44,   -97,
+      77,   -97,   -97,   -52,     9,    -6,   -97,   -97,   -29
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If zero, do what YYDEFACT says.
-   If YYTABLE_NINF, parse error.  */
+   If YYTABLE_NINF, syntax error.  */
 #define YYTABLE_NINF -1
 static const unsigned char yytable[] =
 {
-       8,    73,    24,    88,    29,    29,    35,    38,    46,    28,
-      34,    92,     9,    93,    29,   109,    29,    29,   111,   117,
-       9,   113,   118,   124,    29,   125,   126,    78,    90,    29,
-      93,    47,    69,   102,    78,    43,   100,    56,   123,    58,
-      60,    65,    74,    24,    29,    75,    46,    72,    43,    89,
-      76,    77,    72,   116,    78,    90,     7,   115,     9,    78,
-      69,   103,    56,    58,    60,   119,    29,    29,    29,    72,
-     104,     0,     0,    24,    94,    29,    96,    29,    35,    97,
-      28,     0,    34,   127,    56,    58,    60,    99,     0,    56,
-      58,    60,     0,    24,   124,     0,   125,   126,    79,    82,
-      85,     0,    47,     0,    78,    47,    43,     0,    47,    95,
-      80,    83,    86,    98,    81,    84,    87,     0,     0,     0,
-       0,    47,     0,    24,     0,    79,    82,    85,    56,    58,
-      60,     0,     0,     0,     0,     0,     0,    80,    83,    86,
-       0,    81,    84,    87,     0,     0,     0,     0,   114,     0,
-     108,     0,    55,   110,    57,    59,   112,     0,     0,     0,
-       0,     0,    70,     0,   120,   121,   122,    70,    98,     0,
-      98,     0,    98,     1,     2,     3,    80,    83,    86,     0,
-       4,     0,     5,   120,   121,   122,     0,     0,     0,     0,
-       0,   108,   110,   112,     0,    80,    83,    86,     0,     0,
-       0,     0,     0,     0,    55,    57,    59,    66,    15,    67,
-      68,    18,    19,    20,     1,     0,     3,    42,    69,    43,
-       0,     4,     0,     5,     0,     0,    44,    39,    15,    40,
-      41,    18,    19,    20,     1,     0,     3,    42,     0,    43,
-       0,     4,     0,     5,     0,     0,    44,    66,    15,    67,
-      68,    18,    19,    20,     1,     0,     3,    42,     0,    43,
-       0,     4,     0,     5,     0,     0,    44,   105,    15,   106,
-     107,    18,    19,    20,     0,     0,     3,     0,     0,    43,
-       0,     0,     0,     0,     0,     0,    44,    61,    15,    62,
-      63,    18,    19,    20,     0,     0,     3,     0,     0,    43,
-       0,     0,     0,     0,     0,     0,    44,    14,    15,    16,
-      17,    18,    19,    20,     1,     0,     3,     0,     0,     0,
-       0,     4,     0,     5,    33,    66,    15,    67,    68,    18,
-      19,    20,     1,     0,     3,    78,     0,    43,     0,     4,
-       0,     5,    14,    15,    16,    17,    18,    19,    20,     1,
-       0,     3,     0,     0,     0,     0,     4,    27,     5,    14,
-      15,    16,    17,    18,    19,    20,     1,     0,     3,     0,
-       0,     0,     0,     4,     0,     5,    39,    15,    40,    41,
-      18,    19,    20,     0,     0,     3,    78,     0,    43,   105,
-      15,   106,   107,    18,    19,    20,     0,     0,     3,    78,
-       0,    43,    61,    15,    62,    63,    18,    19,    20,     0,
-       0,     3,    42,    61,    15,    62,    63,    18,    19,    20,
-       0,     0,     3
+      24,    96,    26,    28,    33,   100,    49,    52,    14,   123,
+     104,   106,   102,   126,   108,    60,    84,    85,    82,    43,
+      48,    83,    88,    91,    94,   111,    81,   110,    24,    26,
+      28,    68,   107,    24,    26,    28,    33,    86,    32,   112,
+      60,    57,    41,    86,    98,   122,    88,    91,    94,    86,
+     102,   124,    24,    26,    28,   115,   113,   127,   117,     0,
+       0,   119,    32,    32,    32,    32,    97,    41,    41,    41,
+      76,    24,    26,    28,    41,    68,    24,    26,    28,    49,
+       0,     0,    23,     0,    25,    27,   114,     0,     0,   114,
+      41,    43,   114,    48,     0,     0,   116,    59,     0,   118,
+       0,     0,   120,     0,     0,    76,    76,    76,   114,    76,
+      41,    41,    41,     0,    41,    23,    25,    27,     0,     0,
+      32,     0,    59,    32,     0,     0,    32,    87,    90,    93,
+      89,    92,    95,     0,    23,    25,    27,   105,     0,     0,
+      41,   109,    32,    69,    70,    71,    75,     0,     0,     0,
+      80,    87,    90,    93,    89,    92,    95,     0,    23,    25,
+      27,    29,     2,    30,    31,     5,     6,     7,     0,     0,
+      10,   121,     0,    57,     0,     0,     0,     0,     0,     0,
+      58,    69,    70,    71,     0,    80,    69,    70,    71,   105,
+     109,   105,   109,   105,   109,    53,     2,    54,    55,     5,
+       6,     7,     8,     0,    10,    56,     0,    57,     0,    11,
+       0,    12,     0,     0,    58,    77,     2,    78,    79,    37,
+       6,     7,     8,     0,    10,    56,     0,    57,     0,    11,
+       0,    12,     0,     0,    58,     1,     2,     3,     4,     5,
+       6,     7,     8,     0,    10,     0,     0,     0,     0,    11,
+       0,    12,    47,     1,     2,     3,     4,     5,     6,     7,
+       8,     9,    10,     0,     0,     0,     0,    11,     0,    12,
+       1,     2,     3,     4,     5,     6,     7,     8,     0,    10,
+       0,     0,     0,     0,    11,    42,    12,    53,     2,    54,
+      55,     5,     6,     7,     8,     0,    10,    86,     0,     0,
+       0,    11,     0,    12,    77,     2,    78,    79,    37,     6,
+       7,     8,     0,    10,    86,     0,     0,     0,    11,     0,
+      12,     1,     2,     3,     4,     5,     6,     7,     8,     0,
+      10,     0,     0,     0,     0,    11,     0,    12,    34,     2,
+      35,    36,    37,     6,     7,     8,     0,    10,     0,     0,
+       0,     0,    11,     0,    12,    29,     2,    30,    31,     5,
+       6,     7,     0,     0,    10,    56,    72,     2,    73,    74,
+      37,     6,     7,     0,     0,    10,    56,    29,     2,    30,
+      31,     5,     6,     7,     0,     0,    10,    72,     2,    73,
+      74,    37,     6,     7,     0,     0,    10
 };
 
 static const yysigned_char yycheck[] =
 {
-       0,    16,     2,    43,     4,     5,     5,     0,     8,     4,
-       5,    45,     0,    16,    14,    79,    16,    17,    82,    95,
-       8,    85,    98,     3,    24,     5,     6,    13,    14,    29,
-      16,     8,    14,    73,    13,    15,    70,    14,    16,    16,
-      17,    18,    18,    43,    44,    21,    46,    24,    15,    44,
-      20,    21,    29,    93,    13,    14,     0,    91,    46,    13,
-      14,    75,    39,    40,    41,    98,    66,    67,    68,    46,
-      77,    -1,    -1,    73,    49,    75,    51,    77,    77,    54,
-      75,    -1,    77,   123,    61,    62,    63,    64,    -1,    66,
-      67,    68,    -1,    93,     3,    -1,     5,     6,    39,    40,
-      41,    -1,    79,    -1,    13,    82,    15,    -1,    85,    50,
-      39,    40,    41,    54,    39,    40,    41,    -1,    -1,    -1,
-      -1,    98,    -1,   123,    -1,    66,    67,    68,   105,   106,
-     107,    -1,    -1,    -1,    -1,    -1,    -1,    66,    67,    68,
-      -1,    66,    67,    68,    -1,    -1,    -1,    -1,    89,    -1,
-      79,    -1,    14,    82,    16,    17,    85,    -1,    -1,    -1,
-      -1,    -1,    24,    -1,   105,   106,   107,    29,   109,    -1,
-     111,    -1,   113,    10,    11,    12,   105,   106,   107,    -1,
-      17,    -1,    19,   124,   125,   126,    -1,    -1,    -1,    -1,
-      -1,   120,   121,   122,    -1,   124,   125,   126,    -1,    -1,
-      -1,    -1,    -1,    -1,    66,    67,    68,     3,     4,     5,
-       6,     7,     8,     9,    10,    -1,    12,    13,    14,    15,
-      -1,    17,    -1,    19,    -1,    -1,    22,     3,     4,     5,
-       6,     7,     8,     9,    10,    -1,    12,    13,    -1,    15,
-      -1,    17,    -1,    19,    -1,    -1,    22,     3,     4,     5,
-       6,     7,     8,     9,    10,    -1,    12,    13,    -1,    15,
-      -1,    17,    -1,    19,    -1,    -1,    22,     3,     4,     5,
-       6,     7,     8,     9,    -1,    -1,    12,    -1,    -1,    15,
-      -1,    -1,    -1,    -1,    -1,    -1,    22,     3,     4,     5,
-       6,     7,     8,     9,    -1,    -1,    12,    -1,    -1,    15,
-      -1,    -1,    -1,    -1,    -1,    -1,    22,     3,     4,     5,
-       6,     7,     8,     9,    10,    -1,    12,    -1,    -1,    -1,
-      -1,    17,    -1,    19,    20,     3,     4,     5,     6,     7,
+       1,    57,     3,     4,     5,    59,    12,     0,     0,   105,
+      63,    64,    14,   109,    67,    16,    20,    21,    18,    11,
+      12,    21,    53,    54,    55,    81,    16,    80,    29,    30,
+      31,    32,    16,    34,    35,    36,    37,    13,     5,    83,
+      41,    15,     9,    13,    14,    99,    77,    78,    79,    13,
+      14,   107,    53,    54,    55,    87,    85,   109,    90,    -1,
+      -1,    93,    29,    30,    31,    32,    58,    34,    35,    36,
+      37,    72,    73,    74,    41,    76,    77,    78,    79,    85,
+      -1,    -1,     1,    -1,     3,     4,    87,    -1,    -1,    90,
+      57,    83,    93,    85,    -1,    -1,    87,    16,    -1,    90,
+      -1,    -1,    93,    -1,    -1,    72,    73,    74,   109,    76,
+      77,    78,    79,    -1,    81,    34,    35,    36,    -1,    -1,
+      87,    -1,    41,    90,    -1,    -1,    93,    53,    54,    55,
+      53,    54,    55,    -1,    53,    54,    55,    63,    -1,    -1,
+     107,    67,   109,    34,    35,    36,    37,    -1,    -1,    -1,
+      41,    77,    78,    79,    77,    78,    79,    -1,    77,    78,
+      79,     3,     4,     5,     6,     7,     8,     9,    -1,    -1,
+      12,    97,    -1,    15,    -1,    -1,    -1,    -1,    -1,    -1,
+      22,    72,    73,    74,    -1,    76,    77,    78,    79,   115,
+     116,   117,   118,   119,   120,     3,     4,     5,     6,     7,
        8,     9,    10,    -1,    12,    13,    -1,    15,    -1,    17,
-      -1,    19,     3,     4,     5,     6,     7,     8,     9,    10,
-      -1,    12,    -1,    -1,    -1,    -1,    17,    18,    19,     3,
-       4,     5,     6,     7,     8,     9,    10,    -1,    12,    -1,
-      -1,    -1,    -1,    17,    -1,    19,     3,     4,     5,     6,
-       7,     8,     9,    -1,    -1,    12,    13,    -1,    15,     3,
-       4,     5,     6,     7,     8,     9,    -1,    -1,    12,    13,
-      -1,    15,     3,     4,     5,     6,     7,     8,     9,    -1,
-      -1,    12,    13,     3,     4,     5,     6,     7,     8,     9,
-      -1,    -1,    12
+      -1,    19,    -1,    -1,    22,     3,     4,     5,     6,     7,
+       8,     9,    10,    -1,    12,    13,    -1,    15,    -1,    17,
+      -1,    19,    -1,    -1,    22,     3,     4,     5,     6,     7,
+       8,     9,    10,    -1,    12,    -1,    -1,    -1,    -1,    17,
+      -1,    19,    20,     3,     4,     5,     6,     7,     8,     9,
+      10,    11,    12,    -1,    -1,    -1,    -1,    17,    -1,    19,
+       3,     4,     5,     6,     7,     8,     9,    10,    -1,    12,
+      -1,    -1,    -1,    -1,    17,    18,    19,     3,     4,     5,
+       6,     7,     8,     9,    10,    -1,    12,    13,    -1,    -1,
+      -1,    17,    -1,    19,     3,     4,     5,     6,     7,     8,
+       9,    10,    -1,    12,    13,    -1,    -1,    -1,    17,    -1,
+      19,     3,     4,     5,     6,     7,     8,     9,    10,    -1,
+      12,    -1,    -1,    -1,    -1,    17,    -1,    19,     3,     4,
+       5,     6,     7,     8,     9,    10,    -1,    12,    -1,    -1,
+      -1,    -1,    17,    -1,    19,     3,     4,     5,     6,     7,
+       8,     9,    -1,    -1,    12,    13,     3,     4,     5,     6,
+       7,     8,     9,    -1,    -1,    12,    13,     3,     4,     5,
+       6,     7,     8,     9,    -1,    -1,    12,     3,     4,     5,
+       6,     7,     8,     9,    -1,    -1,    12
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
    symbol of state STATE-NUM.  */
 static const unsigned char yystos[] =
 {
-       0,    10,    11,    12,    17,    19,    24,    26,    29,    34,
-      35,    39,    42,    48,     3,     4,     5,     6,     7,     8,
-       9,    25,    27,    28,    29,    33,    34,    18,    25,    29,
-      40,    41,    47,    20,    25,    47,    49,    50,     0,     3,
-       5,     6,    13,    15,    22,    26,    29,    33,    36,    37,
-      38,    43,    44,    45,    46,    27,    33,    27,    33,    27,
-      33,     3,     5,     6,    29,    33,     3,     5,     6,    14,
-      27,    30,    33,    16,    18,    21,    20,    21,    13,    31,
-      37,    43,    31,    37,    43,    31,    37,    43,    28,    25,
-      14,    31,    32,    16,    30,    31,    30,    30,    31,    33,
-      32,    32,    28,    41,    50,     3,     5,     6,    37,    46,
-      37,    46,    37,    46,    31,    32,    28,    36,    36,    45,
-      31,    31,    31,    16,     3,     5,     6,    28
+       0,     3,     4,     5,     6,     7,     8,     9,    10,    11,
+      12,    17,    19,    24,    25,    26,    29,    33,    34,    35,
+      39,    42,    49,    26,    33,    26,    33,    26,    33,     3,
+       5,     6,    29,    33,     3,     5,     6,     7,    25,    27,
+      28,    29,    18,    25,    40,    41,    48,    20,    25,    48,
+      50,    51,     0,     3,     5,     6,    13,    15,    22,    26,
+      33,    36,    37,    38,    43,    44,    46,    47,    33,    28,
+      28,    28,     3,     5,     6,    28,    29,     3,     5,     6,
+      28,    16,    18,    21,    20,    21,    13,    31,    37,    43,
+      31,    37,    43,    31,    37,    43,    27,    25,    14,    31,
+      32,    32,    14,    30,    30,    31,    30,    16,    30,    31,
+      30,    27,    41,    51,    33,    38,    47,    38,    47,    38,
+      47,    31,    32,    36,    27,    45,    36,    46
 };
 
 #if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
@@ -604,13 +603,14 @@
 
 #define yyerrok		(yyerrstatus = 0)
 #define yyclearin	(yychar = YYEMPTY)
-#define YYEMPTY		-2
+#define YYEMPTY		(-2)
 #define YYEOF		0
 
 #define YYACCEPT	goto yyacceptlab
 #define YYABORT		goto yyabortlab
-#define YYERROR		goto yyerrlab1
+#define YYERROR		goto yyerrorlab
 
+
 /* Like YYERROR except do call yyerror.  This remains here temporarily
    to ease the transition to the new meaning of YYERROR, for GCC.
    Once GCC version 2 has supplanted version 1, this can go.  */
@@ -625,13 +625,13 @@
     {								\
       yychar = (Token);						\
       yylval = (Value);						\
-      yychar1 = YYTRANSLATE (yychar);				\
+      yytoken = YYTRANSLATE (yychar);				\
       YYPOPSTACK;						\
       goto yybackup;						\
     }								\
   else								\
     { 								\
-      yyerror ("syntax error: cannot back up");			\
+      yyerror ("syntax error: cannot back up");\
       YYERROR;							\
     }								\
 while (0)
@@ -643,19 +643,19 @@
    are run).  */
 
 #ifndef YYLLOC_DEFAULT
-# define YYLLOC_DEFAULT(Current, Rhs, N)           \
-  Current.first_line   = Rhs[1].first_line;      \
-  Current.first_column = Rhs[1].first_column;    \
-  Current.last_line    = Rhs[N].last_line;       \
-  Current.last_column  = Rhs[N].last_column;
+# define YYLLOC_DEFAULT(Current, Rhs, N)		\
+   ((Current).first_line   = (Rhs)[1].first_line,	\
+    (Current).first_column = (Rhs)[1].first_column,	\
+    (Current).last_line    = (Rhs)[N].last_line,	\
+    (Current).last_column  = (Rhs)[N].last_column)
 #endif
 
 /* YYLEX -- calling `yylex' with the right arguments.  */
 
 #ifdef YYLEX_PARAM
-# define YYLEX	yylex (&yylval, YYLEX_PARAM)
+# define YYLEX yylex (&yylval, YYLEX_PARAM)
 #else
-# define YYLEX	yylex (&yylval)
+# define YYLEX yylex (&yylval)
 #endif
 
 /* Enable debugging if requested.  */
@@ -671,19 +671,93 @@
   if (yydebug)					\
     YYFPRINTF Args;				\
 } while (0)
+
 # define YYDSYMPRINT(Args)			\
 do {						\
   if (yydebug)					\
     yysymprint Args;				\
 } while (0)
+
+# define YYDSYMPRINTF(Title, Token, Value, Location)		\
+do {								\
+  if (yydebug)							\
+    {								\
+      YYFPRINTF (stderr, "%s ", Title);				\
+      yysymprint (stderr, 					\
+                  Token, Value);	\
+      YYFPRINTF (stderr, "\n");					\
+    }								\
+} while (0)
+
+/*------------------------------------------------------------------.
+| yy_stack_print -- Print the state stack from its BOTTOM up to its |
+| TOP (included).                                                   |
+`------------------------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_stack_print (short int *bottom, short int *top)
+#else
+static void
+yy_stack_print (bottom, top)
+    short int *bottom;
+    short int *top;
+#endif
+{
+  YYFPRINTF (stderr, "Stack now");
+  for (/* Nothing. */; bottom <= top; ++bottom)
+    YYFPRINTF (stderr, " %d", *bottom);
+  YYFPRINTF (stderr, "\n");
+}
+
+# define YY_STACK_PRINT(Bottom, Top)				\
+do {								\
+  if (yydebug)							\
+    yy_stack_print ((Bottom), (Top));				\
+} while (0)
+
+
+/*------------------------------------------------.
+| Report that the YYRULE is going to be reduced.  |
+`------------------------------------------------*/
+
+#if defined (__STDC__) || defined (__cplusplus)
+static void
+yy_reduce_print (int yyrule)
+#else
+static void
+yy_reduce_print (yyrule)
+    int yyrule;
+#endif
+{
+  int yyi;
+  unsigned int yylno = yyrline[yyrule];
+  YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ",
+             yyrule - 1, yylno);
+  /* Print the symbols being reduced, and their result.  */
+  for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++)
+    YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]);
+  YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]);
+}
+
+# define YY_REDUCE_PRINT(Rule)		\
+do {					\
+  if (yydebug)				\
+    yy_reduce_print (Rule);		\
+} while (0)
+
 /* Nonzero means print parse trace.  It is left uninitialized so that
    multiple parsers can coexist.  */
 int yydebug;
 #else /* !YYDEBUG */
 # define YYDPRINTF(Args)
 # define YYDSYMPRINT(Args)
+# define YYDSYMPRINTF(Title, Token, Value, Location)
+# define YY_STACK_PRINT(Bottom, Top)
+# define YY_REDUCE_PRINT(Rule)
 #endif /* !YYDEBUG */
 
+
 /* YYINITDEPTH -- initial size of the parser's stacks.  */
 #ifndef	YYINITDEPTH
 # define YYINITDEPTH 200
@@ -696,7 +770,7 @@
    SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH)
    evaluated with infinite-precision integer arithmetic.  */
 
-#if YYMAXDEPTH == 0
+#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0
 # undef YYMAXDEPTH
 #endif
 
@@ -762,102 +836,111 @@
 
 
 #if YYDEBUG
-/*-----------------------------.
-| Print this symbol on YYOUT.  |
-`-----------------------------*/
+/*--------------------------------.
+| Print this symbol on YYOUTPUT.  |
+`--------------------------------*/
 
+#if defined (__STDC__) || defined (__cplusplus)
 static void
-#if defined (__STDC__) || defined (__cplusplus)
-yysymprint (FILE* yyout, int yytype, YYSTYPE yyvalue)
+yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep)
 #else
-yysymprint (yyout, yytype, yyvalue)
-    FILE* yyout;
+static void
+yysymprint (yyoutput, yytype, yyvaluep)
+    FILE *yyoutput;
     int yytype;
-    YYSTYPE yyvalue;
+    YYSTYPE *yyvaluep;
 #endif
 {
   /* Pacify ``unused variable'' warnings.  */
-  (void) yyvalue;
+  (void) yyvaluep;
 
   if (yytype < YYNTOKENS)
     {
-      YYFPRINTF (yyout, "token %s (", yytname[yytype]);
+      YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
 # ifdef YYPRINT
-      YYPRINT (yyout, yytoknum[yytype], yyvalue);
+      YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
 # endif
     }
   else
-    YYFPRINTF (yyout, "nterm %s (", yytname[yytype]);
+    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
 
   switch (yytype)
     {
       default:
         break;
     }
-  YYFPRINTF (yyout, ")");
+  YYFPRINTF (yyoutput, ")");
 }
-#endif /* YYDEBUG. */
 
-
+#endif /* ! YYDEBUG */
 /*-----------------------------------------------.
 | Release the memory associated to this symbol.  |
 `-----------------------------------------------*/
 
+#if defined (__STDC__) || defined (__cplusplus)
 static void
-#if defined (__STDC__) || defined (__cplusplus)
-yydestruct (int yytype, YYSTYPE yyvalue)
+yydestruct (int yytype, YYSTYPE *yyvaluep)
 #else
-yydestruct (yytype, yyvalue)
+static void
+yydestruct (yytype, yyvaluep)
     int yytype;
-    YYSTYPE yyvalue;
+    YYSTYPE *yyvaluep;
 #endif
 {
   /* Pacify ``unused variable'' warnings.  */
-  (void) yyvalue;
+  (void) yyvaluep;
 
   switch (yytype)
     {
+
       default:
         break;
     }
 }
-
 
 
-/* The user can define YYPARSE_PARAM as the name of an argument to be passed
-   into yyparse.  The argument should have type void *.
-   It should actually point to an object.
-   Grammar actions can access the variable by casting it
-   to the proper pointer type.  */
+/* Prevent warnings from -Wmissing-prototypes.  */
 
 #ifdef YYPARSE_PARAM
 # if defined (__STDC__) || defined (__cplusplus)
-#  define YYPARSE_PARAM_ARG void *YYPARSE_PARAM
-#  define YYPARSE_PARAM_DECL
+int yyparse (void *YYPARSE_PARAM);
 # else
-#  define YYPARSE_PARAM_ARG YYPARSE_PARAM
-#  define YYPARSE_PARAM_DECL void *YYPARSE_PARAM;
+int yyparse ();
 # endif
-#else /* !YYPARSE_PARAM */
-# define YYPARSE_PARAM_ARG
-# define YYPARSE_PARAM_DECL
-#endif /* !YYPARSE_PARAM */
-
-/* Prevent warning if -Wstrict-prototypes.  */
-#ifdef __GNUC__
-# ifdef YYPARSE_PARAM
-int yyparse (void *);
-# else
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
 int yyparse (void);
-# endif
+#else
+int yyparse ();
 #endif
+#endif /* ! YYPARSE_PARAM */
 
 
 
 
+
+
+/*----------.
+| yyparse.  |
+`----------*/
+
+#ifdef YYPARSE_PARAM
+# if defined (__STDC__) || defined (__cplusplus)
+int yyparse (void *YYPARSE_PARAM)
+# else
+int yyparse (YYPARSE_PARAM)
+  void *YYPARSE_PARAM;
+# endif
+#else /* ! YYPARSE_PARAM */
+#if defined (__STDC__) || defined (__cplusplus)
 int
-yyparse (YYPARSE_PARAM_ARG)
-     YYPARSE_PARAM_DECL
+yyparse (void)
+#else
+int
+yyparse ()
+
+#endif
+#endif
 {
   /* The lookahead symbol.  */
 int yychar;
@@ -865,7 +948,7 @@
 /* The semantic value of the lookahead symbol.  */
 YYSTYPE yylval;
 
-/* Number of parse errors so far.  */
+/* Number of syntax errors so far.  */
 int yynerrs;
 
   register int yystate;
@@ -874,7 +957,7 @@
   /* Number of tokens to shift before error messages enabled.  */
   int yyerrstatus;
   /* Lookahead token as an internal (translated) token number.  */
-  int yychar1 = 0;
+  int yytoken = 0;
 
   /* Three stacks and their tools:
      `yyss': related to states,
@@ -885,9 +968,9 @@
      to reallocate them elsewhere.  */
 
   /* The state stack.  */
-  short	yyssa[YYINITDEPTH];
-  short *yyss = yyssa;
-  register short *yyssp;
+  short int yyssa[YYINITDEPTH];
+  short int *yyss = yyssa;
+  register short int *yyssp;
 
   /* The semantic value stack.  */
   YYSTYPE yyvsa[YYINITDEPTH];
@@ -924,6 +1007,7 @@
   yyssp = yyss;
   yyvsp = yyvs;
 
+
   goto yysetstate;
 
 /*------------------------------------------------------------.
@@ -938,7 +1022,7 @@
  yysetstate:
   *yyssp = yystate;
 
-  if (yyssp >= yyss + yystacksize - 1)
+  if (yyss + yystacksize - 1 <= yyssp)
     {
       /* Get the current used size of the three stacks, in elements.  */
       YYSIZE_T yysize = yyssp - yyss + 1;
@@ -949,7 +1033,7 @@
 	   these so that the &'s don't force the real ones into
 	   memory.  */
 	YYSTYPE *yyvs1 = yyvs;
-	short *yyss1 = yyss;
+	short int *yyss1 = yyss;
 
 
 	/* Each stack pointer address is followed by the size of the
@@ -970,14 +1054,14 @@
       goto yyoverflowlab;
 # else
       /* Extend the stack our own way.  */
-      if (yystacksize >= YYMAXDEPTH)
+      if (YYMAXDEPTH <= yystacksize)
 	goto yyoverflowlab;
       yystacksize *= 2;
-      if (yystacksize > YYMAXDEPTH)
+      if (YYMAXDEPTH < yystacksize)
 	yystacksize = YYMAXDEPTH;
 
       {
-	short *yyss1 = yyss;
+	short int *yyss1 = yyss;
 	union yyalloc *yyptr =
 	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
 	if (! yyptr)
@@ -999,7 +1083,7 @@
       YYDPRINTF ((stderr, "Stack size increased to %lu\n",
 		  (unsigned long int) yystacksize));
 
-      if (yyssp >= yyss + yystacksize - 1)
+      if (yyss + yystacksize - 1 <= yyssp)
 	YYABORT;
     }
 
@@ -1024,39 +1108,28 @@
 
   /* Not known => get a lookahead token if don't already have one.  */
 
-  /* yychar is either YYEMPTY or YYEOF
-     or a valid token in external form.  */
-
+  /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol.  */
   if (yychar == YYEMPTY)
     {
       YYDPRINTF ((stderr, "Reading a token: "));
       yychar = YYLEX;
     }
 
-  /* Convert token to internal form (in yychar1) for indexing tables with.  */
-
-  if (yychar <= 0)		/* This means end of input.  */
+  if (yychar <= YYEOF)
     {
-      yychar1 = 0;
-      yychar = YYEOF;		/* Don't call YYLEX any more.  */
-
+      yychar = yytoken = YYEOF;
       YYDPRINTF ((stderr, "Now at end of input.\n"));
     }
   else
     {
-      yychar1 = YYTRANSLATE (yychar);
-
-      /* We have to keep this `#if YYDEBUG', since we use variables
-	 which are defined only if `YYDEBUG' is set.  */
-      YYDPRINTF ((stderr, "Next token is "));
-      YYDSYMPRINT ((stderr, yychar1, yylval));
-      YYDPRINTF ((stderr, "\n"));
+      yytoken = YYTRANSLATE (yychar);
+      YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc);
     }
 
-  /* If the proper action on seeing token YYCHAR1 is to reduce or to
+  /* If the proper action on seeing token YYTOKEN is to reduce or to
      detect an error, take that action.  */
-  yyn += yychar1;
-  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yychar1)
+  yyn += yytoken;
+  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
     goto yydefault;
   yyn = yytable[yyn];
   if (yyn <= 0)
@@ -1071,8 +1144,7 @@
     YYACCEPT;
 
   /* Shift the lookahead token.  */
-  YYDPRINTF ((stderr, "Shifting token %d (%s), ",
-	      yychar, yytname[yychar1]));
+  YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken]));
 
   /* Discard the token being shifted unless it is eof.  */
   if (yychar != YYEOF)
@@ -1118,71 +1190,48 @@
   yyval = yyvsp[1-yylen];
 
 
-
-#if YYDEBUG
-  /* We have to keep this `#if YYDEBUG', since we use variables which
-     are defined only if `YYDEBUG' is set.  */
-  if (yydebug)
-    {
-      int yyi;
-
-      YYFPRINTF (stderr, "Reducing via rule %d (line %d), ",
-		 yyn - 1, yyrline[yyn]);
-
-      /* Print the symbols being reduced, and their result.  */
-      for (yyi = yyprhs[yyn]; yyrhs[yyi] >= 0; yyi++)
-	YYFPRINTF (stderr, "%s ", yytname[yyrhs[yyi]]);
-      YYFPRINTF (stderr, " -> %s\n", yytname[yyr1[yyn]]);
-    }
-#endif
+  YY_REDUCE_PRINT (yyn);
   switch (yyn)
     {
         case 2:
-#line 55 "gram.y"
+#line 57 "gram.y"
     {
            ((SyckParser *)parser)->root = syck_hdlr_add_node( (SyckParser *)parser, yyvsp[0].nodeData );
         }
     break;
 
   case 3:
-#line 59 "gram.y"
+#line 61 "gram.y"
     {
            ((SyckParser *)parser)->root = syck_hdlr_add_node( (SyckParser *)parser, yyvsp[0].nodeData );
         }
     break;
 
   case 4:
-#line 63 "gram.y"
+#line 65 "gram.y"
     {
            ((SyckParser *)parser)->eof = 1;
         }
     break;
 
   case 8:
-#line 74 "gram.y"
-    {
-           yyval.nodeData = yyvsp[-1].nodeData;
-        }
-    break;
-
-  case 10:
-#line 81 "gram.y"
+#line 76 "gram.y"
     { 
             syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
             yyval.nodeData = yyvsp[0].nodeData;
         }
     break;
 
-  case 11:
-#line 86 "gram.y"
+  case 9:
+#line 81 "gram.y"
     {
             syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, 0 );
             yyval.nodeData = yyvsp[0].nodeData;
         }
     break;
 
-  case 12:
-#line 91 "gram.y"
+  case 10:
+#line 86 "gram.y"
     { 
            /*
             * _Anchors_: The language binding must keep a separate symbol table
@@ -1193,15 +1242,22 @@
         }
     break;
 
-  case 13:
-#line 100 "gram.y"
+  case 11:
+#line 95 "gram.y"
     {
            yyval.nodeData = yyvsp[-1].nodeData;
         }
     break;
 
+  case 14:
+#line 105 "gram.y"
+    {
+                    yyval.nodeData = yyvsp[-1].nodeData;
+                }
+    break;
+
   case 15:
-#line 107 "gram.y"
+#line 109 "gram.y"
     {
                     NULL_NODE( parser, n );
                     yyval.nodeData = n;
@@ -1209,31 +1265,62 @@
     break;
 
   case 16:
-#line 112 "gram.y"
+#line 114 "gram.y"
+    { 
+                   if ( ((SyckParser *)parser)->implicit_typing == 1 )
+                   {
+                      try_tag_implicit( yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
+                   }
+                   yyval.nodeData = yyvsp[0].nodeData;
+                }
+    break;
+
+  case 17:
+#line 122 "gram.y"
+    { 
+                    syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
+                    yyval.nodeData = yyvsp[0].nodeData;
+                }
+    break;
+
+  case 18:
+#line 127 "gram.y"
     {
-                    NULL_NODE( parser, n );
-                    yyval.nodeData = n;
+                    syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, 0 );
+                    yyval.nodeData = yyvsp[0].nodeData;
                 }
     break;
 
-  case 23:
-#line 141 "gram.y"
+  case 19:
+#line 132 "gram.y"
     { 
+                   /*
+                    * _Anchors_: The language binding must keep a separate symbol table
+                    * for anchors.  The actual ID in the symbol table is returned to the
+                    * higher nodes, though.
+                    */
+                   yyval.nodeData = syck_hdlr_add_anchor( (SyckParser *)parser, yyvsp[-1].name, yyvsp[0].nodeData );
+                }
+    break;
+
+  case 26:
+#line 165 "gram.y"
+    { 
                syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
                yyval.nodeData = yyvsp[0].nodeData;
             }
     break;
 
-  case 24:
-#line 146 "gram.y"
+  case 27:
+#line 170 "gram.y"
     { 
                syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, 0 );
                yyval.nodeData = yyvsp[0].nodeData;
             }
     break;
 
-  case 25:
-#line 151 "gram.y"
+  case 28:
+#line 175 "gram.y"
     { 
                if ( ((SyckParser *)parser)->implicit_typing == 1 )
                {
@@ -1243,15 +1330,15 @@
             }
     break;
 
-  case 26:
-#line 159 "gram.y"
+  case 29:
+#line 183 "gram.y"
     { 
                yyval.nodeData = syck_hdlr_add_anchor( (SyckParser *)parser, yyvsp[-1].name, yyvsp[0].nodeData );
             }
     break;
 
-  case 27:
-#line 163 "gram.y"
+  case 30:
+#line 187 "gram.y"
     {
                /*
                 * _Aliases_: The anchor symbol table is scanned for the anchor name.
@@ -1261,8 +1348,8 @@
             }
     break;
 
-  case 28:
-#line 171 "gram.y"
+  case 31:
+#line 195 "gram.y"
     { 
                SyckNode *n = yyvsp[0].nodeData;
                if ( ((SyckParser *)parser)->taguri_expansion == 1 )
@@ -1277,207 +1364,212 @@
             }
     break;
 
-  case 30:
-#line 185 "gram.y"
+  case 33:
+#line 209 "gram.y"
     {
                yyval.nodeData = yyvsp[-1].nodeData;
             }
     break;
 
-  case 36:
-#line 205 "gram.y"
+  case 39:
+#line 229 "gram.y"
     { 
                     yyval.nodeData = yyvsp[-1].nodeData;
                 }
     break;
 
-  case 37:
-#line 211 "gram.y"
+  case 40:
+#line 233 "gram.y"
     { 
+                    yyval.nodeData = yyvsp[-1].nodeData;
+                }
+    break;
+
+  case 41:
+#line 239 "gram.y"
+    { 
                     yyval.nodeId = syck_hdlr_add_node( (SyckParser *)parser, yyvsp[0].nodeData );
                 }
     break;
 
-  case 39:
-#line 218 "gram.y"
+  case 42:
+#line 245 "gram.y"
     { 
                     syck_add_transfer( yyvsp[-2].name, yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
                     yyval.nodeData = yyvsp[0].nodeData;
                 }
     break;
 
-  case 40:
-#line 223 "gram.y"
+  case 43:
+#line 250 "gram.y"
     { 
                     syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
                     yyval.nodeData = yyvsp[0].nodeData;
                 }
     break;
 
-  case 41:
-#line 228 "gram.y"
+  case 44:
+#line 255 "gram.y"
     { 
                     syck_add_transfer( yyvsp[-2].name, yyvsp[0].nodeData, 0 );
                     yyval.nodeData = yyvsp[0].nodeData;
                 }
     break;
 
-  case 42:
-#line 233 "gram.y"
+  case 45:
+#line 260 "gram.y"
     { 
                     syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, 0 );
                     yyval.nodeData = yyvsp[0].nodeData;
                 }
     break;
 
-  case 43:
-#line 238 "gram.y"
+  case 46:
+#line 265 "gram.y"
     { 
                     yyval.nodeData = syck_hdlr_add_anchor( (SyckParser *)parser, yyvsp[-2].name, yyvsp[0].nodeData );
                 }
     break;
 
-  case 44:
-#line 242 "gram.y"
+  case 47:
+#line 269 "gram.y"
     { 
                     yyval.nodeData = syck_hdlr_add_anchor( (SyckParser *)parser, yyvsp[-1].name, yyvsp[0].nodeData );
                 }
     break;
 
-  case 45:
-#line 248 "gram.y"
+  case 48:
+#line 275 "gram.y"
     {
                     yyval.nodeData = syck_new_seq( yyvsp[0].nodeId );
                 }
     break;
 
-  case 46:
-#line 252 "gram.y"
+  case 49:
+#line 279 "gram.y"
     { 
                     syck_seq_add( yyvsp[-2].nodeData, yyvsp[0].nodeId );
                     yyval.nodeData = yyvsp[-2].nodeData;
 				}
     break;
 
-  case 47:
-#line 257 "gram.y"
+  case 50:
+#line 284 "gram.y"
     { 
                     yyval.nodeData = yyvsp[-1].nodeData;
 				}
     break;
 
-  case 48:
-#line 266 "gram.y"
+  case 51:
+#line 293 "gram.y"
     { 
                     yyval.nodeData = yyvsp[-1].nodeData;
                 }
     break;
 
-  case 49:
-#line 270 "gram.y"
+  case 52:
+#line 297 "gram.y"
     { 
                     yyval.nodeData = syck_alloc_seq();
                 }
     break;
 
-  case 50:
-#line 276 "gram.y"
+  case 53:
+#line 303 "gram.y"
     {
                     yyval.nodeData = syck_new_seq( syck_hdlr_add_node( (SyckParser *)parser, yyvsp[0].nodeData ) );
                 }
     break;
 
-  case 51:
-#line 280 "gram.y"
+  case 54:
+#line 307 "gram.y"
     { 
                     syck_seq_add( yyvsp[-2].nodeData, syck_hdlr_add_node( (SyckParser *)parser, yyvsp[0].nodeData ) );
                     yyval.nodeData = yyvsp[-2].nodeData;
 				}
     break;
 
-  case 54:
-#line 294 "gram.y"
+  case 57:
+#line 321 "gram.y"
     { 
                     apply_seq_in_map( (SyckParser *)parser, yyvsp[-1].nodeData );
                     yyval.nodeData = yyvsp[-1].nodeData;
                 }
     break;
 
-  case 55:
-#line 299 "gram.y"
+  case 58:
+#line 326 "gram.y"
     { 
                     apply_seq_in_map( (SyckParser *)parser, yyvsp[-1].nodeData );
                     yyval.nodeData = yyvsp[-1].nodeData;
                 }
     break;
 
-  case 56:
-#line 306 "gram.y"
+  case 59:
+#line 333 "gram.y"
     { 
                     syck_add_transfer( yyvsp[-2].name, yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
                     yyval.nodeData = yyvsp[0].nodeData;
                 }
     break;
 
-  case 57:
-#line 311 "gram.y"
+  case 60:
+#line 338 "gram.y"
     { 
                     syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, ((SyckParser *)parser)->taguri_expansion );
                     yyval.nodeData = yyvsp[0].nodeData;
                 }
     break;
 
-  case 58:
-#line 316 "gram.y"
+  case 61:
+#line 343 "gram.y"
     { 
                     syck_add_transfer( yyvsp[-2].name, yyvsp[0].nodeData, 0 );
                     yyval.nodeData = yyvsp[0].nodeData;
                 }
     break;
 
-  case 59:
-#line 321 "gram.y"
+  case 62:
+#line 348 "gram.y"
     { 
                     syck_add_transfer( yyvsp[-1].name, yyvsp[0].nodeData, 0 );
                     yyval.nodeData = yyvsp[0].nodeData;
                 }
     break;
 
-  case 60:
-#line 326 "gram.y"
+  case 63:
+#line 353 "gram.y"
     { 
                     yyval.nodeData = syck_hdlr_add_anchor( (SyckParser *)parser, yyvsp[-2].name, yyvsp[0].nodeData );
                 }
     break;
 
-  case 61:
-#line 330 "gram.y"
+  case 64:
+#line 357 "gram.y"
     { 
                     yyval.nodeData = syck_hdlr_add_anchor( (SyckParser *)parser, yyvsp[-1].name, yyvsp[0].nodeData );
                 }
     break;
 
-  case 62:
-#line 336 "gram.y"
+  case 66:
+#line 364 "gram.y"
     {
-                    yyval.nodeData = syck_new_map( 
-                        syck_hdlr_add_node( (SyckParser *)parser, yyvsp[-2].nodeData ), 
-                        syck_hdlr_add_node( (SyckParser *)parser, yyvsp[0].nodeData ) );
+                    yyval.nodeData = yyvsp[-1].nodeData;
                 }
     break;
 
-  case 64:
-#line 352 "gram.y"
+  case 68:
+#line 380 "gram.y"
     {
                     yyval.nodeData = syck_new_map( 
-                        syck_hdlr_add_node( (SyckParser *)parser, yyvsp[-3].nodeData ), 
+                        syck_hdlr_add_node( (SyckParser *)parser, yyvsp[-2].nodeData ), 
                         syck_hdlr_add_node( (SyckParser *)parser, yyvsp[0].nodeData ) );
                 }
     break;
 
-  case 66:
-#line 370 "gram.y"
-    { 
+  case 70:
+#line 398 "gram.y"
+    {
                     if ( yyvsp[-2].nodeData->shortcut == NULL )
                     {
                         yyvsp[-2].nodeData->shortcut = syck_new_seq( yyvsp[0].nodeId );
@@ -1490,9 +1582,9 @@
                 }
     break;
 
-  case 67:
-#line 382 "gram.y"
-    { 
+  case 71:
+#line 410 "gram.y"
+    {
                     apply_seq_in_map( (SyckParser *)parser, yyvsp[-2].nodeData );
                     syck_map_update( yyvsp[-2].nodeData, yyvsp[0].nodeData );
                     syck_free_node( yyvsp[0].nodeData );
@@ -1501,15 +1593,15 @@
                 }
     break;
 
-  case 68:
-#line 390 "gram.y"
-    { 
+  case 72:
+#line 418 "gram.y"
+    {
                     yyval.nodeData = yyvsp[-1].nodeData;
                 }
     break;
 
-  case 69:
-#line 399 "gram.y"
+  case 73:
+#line 427 "gram.y"
     {
                     yyval.nodeData = syck_new_map( 
                         syck_hdlr_add_node( (SyckParser *)parser, yyvsp[-2].nodeData ), 
@@ -1517,22 +1609,22 @@
                 }
     break;
 
-  case 70:
-#line 407 "gram.y"
+  case 74:
+#line 435 "gram.y"
     {
                     yyval.nodeData = yyvsp[-1].nodeData;
                 }
     break;
 
-  case 71:
-#line 411 "gram.y"
+  case 75:
+#line 439 "gram.y"
     {
                     yyval.nodeData = syck_alloc_map();
                 }
     break;
 
-  case 73:
-#line 418 "gram.y"
+  case 77:
+#line 446 "gram.y"
     {
                     syck_map_update( yyvsp[-2].nodeData, yyvsp[0].nodeData );
                     syck_free_node( yyvsp[0].nodeData );
@@ -1541,8 +1633,8 @@
 				}
     break;
 
-  case 74:
-#line 427 "gram.y"
+  case 78:
+#line 455 "gram.y"
     {
                     NULL_NODE( parser, n );
                     yyval.nodeData = syck_new_map( 
@@ -1554,23 +1646,14 @@
 
     }
 
-/* Line 1016 of /usr/local/share/bison/yacc.c.  */
-#line 1559 "y.tab.c"
+/* Line 1010 of yacc.c.  */
+#line 1651 "gram.c"
 
   yyvsp -= yylen;
   yyssp -= yylen;
 
 
-#if YYDEBUG
-  if (yydebug)
-    {
-      short *yyssp1 = yyss - 1;
-      YYFPRINTF (stderr, "state stack now");
-      while (yyssp1 != yyssp)
-	YYFPRINTF (stderr, " %d", *++yyssp1);
-      YYFPRINTF (stderr, "\n");
-    }
-#endif
+  YY_STACK_PRINT (yyss, yyssp);
 
   *++yyvsp = yyval;
 
@@ -1605,88 +1688,118 @@
 	{
 	  YYSIZE_T yysize = 0;
 	  int yytype = YYTRANSLATE (yychar);
+	  const char* yyprefix;
 	  char *yymsg;
-	  int yyx, yycount;
+	  int yyx;
 
-	  yycount = 0;
 	  /* Start YYX at -YYN if negative to avoid negative indexes in
 	     YYCHECK.  */
-	  for (yyx = yyn < 0 ? -yyn : 0;
-	       yyx < (int) (sizeof (yytname) / sizeof (char *)); yyx++)
+	  int yyxbegin = yyn < 0 ? -yyn : 0;
+
+	  /* Stay within bounds of both yycheck and yytname.  */
+	  int yychecklim = YYLAST - yyn;
+	  int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
+	  int yycount = 0;
+
+	  yyprefix = ", expecting ";
+	  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
 	    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
-	      yysize += yystrlen (yytname[yyx]) + 15, yycount++;
-	  yysize += yystrlen ("parse error, unexpected ") + 1;
-	  yysize += yystrlen (yytname[yytype]);
+	      {
+		yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]);
+		yycount += 1;
+		if (yycount == 5)
+		  {
+		    yysize = 0;
+		    break;
+		  }
+	      }
+	  yysize += (sizeof ("syntax error, unexpected ")
+		     + yystrlen (yytname[yytype]));
 	  yymsg = (char *) YYSTACK_ALLOC (yysize);
 	  if (yymsg != 0)
 	    {
-	      char *yyp = yystpcpy (yymsg, "parse error, unexpected ");
+	      char *yyp = yystpcpy (yymsg, "syntax error, unexpected ");
 	      yyp = yystpcpy (yyp, yytname[yytype]);
 
 	      if (yycount < 5)
 		{
-		  yycount = 0;
-		  for (yyx = yyn < 0 ? -yyn : 0;
-		       yyx < (int) (sizeof (yytname) / sizeof (char *));
-		       yyx++)
+		  yyprefix = ", expecting ";
+		  for (yyx = yyxbegin; yyx < yyxend; ++yyx)
 		    if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
 		      {
-			const char *yyq = ! yycount ? ", expecting " : " or ";
-			yyp = yystpcpy (yyp, yyq);
+			yyp = yystpcpy (yyp, yyprefix);
 			yyp = yystpcpy (yyp, yytname[yyx]);
-			yycount++;
+			yyprefix = " or ";
 		      }
 		}
 	      yyerror (yymsg);
 	      YYSTACK_FREE (yymsg);
 	    }
 	  else
-	    yyerror ("parse error; also virtual memory exhausted");
+	    yyerror ("syntax error; also virtual memory exhausted");
 	}
       else
 #endif /* YYERROR_VERBOSE */
-	yyerror ("parse error");
+	yyerror ("syntax error");
     }
-  goto yyerrlab1;
 
 
-/*----------------------------------------------------.
-| yyerrlab1 -- error raised explicitly by an action.  |
-`----------------------------------------------------*/
-yyerrlab1:
+
   if (yyerrstatus == 3)
     {
       /* If just tried and failed to reuse lookahead token after an
 	 error, discard it.  */
 
-      /* Return failure if at end of input.  */
-      if (yychar == YYEOF)
+      if (yychar <= YYEOF)
         {
-	  /* Pop the error token.  */
-          YYPOPSTACK;
-	  /* Pop the rest of the stack.  */
-	  while (yyssp > yyss)
-	    {
-	      YYDPRINTF ((stderr, "Error: popping "));
-	      YYDSYMPRINT ((stderr,
-			    yystos[*yyssp],
-			    *yyvsp));
-	      YYDPRINTF ((stderr, "\n"));
-	      yydestruct (yystos[*yyssp], *yyvsp);
-	      YYPOPSTACK;
-	    }
-	  YYABORT;
+          /* If at end of input, pop the error token,
+	     then the rest of the stack, then return failure.  */
+	  if (yychar == YYEOF)
+	     for (;;)
+	       {
+		 YYPOPSTACK;
+		 if (yyssp == yyss)
+		   YYABORT;
+		 YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+		 yydestruct (yystos[*yyssp], yyvsp);
+	       }
         }
+      else
+	{
+	  YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc);
+	  yydestruct (yytoken, &yylval);
+	  yychar = YYEMPTY;
 
-      YYDPRINTF ((stderr, "Discarding token %d (%s).\n",
-		  yychar, yytname[yychar1]));
-      yydestruct (yychar1, yylval);
-      yychar = YYEMPTY;
+	}
     }
 
   /* Else will try to reuse lookahead token after shifting the error
      token.  */
+  goto yyerrlab1;
 
+
+/*---------------------------------------------------.
+| yyerrorlab -- error raised explicitly by YYERROR.  |
+`---------------------------------------------------*/
+yyerrorlab:
+
+#ifdef __GNUC__
+  /* Pacify GCC when the user code never invokes YYERROR and the label
+     yyerrorlab therefore never appears in user code.  */
+  if (0)
+     goto yyerrorlab;
+#endif
+
+  yyvsp -= yylen;
+  yyssp -= yylen;
+  yystate = *yyssp;
+  goto yyerrlab1;
+
+
+/*-------------------------------------------------------------.
+| yyerrlab1 -- common code for both syntax error and YYERROR.  |
+`-------------------------------------------------------------*/
+yyerrlab1:
   yyerrstatus = 3;	/* Each real token shifted decrements this.  */
 
   for (;;)
@@ -1707,26 +1820,11 @@
       if (yyssp == yyss)
 	YYABORT;
 
-      YYDPRINTF ((stderr, "Error: popping "));
-      YYDSYMPRINT ((stderr,
-		    yystos[*yyssp], *yyvsp));
-      YYDPRINTF ((stderr, "\n"));
-
-      yydestruct (yystos[yystate], *yyvsp);
-      yyvsp--;
-      yystate = *--yyssp;
-
-
-#if YYDEBUG
-      if (yydebug)
-	{
-	  short *yyssp1 = yyss - 1;
-	  YYFPRINTF (stderr, "Error: state stack now");
-	  while (yyssp1 != yyssp)
-	    YYFPRINTF (stderr, " %d", *++yyssp1);
-	  YYFPRINTF (stderr, "\n");
-	}
-#endif
+      YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp);
+      yydestruct (yystos[yystate], yyvsp);
+      YYPOPSTACK;
+      yystate = *yyssp;
+      YY_STACK_PRINT (yyss, yyssp);
     }
 
   if (yyn == YYFINAL)
@@ -1774,7 +1872,7 @@
 }
 
 
-#line 436 "gram.y"
+#line 464 "gram.y"
 
 
 void

Modified: trunk/ext/syck/gram.h
===================================================================
--- trunk/ext/syck/gram.h	2006-02-20 06:15:42 UTC (rev 449)
+++ trunk/ext/syck/gram.h	2006-02-20 06:16:38 UTC (rev 450)
@@ -1,7 +1,7 @@
-/* A Bison parser, made from gram.y, by GNU bison 1.75.  */
+/* A Bison parser, made by GNU Bison 1.875d.  */
 
 /* Skeleton parser for Yacc-like parsing with Bison,
-   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
@@ -23,9 +23,6 @@
    This special exception was added by the Free Software Foundation
    in version 1.24 of Bison.  */
 
-#ifndef BISON_Y_TAB_H
-# define BISON_Y_TAB_H
-
 /* Tokens.  */
 #ifndef YYTOKENTYPE
 # define YYTOKENTYPE
@@ -62,20 +59,21 @@
 
 
 
-#ifndef YYSTYPE
-#line 33 "gram.y"
-typedef union {
+#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
+#line 35 "gram.y"
+typedef union YYSTYPE {
     SYMID nodeId;
     SyckNode *nodeData;
     char *name;
-} yystype;
-/* Line 1281 of /usr/local/share/bison/yacc.c.  */
-#line 74 "y.tab.h"
-# define YYSTYPE yystype
+} YYSTYPE;
+/* Line 1285 of yacc.c.  */
+#line 71 "gram.h"
+# define yystype YYSTYPE /* obsolescent; will be withdrawn */
+# define YYSTYPE_IS_DECLARED 1
+# define YYSTYPE_IS_TRIVIAL 1
 #endif
 
 
 
 
-#endif /* not BISON_Y_TAB_H */
 

Modified: trunk/ext/syck/handler.c
===================================================================
--- trunk/ext/syck/handler.c	2006-02-20 06:15:42 UTC (rev 449)
+++ trunk/ext/syck/handler.c	2006-02-20 06:16:38 UTC (rev 450)
@@ -2,7 +2,7 @@
  * handler.c
  *
  * $Author: why $
- * $Date: 2004/05/06 06:29:56 $
+ * $Date: 2005/09/20 06:50:19 $
  *
  * Copyright (C) 2003 why the lucky stiff
  */
@@ -31,6 +31,8 @@
 SyckNode *
 syck_hdlr_add_anchor( SyckParser *p, char *a, SyckNode *n )
 {
+    SyckNode *ntmp = NULL;
+
     n->anchor = a;
     if ( p->bad_anchors != NULL )
     {
@@ -48,6 +50,13 @@
     {
         p->anchors = st_init_strtable();
     }
+    if ( st_lookup( p->anchors, (st_data_t)a, (st_data_t *)&ntmp ) )
+    {
+        if ( ntmp != (void *)1 )
+        {
+            syck_free_node( ntmp );
+        }
+    }
     st_insert( p->anchors, (st_data_t)a, (st_data_t)n );
     return n;
 }
@@ -55,10 +64,19 @@
 void
 syck_hdlr_remove_anchor( SyckParser *p, char *a )
 {
+    char *atmp = a;
+    SyckNode *ntmp;
     if ( p->anchors == NULL )
     {
         p->anchors = st_init_strtable();
     }
+    if ( st_delete( p->anchors, (st_data_t *)&atmp, (st_data_t *)&ntmp ) )
+    {
+        if ( ntmp != (void *)1 )
+