rley 0.3.01 → 0.3.04

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,111 +0,0 @@
1
- # Mix-in module that generates a Graphviz's DOT file
2
- # that represents the precedence graph of parse entries.
3
- class GFGRepresentation
4
-
5
- def generate_graph(aParsing, aFile)
6
- heading = build_heading()
7
- aFile.puts(heading)
8
-
9
- fill_graph(aParsing.gf_graph, aFile)
10
-
11
- trailing = build_trailing()
12
- aFile.puts(trailing)
13
- end
14
-
15
- private
16
-
17
- def build_heading()
18
- text = <<-END_STRING
19
- digraph gfg {
20
- size="7,9.5";
21
- page="8.5,11";
22
- ratio = fill;
23
- END_STRING
24
-
25
- return text
26
- end
27
-
28
- def build_trailing()
29
- return '}'
30
- end
31
-
32
- def fill_graph(aGFGraph, aFile)
33
- all_vertices = aGFGraph.vertices.dup
34
- (itemized, endpoints) = all_vertices.partition do |vertex|
35
- vertex.is_a?(Rley::GFG::ItemVertex)
36
- end
37
-
38
- # Group start/end nodes by non-terminal symbol
39
- group_endings = endpoints.group_by { |endpoint| endpoint.non_terminal }
40
-
41
- # Group item vertices by lhs non-terminal symbol
42
- group_items = itemized.group_by { |vertex| vertex.lhs }
43
-
44
- aFile.puts ''
45
- group_endings.each_pair do |nonterm, nodes|
46
- text = <<-END_STRING
47
- subgraph cluster_#{nonterm} {
48
- color = transparent;
49
- END_STRING
50
- aFile.puts text
51
- aFile.puts ' // Define the start and end nodes'
52
- nodes.each do |vertex|
53
- # Emit the start/end nodes
54
- aFile.puts %Q( node_#{vertex.object_id}[shape=box, fontsize=18.0, label="#{vertex.label}"];)
55
- end
56
-
57
- # Create sub-clusters by production
58
- subnodes = group_items[nonterm]
59
- subclusters = subnodes.group_by { |vertex| vertex.dotted_item.production }
60
- subclusters.each_pair do |prod, vertices|
61
- aFile.puts ''
62
- aFile.puts cluster_heading(prod)
63
- vertices.each do |vertex|
64
- aFile.puts %Q( node_#{vertex.object_id}[label="#{vertex.label}"];)
65
- end
66
- aFile.puts cluster_trailing(prod)
67
- end
68
- aFile.puts ' }'
69
- end
70
-
71
- aFile.puts ''
72
- aFile.puts ' // Draw the edges'
73
- aGFGraph.vertices.each do |from_vertex|
74
- from_vertex.edges.each do |anEdge|
75
- if from_vertex.is_a?(Rley::GFG::EndVertex)
76
- to_dotted_item = anEdge.successor.dotted_item
77
- label = "RET_#{to_dotted_item.production.object_id}_#{to_dotted_item.prev_position}"
78
- aFile.puts " node_#{from_vertex.object_id}->node_#{anEdge.successor.object_id}[color=red, style=dashed, arrowhead=onormal,label=#{label}];"
79
- else
80
- if anEdge.is_a?(Rley::GFG::ScanEdge)
81
- aFile.puts %Q( node_#{from_vertex.object_id}->node_#{anEdge.successor.object_id}[fontsize=18.0, label="#{anEdge.terminal}"];)
82
- else
83
- if anEdge.successor.is_a?(Rley::GFG::StartVertex)
84
- from_dotted_item = from_vertex.dotted_item
85
- label = "CALL_#{from_dotted_item.production.object_id}_#{from_dotted_item.position}"
86
- aFile.puts " node_#{from_vertex.object_id}->node_#{anEdge.successor.object_id}[color=green, label=#{label}];"
87
- else
88
- aFile.puts " node_#{from_vertex.object_id}->node_#{anEdge.successor.object_id};"
89
- end
90
- end
91
- end
92
- end
93
- end
94
- end
95
-
96
-
97
- def cluster_heading(anObject)
98
- text = <<-END_STRING
99
- subgraph cluster_#{anObject.object_id} {
100
- style = rounded;
101
- color = blue;
102
- END_STRING
103
-
104
- return text
105
- end
106
-
107
- def cluster_trailing(anObject)
108
- return ' }'
109
- end
110
-
111
- end # module