From e5f08c34aa8e1cd8d3e031cee5d0dd1cd9ca5cb7 Mon Sep 17 00:00:00 2001 From: overflowerror Date: Tue, 11 Jan 2022 22:07:33 +0100 Subject: [PATCH] fixed bug in context analysis when the following context element is optional, the minimal sequence is not going to get bigger. in this case further context analysis is blocked by the exception. => removed exception also made sure getNextElementsInContext() won't return non-token, non-compound elements like actions or predicates. --- .../hoisting/pathAnalysis/TokenAnalysis.java | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/pathAnalysis/TokenAnalysis.java b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/pathAnalysis/TokenAnalysis.java index 41953d2da..cc44ee96d 100644 --- a/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/pathAnalysis/TokenAnalysis.java +++ b/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/parser/antlr/hoisting/pathAnalysis/TokenAnalysis.java @@ -24,12 +24,15 @@ import org.apache.log4j.Logger; import org.eclipse.emf.ecore.EObject; import org.eclipse.xtext.AbstractElement; import org.eclipse.xtext.AbstractRule; +import org.eclipse.xtext.AbstractSemanticPredicate; +import org.eclipse.xtext.Action; import org.eclipse.xtext.Alternatives; import org.eclipse.xtext.Assignment; import org.eclipse.xtext.CompoundElement; import org.eclipse.xtext.Grammar; import org.eclipse.xtext.GrammarUtil; import org.eclipse.xtext.Group; +import org.eclipse.xtext.JavaAction; import org.eclipse.xtext.RuleCall; import org.eclipse.xtext.UnorderedGroup; import org.eclipse.xtext.util.XtextSwitch; @@ -82,6 +85,7 @@ public class TokenAnalysis { } private List getNextElementsInContext(AbstractElement last) { + // TODO: deal with non-trivial cardinalities CompoundElement container = getCompoundContainer(last); while (container instanceof Alternatives || last.eContainer() instanceof Assignment @@ -112,8 +116,24 @@ public class TokenAnalysis { log.info(last.eClass().getName()); log.info(abstractElementToString(container)); } - if (index < elements.size() - 1) { - return Arrays.asList(elements.get(index + 1)); + + int size = elements.size(); + AbstractElement next = null; + + while (index < size - 1) { + next = elements.get(index + 1); + if (!( + (next instanceof Action) || + (next instanceof JavaAction) || + (next instanceof AbstractSemanticPredicate) + )) { + break; + } + + index++; + } + if (index < size - 1) { + return Arrays.asList(next); } else { // this is the last element return getNextElementsInContext(container); @@ -155,17 +175,12 @@ public class TokenAnalysis { // TODO: is this special case necessary? throw new TokenAnalysisAbortedException("context analysis failed: no context"); } - - int currentPosition = prefix.getMinPosition(); - for (AbstractElement element : context) { + for (AbstractElement element : context) { + log.info("context element: " + abstractElementToShortString(element)); TokenAnalysisPaths path = new TokenAnalysisPaths(prefix); path = getTokenPaths(element, path, false, false, shortcutEndlessLoops); - if (!path.isDone() && element != null) { - if (path.getMinPosition() == currentPosition) { - throw new TokenAnalysisAbortedException("no progress in context analysis"); - } - + if (!path.isDone() && element != null) { path = getTokenPathsContext(element, path, shortcutEndlessLoops); } if (path.isDone()) {