@@ -16,7 +16,6 @@ fun <InputNode> writeSppfToDot(sppfNode: RangeSppfNode<InputNode>, filePath: Str
16
16
17
17
fun <InputNode > getSppfDot (sppfNode : RangeSppfNode <InputNode >, label : String = ""): String {
18
18
val queue: ArrayDeque <RangeSppfNode <InputNode >> = ArrayDeque (listOf (sppfNode))
19
- val edges: HashMap <RangeSppfNode <InputNode >, HashSet <RangeSppfNode <InputNode >>> = HashMap ()
20
19
val visited: HashSet <Int > = HashSet ()
21
20
var node: RangeSppfNode <InputNode >
22
21
val sb = StringBuilder ()
@@ -32,32 +31,39 @@ fun <InputNode> getSppfDot(sppfNode: RangeSppfNode<InputNode>, label: String = "
32
31
33
32
node.children.forEach {
34
33
queue.addLast(it)
35
- edges.getOrPut(node, { HashSet () }).add(it)
36
34
}
37
35
}
38
36
val sortedViews = nodeViews.values.sorted()
39
37
val nodeIds = HashMap <RangeSppfNode <InputNode >, Int > ()
38
+ val nodeById = HashMap <Int , RangeSppfNode <InputNode >>()
40
39
for ((node, view) in nodeViews) {
41
- nodeIds[node] = sortedViews.indexOf(view)
40
+ val id = sortedViews.indexOf(view)
41
+ nodeIds[node] = id
42
+ nodeById[id] = node
42
43
}
44
+
43
45
for (i in sortedViews.indices) {
44
46
sb.appendLine(" $i ${sortedViews[i]} " )
45
47
}
46
48
47
- val sortedEdges = ArrayList < String >()
48
- for ((head, tails) in edges) {
49
- for (tail in tails ) {
50
- sortedEdges.add (" ${nodeIds[head ]} ->${nodeIds[tail ]} " )
49
+ for (i in nodeById.keys) {
50
+ val node = nodeById[i]
51
+ for (child in node !! .children ) {
52
+ sb.appendLine (" ${nodeIds[node ]} ->${nodeIds[child ]} " )
51
53
}
54
+ // if(node.children.size < 2){
55
+ // continue
56
+ // }
57
+ // val cs = node.children.map({nodeIds[it]}).joinToString("->")
58
+ // sb.appendLine("{ rank = same; $cs [style=invis]}")
52
59
}
53
- for (edge in sortedEdges.sorted()) {
54
- sb.appendLine(edge)
55
- }
60
+
56
61
sb.appendLine(" }" )
57
62
return sb.toString()
58
63
59
64
}
60
65
66
+
61
67
enum class NodeShape (val view : String ) {
62
68
Terminal (" rectangle" ), Nonterminal (" invtrapezium" ), Intermediate (" plain" ), Empty (" ellipse" ), Range (" ellipse" ), Epsilon (
63
69
" invhouse"
@@ -70,7 +76,7 @@ fun fillNodeTemplate(
70
76
val inputRangeView = if (inputRange != null ) " input: [${inputRange.from} , ${inputRange.to} ]" else null
71
77
val rsmRangeView = if (rsmRange != null ) " rsm: [${rsmRange.from.id} , ${rsmRange.to.id} ]" else null
72
78
val view = listOfNotNull(nodeInfo, inputRangeView, rsmRangeView).joinToString(" , " )
73
- return " [label = \" ${id ? : " " } ${shape.name} $view \" , shape = ${shape.view} ]"
79
+ return " [label = \" ${id? : " " }${shape.name} $view \" , shape = ${shape.view} ]"
74
80
}
75
81
76
82
@@ -91,7 +97,7 @@ fun <InputNode> getNodeView(node: RangeSppfNode<InputNode>, id: String? = null):
91
97
92
98
is IntermediateType <* > -> {
93
99
fillNodeTemplate(
94
- id, " input: ${type.inputPosition} , rsm: ${type.grammarSlot.id} " , null , NodeShape .Intermediate
100
+ id, " input: ${type.inputPosition} , rsm: ${type.grammarSlot.id} " , node.inputRange , NodeShape .Intermediate
95
101
)
96
102
}
97
103
0 commit comments