Commit ffc8b55c authored by Sergio Pérez's avatar Sergio Pérez
Browse files

Removed Left Recursive Grammars in Summary Edges (Problem Benchmark 8)

parent fd6f61ee
Loading
Loading
Loading
Loading
+7 −3
Original line number Diff line number Diff line
@@ -89,10 +89,14 @@ public class AsteriskConstraint extends EdgeConstraint
	}

	private boolean existsPreviousAsteriskConstraint(Constraints constraints){
		for(Constraint c : constraints.getEdgeConstraints())
		boolean previousAsterisk = false;
		for(Constraint c : constraints.getEdgeConstraints()) {
			if (c instanceof AsteriskConstraint)
				return true;
		return false;
				previousAsterisk = true;
			if (previousAsterisk && c instanceof GrammarConstraint)
				previousAsterisk = false;
		}
		return previousAsterisk;
	}

	private Constraints popToAsteriskConstraint(Constraints constraints){
+12 −1
Original line number Diff line number Diff line
@@ -139,6 +139,7 @@ public class SummaryEdgeGenerator extends EdgeGenerator
		final Grammar grammar = this.edg.getGrammar();
		final GrammarConstraint grammarConstraint = new GrammarConstraint(grammar, formalIn);
		boolean isNewGrammarTerm = grammar.isNewGrammarTerm(grammarConstraint);
		if (!isLeftRecursiveGrammar(grammarConstraint, constraints))
			this.edg.addProduction(grammarConstraint, constraints);

		final List<Node> nodesToContinue = new LinkedList<>();
@@ -167,4 +168,14 @@ public class SummaryEdgeGenerator extends EdgeGenerator
			workList.repend(id);
		}
	}

	private boolean isLeftRecursiveGrammar(GrammarConstraint grammarConstraint, Constraints constraints)
	{
		if (constraints.getEdgeConstraints().isEmpty())
			return false;

		String grammarId = grammarConstraint.getRefNode().getId() + "";
		String stackBottomTerm = constraints.getEdgeConstraints().firstElement().toString();
		return grammarId.equals(stackBottomTerm);
	}
}
 No newline at end of file
+1 −2
Original line number Diff line number Diff line
@@ -194,8 +194,7 @@ public class ValueEdgeGenerator {
		{
			final Node valueNode = this.last.getChild(listComprehensionNode, Node.Type.Value);
			final Node value = this.last.getChild(valueNode, Node.Type.Value);
			this.last.addEdge(valueNode, listComprehensionNode, Edge.Type.Value, negativeConstraint);
			this.last.addEdge(value, valueNode, Edge.Type.Value, EmptyConstraint.getConstraint());
			this.last.addEdge(value, listComprehensionNode, Edge.Type.Value, negativeConstraint);
		}
	}