@@ -80,20 +80,62 @@ enum class NodeShape(val view: String) {
80
80
)
81
81
}
82
82
83
- fun getNodeView (node : RangeSppfNode <* >, id : String ): String {
84
- val shape = getNodeShape(node.type)
85
- val idView = if (printWithId) " $id " else " "
86
- return " [label = \" $idView${node} \" , shape = ${shape.view} ]"
83
+ fun fillNodeTemplate (
84
+ id : String? = null, nodeInfo : String , inputRange : InputRange <* >? , shape : NodeShape , rsmRange : RsmRange ? = null
85
+ ): String {
86
+ val inputRangeView = if (inputRange != null ) " input: [${inputRange.from} , ${inputRange.to} ]" else null
87
+ val rsmRangeView = if (rsmRange != null ) " rsm: [${rsmRange.from.id} , ${rsmRange.to.id} ]" else null
88
+ val view = listOfNotNull(nodeInfo, inputRangeView, rsmRangeView).joinToString(" , " )
89
+ return " [label = \" ${id? : " " }${shape.name} $view \" , shape = ${shape.view} ]"
87
90
}
88
91
89
- fun getNodeShape (rangeType : RangeType ): NodeShape {
90
- return when (rangeType) {
91
- is TerminalType <* > -> NodeShape .Terminal
92
- is NonterminalType -> NodeShape .Nonterminal
93
- is IntermediateType <* > -> NodeShape .Intermediate
94
- is EmptyType -> NodeShape .Empty
95
- is EpsilonNonterminalType -> NodeShape .Epsilon
96
- is Range -> NodeShape .Range
97
- else -> throw IllegalStateException (" Can't write node type $rangeType to DOT" )
92
+ fun <InputNode > getNodeView (node : RangeSppfNode <InputNode >, id : String? = null): String {
93
+ val type = node.type
94
+ return when (type) {
95
+ is TerminalType <* > -> {
96
+ fillNodeTemplate(
97
+ id, " '${type.terminal} '" , node.inputRange, NodeShape .Terminal
98
+ )
99
+ }
100
+
101
+ is NonterminalType -> {
102
+ fillNodeTemplate(
103
+ id, " ${type.startState.nonterminal.name} " , node.inputRange, NodeShape .Nonterminal
104
+ )
105
+ }
106
+
107
+ is IntermediateType <* > -> {
108
+ fillNodeTemplate(
109
+ id, " input: ${type.inputPosition} , rsm: ${type.grammarSlot.id} " , node.inputRange, NodeShape .Intermediate
110
+ )
111
+ }
112
+
113
+ is EmptyType -> {
114
+ fillNodeTemplate(
115
+ id, " " , null , NodeShape .Empty
116
+ )
117
+ }
118
+
119
+ is EpsilonNonterminalType -> {
120
+ fillNodeTemplate(
121
+ id, " RSM: ${type.startState.id} " , node.inputRange, NodeShape .Epsilon
122
+ )
123
+ }
124
+
125
+ is RangeType -> {
126
+ fillNodeTemplate(
127
+ id, " " , node.inputRange, NodeShape .Range , node.rsmRange
128
+ )
129
+ }
130
+
131
+ else -> throw IllegalStateException (" Can't write node type $type to DOT" )
132
+
98
133
}
134
+
135
+
136
+ }
137
+
138
+ private fun getView (range : RsmRange ? ): String {
139
+ if (range == null ) return " "
140
+ return " rsm: [(${range.from.nonterminal.name} :${range.from.numId} ), " + " (${range.to.nonterminal.name} :${range.to.numId} )]"
99
141
}
0 commit comments