Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 2 additions & 3 deletions benchmarks/src/main/kotlin/org/ucfs/Java8ParserRecovery.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

package org.ucfs

import org.ucfs.JavaToken
import org.ucfs.descriptors.Descriptor
import org.ucfs.input.IInputGraph
import org.ucfs.input.ILabel
Expand Down Expand Up @@ -8649,8 +8648,8 @@ public class Java8ParserRecovery<VertexType, LabelType : ILabel> :
}
}

override fun parse(descriptor: Descriptor<VertexType>) {
super.parse(descriptor)
override fun handleDescriptor(descriptor: Descriptor<VertexType>) {
super.handleDescriptor(descriptor)
org.ucfs.intersection.RecoveryIntersection.handleRecoveryEdges(this, descriptor)
}

Expand Down
14 changes: 1 addition & 13 deletions generator/src/main/kotlin/org/ucfs/parser/GeneratedParser.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,32 +26,20 @@ abstract class GeneratedParser<VertexType, LabelType : ILabel> :
curSppfNode: SppfNode<VertexType>?
): Unit

override fun parse(descriptor: Descriptor<VertexType>) {
override fun handleDescriptor(descriptor: Descriptor<VertexType>) {
val state = descriptor.rsmState
val nt = state.nonterminal

val pos = descriptor.inputPosition
val curSppfNode = descriptor.sppfNode
val epsilonSppfNode = ctx.sppf.getEpsilonSppfNode(descriptor)
val leftExtent = curSppfNode?.leftExtent
val rightExtent = curSppfNode?.rightExtent

if (state.isFinal) {
pop(descriptor.gssNode, curSppfNode ?: epsilonSppfNode, pos)
}

ctx.descriptors.addToHandled(descriptor)

if (state.isStart && state.isFinal) {
checkAcceptance(
epsilonSppfNode,
epsilonSppfNode!!.leftExtent,
epsilonSppfNode!!.rightExtent,
nt
)
}
checkAcceptance(curSppfNode, leftExtent, rightExtent, nt)

callNtFuncs(nt, descriptor, curSppfNode)
}

Expand Down
6 changes: 2 additions & 4 deletions solver/src/main/kotlin/org/ucfs/gss/GssNode.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class GssNode<VertexType>(
/**
* Maps edge label (rsmState, sppfNode) to destination gssNode
*/
val edges: HashMap<Pair<RsmState, SppfNode<VertexType>?>, HashSet<GssNode<VertexType>>> = HashMap()
val edges: HashMap<Pair<RsmState, SppfNode<VertexType>?>, GssNode<VertexType>> = HashMap()

/**
* Stores handled descriptors, which contained current gssNode as value of corresponding field
Expand All @@ -40,12 +40,10 @@ class GssNode<VertexType>(
* @param rsmState - rsmState to store on the edge
* @param sppfNode - sppfNode to store on the edge
* @param gssNode - destination gssNode
* @return true if creation was successful, false otherwise
*/
fun addEdge(rsmState: RsmState, sppfNode: SppfNode<VertexType>?, gssNode: GssNode<VertexType>): Boolean {
val label = Pair(rsmState, sppfNode)

return edges.computeIfAbsent(label) { HashSet() }.add(gssNode)
return edges.put(label, gssNode) == null
}

override fun toString() = "GSSNode(nonterminal=$nonterminal, inputPosition=$inputPosition)"
Expand Down
19 changes: 9 additions & 10 deletions solver/src/main/kotlin/org/ucfs/parser/Gll.kt
Original file line number Diff line number Diff line change
Expand Up @@ -66,26 +66,25 @@ class Gll<VertexType, LabelType : ILabel> private constructor(
* Processes descriptor
* @param descriptor - descriptor to process
*/
override fun parse(descriptor: Descriptor<VertexType>) {
override fun handleDescriptor(descriptor: Descriptor<VertexType>) {
val state = descriptor.rsmState
val pos = descriptor.inputPosition
val sppfNode = descriptor.sppfNode
val epsilonSppfNode = ctx.sppf.getEpsilonSppfNode(descriptor)
val leftExtent = sppfNode?.leftExtent
val rightExtent = sppfNode?.rightExtent

if (state.isFinal) {
pop(descriptor.gssNode, sppfNode ?: epsilonSppfNode, pos)
pop(descriptor.gssNode, sppfNode ?: ctx.sppf.getEpsilonSppfNode(descriptor), pos)
}

ctx.descriptors.addToHandled(descriptor)

if (state.isStart && state.isFinal) {
checkAcceptance(
epsilonSppfNode, epsilonSppfNode!!.leftExtent, epsilonSppfNode!!.rightExtent, state.nonterminal
)
}
checkAcceptance(sppfNode, leftExtent, rightExtent, state.nonterminal)
//
// if (state.isStart && state.isFinal) {
// checkAcceptance(
// epsilonSppfNode, epsilonSppfNode!!.leftExtent, epsilonSppfNode!!.rightExtent, state.nonterminal
// )
// }
// checkAcceptance(sppfNode, leftExtent, rightExtent, state.nonterminal)

engine.handleEdges(this, descriptor, sppfNode)
}
Expand Down
49 changes: 28 additions & 21 deletions solver/src/main/kotlin/org/ucfs/parser/IGll.kt
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ interface IGll<VertexType, LabelType : ILabel> {
// Continue parsing until all default descriptors processed
var curDescriptor = ctx.nextDescriptorToHandle()
while (curDescriptor != null) {
parse(curDescriptor)
handleDescriptor(curDescriptor)
curDescriptor = ctx.nextDescriptorToHandle()
}

Expand All @@ -43,7 +43,7 @@ interface IGll<VertexType, LabelType : ILabel> {
* Processes descriptor
* @param descriptor - descriptor to process
*/
fun parse(descriptor: Descriptor<VertexType>)
fun handleDescriptor(descriptor: Descriptor<VertexType>)

/**
* Creates descriptors for all starting vertices in input graph
Expand Down Expand Up @@ -104,7 +104,10 @@ interface IGll<VertexType, LabelType : ILabel> {
if (ctx.poppedGssNodes.containsKey(newNode)) {
for (popped in ctx.poppedGssNodes[newNode]!!) {
val descriptor = Descriptor(
rsmState, gssNode, ctx.sppf.getParentNodeAfterTerminal(rsmState, sppfNode, popped!!), popped.rightExtent
rsmState,
gssNode,
ctx.sppf.getOrCreateIntermediateNode(rsmState, sppfNode, popped!!),
popped.rightExtent
)
addDescriptor(descriptor)
}
Expand All @@ -126,21 +129,26 @@ interface IGll<VertexType, LabelType : ILabel> {
* Iterates over all outgoing edges from current gssNode, collects derivation trees, stored on edges and
* combines them with current derivation tree, given as sppfNode
* @param gssNode - current node in top layer of Graph Structured Stack
* @param sppfNode - derivation tree, corresponding to parsed portion of input
* @param sppfNode - derivation tree, corresponding to parsed portion of input for current nonterminal
* @param inputPosition - vertex in input graph
*/
fun pop(gssNode: GssNode<VertexType>, sppfNode: SppfNode<VertexType>?, inputPosition: VertexType) {
if (!ctx.poppedGssNodes.containsKey(gssNode)) ctx.poppedGssNodes[gssNode] = HashSet()
fun pop(gssNode: GssNode<VertexType>, sppfNode: SppfNode<VertexType>, inputPosition: VertexType) {
if (!ctx.poppedGssNodes.containsKey(gssNode)) {
ctx.poppedGssNodes[gssNode] = HashSet()
}
ctx.poppedGssNodes.getValue(gssNode).add(sppfNode)

for ((label, target) in gssNode.edges) {
for (node in target) {
val descriptor = Descriptor(
label.first, node, ctx.sppf.getParentNodeAfterTerminal(label.first, label.second, sppfNode!!), inputPosition
)
addDescriptor(descriptor)
}
val symbolSppfNode = ctx.sppf.getOrCreateSymbolSppfNode(gssNode.nonterminal, sppfNode)

for ((label, node) in gssNode.edges) {
val (rsmTo, leftSppf) = label
val descriptor = Descriptor(
rsmTo, node, ctx.sppf.getOrCreateIntermediateNode(rsmTo, leftSppf, symbolSppfNode), inputPosition
)
addDescriptor(descriptor)
}

checkAcceptance(symbolSppfNode)
}

/**
Expand All @@ -151,19 +159,18 @@ interface IGll<VertexType, LabelType : ILabel> {
* @param rightExtent - right limit of the range
* @param nonterminal - nonterminal, which defines language we check belonging to
*/
fun checkAcceptance(
sppfNode: SppfNode<VertexType>?, leftExtent: VertexType?, rightExtent: VertexType?, nonterminal: Nonterminal
) {
if (sppfNode is SymbolSppfNode<VertexType> && nonterminal == ctx.startState.nonterminal && ctx.input.isStart(
leftExtent!!
) && ctx.input.isFinal(rightExtent!!)
fun checkAcceptance(sppfNode: SppfNode<VertexType>) {
if (sppfNode is SymbolSppfNode<VertexType>
&& sppfNode.symbol == ctx.startState.nonterminal
&& ctx.input.isStart(sppfNode.leftExtent)
&& ctx.input.isFinal(sppfNode.rightExtent)
) {
if (ctx.parseResult == null || ctx.parseResult!!.weight > sppfNode.weight) {
ctx.parseResult = sppfNode
}

//update reachability
val pair = Pair(leftExtent, rightExtent)
val pair = Pair(sppfNode.leftExtent, sppfNode.rightExtent)
val distance = ctx.sppf.minDistance(sppfNode)

ctx.reachabilityPairs[pair] = if (ctx.reachabilityPairs.containsKey(pair)) {
Expand Down Expand Up @@ -217,7 +224,7 @@ interface IGll<VertexType, LabelType : ILabel> {
targetWeight: Int,
) {
val terminalNode = ctx.sppf.getOrCreateTerminalSppfNode(terminal, descriptor.inputPosition, targetVertex, targetWeight)
val parentNode = ctx.sppf.getParentNodeAfterTerminal(targetState, sppfNode, terminalNode)
val parentNode = ctx.sppf.getOrCreateIntermediateNode(targetState, sppfNode, terminalNode)
val newDescriptor = Descriptor(targetState, descriptor.gssNode, parentNode, targetVertex)
addDescriptor(newDescriptor)
}
Expand Down
14 changes: 8 additions & 6 deletions solver/src/main/kotlin/org/ucfs/parser/context/IContext.kt
Original file line number Diff line number Diff line change
Expand Up @@ -73,12 +73,14 @@ interface IContext<VertexType, LabelType : ILabel> {
val leftExtent = sppfNode?.leftExtent
val rightExtent = sppfNode?.rightExtent

if (parseResult == null && sppfNode is SymbolSppfNode<*> && state.nonterminal == startState.nonterminal && input.isStart(
leftExtent!!
) && input.isFinal(rightExtent!!)
) {
descriptors.removeFromHandled(descriptor)
}
// if (parseResult == null
// && sppfNode is SymbolSppfNode<*>
// && state.nonterminal == startState.nonterminal
// && input.isStart(leftExtent!!)
// && input.isFinal(rightExtent!!)
// ) {
// descriptors.removeFromHandled(descriptor)
// }
descriptors.addToHandling(descriptor)
}

Expand Down
4 changes: 2 additions & 2 deletions solver/src/main/kotlin/org/ucfs/sppf/RecoverySppf.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,12 @@ class RecoverySppf<VertexType> : Sppf<VertexType>() {
* @param nextSppfNode - right subtree
* @return ParentNode, which has combined subtree as alternative derivation
*/
override fun getParentNodeAfterTerminal(
override fun getOrCreateIntermediateNode(
rsmState: RsmState,
sppfNode: SppfNode<VertexType>?,
nextSppfNode: SppfNode<VertexType>,
): SppfNode<VertexType> {
val parent = super.getParentNodeAfterTerminal(rsmState, sppfNode, nextSppfNode)
val parent = super.getOrCreateIntermediateNode(rsmState, sppfNode, nextSppfNode)
updateWeights(parent)
return parent
}
Expand Down
Loading
Loading