@@ -16,7 +16,6 @@ fun <InputNode> writeSppfToDot(sppfNode: RangeSppfNode<InputNode>, filePath: Str
1616
1717fun <InputNode > getSppfDot (sppfNode : RangeSppfNode <InputNode >, label : String = ""): String {
1818 val queue: ArrayDeque <RangeSppfNode <InputNode >> = ArrayDeque (listOf (sppfNode))
19- val edges: HashMap <RangeSppfNode <InputNode >, HashSet <RangeSppfNode <InputNode >>> = HashMap ()
2019 val visited: HashSet <Int > = HashSet ()
2120 var node: RangeSppfNode <InputNode >
2221 val sb = StringBuilder ()
@@ -32,32 +31,39 @@ fun <InputNode> getSppfDot(sppfNode: RangeSppfNode<InputNode>, label: String = "
3231
3332 node.children.forEach {
3433 queue.addLast(it)
35- edges.getOrPut(node, { HashSet () }).add(it)
3634 }
3735 }
3836 val sortedViews = nodeViews.values.sorted()
3937 val nodeIds = HashMap <RangeSppfNode <InputNode >, Int > ()
38+ val nodeById = HashMap <Int , RangeSppfNode <InputNode >>()
4039 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
4243 }
44+
4345 for (i in sortedViews.indices) {
4446 sb.appendLine(" $i ${sortedViews[i]} " )
4547 }
4648
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 ]} " )
5153 }
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]}")
5259 }
53- for (edge in sortedEdges.sorted()) {
54- sb.appendLine(edge)
55- }
60+
5661 sb.appendLine(" }" )
5762 return sb.toString()
5863
5964}
6065
66+
6167enum class NodeShape (val view : String ) {
6268 Terminal (" rectangle" ), Nonterminal (" invtrapezium" ), Intermediate (" plain" ), Empty (" ellipse" ), Range (" ellipse" ), Epsilon (
6369 " invhouse"
@@ -70,7 +76,7 @@ fun fillNodeTemplate(
7076 val inputRangeView = if (inputRange != null ) " input: [${inputRange.from} , ${inputRange.to} ]" else null
7177 val rsmRangeView = if (rsmRange != null ) " rsm: [${rsmRange.from.id} , ${rsmRange.to.id} ]" else null
7278 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} ]"
7480}
7581
7682
@@ -91,7 +97,7 @@ fun <InputNode> getNodeView(node: RangeSppfNode<InputNode>, id: String? = null):
9197
9298 is IntermediateType <* > -> {
9399 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
95101 )
96102 }
97103
0 commit comments