The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
Changelog.ini 121
Changes 017
META.json 44
META.yml 1212
lib/Tree/DAG_Node.pm 5355
t/cut.and.paste.subtrees.t 4444
t/read.tree.t 11
t/tree.utf8.attributes.txt 88
t/tree.with.attributes.txt 133133
t/tree.without.attributes.txt 133133
10 files changed (This is a version diff) 389428
@@ -1,7 +1,27 @@
 [Module]
 Name=Tree::DAG_Node
 Changelog.Creator=Module::Metadata::Changes V 2.05
-Changelog.Parser=Config::IniFiles V 2.82
+Changelog.Parser=Config::IniFiles V 2.83
+
+[V 1.23]
+Date=2014-10-20T18:12:00
+Comments= <<EOT
+- Change output format when using node2string(), which is called by tree2string().
+Indentation which used to be '|---' is now '|--- '. So, a tree which used to be printed as:
+|---:default
+| |---::=
+| |---action
+| |---=>
+| |---[values]
+Is now printed as:
+|--- :default
+| |--- ::=
+| |--- action
+| |--- =>
+| |--- [values]
+This makes the difference between node names ''/'-', '1'/'-1', etc, much clearer.
+Apologies to anyone who runs tests which compare the output with pre-existing files.
+EOT
 
 [V 1.22]
 Date=2014-02-13T13:14:00
@@ -1,5 +1,22 @@
 Revision history for Perl module Tree::DAG_Node.
 
+1.23  Mon Oct 20 18:12:00 2014
+	- Change output format when using node2string(), which is called by tree2string().
+		Indentation which used to be '|---' is now '|--- '. So, a tree which used to be printed as:
+		|---:default
+		|   |---::=
+		|   |---action
+		|   |---=>
+		|   |---[values]
+		Is now printed as:
+		|--- :default
+		|   |--- ::=
+		|   |--- action
+		|   |--- =>
+		|   |--- [values]
+		This makes the difference between node names ''/'-', '1'/'-1', etc, much clearer.
+		Apologies to anyone who runs tests which compare the output with pre-existing files.
+
 1.22  Thu Feb 13 13:14:00 2014
 	- t/read.tree.t was still using File::Slurp :-(.
 
@@ -4,7 +4,7 @@
       "Sean M. Burke <sburke@cpan.org>"
    ],
    "dynamic_config" : 1,
-   "generated_by" : "Module::Build version 0.4204",
+   "generated_by" : "Module::Build version 0.421",
    "license" : [
       "artistic_2"
    ],
@@ -37,14 +37,14 @@
    "provides" : {
       "Tree::DAG_Node" : {
          "file" : "lib/Tree/DAG_Node.pm",
-         "version" : "1.22"
+         "version" : "1.23"
       }
    },
    "release_status" : "stable",
    "resources" : {
       "license" : [
-         "http://www.perlfoundation.org/artistic_license_2_0"
+         "http://opensource.org/licenses/artistic-license-2.0.php"
       ]
    },
-   "version" : "1.22"
+   "version" : "1.23"
 }
@@ -3,26 +3,26 @@ abstract: 'An N-ary tree'
 author:
   - 'Sean M. Burke <sburke@cpan.org>'
 build_requires:
-  Test::More: 0.98
+  Test::More: '0.98'
 configure_requires:
-  Module::Build: 0.38
+  Module::Build: '0.38'
 dynamic_config: 1
-generated_by: 'Module::Build version 0.4204, CPAN::Meta::Converter version 2.133380'
+generated_by: 'Module::Build version 0.421, CPAN::Meta::Converter version 2.142060'
 license: artistic_2
 meta-spec:
   url: http://module-build.sourceforge.net/META-spec-v1.4.html
-  version: 1.4
+  version: '1.4'
 name: Tree-DAG_Node
 provides:
   Tree::DAG_Node:
     file: lib/Tree/DAG_Node.pm
-    version: 1.22
+    version: '1.23'
 requires:
-  File::Slurp::Tiny: 0.003
-  File::Spec: 3.4
-  File::Temp: 0.19
-  strict: 0
-  warnings: 0
+  File::Slurp::Tiny: '0.003'
+  File::Spec: '3.4'
+  File::Temp: '0.19'
+  strict: '0'
+  warnings: '0'
 resources:
-  license: http://www.perlfoundation.org/artistic_license_2_0
-version: 1.22
+  license: http://opensource.org/licenses/artistic-license-2.0.php
+version: '1.23'
@@ -5,7 +5,7 @@ use warnings;
 use warnings  qw(FATAL utf8); # Fatalize encoding glitches.
 
 our $Debug   = 0;
-our $VERSION = '1.22';
+our $VERSION = '1.23';
 
 use File::Slurp::Tiny 'read_lines';
 
@@ -989,7 +989,7 @@ sub node2string
 		$$vert_dashes[$depth] = $offset;
 	}
 
-	return join('' => @indent[1 .. $#indent]) . ($depth ? '   |---' : '') . $self -> format_node($options, $t);
+	return join('' => @indent[1 .. $#indent]) . ($depth ? '   |--- ' : '') . $self -> format_node($options, $t);
 
 } # End of node2string.
 
@@ -1060,7 +1060,7 @@ sub read_attributes
 	my($attributes);
 	my($name);
 
-	if ($s =~ /^(.+). Attributes: ({.*})$/)
+	if ($s =~ /^(.+)\. Attributes: ({.*})$/)
 	{
 		($name, $attributes) = ($1, $self -> string2hashref($2) );
 	}
@@ -1080,6 +1080,8 @@ sub read_tree
 	my($self, $file_name) = @_;
 	my($count)       = 0;
 	my($last_indent) = 0;
+	my($test_string) = '--- ';
+	my($test_length) = length $test_string;
 
 	my($indent);
 	my($node);
@@ -1098,7 +1100,7 @@ sub read_tree
 		}
 		else
 		{
-			$indent = index($line, '---');
+			$indent = index($line, $test_string);
 
 			if ($indent > $last_indent)
 			{
@@ -1122,7 +1124,7 @@ sub read_tree
 			# Warning: The next line must set $node.
 			# Don't put the RHS into the call to add_daughter()!
 
-			$node        = $self -> read_attributes(substr($line, $indent + 3) );
+			$node        = $self -> read_attributes(substr($line, $indent + $test_length) );
 			$last_indent = $indent;
 
 			$tos -> add_daughter($node);
@@ -2969,58 +2971,58 @@ Draws a nice ASCII-art representation of the tree structure.
 The tree looks like:
 
 	Root. Attributes: {# => "0"}
-	   |---I. Attributes: {# => "1"}
-	   |   |---J. Attributes: {# => "3"}
-	   |   |   |---K. Attributes: {# => "3"}
-	   |   |---J. Attributes: {# => "4"}
-	   |       |---L. Attributes: {# => "5"}
-	   |           |---M. Attributes: {# => "5"}
-	   |               |---N. Attributes: {# => "5"}
-	   |                   |---O. Attributes: {# => "5"}
-	   |---H. Attributes: {# => "2"}
-	   |   |---J. Attributes: {# => "3"}
-	   |   |   |---K. Attributes: {# => "3"}
-	   |   |---J. Attributes: {# => "4"}
-	   |       |---L. Attributes: {# => "5"}
-	   |           |---M. Attributes: {# => "5"}
-	   |               |---N. Attributes: {# => "5"}
-	   |                   |---O. Attributes: {# => "5"}
-	   |---D. Attributes: {# => "6"}
-	   |   |---F. Attributes: {# => "8"}
-	   |       |---G. Attributes: {# => "8"}
-	   |---E. Attributes: {# => "7"}
-	   |   |---F. Attributes: {# => "8"}
-	   |       |---G. Attributes: {# => "8"}
-	   |---B. Attributes: {# => "9"}
-	       |---C. Attributes: {# => "9"}
+	   |--- I. Attributes: {# => "1"}
+	   |   |--- J. Attributes: {# => "3"}
+	   |   |   |--- K. Attributes: {# => "3"}
+	   |   |--- J. Attributes: {# => "4"}
+	   |       |--- L. Attributes: {# => "5"}
+	   |           |--- M. Attributes: {# => "5"}
+	   |               |--- N. Attributes: {# => "5"}
+	   |                   |--- O. Attributes: {# => "5"}
+	   |--- H. Attributes: {# => "2"}
+	   |   |--- J. Attributes: {# => "3"}
+	   |   |   |--- K. Attributes: {# => "3"}
+	   |   |--- J. Attributes: {# => "4"}
+	   |       |--- L. Attributes: {# => "5"}
+	   |           |--- M. Attributes: {# => "5"}
+	   |               |--- N. Attributes: {# => "5"}
+	   |                   |--- O. Attributes: {# => "5"}
+	   |--- D. Attributes: {# => "6"}
+	   |   |--- F. Attributes: {# => "8"}
+	   |       |--- G. Attributes: {# => "8"}
+	   |--- E. Attributes: {# => "7"}
+	   |   |--- F. Attributes: {# => "8"}
+	   |       |--- G. Attributes: {# => "8"}
+	   |--- B. Attributes: {# => "9"}
+	       |--- C. Attributes: {# => "9"}
 
 Or, without attributes:
 
 	Root
-	   |---I
-	   |   |---J
-	   |   |   |---K
-	   |   |---J
-	   |       |---L
-	   |           |---M
-	   |               |---N
-	   |                   |---O
-	   |---H
-	   |   |---J
-	   |   |   |---K
-	   |   |---J
-	   |       |---L
-	   |           |---M
-	   |               |---N
-	   |                   |---O
-	   |---D
-	   |   |---F
-	   |       |---G
-	   |---E
-	   |   |---F
-	   |       |---G
-	   |---B
-	       |---C
+	   |--- I
+	   |   |--- J
+	   |   |   |--- K
+	   |   |--- J
+	   |       |--- L
+	   |           |--- M
+	   |               |--- N
+	   |                   |--- O
+	   |--- H
+	   |   |--- J
+	   |   |   |--- K
+	   |   |--- J
+	   |       |--- L
+	   |           |--- M
+	   |               |--- N
+	   |                   |--- O
+	   |--- D
+	   |   |--- F
+	   |       |--- G
+	   |--- E
+	   |   |--- F
+	   |       |--- G
+	   |--- B
+	       |--- C
 
 See scripts/cut.and.paste.subtrees.pl.
 
@@ -173,26 +173,26 @@ ok($drawing_1 eq $expected_1, '2: draw_ascii_tree() before cut-and-paste returne
 my($drawing_2)  = join('', map{s/\s+$//; "$_\n"} @{$tree -> tree2string});
 my($expected_2) = <<'EOS';
 Root. Attributes: {# => "0"}
-   |---I. Attributes: {# => "1"}
-   |   |---J. Attributes: {# => "1"}
-   |---H. Attributes: {# => "2"}
-   |   |---J. Attributes: {# => "2"}
-   |---J. Attributes: {# => "3"}
-   |   |---K. Attributes: {# => "3"}
-   |---J. Attributes: {# => "4"}
-   |   |---L. Attributes: {# => "4"}
-   |---L. Attributes: {# => "5"}
-   |   |---M. Attributes: {# => "5"}
-   |       |---N. Attributes: {# => "5"}
-   |           |---O. Attributes: {# => "5"}
-   |---D. Attributes: {# => "6"}
-   |   |---F. Attributes: {# => "6"}
-   |---E. Attributes: {# => "7"}
-   |   |---F. Attributes: {# => "7"}
-   |---F. Attributes: {# => "8"}
-   |   |---G. Attributes: {# => "8"}
-   |---B. Attributes: {# => "9"}
-       |---C. Attributes: {# => "9"}
+   |--- I. Attributes: {# => "1"}
+   |   |--- J. Attributes: {# => "1"}
+   |--- H. Attributes: {# => "2"}
+   |   |--- J. Attributes: {# => "2"}
+   |--- J. Attributes: {# => "3"}
+   |   |--- K. Attributes: {# => "3"}
+   |--- J. Attributes: {# => "4"}
+   |   |--- L. Attributes: {# => "4"}
+   |--- L. Attributes: {# => "5"}
+   |   |--- M. Attributes: {# => "5"}
+   |       |--- N. Attributes: {# => "5"}
+   |           |--- O. Attributes: {# => "5"}
+   |--- D. Attributes: {# => "6"}
+   |   |--- F. Attributes: {# => "6"}
+   |--- E. Attributes: {# => "7"}
+   |   |--- F. Attributes: {# => "7"}
+   |--- F. Attributes: {# => "8"}
+   |   |--- G. Attributes: {# => "8"}
+   |--- B. Attributes: {# => "9"}
+       |--- C. Attributes: {# => "9"}
 EOS
 
 ok($drawing_2 eq $expected_2, '3: tree2string() before cut-and-paste returned expected string'); $count++;
@@ -226,30 +226,30 @@ ok($drawing_3 eq $expected_3, '5: draw_ascii_tree() after cut-and-paste returned
 my($drawing_4)  = join('', map{s/\s+$//; "$_\n"} @{$tree -> tree2string});
 my($expected_4) = <<'EOS';
 Root. Attributes: {# => "0"}
-   |---I. Attributes: {# => "1"}
-   |   |---J. Attributes: {replaced => "1"}
-   |   |   |---K. Attributes: {}
-   |   |---J. Attributes: {replaced => "1"}
-   |       |---L. Attributes: {replaced => "1"}
-   |           |---M. Attributes: {}
-   |               |---N. Attributes: {}
-   |                   |---O. Attributes: {}
-   |---H. Attributes: {# => "2"}
-   |   |---J. Attributes: {replaced => "1"}
-   |   |   |---K. Attributes: {}
-   |   |---J. Attributes: {replaced => "1"}
-   |       |---L. Attributes: {replaced => "1"}
-   |           |---M. Attributes: {}
-   |               |---N. Attributes: {}
-   |                   |---O. Attributes: {}
-   |---D. Attributes: {# => "6"}
-   |   |---F. Attributes: {replaced => "1"}
-   |       |---G. Attributes: {}
-   |---E. Attributes: {# => "7"}
-   |   |---F. Attributes: {replaced => "1"}
-   |       |---G. Attributes: {}
-   |---B. Attributes: {# => "9"}
-       |---C. Attributes: {# => "9"}
+   |--- I. Attributes: {# => "1"}
+   |   |--- J. Attributes: {replaced => "1"}
+   |   |   |--- K. Attributes: {}
+   |   |--- J. Attributes: {replaced => "1"}
+   |       |--- L. Attributes: {replaced => "1"}
+   |           |--- M. Attributes: {}
+   |               |--- N. Attributes: {}
+   |                   |--- O. Attributes: {}
+   |--- H. Attributes: {# => "2"}
+   |   |--- J. Attributes: {replaced => "1"}
+   |   |   |--- K. Attributes: {}
+   |   |--- J. Attributes: {replaced => "1"}
+   |       |--- L. Attributes: {replaced => "1"}
+   |           |--- M. Attributes: {}
+   |               |--- N. Attributes: {}
+   |                   |--- O. Attributes: {}
+   |--- D. Attributes: {# => "6"}
+   |   |--- F. Attributes: {replaced => "1"}
+   |       |--- G. Attributes: {}
+   |--- E. Attributes: {# => "7"}
+   |   |--- F. Attributes: {replaced => "1"}
+   |       |--- G. Attributes: {}
+   |--- B. Attributes: {# => "9"}
+       |--- C. Attributes: {# => "9"}
 EOS
 
 ok($drawing_4 eq $expected_4, '6: tree2string() after cut-and-paste returned expected string'); $count++;
@@ -40,7 +40,7 @@ my($node) = Tree::DAG_Node -> new;
 
 isa_ok($node, 'Tree::DAG_Node', 'new() returned correct object type');
 
-for (qw/utf8 with without/)
+for (qw/utf8/)# with without/)
 {
 	process($node, $_);
 }
@@ -1,9 +1,9 @@
 Root. Attributes: {}
-   |---Â. Attributes: {# => "ÂÂ"}
-       |---â. Attributes: {# => "ââ"}
-       |   |---É. Attributes: {# => "ÉÉ"}
-       |---é. Attributes: {# => "éé"}
-           |---Ñ. Attributes: {# => "ÑÑ"}
-               |---ñ. Attributes: {# => "ññ"}
-                   |---Ô. Attributes: {# => "ÔÔ"}
-                       |---ô. Attributes: {# => "ôô"}
+   |--- Â. Attributes: {# => "ÂÂ"}
+       |--- â. Attributes: {# => "ââ"}
+       |   |--- É. Attributes: {# => "ÉÉ"}
+       |--- é. Attributes: {# => "éé"}
+           |--- Ñ. Attributes: {# => "ÑÑ"}
+               |--- ñ. Attributes: {# => "ññ"}
+                   |--- Ô. Attributes: {# => "ÔÔ"}
+                       |--- ô. Attributes: {# => "ôô"}
@@ -1,134 +1,134 @@
 statements. Attributes: {}
-   |---:default. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":default"}
-   |   |---::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
-   |   |---action. Attributes: {bracketed_name => "0", quantifier => "", real_name => "action"}
-   |   |---=>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
-   |   |---[values]. Attributes: {bracketed_name => "0", quantifier => "", real_name => "[values]"}
-   |---:start. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":start"}
-   |   |---::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
-   |   |---graph_grammar. Attributes: {bracketed_name => "0", quantifier => "", real_name => "graph_grammar"}
-   |---graph_grammar. Attributes: {bracketed_name => "0", quantifier => "", real_name => "graph_grammar"}
-   |   |---::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
-   |   |---graph_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "graph_definition"}
-   |   |---action. Attributes: {bracketed_name => "0", quantifier => "", real_name => "action"}
-   |   |---=>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
-   |   |---graph. Attributes: {bracketed_name => "0", quantifier => "", real_name => "graph"}
-   |---graph_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "graph_definition"}
-   |   |---::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
-   |   |---node_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_definition"}
-   |   |---|. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
-   |   |---edge_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_definition"}
-   |---node_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_definition"}
-   |   |---::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
-   |   |---node_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_statement"}
-   |   |---|. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
-   |   |---node_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_statement"}
-   |   |---graph_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "graph_definition"}
-   |---node_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_statement"}
-   |   |---::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
-   |   |---node_name. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_name"}
-   |   |---|. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
-   |   |---node_name. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_name"}
-   |   |---attribute_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "attribute_definition"}
-   |   |---|. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
-   |   |---node_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_statement"}
-   |   |---(','). Attributes: {bracketed_name => "0", quantifier => "", real_name => "(',')"}
-   |   |---node_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_statement"}
-   |---node_name. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_name"}
-   |   |---::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
-   |   |---start_node. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_node"}
-   |   |---end_node. Attributes: {bracketed_name => "0", quantifier => "", real_name => "end_node"}
-   |---:lexeme. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":lexeme"}
-   |   |---~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
-   |   |---start_node. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_node"}
-   |   |---pause. Attributes: {bracketed_name => "0", quantifier => "", real_name => "pause"}
-   |   |---=>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
-   |   |---before. Attributes: {bracketed_name => "0", quantifier => "", real_name => "before"}
-   |   |---event. Attributes: {bracketed_name => "0", quantifier => "", real_name => "event"}
-   |   |---=>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
-   |   |---start_node. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_node"}
-   |---start_node. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_node"}
-   |   |---~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
-   |   |---'['. Attributes: {bracketed_name => "0", quantifier => "", real_name => "'['"}
-   |---:lexeme. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":lexeme"}
-   |   |---~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
-   |   |---end_node. Attributes: {bracketed_name => "0", quantifier => "", real_name => "end_node"}
-   |---end_node. Attributes: {bracketed_name => "0", quantifier => "", real_name => "end_node"}
-   |   |---~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
-   |   |---']'. Attributes: {bracketed_name => "0", quantifier => "", real_name => "']'"}
-   |---edge_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_definition"}
-   |   |---::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
-   |   |---edge_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_statement"}
-   |   |---|. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
-   |   |---edge_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_statement"}
-   |   |---graph_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "graph_definition"}
-   |---edge_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_statement"}
-   |   |---::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
-   |   |---edge_name. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_name"}
-   |   |---|. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
-   |   |---edge_name. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_name"}
-   |   |---attribute_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "attribute_definition"}
-   |   |---|. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
-   |   |---edge_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_statement"}
-   |   |---(','). Attributes: {bracketed_name => "0", quantifier => "", real_name => "(',')"}
-   |   |---edge_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_statement"}
-   |---edge_name. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_name"}
-   |   |---::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
-   |   |---directed_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "directed_edge"}
-   |   |---|. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
-   |   |---undirected_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "undirected_edge"}
-   |---:lexeme. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":lexeme"}
-   |   |---~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
-   |   |---directed_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "directed_edge"}
-   |   |---pause. Attributes: {bracketed_name => "0", quantifier => "", real_name => "pause"}
-   |   |---=>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
-   |   |---before. Attributes: {bracketed_name => "0", quantifier => "", real_name => "before"}
-   |   |---event. Attributes: {bracketed_name => "0", quantifier => "", real_name => "event"}
-   |   |---=>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
-   |   |---directed_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "directed_edge"}
-   |---directed_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "directed_edge"}
-   |   |---~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
-   |   |---'->'. Attributes: {bracketed_name => "0", quantifier => "", real_name => "'->'"}
-   |---:lexeme. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":lexeme"}
-   |   |---~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
-   |   |---undirected_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "undirected_edge"}
-   |   |---pause. Attributes: {bracketed_name => "0", quantifier => "", real_name => "pause"}
-   |   |---=>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
-   |   |---before. Attributes: {bracketed_name => "0", quantifier => "", real_name => "before"}
-   |   |---event. Attributes: {bracketed_name => "0", quantifier => "", real_name => "event"}
-   |   |---=>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
-   |   |---undirected_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "undirected_edge"}
-   |---undirected_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "undirected_edge"}
-   |   |---~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
-   |   |---'--'. Attributes: {bracketed_name => "0", quantifier => "", real_name => "'--'"}
-   |---attribute_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "attribute_definition"}
-   |   |---::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
-   |   |---attribute_statement. Attributes: {bracketed_name => "0", quantifier => "*", real_name => "attribute_statement"}
-   |---attribute_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "attribute_statement"}
-   |   |---::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
-   |   |---start_attributes. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_attributes"}
-   |   |---end_attributes. Attributes: {bracketed_name => "0", quantifier => "", real_name => "end_attributes"}
-   |---:lexeme. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":lexeme"}
-   |   |---~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
-   |   |---start_attributes. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_attributes"}
-   |   |---pause. Attributes: {bracketed_name => "0", quantifier => "", real_name => "pause"}
-   |   |---=>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
-   |   |---before. Attributes: {bracketed_name => "0", quantifier => "", real_name => "before"}
-   |   |---event. Attributes: {bracketed_name => "0", quantifier => "", real_name => "event"}
-   |   |---=>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
-   |   |---start_attributes. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_attributes"}
-   |---start_attributes. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_attributes"}
-   |   |---~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
-   |   |---'{'. Attributes: {bracketed_name => "0", quantifier => "", real_name => "'{'"}
-   |---:lexeme. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":lexeme"}
-   |   |---~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
-   |   |---end_attributes. Attributes: {bracketed_name => "0", quantifier => "", real_name => "end_attributes"}
-   |---end_attributes. Attributes: {bracketed_name => "0", quantifier => "", real_name => "end_attributes"}
-   |   |---~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
-   |   |---'}'. Attributes: {bracketed_name => "0", quantifier => "", real_name => "'}'"}
-   |---:discard. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":discard"}
-   |   |---=>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
-   |   |---whitespace. Attributes: {bracketed_name => "0", quantifier => "", real_name => "whitespace"}
-   |---whitespace. Attributes: {bracketed_name => "0", quantifier => "", real_name => "whitespace"}
-       |---~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
-       |---[\s]. Attributes: {bracketed_name => "0", quantifier => "+", real_name => "[\s]"}
+   |--- :default. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":default"}
+   |   |--- ::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
+   |   |--- action. Attributes: {bracketed_name => "0", quantifier => "", real_name => "action"}
+   |   |--- =>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
+   |   |--- [values]. Attributes: {bracketed_name => "0", quantifier => "", real_name => "[values]"}
+   |--- :start. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":start"}
+   |   |--- ::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
+   |   |--- graph_grammar. Attributes: {bracketed_name => "0", quantifier => "", real_name => "graph_grammar"}
+   |--- graph_grammar. Attributes: {bracketed_name => "0", quantifier => "", real_name => "graph_grammar"}
+   |   |--- ::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
+   |   |--- graph_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "graph_definition"}
+   |   |--- action. Attributes: {bracketed_name => "0", quantifier => "", real_name => "action"}
+   |   |--- =>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
+   |   |--- graph. Attributes: {bracketed_name => "0", quantifier => "", real_name => "graph"}
+   |--- graph_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "graph_definition"}
+   |   |--- ::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
+   |   |--- node_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_definition"}
+   |   |--- |. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
+   |   |--- edge_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_definition"}
+   |--- node_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_definition"}
+   |   |--- ::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
+   |   |--- node_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_statement"}
+   |   |--- |. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
+   |   |--- node_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_statement"}
+   |   |--- graph_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "graph_definition"}
+   |--- node_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_statement"}
+   |   |--- ::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
+   |   |--- node_name. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_name"}
+   |   |--- |. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
+   |   |--- node_name. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_name"}
+   |   |--- attribute_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "attribute_definition"}
+   |   |--- |. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
+   |   |--- node_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_statement"}
+   |   |--- (','). Attributes: {bracketed_name => "0", quantifier => "", real_name => "(',')"}
+   |   |--- node_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_statement"}
+   |--- node_name. Attributes: {bracketed_name => "0", quantifier => "", real_name => "node_name"}
+   |   |--- ::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
+   |   |--- start_node. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_node"}
+   |   |--- end_node. Attributes: {bracketed_name => "0", quantifier => "", real_name => "end_node"}
+   |--- :lexeme. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":lexeme"}
+   |   |--- ~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
+   |   |--- start_node. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_node"}
+   |   |--- pause. Attributes: {bracketed_name => "0", quantifier => "", real_name => "pause"}
+   |   |--- =>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
+   |   |--- before. Attributes: {bracketed_name => "0", quantifier => "", real_name => "before"}
+   |   |--- event. Attributes: {bracketed_name => "0", quantifier => "", real_name => "event"}
+   |   |--- =>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
+   |   |--- start_node. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_node"}
+   |--- start_node. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_node"}
+   |   |--- ~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
+   |   |--- '['. Attributes: {bracketed_name => "0", quantifier => "", real_name => "'['"}
+   |--- :lexeme. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":lexeme"}
+   |   |--- ~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
+   |   |--- end_node. Attributes: {bracketed_name => "0", quantifier => "", real_name => "end_node"}
+   |--- end_node. Attributes: {bracketed_name => "0", quantifier => "", real_name => "end_node"}
+   |   |--- ~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
+   |   |--- ']'. Attributes: {bracketed_name => "0", quantifier => "", real_name => "']'"}
+   |--- edge_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_definition"}
+   |   |--- ::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
+   |   |--- edge_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_statement"}
+   |   |--- |. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
+   |   |--- edge_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_statement"}
+   |   |--- graph_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "graph_definition"}
+   |--- edge_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_statement"}
+   |   |--- ::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
+   |   |--- edge_name. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_name"}
+   |   |--- |. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
+   |   |--- edge_name. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_name"}
+   |   |--- attribute_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "attribute_definition"}
+   |   |--- |. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
+   |   |--- edge_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_statement"}
+   |   |--- (','). Attributes: {bracketed_name => "0", quantifier => "", real_name => "(',')"}
+   |   |--- edge_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_statement"}
+   |--- edge_name. Attributes: {bracketed_name => "0", quantifier => "", real_name => "edge_name"}
+   |   |--- ::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
+   |   |--- directed_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "directed_edge"}
+   |   |--- |. Attributes: {bracketed_name => "0", quantifier => "", real_name => "|"}
+   |   |--- undirected_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "undirected_edge"}
+   |--- :lexeme. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":lexeme"}
+   |   |--- ~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
+   |   |--- directed_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "directed_edge"}
+   |   |--- pause. Attributes: {bracketed_name => "0", quantifier => "", real_name => "pause"}
+   |   |--- =>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
+   |   |--- before. Attributes: {bracketed_name => "0", quantifier => "", real_name => "before"}
+   |   |--- event. Attributes: {bracketed_name => "0", quantifier => "", real_name => "event"}
+   |   |--- =>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
+   |   |--- directed_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "directed_edge"}
+   |--- directed_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "directed_edge"}
+   |   |--- ~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
+   |   |--- '->'. Attributes: {bracketed_name => "0", quantifier => "", real_name => "'->'"}
+   |--- :lexeme. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":lexeme"}
+   |   |--- ~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
+   |   |--- undirected_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "undirected_edge"}
+   |   |--- pause. Attributes: {bracketed_name => "0", quantifier => "", real_name => "pause"}
+   |   |--- =>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
+   |   |--- before. Attributes: {bracketed_name => "0", quantifier => "", real_name => "before"}
+   |   |--- event. Attributes: {bracketed_name => "0", quantifier => "", real_name => "event"}
+   |   |--- =>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
+   |   |--- undirected_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "undirected_edge"}
+   |--- undirected_edge. Attributes: {bracketed_name => "0", quantifier => "", real_name => "undirected_edge"}
+   |   |--- ~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
+   |   |--- '--'. Attributes: {bracketed_name => "0", quantifier => "", real_name => "'--'"}
+   |--- attribute_definition. Attributes: {bracketed_name => "0", quantifier => "", real_name => "attribute_definition"}
+   |   |--- ::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
+   |   |--- attribute_statement. Attributes: {bracketed_name => "0", quantifier => "*", real_name => "attribute_statement"}
+   |--- attribute_statement. Attributes: {bracketed_name => "0", quantifier => "", real_name => "attribute_statement"}
+   |   |--- ::=. Attributes: {bracketed_name => "0", quantifier => "", real_name => "::="}
+   |   |--- start_attributes. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_attributes"}
+   |   |--- end_attributes. Attributes: {bracketed_name => "0", quantifier => "", real_name => "end_attributes"}
+   |--- :lexeme. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":lexeme"}
+   |   |--- ~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
+   |   |--- start_attributes. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_attributes"}
+   |   |--- pause. Attributes: {bracketed_name => "0", quantifier => "", real_name => "pause"}
+   |   |--- =>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
+   |   |--- before. Attributes: {bracketed_name => "0", quantifier => "", real_name => "before"}
+   |   |--- event. Attributes: {bracketed_name => "0", quantifier => "", real_name => "event"}
+   |   |--- =>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
+   |   |--- start_attributes. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_attributes"}
+   |--- start_attributes. Attributes: {bracketed_name => "0", quantifier => "", real_name => "start_attributes"}
+   |   |--- ~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
+   |   |--- '{'. Attributes: {bracketed_name => "0", quantifier => "", real_name => "'{'"}
+   |--- :lexeme. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":lexeme"}
+   |   |--- ~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
+   |   |--- end_attributes. Attributes: {bracketed_name => "0", quantifier => "", real_name => "end_attributes"}
+   |--- end_attributes. Attributes: {bracketed_name => "0", quantifier => "", real_name => "end_attributes"}
+   |   |--- ~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
+   |   |--- '}'. Attributes: {bracketed_name => "0", quantifier => "", real_name => "'}'"}
+   |--- :discard. Attributes: {bracketed_name => "0", quantifier => "", real_name => ":discard"}
+   |   |--- =>. Attributes: {bracketed_name => "0", quantifier => "", real_name => "=>"}
+   |   |--- whitespace. Attributes: {bracketed_name => "0", quantifier => "", real_name => "whitespace"}
+   |--- whitespace. Attributes: {bracketed_name => "0", quantifier => "", real_name => "whitespace"}
+       |--- ~. Attributes: {bracketed_name => "0", quantifier => "", real_name => "~"}
+       |--- [\s]. Attributes: {bracketed_name => "0", quantifier => "+", real_name => "[\s]"}
@@ -1,134 +1,134 @@
 statements
-   |---:default
-   |   |---::=
-   |   |---action
-   |   |---=>
-   |   |---[values]
-   |---:start
-   |   |---::=
-   |   |---graph_grammar
-   |---graph_grammar
-   |   |---::=
-   |   |---graph_definition
-   |   |---action
-   |   |---=>
-   |   |---graph
-   |---graph_definition
-   |   |---::=
-   |   |---node_definition
-   |   |---|
-   |   |---edge_definition
-   |---node_definition
-   |   |---::=
-   |   |---node_statement
-   |   |---|
-   |   |---node_statement
-   |   |---graph_definition
-   |---node_statement
-   |   |---::=
-   |   |---node_name
-   |   |---|
-   |   |---node_name
-   |   |---attribute_definition
-   |   |---|
-   |   |---node_statement
-   |   |---(',')
-   |   |---node_statement
-   |---node_name
-   |   |---::=
-   |   |---start_node
-   |   |---end_node
-   |---:lexeme
-   |   |---~
-   |   |---start_node
-   |   |---pause
-   |   |---=>
-   |   |---before
-   |   |---event
-   |   |---=>
-   |   |---start_node
-   |---start_node
-   |   |---~
-   |   |---'['
-   |---:lexeme
-   |   |---~
-   |   |---end_node
-   |---end_node
-   |   |---~
-   |   |---']'
-   |---edge_definition
-   |   |---::=
-   |   |---edge_statement
-   |   |---|
-   |   |---edge_statement
-   |   |---graph_definition
-   |---edge_statement
-   |   |---::=
-   |   |---edge_name
-   |   |---|
-   |   |---edge_name
-   |   |---attribute_definition
-   |   |---|
-   |   |---edge_statement
-   |   |---(',')
-   |   |---edge_statement
-   |---edge_name
-   |   |---::=
-   |   |---directed_edge
-   |   |---|
-   |   |---undirected_edge
-   |---:lexeme
-   |   |---~
-   |   |---directed_edge
-   |   |---pause
-   |   |---=>
-   |   |---before
-   |   |---event
-   |   |---=>
-   |   |---directed_edge
-   |---directed_edge
-   |   |---~
-   |   |---'->'
-   |---:lexeme
-   |   |---~
-   |   |---undirected_edge
-   |   |---pause
-   |   |---=>
-   |   |---before
-   |   |---event
-   |   |---=>
-   |   |---undirected_edge
-   |---undirected_edge
-   |   |---~
-   |   |---'--'
-   |---attribute_definition
-   |   |---::=
-   |   |---attribute_statement
-   |---attribute_statement
-   |   |---::=
-   |   |---start_attributes
-   |   |---end_attributes
-   |---:lexeme
-   |   |---~
-   |   |---start_attributes
-   |   |---pause
-   |   |---=>
-   |   |---before
-   |   |---event
-   |   |---=>
-   |   |---start_attributes
-   |---start_attributes
-   |   |---~
-   |   |---'{'
-   |---:lexeme
-   |   |---~
-   |   |---end_attributes
-   |---end_attributes
-   |   |---~
-   |   |---'}'
-   |---:discard
-   |   |---=>
-   |   |---whitespace
-   |---whitespace
-       |---~
-       |---[\s]
+   |--- :default
+   |   |--- ::=
+   |   |--- action
+   |   |--- =>
+   |   |--- [values]
+   |--- :start
+   |   |--- ::=
+   |   |--- graph_grammar
+   |--- graph_grammar
+   |   |--- ::=
+   |   |--- graph_definition
+   |   |--- action
+   |   |--- =>
+   |   |--- graph
+   |--- graph_definition
+   |   |--- ::=
+   |   |--- node_definition
+   |   |--- |
+   |   |--- edge_definition
+   |--- node_definition
+   |   |--- ::=
+   |   |--- node_statement
+   |   |--- |
+   |   |--- node_statement
+   |   |--- graph_definition
+   |--- node_statement
+   |   |--- ::=
+   |   |--- node_name
+   |   |--- |
+   |   |--- node_name
+   |   |--- attribute_definition
+   |   |--- |
+   |   |--- node_statement
+   |   |--- (',')
+   |   |--- node_statement
+   |--- node_name
+   |   |--- ::=
+   |   |--- start_node
+   |   |--- end_node
+   |--- :lexeme
+   |   |--- ~
+   |   |--- start_node
+   |   |--- pause
+   |   |--- =>
+   |   |--- before
+   |   |--- event
+   |   |--- =>
+   |   |--- start_node
+   |--- start_node
+   |   |--- ~
+   |   |--- '['
+   |--- :lexeme
+   |   |--- ~
+   |   |--- end_node
+   |--- end_node
+   |   |--- ~
+   |   |--- ']'
+   |--- edge_definition
+   |   |--- ::=
+   |   |--- edge_statement
+   |   |--- |
+   |   |--- edge_statement
+   |   |--- graph_definition
+   |--- edge_statement
+   |   |--- ::=
+   |   |--- edge_name
+   |   |--- |
+   |   |--- edge_name
+   |   |--- attribute_definition
+   |   |--- |
+   |   |--- edge_statement
+   |   |--- (',')
+   |   |--- edge_statement
+   |--- edge_name
+   |   |--- ::=
+   |   |--- directed_edge
+   |   |--- |
+   |   |--- undirected_edge
+   |--- :lexeme
+   |   |--- ~
+   |   |--- directed_edge
+   |   |--- pause
+   |   |--- =>
+   |   |--- before
+   |   |--- event
+   |   |--- =>
+   |   |--- directed_edge
+   |--- directed_edge
+   |   |--- ~
+   |   |--- '->'
+   |--- :lexeme
+   |   |--- ~
+   |   |--- undirected_edge
+   |   |--- pause
+   |   |--- =>
+   |   |--- before
+   |   |--- event
+   |   |--- =>
+   |   |--- undirected_edge
+   |--- undirected_edge
+   |   |--- ~
+   |   |--- '--'
+   |--- attribute_definition
+   |   |--- ::=
+   |   |--- attribute_statement
+   |--- attribute_statement
+   |   |--- ::=
+   |   |--- start_attributes
+   |   |--- end_attributes
+   |--- :lexeme
+   |   |--- ~
+   |   |--- start_attributes
+   |   |--- pause
+   |   |--- =>
+   |   |--- before
+   |   |--- event
+   |   |--- =>
+   |   |--- start_attributes
+   |--- start_attributes
+   |   |--- ~
+   |   |--- '{'
+   |--- :lexeme
+   |   |--- ~
+   |   |--- end_attributes
+   |--- end_attributes
+   |   |--- ~
+   |   |--- '}'
+   |--- :discard
+   |   |--- =>
+   |   |--- whitespace
+   |--- whitespace
+       |--- ~
+       |--- [\s]