Search in sources :

Example 1 with Pair

use of org.eclipse.xtext.util.Pair in project xtext-core by eclipse.

the class AbstractPDAProvider method createState.

/**
 * @since 2.0
 */
protected PDAState createState(PDAContext<CTX> ctx, RuleCallStackElement stack, INFAState<?, ?> fromNfa, EClass constructedType, boolean returning, boolean canReturn, Set<Pair<Boolean, INFAState<?, ?>>> visited) {
    Set<Pair<Boolean, INFAState<?, ?>>> visited2 = Sets.newHashSet();
    if (stack == null || !canReachContextEnd(ctx, stack.cloneWithoutVisited(), fromNfa, constructedType, returning, canReturn, visited2))
        return null;
    if (constructedType == null)
        constructedType = getConstructedType(fromNfa.getGrammarElement());
    AbstractElement ge = fromNfa.getGrammarElement();
    PDAState result = null;
    if (canEnterRuleCall(fromNfa)) {
        if (returning) {
            if ((result = ctx.ruleCallExit.get(fromNfa)) == null)
                ctx.ruleCallExit.put(fromNfa, result = createState(PDAStateType.RULECALL_EXIT, ge));
        } else {
            if ((result = ctx.ruleCallEnter.get(fromNfa)) == null)
                ctx.ruleCallEnter.put(fromNfa, result = createState(PDAStateType.RULECALL_ENTER, ge));
        }
    } else {
        if ((result = ctx.elements.get(fromNfa)) == null)
            ctx.elements.put(fromNfa, result = createState(PDAStateType.ELEMENT, ge));
    }
    if (!visited.add(Tuples.<Boolean, INFAState<?, ?>>create(returning, fromNfa)))
        return result;
    if (!returning && canEnterRuleCall(fromNfa)) {
        if (stack.hasEnteredTwice(fromNfa))
            return result;
        stack = stackPush(stack, fromNfa);
        visited = Sets.newHashSet();
    }
    if (result.followers == null || result.followers == Collections.EMPTY_SET) {
        result.followers = Sets.newHashSet();
    }
    if (isFinalState(ctx.context, fromNfa, returning, canReturn))
        result.followers.add(ctx.stop);
    for (INFAState<?, ?> follower : getFollowers(ctx.context, fromNfa, returning, canReturn)) {
        boolean folCanReturn = !canEnterRuleCall(follower);
        boolean folReturning = follower.hasOutgoingRuleCall() && folCanReturn;
        PDAState r = createState(ctx, stack, follower, constructedType, folReturning, folCanReturn, visited);
        if (r != null)
            result.followers.add(r);
    }
    if (canReturn && fromNfa.isEndState() && stack != null && stack.getRuleCall() != null) {
        visited = Sets.newHashSet();
        PDAState r = createState(ctx, stack.getParent(), stack.getRuleCall(), constructedType, true, true, visited);
        if (r != null)
            result.followers.add(r);
    }
    return result;
}
Also used : AbstractElement(org.eclipse.xtext.AbstractElement) INFAState(org.eclipse.xtext.grammaranalysis.INFAState) IPDAState(org.eclipse.xtext.grammaranalysis.IPDAState) Pair(org.eclipse.xtext.util.Pair)

Example 2 with Pair

use of org.eclipse.xtext.util.Pair in project xtext-core by eclipse.

the class StringProduction method lex.

protected Stack<Pair<Token, String>> lex(String string) {
    int offset = 0;
    Matcher wsMatcher = WS.matcher(string);
    List<Pair<Token, Matcher>> matcher = Lists.newArrayList();
    for (Token t : Token.values()) matcher.add(Tuples.create(t, t.pattern.matcher(string)));
    Stack<Pair<Token, String>> result = new Stack<Pair<Token, String>>();
    ROOT: while (offset < string.length()) {
        wsMatcher.region(offset, string.length());
        if (wsMatcher.find()) {
            offset = wsMatcher.end();
            continue ROOT;
        }
        for (Pair<Token, Matcher> m : matcher) {
            m.getSecond().region(offset, string.length());
            if (m.getSecond().find()) {
                result.add(Tuples.create(m.getFirst(), m.getSecond().group(m.getSecond().groupCount() == 1 ? 1 : 0)));
                offset = m.getSecond().end();
                continue ROOT;
            }
        }
        throw new RuntimeException("No valid token found at '" + string.substring(offset) + "'");
    }
    Collections.reverse(result);
    return result;
}
Also used : Matcher(java.util.regex.Matcher) Pair(org.eclipse.xtext.util.Pair) Stack(java.util.Stack)

Example 3 with Pair

use of org.eclipse.xtext.util.Pair in project xtext-core by eclipse.

the class LazyLinkerTest method setUp.

@Override
public void setUp() throws Exception {
    super.setUp();
    with(new AbstractModule() {

        @Override
        protected void configure() {
            bind(EPackage.Registry.class).toInstance(EPackage.Registry.INSTANCE);
            bind(IGrammarAccess.class).toInstance(new IGrammarAccess() {

                @Override
                public List<Pair<Keyword, Keyword>> findKeywordPairs(String leftKw, String rightKw) {
                    return Collections.emptyList();
                }

                @Override
                public List<Keyword> findKeywords(String... keywords) {
                    return Collections.emptyList();
                }

                @Override
                public List<RuleCall> findRuleCalls(AbstractRule... rules) {
                    return Collections.emptyList();
                }

                @Override
                public Grammar getGrammar() {
                    return XtextFactory.eINSTANCE.createGrammar();
                }
            });
        }
    });
    linker = get(LazyLinker.class);
    resourceSet = get(XtextResourceSet.class);
    resourceSet.setClasspathURIContext(getClass());
    lazyLinkingPackage = (EPackage) resourceSet.getResource(URI.createURI("classpath:/org/eclipse/xtext/linking/lazy/LazyLinking.ecore"), true).getContents().get(0);
}
Also used : IGrammarAccess(org.eclipse.xtext.IGrammarAccess) Keyword(org.eclipse.xtext.Keyword) XtextResourceSet(org.eclipse.xtext.resource.XtextResourceSet) AbstractRule(org.eclipse.xtext.AbstractRule) RuleCall(org.eclipse.xtext.RuleCall) AbstractModule(com.google.inject.AbstractModule) EPackage(org.eclipse.emf.ecore.EPackage) Pair(org.eclipse.xtext.util.Pair)

Example 4 with Pair

use of org.eclipse.xtext.util.Pair in project xtext-core by eclipse.

the class SerializerTestHelper method assertSerializeWithoutNodeModel.

public void assertSerializeWithoutNodeModel(EObject semanticObject) {
    try {
        EObject parsed;
        if (semanticObject.eResource().getContents().contains(semanticObject)) {
            List<Pair<EObject, ICompositeNode>> nodes = detachNodeModel(semanticObject);
            String serialized = serializeWithoutNodeModel(semanticObject);
            parsed = parseHelper.parse(serialized, semanticObject.eResource().getResourceSet());
            reattachNodes(nodes);
        } else {
            INode oldNode = NodeModelUtils.getNode(semanticObject);
            String oldtext = oldNode.getRootNode().getText();
            String oldURI = semanticObject.eResource().getURIFragment(semanticObject);
            List<Pair<EObject, ICompositeNode>> nodes = detachNodeModel(semanticObject);
            String serialized = serializeWithoutNodeModel(semanticObject);
            ITextRegion oldRegion = oldNode.getTextRegion();
            String newtext = oldtext.substring(0, oldRegion.getOffset()) + serialized + oldtext.substring(oldRegion.getOffset() + oldRegion.getLength());
            EObject newmodel = parseHelper.parse(newtext, semanticObject.eResource().getResourceSet());
            parsed = newmodel.eResource().getEObject(oldURI);
            reattachNodes(nodes);
        }
        EcoreUtil.resolveAll(parsed);
        Assert.assertTrue(parsed.eResource().getErrors().toString(), parsed.eResource().getErrors().isEmpty());
        parsed.eResource().getResourceSet().getResources().remove(parsed.eResource());
        assertEqualWithEmfFormatter(semanticObject, parsed);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }
}
Also used : INode(org.eclipse.xtext.nodemodel.INode) ITextRegion(org.eclipse.xtext.util.ITextRegion) EObject(org.eclipse.emf.ecore.EObject) Pair(org.eclipse.xtext.util.Pair)

Example 5 with Pair

use of org.eclipse.xtext.util.Pair in project xtext-core by eclipse.

the class SerializerTestHelper method detachNodeModel.

protected List<Pair<EObject, ICompositeNode>> detachNodeModel(EObject eObject) {
    EcoreUtil.resolveAll(eObject);
    List<Pair<EObject, ICompositeNode>> result = Lists.newArrayList();
    Iterator<Object> iterator = EcoreUtil.getAllContents(eObject.eResource(), false);
    while (iterator.hasNext()) {
        EObject object = (EObject) iterator.next();
        Iterator<Adapter> adapters = object.eAdapters().iterator();
        while (adapters.hasNext()) {
            Adapter adapter = adapters.next();
            if (adapter instanceof ICompositeNode) {
                adapters.remove();
                result.add(Tuples.create(object, (ICompositeNode) adapter));
                break;
            }
        }
    }
    return result;
}
Also used : EObject(org.eclipse.emf.ecore.EObject) ICompositeNode(org.eclipse.xtext.nodemodel.ICompositeNode) EObject(org.eclipse.emf.ecore.EObject) Adapter(org.eclipse.emf.common.notify.Adapter) Pair(org.eclipse.xtext.util.Pair)

Aggregations

Pair (org.eclipse.xtext.util.Pair)8 EObject (org.eclipse.emf.ecore.EObject)2 IPDAState (org.eclipse.xtext.grammaranalysis.IPDAState)2 AbstractModule (com.google.inject.AbstractModule)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 HashSet (java.util.HashSet)1 Map (java.util.Map)1 Stack (java.util.Stack)1 Matcher (java.util.regex.Matcher)1 Adapter (org.eclipse.emf.common.notify.Adapter)1 EPackage (org.eclipse.emf.ecore.EPackage)1 EStructuralFeature (org.eclipse.emf.ecore.EStructuralFeature)1 AbstractElement (org.eclipse.xtext.AbstractElement)1 AbstractRule (org.eclipse.xtext.AbstractRule)1 IGrammarAccess (org.eclipse.xtext.IGrammarAccess)1 Keyword (org.eclipse.xtext.Keyword)1 RuleCall (org.eclipse.xtext.RuleCall)1 INFAState (org.eclipse.xtext.grammaranalysis.INFAState)1 ICompositeNode (org.eclipse.xtext.nodemodel.ICompositeNode)1