Created
October 15, 2014 14:30
-
-
Save rns/cb9f19989565309de914 to your computer and use it in GitHub Desktop.
http://stackoverflow.com/questions/26173372/parsing-an-ad-hoc-tree/26192035 -- pathological first cut
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Output of $r->ambiguous(): at C:\cygwin\home\Ruslan\Marpa-R2-work\q26173372-asf.pl line 84. | |
Length of symbol "table" at line 3, column 1 is ambiguous | |
Choices start with: +Team:US | |
Choice 1, length=415, ends at C:\cygwin\home\Ruslan\Marpa-R2-work\q26173372-asf.pl line 85. | |
# Output of $r->value(), max_parses is in effect, so works ok: at C:\cygwin\home\Ruslan\Marpa-R2-work\q26173372-asf.pl line 89. | |
['data',['heading',['string','Soccer']],['tables',['table',['row',['level','+'],['name',['string','Team']],':',['value',['string','US']]],['row',['level','++'],['name',['string','Shirt']],':',['value',['string','Red & White Stripes']]],['row',['level','++'],['name',['string','Shorts']],':',['value',['string','Blue']]],['row',['level','++'],['name',['string','Players']],':',['value',['string','17']]],['row',['level','+++'],['name',['string','Active']],':',['value',['string','11']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Midfield']],':',['value',['string','4']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','4']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value',['string','1']]],['row',['level','+++'],['name',['string','Substitute']],':',['value',['string','6']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','1']]],['row',['level','++++'],['name',['string','Midfied']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','3']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value']],['row',['level','+'],['name',['string','Team']],':',['value',['string','Mexico']]],['row',['level','++'],['name',['string','Shirt']],':',['value',['string','Green']]],['row',['level','++'],['name',['string','Shorts']],':',['value',['string','White']]],['row',['level','++'],['name',['string','Players']],':',['value',['string','17']]],['row',['level','+++'],['name',['string','Active']],':',['value',['string','11']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','3']]],['row',['level','++++'],['name',['string','Midfield']],':',['value',['string','3']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','4']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value',['string','1']]],['row',['level','+++'],['name',['string','Substitute']],':',['value',['string','6']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Midfield']],':',['value',['string','1']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value',['string','1']]]]]] at C:\cygwin\home\Ruslan\Marpa-R2-work\q26173372-asf.pl line 95. | |
eval {...} called at C:\cygwin\home\Ruslan\Marpa-R2-work\q26173372-asf.pl line 91 | |
['data',['heading',['string','Soccer']],['tables',['table',['row',['level','+'],['name',['string','Team']],':',['value',['string','US']]],['row',['level','++'],['name',['string','Shirt']],':',['value',['string','Red & White Stripes']]],['row',['level','++'],['name',['string','Shorts']],':',['value',['string','Blue']]],['row',['level','++'],['name',['string','Players']],':',['value',['number','17']]],['row',['level','+++'],['name',['string','Active']],':',['value',['string','11']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Midfield']],':',['value',['string','4']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','4']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value',['string','1']]],['row',['level','+++'],['name',['string','Substitute']],':',['value',['string','6']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','1']]],['row',['level','++++'],['name',['string','Midfied']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','3']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value']],['row',['level','+'],['name',['string','Team']],':',['value',['string','Mexico']]],['row',['level','++'],['name',['string','Shirt']],':',['value',['string','Green']]],['row',['level','++'],['name',['string','Shorts']],':',['value',['string','White']]],['row',['level','++'],['name',['string','Players']],':',['value',['string','17']]],['row',['level','+++'],['name',['string','Active']],':',['value',['string','11']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','3']]],['row',['level','++++'],['name',['string','Midfield']],':',['value',['string','3']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','4']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value',['string','1']]],['row',['level','+++'],['name',['string','Substitute']],':',['value',['string','6']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Midfield']],':',['value',['string','1']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value',['string','1']]]]]] at C:\cygwin\home\Ruslan\Marpa-R2-work\q26173372-asf.pl line 95. | |
eval {...} called at C:\cygwin\home\Ruslan\Marpa-R2-work\q26173372-asf.pl line 91 | |
['data',['heading',['string','Soccer']],['tables',['table',['row',['level','+'],['name',['string','Team']],':',['value',['string','US']]],['row',['level','++'],['name',['string','Shirt']],':',['value',['string','Red & White Stripes']]],['row',['level','++'],['name',['string','Shorts']],':',['value',['string','Blue']]],['row',['level','++'],['name',['string','Players']],':',['value',['string','17']]],['row',['level','+++'],['name',['string','Active']],':',['value',['number','11']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Midfield']],':',['value',['string','4']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','4']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value',['string','1']]],['row',['level','+++'],['name',['string','Substitute']],':',['value',['string','6']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','1']]],['row',['level','++++'],['name',['string','Midfied']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','3']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value']],['row',['level','+'],['name',['string','Team']],':',['value',['string','Mexico']]],['row',['level','++'],['name',['string','Shirt']],':',['value',['string','Green']]],['row',['level','++'],['name',['string','Shorts']],':',['value',['string','White']]],['row',['level','++'],['name',['string','Players']],':',['value',['string','17']]],['row',['level','+++'],['name',['string','Active']],':',['value',['string','11']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','3']]],['row',['level','++++'],['name',['string','Midfield']],':',['value',['string','3']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','4']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value',['string','1']]],['row',['level','+++'],['name',['string','Substitute']],':',['value',['string','6']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Midfield']],':',['value',['string','1']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value',['string','1']]]]]] at C:\cygwin\home\Ruslan\Marpa-R2-work\q26173372-asf.pl line 95. | |
eval {...} called at C:\cygwin\home\Ruslan\Marpa-R2-work\q26173372-asf.pl line 91 | |
['data',['heading',['string','Soccer']],['tables',['table',['row',['level','+'],['name',['string','Team']],':',['value',['string','US']]],['row',['level','++'],['name',['string','Shirt']],':',['value',['string','Red & White Stripes']]],['row',['level','++'],['name',['string','Shorts']],':',['value',['string','Blue']]],['row',['level','++'],['name',['string','Players']],':',['value',['number','17']]],['row',['level','+++'],['name',['string','Active']],':',['value',['number','11']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Midfield']],':',['value',['string','4']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','4']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value',['string','1']]],['row',['level','+++'],['name',['string','Substitute']],':',['value',['string','6']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','1']]],['row',['level','++++'],['name',['string','Midfied']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','3']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value']],['row',['level','+'],['name',['string','Team']],':',['value',['string','Mexico']]],['row',['level','++'],['name',['string','Shirt']],':',['value',['string','Green']]],['row',['level','++'],['name',['string','Shorts']],':',['value',['string','White']]],['row',['level','++'],['name',['string','Players']],':',['value',['string','17']]],['row',['level','+++'],['name',['string','Active']],':',['value',['string','11']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','3']]],['row',['level','++++'],['name',['string','Midfield']],':',['value',['string','3']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','4']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value',['string','1']]],['row',['level','+++'],['name',['string','Substitute']],':',['value',['string','6']]],['row',['level','++++'],['name',['string','Forward']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Midfield']],':',['value',['string','1']]],['row',['level','++++'],['name',['string','Defense']],':',['value',['string','2']]],['row',['level','++++'],['name',['string','Goalkeeper']],':',['value',['string','1']]]]]] at C:\cygwin\home\Ruslan\Marpa-R2-work\q26173372-asf.pl line 95. | |
eval {...} called at C:\cygwin\home\Ruslan\Marpa-R2-work\q26173372-asf.pl line 91 | |
# Output of asf_to_basic_tree()/array_diplay() from Marpa::R2::Glade: at C:\cygwin\home\Ruslan\Marpa-R2-work\q26173372-asf.pl line 100. | |
Glade 2, Rule (0-422) data ::= heading tables | |
Glade 1, Rule (0-5) heading ::= string | |
Glade 6, Token (0-5) string: "Soccer" | |
Glade 4, symch 0 has 41 factorings | |
Glade 4, Rule (8-422) tables ::= table + | |
Glade 9, Rule (8-422) table ::= row + | |
Glade 64, Rule (8-15) row ::= level name ':' value | |
Glade 68, Token (8-8) level: "+" | |
Glade 67, Rule (9-12) name ::= string | |
Glade 70, Token (9-12) string: "Team" | |
Glade 66, Token (13-13) ':': ":" | |
Glade 7, Rule (14-15) value ::= string | |
Glade 73, Token (14-15) string: "US" | |
Glade 63, Rule (17-43) row ::= level name ':' value | |
Glade 79, Token (17-18) level: "++" | |
Glade 78, Rule (19-23) name ::= string | |
Glade 82, Token (19-23) string: "Shirt" | |
Glade 77, Token (24-24) ':': ":" | |
Glade 76, Rule (25-43) value ::= string | |
Glade 86, Token (25-43) string: "Red & White Stripes" | |
Glade 62, Rule (45-57) row ::= level name ':' value | |
Glade 91, Token (45-46) level: "++" | |
Glade 90, Rule (47-52) name ::= string | |
Glade 93, Token (47-52) string: "Shorts" | |
Glade 89, Token (53-53) ':': ":" | |
Glade 88, Rule (54-57) value ::= string | |
Glade 96, Token (54-57) string: "Blue" | |
Glade 61, Rule (59-70) row ::= level name ':' value | |
Glade 102, Token (59-60) level: "++" | |
Glade 101, Rule (61-67) name ::= string | |
Glade 105, Token (61-67) string: "Players" | |
Glade 100, Token (68-68) ':': ":" | |
Glade 99 has 2 symches | |
Glade 99, Symch 0, Rule (69-70) value ::= number | |
Glade 111, Token (69-70) number: "17" | |
Glade 99, Symch 1, Rule (69-70) value ::= string | |
Glade 112, Token (69-70) string: "17" | |
Glade 60, Rule (72-83) row ::= level name ':' value | |
Glade 118, Token (72-74) level: "+++" | |
Glade 117, Rule (75-80) name ::= string | |
Glade 120, Token (75-80) string: "Active" | |
Glade 116, Token (81-81) ':': ":" | |
Glade 115 has 2 symches | |
Glade 115, Symch 0, Rule (82-83) value ::= string | |
Glade 124, Token (82-83) string: "11" | |
Glade 115, Symch 1, Rule (82-83) value ::= number | |
Glade 125, Token (82-83) number: "11" | |
Glade 59, Rule (85-97) row ::= level name ':' value | |
Glade 132, Token (85-88) level: "++++" | |
Glade 131, Rule (89-95) name ::= string | |
Glade 135, Token (89-95) string: "Forward" | |
Glade 130, Token (96-96) ':': ":" | |
Glade 129 has 2 symches | |
Glade 129, Symch 0, Rule (97-97) value ::= number | |
Glade 141, Token (97-97) number: "2" | |
Glade 129, Symch 1, Rule (97-97) value ::= string | |
Glade 142, Token (97-97) string: "2" | |
Glade 58, Rule (99-112) row ::= level name ':' value | |
Glade 148, Token (99-102) level: "++++" | |
Glade 147, Rule (103-110) name ::= string | |
Glade 151, Token (103-110) string: "Midfield" | |
Glade 146, Token (111-111) ':': ":" | |
Glade 145 has 2 symches | |
Glade 145, Symch 0, Rule (112-112) value ::= number | |
Glade 156, Token (112-112) number: "4" | |
Glade 145, Symch 1, Rule (112-112) value ::= string | |
Glade 157, Token (112-112) string: "4" | |
Glade 57, Rule (114-126) row ::= level name ':' value | |
Glade 164, Token (114-117) level: "++++" | |
Glade 163, Rule (118-124) name ::= string | |
Glade 167, Token (118-124) string: "Defense" | |
Glade 162, Token (125-125) ':': ":" | |
Glade 161 has 2 symches | |
Glade 161, Symch 0, Rule (126-126) value ::= number | |
Glade 171, Token (126-126) number: "4" | |
Glade 161, Symch 1, Rule (126-126) value ::= string | |
Glade 172, Token (126-126) string: "4" | |
Glade 56, Rule (128-143) row ::= level name ':' value | |
Glade 179, Token (128-131) level: "++++" | |
Glade 178, Rule (132-141) name ::= string | |
Glade 182, Token (132-141) string: "Goalkeeper" | |
Glade 177, Token (142-142) ':': ":" | |
Glade 176 has 2 symches | |
Glade 176, Symch 0, Rule (143-143) value ::= number | |
Glade 188, Token (143-143) number: "1" | |
Glade 176, Symch 1, Rule (143-143) value ::= string | |
Glade 189, Token (143-143) string: "1" | |
Glade 55, Rule (145-159) row ::= level name ':' value | |
Glade 196, Token (145-147) level: "+++" | |
Glade 195, Rule (148-157) name ::= string | |
Glade 199, Token (148-157) string: "Substitute" | |
Glade 194, Token (158-158) ':': ":" | |
Glade 193 has 2 symches | |
Glade 193, Symch 0, Rule (159-159) value ::= number | |
Glade 205, Token (159-159) number: "6" | |
Glade 193, Symch 1, Rule (159-159) value ::= string | |
Glade 206, Token (159-159) string: "6" | |
Glade 54, Rule (161-173) row ::= level name ':' value | |
Glade 213, Token (161-164) level: "++++" | |
Glade 212, Rule (165-171) name ::= string | |
Glade 216, Token (165-171) string: "Forward" | |
Glade 211, Token (172-172) ':': ":" | |
Glade 210 has 2 symches | |
Glade 210, Symch 0, Rule (173-173) value ::= number | |
Glade 222, Token (173-173) number: "1" | |
Glade 210, Symch 1, Rule (173-173) value ::= string | |
Glade 223, Token (173-173) string: "1" | |
Glade 53, Rule (175-187) row ::= level name ':' value | |
Glade 230, Token (175-178) level: "++++" | |
Glade 229, Rule (179-185) name ::= string | |
Glade 232, Token (179-185) string: "Midfied" | |
Glade 228, Token (186-186) ':': ":" | |
Glade 227 has 2 symches | |
Glade 227, Symch 0, Rule (187-187) value ::= number | |
Glade 237, Token (187-187) number: "2" | |
Glade 227, Symch 1, Rule (187-187) value ::= string | |
Glade 238, Token (187-187) string: "2" | |
Glade 52, Rule (189-201) row ::= level name ':' value | |
Glade 244, Token (189-192) level: "++++" | |
Glade 243, Rule (193-199) name ::= string | |
Glade 247, Token (193-199) string: "Defense" | |
Glade 242, Token (200-200) ':': ":" | |
Glade 241 has 2 symches | |
Glade 241, Symch 0, Rule (201-201) value ::= number | |
Glade 253, Token (201-201) number: "3" | |
Glade 241, Symch 1, Rule (201-201) value ::= string | |
Glade 254, Token (201-201) string: "3" | |
Glade 51, Rule (203-217) row ::= level name ':' value | |
Glade 260, Token (203-206) level: "++++" | |
Glade 259, Rule (207-216) name ::= string | |
Glade 263, Token (207-216) string: "Goalkeeper" | |
Glade 258, Token (217-217) ':': ":" | |
Glade 257, Token (56-55) value: "" | |
Glade 50, Rule (220-231) row ::= level name ':' value | |
Glade 270, Token (220-220) level: "+" | |
Glade 269, Rule (221-224) name ::= string | |
Glade 272, Token (221-224) string: "Team" | |
Glade 268, Token (225-225) ':': ":" | |
Glade 267, Rule (226-231) value ::= string | |
Glade 274, Token (226-231) string: "Mexico" | |
Glade 49, Rule (233-245) row ::= level name ':' value | |
Glade 280, Token (233-234) level: "++" | |
Glade 279, Rule (235-239) name ::= string | |
Glade 283, Token (235-239) string: "Shirt" | |
Glade 278, Token (240-240) ':': ":" | |
Glade 277, Rule (241-245) value ::= string | |
Glade 287, Token (241-245) string: "Green" | |
Glade 48, Rule (247-260) row ::= level name ':' value | |
Glade 293, Token (247-248) level: "++" | |
Glade 292, Rule (249-254) name ::= string | |
Glade 296, Token (249-254) string: "Shorts" | |
Glade 291, Token (255-255) ':': ":" | |
Glade 290, Rule (256-260) value ::= string | |
Glade 300, Token (256-260) string: "White" | |
Glade 47, Rule (262-273) row ::= level name ':' value | |
Glade 305, Token (262-263) level: "++" | |
Glade 304, Rule (264-270) name ::= string | |
Glade 308, Token (264-270) string: "Players" | |
Glade 303, Token (271-271) ':': ":" | |
Glade 302 has 2 symches | |
Glade 302, Symch 0, Rule (272-273) value ::= number | |
Glade 314, Token (272-273) number: "17" | |
Glade 302, Symch 1, Rule (272-273) value ::= string | |
Glade 315, Token (272-273) string: "17" | |
Glade 46, Rule (275-286) row ::= level name ':' value | |
Glade 322, Token (275-277) level: "+++" | |
Glade 321, Rule (278-283) name ::= string | |
Glade 325, Token (278-283) string: "Active" | |
Glade 320, Token (284-284) ':': ":" | |
Glade 319 has 2 symches | |
Glade 319, Symch 0, Rule (285-286) value ::= number | |
Glade 331, Token (285-286) number: "11" | |
Glade 319, Symch 1, Rule (285-286) value ::= string | |
Glade 332, Token (285-286) string: "11" | |
Glade 45, Rule (288-300) row ::= level name ':' value | |
Glade 338, Token (288-291) level: "++++" | |
Glade 337, Rule (292-298) name ::= string | |
Glade 341, Token (292-298) string: "Forward" | |
Glade 336, Token (299-299) ':': ":" | |
Glade 335 has 2 symches | |
Glade 335, Symch 0, Rule (300-300) value ::= number | |
Glade 347, Token (300-300) number: "3" | |
Glade 335, Symch 1, Rule (300-300) value ::= string | |
Glade 348, Token (300-300) string: "3" | |
Glade 44, Rule (302-315) row ::= level name ':' value | |
Glade 355, Token (302-305) level: "++++" | |
Glade 354, Rule (306-313) name ::= string | |
Glade 358, Token (306-313) string: "Midfield" | |
Glade 353, Token (314-314) ':': ":" | |
Glade 352 has 2 symches | |
Glade 352, Symch 0, Rule (315-315) value ::= number | |
Glade 362, Token (315-315) number: "3" | |
Glade 352, Symch 1, Rule (315-315) value ::= string | |
Glade 363, Token (315-315) string: "3" | |
Glade 43, Rule (317-329) row ::= level name ':' value | |
Glade 370, Token (317-320) level: "++++" | |
Glade 369, Rule (321-327) name ::= string | |
Glade 373, Token (321-327) string: "Defense" | |
Glade 368, Token (328-328) ':': ":" | |
Glade 367 has 2 symches | |
Glade 367, Symch 0, Rule (329-329) value ::= number | |
Glade 379, Token (329-329) number: "4" | |
Glade 367, Symch 1, Rule (329-329) value ::= string | |
Glade 380, Token (329-329) string: "4" | |
Glade 42, Rule (331-346) row ::= level name ':' value | |
Glade 386, Token (331-334) level: "++++" | |
Glade 385, Rule (335-344) name ::= string | |
Glade 389, Token (335-344) string: "Goalkeeper" | |
Glade 384, Token (345-345) ':': ":" | |
Glade 383 has 2 symches | |
Glade 383, Symch 0, Rule (346-346) value ::= number | |
Glade 395, Token (346-346) number: "1" | |
Glade 383, Symch 1, Rule (346-346) value ::= string | |
Glade 396, Token (346-346) string: "1" | |
Glade 41, Rule (348-362) row ::= level name ':' value | |
Glade 403, Token (348-350) level: "+++" | |
Glade 402, Rule (351-360) name ::= string | |
Glade 405, Token (351-360) string: "Substitute" | |
Glade 401, Token (361-361) ':': ":" | |
Glade 400 has 2 symches | |
Glade 400, Symch 0, Rule (362-362) value ::= number | |
Glade 410, Token (362-362) number: "6" | |
Glade 400, Symch 1, Rule (362-362) value ::= string | |
Glade 411, Token (362-362) string: "6" | |
Glade 40, Rule (364-376) row ::= level name ':' value | |
Glade 418, Token (364-367) level: "++++" | |
Glade 417, Rule (368-374) name ::= string | |
Glade 421, Token (368-374) string: "Forward" | |
Glade 416, Token (375-375) ':': ":" | |
Glade 415 has 2 symches | |
Glade 415, Symch 0, Rule (376-376) value ::= number | |
Glade 427, Token (376-376) number: "2" | |
Glade 415, Symch 1, Rule (376-376) value ::= string | |
Glade 428, Token (376-376) string: "2" | |
Glade 39, Rule (378-391) row ::= level name ':' value | |
Glade 435, Token (378-381) level: "++++" | |
Glade 434, Rule (382-389) name ::= string | |
Glade 438, Token (382-389) string: "Midfield" | |
Glade 433, Token (390-390) ':': ":" | |
Glade 432 has 2 symches | |
Glade 432, Symch 0, Rule (391-391) value ::= number | |
Glade 444, Token (391-391) number: "1" | |
Glade 432, Symch 1, Rule (391-391) value ::= string | |
Glade 445, Token (391-391) string: "1" | |
Glade 38, Rule (393-405) row ::= level name ':' value | |
Glade 451, Token (393-396) level: "++++" | |
Glade 450, Rule (397-403) name ::= string | |
Glade 454, Token (397-403) string: "Defense" | |
Glade 449, Token (404-404) ':': ":" | |
Glade 448 has 2 symches | |
Glade 448, Symch 0, Rule (405-405) value ::= number | |
Glade 460, Token (405-405) number: "2" | |
Glade 448, Symch 1, Rule (405-405) value ::= string | |
Glade 461, Token (405-405) string: "2" | |
Glade 37, Rule (407-422) row ::= level name ':' value | |
Glade 468, Token (407-410) level: "++++" | |
Glade 467, Rule (411-420) name ::= string | |
Glade 471, Token (411-420) string: "Goalkeeper" | |
Glade 466, Token (421-421) ':': ":" | |
Glade 465 has 2 symches | |
Glade 465, Symch 0, Rule (422-422) value ::= number | |
Glade 477, Token (422-422) number: "1" | |
Glade 465, Symch 1, Rule (422-422) value ::= string | |
Glade 478, Token (422-422) string: "1" | |
Glade 11, Rule (8-15) table ::= row + | |
Glade 64 revisited | |
Glade 10, Rule (17-422) table ::= row + | |
Glade 63 revisited | |
Glade 62 revisited | |
Glade 61 revisited | |
Glade 60 revisited | |
Glade 59 revisited | |
Glade 58 revisited | |
Glade 57 revisited | |
Glade 56 revisited | |
Glade 55 revisited | |
Glade 54 revisited | |
Glade 53 revisited | |
Glade 52 revisited | |
Glade 51 revisited | |
Glade 50 revisited | |
Glade 49 revisited | |
Glade 48 revisited | |
Glade 47 revisited | |
Glade 46 revisited | |
Glade 45 revisited | |
Glade 44 revisited | |
Glade 43 revisited | |
Glade 42 revisited | |
Glade 41 revisited | |
Glade 40 revisited | |
Glade 39 revisited | |
Glade 38 revisited | |
Glade 37 revisited | |
Glade 13, Rule (8-43) table ::= row + | |
Glade 64 revisited | |
Glade 63 revisited | |
Glade 12, Rule (45-422) table ::= row + | |
Glade 62 revisited | |
Glade 61 revisited | |
Glade 60 revisited | |
Glade 59 revisited | |
Glade 58 revisited | |
Glade 57 revisited | |
Glade 56 revisited | |
Glade 55 revisited | |
Glade 54 revisited | |
Glade 53 revisited | |
Glade 52 revisited | |
Glade 51 revisited | |
Glade 50 revisited | |
Glade 49 revisited | |
Glade 48 revisited | |
Glade 47 revisited | |
Glade 46 revisited | |
Glade 45 revisited | |
Glade 44 revisited | |
Glade 43 revisited | |
Glade 42 revisited | |
Glade 41 revisited | |
Glade 40 revisited | |
Glade 39 revisited | |
Glade 38 revisited | |
Glade 37 revisited | |
Glade 11 revisited | |
Glade 14, Rule (17-43) table ::= row + | |
Glade 63 revisited | |
Glade 12 revisited | |
Glade 16, Rule (8-57) table ::= row + | |
Glade 64 revisited | |
Glade 63 revisited | |
Glade 62 revisited | |
Glade 15, Rule (59-422) table ::= row + | |
Glade 61 revisited | |
Glade 60 revisited | |
Glade 59 revisited | |
Glade 58 revisited | |
Glade 57 revisited | |
Glade 56 revisited | |
Glade 55 revisited | |
Glade 54 revisited | |
Glade 53 revisited | |
Glade 52 revisited | |
Glade 51 revisited | |
Glade 50 revisited | |
Glade 49 revisited | |
Glade 48 revisited | |
Glade 47 revisited | |
Glade 46 revisited | |
Glade 45 revisited | |
Glade 44 revisited | |
Glade 43 revisited | |
Glade 42 revisited | |
Glade 41 revisited | |
Glade 40 revisited | |
Glade 39 revisited | |
Glade 38 revisited | |
Glade 37 revisited | |
Glade 11 revisited | |
Glade 17, Rule (17-57) table ::= row + | |
Glade 63 revisited | |
Glade 62 revisited | |
Glade 15 revisited | |
Glade 13 revisited | |
Glade 18, Rule (45-57) table ::= row + | |
Glade 62 revisited | |
Glade 15 revisited | |
Glade 11 revisited | |
Glade 14 revisited | |
Glade 18 revisited | |
Glade 15 revisited | |
Glade 20, Rule (8-70) table ::= row + | |
Glade 64 revisited | |
Glade 63 revisited | |
Glade 62 revisited | |
Glade 61 revisited | |
Glade 19, Rule (72-422) table ::= row + | |
Glade 60 revisited | |
Glade 59 revisited | |
Glade 58 revisited | |
Glade 57 revisited | |
Glade 56 revisited | |
Glade 55 revisited | |
Glade 54 revisited | |
Glade 53 revisited | |
Glade 52 revisited | |
Glade 51 revisited | |
Glade 50 revisited | |
Glade 49 revisited | |
Glade 48 revisited | |
Glade 47 revisited | |
Glade 46 revisited | |
Glade 45 revisited | |
Glade 44 revisited | |
Glade 43 revisited | |
Glade 42 revisited | |
Glade 41 revisited | |
Glade 40 revisited | |
Glade 39 revisited | |
Glade 38 revisited | |
Glade 37 revisited | |
Glade 11 revisited | |
Glade 21, Rule (17-70) table ::= row + | |
Glade 63 revisited | |
Glade 62 revisited | |
Glade 61 revisited | |
Glade 19 revisited | |
Glade 13 revisited | |
Glade 22, Rule (45-70) table ::= row + | |
Glade 62 revisited | |
Glade 61 revisited | |
Glade 19 revisited | |
Glade 11 revisited | |
Glade 14 revisited | |
Glade 22 revisited | |
Glade 19 revisited | |
Glade 16 revisited | |
Glade 23, Rule (59-70) table ::= row + | |
Glade 61 revisited | |
Glade 19 revisited | |
Glade 11 revisited | |
Glade 17 revisited | |
Glade 23 revisited | |
Glade 19 revisited | |
Glade 13 revisited | |
Glade 18 revisited | |
Glade 23 revisited | |
Glade 19 revisited | |
Glade 11 revisited | |
Glade 14 revisited | |
Glade 18 revisited | |
Glade 23 revisited | |
Glade 19 revisited | |
Glade 25, Rule (8-83) table ::= row + | |
Glade 64 revisited | |
Glade 63 revisited | |
Glade 62 revisited | |
Glade 61 revisited | |
Glade 60 revisited | |
Glade 24, Rule (85-422) table ::= row + | |
Glade 59 revisited | |
Glade 58 revisited | |
Glade 57 revisited | |
Glade 56 revisited | |
Glade 55 revisited | |
Glade 54 revisited | |
Glade 53 revisited | |
Glade 52 revisited | |
Glade 51 revisited | |
Glade 50 revisited | |
Glade 49 revisited | |
Glade 48 revisited | |
Glade 47 revisited | |
Glade 46 revisited | |
Glade 45 revisited | |
Glade 44 revisited | |
Glade 43 revisited | |
Glade 42 revisited | |
Glade 41 revisited | |
Glade 40 revisited | |
Glade 39 revisited | |
Glade 38 revisited | |
Glade 37 revisited | |
Glade 11 revisited | |
Glade 26, Rule (17-83) table ::= row + | |
Glade 63 revisited | |
Glade 62 revisited | |
Glade 61 revisited | |
Glade 60 revisited | |
Glade 24 revisited | |
Glade 13 revisited | |
Glade 27, Rule (45-83) table ::= row + | |
Glade 62 revisited | |
Glade 61 revisited | |
Glade 60 revisited | |
Glade 24 revisited | |
Glade 11 revisited | |
Glade 14 revisited | |
Glade 27 revisited | |
Glade 24 revisited | |
Glade 16 revisited | |
Glade 28, Rule (59-83) table ::= row + | |
Glade 61 revisited | |
Glade 60 revisited | |
Glade 24 revisited | |
Glade 11 revisited | |
Glade 17 revisited | |
Glade 28 revisited | |
Glade 24 revisited | |
Glade 13 revisited | |
Glade 18 revisited | |
Glade 28 revisited | |
Glade 24 revisited | |
Glade 11 revisited | |
Glade 14 revisited | |
Glade 18 revisited | |
Glade 28 revisited | |
Glade 24 revisited | |
Glade 20 revisited | |
Glade 29, Rule (72-83) table ::= row + | |
Glade 60 revisited | |
Glade 24 revisited | |
Glade 11 revisited | |
Glade 21 revisited | |
Glade 29 revisited | |
Glade 24 revisited | |
Glade 13 revisited | |
Glade 22 revisited | |
Glade 29 revisited | |
Glade 24 revisited | |
Glade 11 revisited | |
Glade 14 revisited | |
Glade 22 revisited | |
Glade 29 revisited | |
Glade 24 revisited | |
Glade 16 revisited | |
Glade 23 revisited | |
Glade 29 revisited | |
Glade 24 revisited | |
Glade 11 revisited | |
Glade 17 revisited | |
Glade 23 revisited | |
Glade 29 revisited | |
Glade 24 revisited | |
Glade 13 revisited | |
Glade 18 revisited | |
Glade 23 revisited | |
Glade 29 revisited | |
Glade 24 revisited | |
Glade 11 revisited | |
Glade 14 revisited | |
Glade 18 revisited | |
Glade 23 revisited | |
Glade 29 revisited | |
Glade 24 revisited | |
Glade 31, Rule (8-97) table ::= row + | |
Glade 64 revisited | |
Glade 63 revisited | |
Glade 62 revisited | |
Glade 61 revisited | |
Glade 60 revisited | |
Glade 59 revisited | |
Glade 30, Rule (99-422) table ::= row + | |
Glade 58 revisited | |
Glade 57 revisited | |
Glade 56 revisited | |
Glade 55 revisited | |
Glade 54 revisited | |
Glade 53 revisited | |
Glade 52 revisited | |
Glade 51 revisited | |
Glade 50 revisited | |
Glade 49 revisited | |
Glade 48 revisited | |
Glade 47 revisited | |
Glade 46 revisited | |
Glade 45 revisited | |
Glade 44 revisited | |
Glade 43 revisited | |
Glade 42 revisited | |
Glade 41 revisited | |
Glade 40 revisited | |
Glade 39 revisited | |
Glade 38 revisited | |
Glade 37 revisited | |
Glade 11 revisited | |
Glade 32, Rule (17-97) table ::= row + | |
Glade 63 revisited | |
Glade 62 revisited | |
Glade 61 revisited | |
Glade 60 revisited | |
Glade 59 revisited | |
Glade 30 revisited | |
Glade 13 revisited | |
Glade 33, Rule (45-97) table ::= row + | |
Glade 62 revisited | |
Glade 61 revisited | |
Glade 60 revisited | |
Glade 59 revisited | |
Glade 30 revisited | |
Glade 11 revisited | |
Glade 14 revisited | |
Glade 33 revisited | |
Glade 30 revisited | |
Glade 16 revisited | |
Glade 34, Rule (59-97) table ::= row + | |
Glade 61 revisited | |
Glade 60 revisited | |
Glade 59 revisited | |
Glade 30 revisited | |
Glade 11 revisited | |
Glade 17 revisited | |
Glade 34 revisited | |
Glade 30 revisited | |
Glade 13 revisited | |
Glade 18 revisited | |
Glade 34 revisited | |
Glade 30 revisited | |
Glade 11 revisited | |
Glade 14 revisited | |
Glade 18 revisited | |
Glade 34 revisited | |
Glade 30 revisited | |
Glade 20 revisited | |
Glade 35, Rule (72-97) table ::= row + | |
Glade 60 revisited | |
Glade 59 revisited | |
Glade 30 revisited | |
at C:\cygwin\home\Ruslan\Marpa-R2-work\q26173372-asf.pl line 106. | |
# Output of asf->traverse(): (tries to enumerate ASTs, takes a long time) at C:\cygwin\home\Ruslan\Marpa-R2-work\q26173372-asf.pl line 110. | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use 5.010; | |
use strict; | |
use warnings; | |
use Data::Dumper; | |
$Data::Dumper::Indent = 0; | |
$Data::Dumper::Terse = 1; | |
$Data::Dumper::Deepcopy = 1; | |
use Carp::Always; # force stack trace | |
use Marpa::R2; | |
my $g = Marpa::R2::Scanless::G->new( { source => \(<<'END_OF_SOURCE'), | |
:default ::= action => [ name, value] | |
lexeme default = action => [ name, value ] latm => 1 | |
data ::= heading tables | |
heading ::= string | |
tables ::= table+ | |
table ::= row+ | |
row ::= level name ':' value | |
level ~ '+' | '++' | '+++' | '++++' | |
name ::= string | |
value ::= number | |
value ::= string | |
value ::= | |
string ~ [\w\& ]+ | |
number ~ [\d]+ | |
:discard ~ whitespace | |
whitespace ~ [\s]+ | |
END_OF_SOURCE | |
}); | |
my $input = <<EOI; | |
Soccer | |
+Team:US | |
++Shirt:Red & White Stripes | |
++Shorts:Blue | |
++Players:17 | |
+++Active:11 | |
++++Forward:2 | |
++++Midfield:4 | |
++++Defense:4 | |
++++Goalkeeper:1 | |
+++Substitute:6 | |
++++Forward:1 | |
++++Midfied:2 | |
++++Defense:3 | |
++++Goalkeeper: | |
+Team:Mexico | |
++Shirt:Green | |
++Shorts:White | |
++Players:17 | |
+++Active:11 | |
++++Forward:3 | |
++++Midfield:3 | |
++++Defense:4 | |
++++Goalkeeper:1 | |
+++Substitute:6 | |
++++Forward:2 | |
++++Midfield:1 | |
++++Defense:2 | |
++++Goalkeeper:1 | |
EOI | |
my $r = Marpa::R2::Scanless::R->new( { | |
max_parses => 3, | |
grammar => $g, | |
# trace_terminals => 1 | |
} ); | |
eval {$r->read(\$input)} || warn "Parse failure, progress report is:\n" . $r->show_progress; | |
# this runs ok | |
warn "\n# Output of \$r->ambiguous():"; | |
warn $r->ambiguous(); | |
# tries to enumerate ASTs, which *would* take a long time | |
# but max_parses does its job and it ends well | |
warn "\n# Output of \$r->value(), max_parses is in effect, so works ok:"; | |
$r->series_restart(); | |
eval { | |
# Marpa::R2::value() | |
my $i = 0; # 2 million reached | |
while ( defined( my $value_ref = $r->value() ) ) { | |
warn Dumper ${ $value_ref }; | |
} | |
}; | |
# Marpa::R2::Glade -- reports ambiguities ok | |
warn "\n# Output of asf_to_basic_tree()/array_diplay() from Marpa::R2::Glade:"; | |
$r->series_restart(); | |
my $asf = Marpa::R2::ASF->new( { slr => $r } ); | |
die 'No ASF' if not defined $asf; | |
my $output_as_array = asf_to_basic_tree($asf); | |
my $actual_output = array_display($output_as_array); | |
warn $actual_output; | |
# Marpa::R2::ASF -- tries to enumerate ASTs, takes a long time | |
# max_parses does not apply | |
warn "\n# Output of asf->traverse(): (tries to enumerate ASTs, takes a long time)"; | |
$r->series_restart(); | |
$asf = Marpa::R2::ASF->new( { slr => $r, factoring_max => 2 } ); | |
die 'No ASF' if not defined $asf; | |
exit; # or the process will need to be killed, | |
# 2^8192 values can be expected from 32 lines of input with this grammar. | |
my $full_result = $asf->traverse( {}, \&full_traverser ); | |
warn Dumper $full_result; | |
# ================================================================================ | |
# full_traverser code Marpa::R2::ASF | |
# | |
sub full_traverser { | |
# This routine converts the glade into a list of elements. It is called recursively. | |
my ($glade, $scratch) = @_; | |
my $rule_id = $glade->rule_id(); | |
my $symbol_id = $glade->symbol_id(); | |
my $symbol_name = $g->symbol_name($symbol_id); | |
# A token is a single choice, and we know enough to return it | |
if ( not defined $rule_id ) { | |
my $literal = $glade->literal(); | |
return ["($literal)"]; | |
} ## end if ( not defined $rule_id ) | |
# Our result will be a list of choices | |
my @return_value = (); | |
CHOICE: while (1) { | |
# The results at each position are a list of choices, so | |
# to produce a new result list, we need to take a Cartesian | |
# product of all the choices | |
my $length = $glade->rh_length(); | |
my @results = ( [] ); | |
for my $rh_ix ( 0 .. $length - 1 ) { | |
my @new_results = (); | |
for my $old_result (@results) { | |
my $child_value = $glade->rh_value($rh_ix); | |
for my $new_value ( @{ $child_value } ) { | |
push @new_results, [ @{$old_result}, $new_value ]; | |
} | |
} | |
@results = @new_results; | |
} ## end for my $rh_ix ( 0 .. $length - 1 ) | |
# Special case for the start rule | |
if ( $symbol_name eq '[:start]' ) { | |
return [ map { join q{}, @{$_} } @results ]; | |
} | |
# Now we have a list of choices, as a list of lists. Each sub list | |
# is a list of elements, which we need to join into | |
# a single element. The result will be to collapse | |
# one level of lists, and leave us with a list of | |
# elements | |
my $join_ws = q{ }; | |
$join_ws = qq{\n } if $symbol_name eq 'S'; | |
push @return_value, | |
map { '(' . $symbol_name . q{ } . ( join $join_ws, @{$_} ) . ')' } | |
@results; | |
# Look at the next alternative in this glade, or end the | |
# loop if there is none | |
last CHOICE if not defined $glade->next(); | |
} ## end CHOICE: while (1) | |
# Return the list of elements for this glade | |
return \@return_value; | |
} ## end sub full_traverser | |
# ================================================================================ | |
# Example code from Marpa::R2::Glade | |
# | |
sub asf_to_basic_tree { | |
my ( $asf, $glade ) = @_; | |
my $peak = $asf->peak(); | |
return glade_to_basic_tree( $asf, $peak, [] ); | |
} ## end sub asf_to_basic_tree | |
sub glade_to_basic_tree { | |
my ( $asf, $glade, $seen ) = @_; | |
return bless ["Glade $glade revisited"], 'My_Revisit' | |
if $seen->[$glade]; | |
$seen->[$glade] = 1; | |
my $grammar = $asf->grammar(); | |
my @symches = (); | |
my $symch_count = $asf->glade_symch_count($glade); | |
# get span | |
my ( $start, $length ) = $asf->glade_span($glade); | |
my $end = $start + $length - 1; | |
SYMCH: for ( my $symch_ix = 0; $symch_ix < $symch_count; $symch_ix++ ) { | |
my $rule_id = $asf->symch_rule_id( $glade, $symch_ix ); | |
if ( $rule_id < 0 ) { | |
my $literal = $asf->glade_literal($glade); | |
my $symbol_id = $asf->glade_symbol_id($glade); | |
my $display_form = $grammar->symbol_display_form($symbol_id); | |
push @symches, | |
bless [qq{Glade $glade, Token ($start-$end) $display_form: "$literal"}], | |
'My_Token'; | |
next SYMCH; | |
} ## end if ( $rule_id < 0 ) | |
# ignore any truncation of the factorings | |
my $factoring_count = | |
$asf->symch_factoring_count( $glade, $symch_ix ); | |
my @symch_description = ("Glade $glade"); | |
push @symch_description, "Symch $symch_ix" if $symch_count > 1; | |
push @symch_description, "Rule ($start-$end) " . $grammar->rule_show($rule_id); | |
my $symch_description = join q{, }, @symch_description; | |
my @factorings = ($symch_description); | |
for ( | |
my $factoring_ix = 0; | |
$factoring_ix < $factoring_count; | |
$factoring_ix++ | |
) | |
{ | |
my $downglades = | |
$asf->factoring_downglades( $glade, $symch_ix, | |
$factoring_ix ); | |
push @factorings, | |
bless [ map { glade_to_basic_tree( $asf, $_, $seen ) } | |
@{$downglades} ], 'My_Rule'; | |
} ## end for ( my $factoring_ix = 0; $factoring_ix < $factoring_count...) | |
if ( $factoring_count > 1 ) { | |
push @symches, | |
bless [ | |
"Glade $glade, symch $symch_ix has $factoring_count factorings", | |
@factorings | |
], | |
'My_Factorings'; | |
next SYMCH; | |
} ## end if ( $factoring_count > 1 ) | |
push @symches, bless [ @factorings[ 0, 1 ] ], 'My_Factorings'; | |
} ## end SYMCH: for ( my $symch_ix = 0; $symch_ix < $symch_count; ...) | |
return bless [ "Glade $glade has $symch_count symches", @symches ], | |
'My_Symches' | |
if $symch_count > 1; | |
return $symches[0]; | |
} ## end sub glade_to_basic_tree | |
sub array_display { | |
my ($array) = @_; | |
my ( undef, @lines ) = @{ array_lines_display($array) }; | |
my $text = q{}; | |
for my $line (@lines) { | |
my ( $indent, $body ) = @{$line}; | |
$indent -= 6; | |
$text .= ( q{ } x $indent ) . $body . "\n"; | |
} | |
return $text; | |
} ## end sub array_display | |
sub array_lines_display { | |
my ($array) = @_; | |
my $reftype = Scalar::Util::reftype($array) // '!undef!'; | |
return [ [ 0, $array ] ] if $reftype ne 'ARRAY'; | |
my @lines = (); | |
ELEMENT: for my $element ( @{$array} ) { | |
for my $line ( @{ array_lines_display($element) } ) { | |
my ( $indent, $body ) = @{$line}; | |
push @lines, [ $indent + 2, $body ]; | |
} | |
} ## end ELEMENT: for my $element ( @{$array} ) | |
return \@lines; | |
} ## end sub array_lines_display |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment