11package org.ucfs.parser
22
3+ import io.github.oshai.kotlinlogging.KotlinLogging
34import org.ucfs.descriptors.Descriptor
45import org.ucfs.gss.GssEdge
56import org.ucfs.input.IInputGraph
@@ -18,6 +19,7 @@ import org.ucfs.sppf.node.*
1819class Gll <VertexType , LabelType : ILabel > private constructor(
1920 override var ctx : Context <VertexType , LabelType >, private val engine : IIntersectionEngine
2021) : IGll<VertexType, LabelType> {
22+ val logger = KotlinLogging .logger {}
2123
2224 companion object {
2325 /* *
@@ -29,7 +31,7 @@ class Gll<VertexType, LabelType : ILabel> private constructor(
2931 fun <VertexType , LabelType : ILabel > gll (
3032 startState : RsmState , inputGraph : IInputGraph <VertexType , LabelType >
3133 ): Gll <VertexType , LabelType > {
32- val finalState = startState.outgoingEdges.get( 0 ) .destinationState
34+ val finalState = startState.outgoingEdges[ 0 ] .destinationState
3335 return Gll (Context (startState, finalState, inputGraph), IntersectionEngine )
3436 }
3537 }
@@ -67,41 +69,47 @@ class Gll<VertexType, LabelType : ILabel> private constructor(
6769 ctx.descriptors.add(newDescriptor)
6870 }
6971
70- fun isParseResult (descriptor : Descriptor < VertexType >, matchedRange : RangeSppfNode <VertexType >): Boolean {
72+ private fun isParseResult (matchedRange : RangeSppfNode <VertexType >): Boolean {
7173 return matchedRange.inputRange!! .from in ctx.input.getInputStartVertices()
7274 && matchedRange.rsmRange!! .from == ctx.fictiveStartState
7375 && matchedRange.rsmRange.to == ctx.fictiveFinalState
7476 }
77+
7578 /* *
7679 * Processes descriptor
7780 * @param descriptor - descriptor to process
7881 */
7982 override fun handleDescriptor (descriptor : Descriptor <VertexType >) {
8083 ctx.descriptors.addToHandled(descriptor)
84+ logger.debug { " \n ${descriptor} \t " }
8185 if (descriptor.rsmState.isFinal) {
82- val matchedRange = if (descriptor.sppfNode.type is EmptyType ) {
83- val node = getEpsilonRange(descriptor)
84- // TODO fix
85- // dirty hack: in fact it's equivavelnt descriptors
86- // but only initial was added in handled set
87- ctx.descriptors.addToHandled(Descriptor (descriptor.inputPosition,
88- descriptor.gssNode, descriptor.rsmState, node))
89- node
90- } else {
91- descriptor.sppfNode
92- }
93- for (poppedEdge in ctx.gss.pop(descriptor, matchedRange)) {
94- handlePoppedGssEdge(poppedEdge, descriptor, matchedRange)
95- }
96- if (isParseResult(descriptor, matchedRange)) {
97-
98- if (ctx.parseResult == null ) {
99- ctx.parseResult = matchedRange
100- }
101- ctx.parseResults.add(matchedRange)
102- }
86+ handleTerminalRsmState(descriptor)
10387 }
10488 engine.handleEdges(this , descriptor)
10589 }
90+
91+ private fun handleTerminalRsmState (descriptor : Descriptor <VertexType >) {
92+ val matchedRange = if (descriptor.sppfNode.type is EmptyType ) {
93+ val node = getEpsilonRange(descriptor)
94+ // TODO fix
95+ // dirty hack: in fact it's equivavelnt descriptors
96+ // but only initial was added in handled set
97+ ctx.descriptors.addToHandled(
98+ Descriptor (
99+ descriptor.inputPosition,
100+ descriptor.gssNode, descriptor.rsmState, node
101+ )
102+ )
103+ node
104+ } else {
105+ descriptor.sppfNode
106+ }
107+ for (poppedEdge in ctx.gss.pop(descriptor, matchedRange)) {
108+ handlePoppedGssEdge(poppedEdge, descriptor, matchedRange)
109+ }
110+ if (isParseResult(matchedRange)) {
111+ ctx.parseResults.add(matchedRange)
112+ }
113+ }
106114}
107115
0 commit comments