All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.xtext.serializer.analysis.ISyntacticSequencerPDAProvider Maven / Gradle / Ivy

/*******************************************************************************
 * Copyright (c) 2011 itemis AG (http://www.itemis.eu) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *******************************************************************************/
package org.eclipse.xtext.serializer.analysis;

import java.util.List;
import java.util.Map;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.AbstractElement;
import org.eclipse.xtext.RuleCall;
import org.eclipse.xtext.grammaranalysis.IPDAState;
import org.eclipse.xtext.grammaranalysis.IPDAState.PDAStateType;
import org.eclipse.xtext.serializer.analysis.GrammarAlias.AbstractElementAlias;
import org.eclipse.xtext.serializer.sequencer.RuleCallStack;
import org.eclipse.xtext.util.formallang.Nfa;
import org.eclipse.xtext.util.formallang.NfaUtil;
import org.eclipse.xtext.util.formallang.Pda;

import com.google.common.base.Function;
import com.google.common.base.Predicate;
import com.google.inject.ImplementedBy;

/**
 * @author Moritz Eysholdt - Initial contribution and API
 */
@ImplementedBy(SyntacticSequencerPDAProvider.class)
public interface ISyntacticSequencerPDAProvider {

	public class GetGrammarElement implements Function {
		public AbstractElement apply(ISynState from) {
			return from.getGrammarElement();
		}
	}

	public interface ISynAbsorberState extends ISynState {
		List getOutAbsorbers();

		List getOutTransitions();

		Map getOutTransitionsByElement();
	}

	public interface ISynEmitterState extends ISynState, ISynNavigable {
	}

	public interface ISynFollowerOwner {
		EObject getContext();

		EClass getEClass();

		List getFollowers();
	}

	public interface ISynNavigable extends ISynFollowerOwner {
		Pda getPathToTarget();

		List getShortestPathTo(AbstractElement ele, RuleCallStack stack);

		List getShortestPathToAbsorber(RuleCallStack stack);

		List getShortestStackpruningPathTo(AbstractElement ele, RuleCallStack stack);

		List getShortestStackpruningPathToAbsorber(RuleCallStack stack);

		ISynAbsorberState getTarget();

		boolean hasEmitters();

		boolean involvesUnassignedTokenRuleCalls();

		boolean isSyntacticallyAmbiguous();
	}

	public interface ISynState extends ISynFollowerOwner {

		AbstractElement getGrammarElement();

		SynStateType getType();

		String toString(Function elementFormatter);
	}

	public interface ISynTransition extends ISynNavigable {

		AbstractElementAlias getAmbiguousSyntax();

		List getAmbiguousSyntaxes();

		ISynAbsorberState getSource();
	}

	public class SynAbsorberNfaAdapter implements Nfa {

		protected ISynAbsorberState start;
		protected ISynAbsorberState stop;

		public SynAbsorberNfaAdapter(ISynAbsorberState start) {
			super();
			this.start = start;
			this.stop = new NfaUtil().find(this, new Predicate() {
				public boolean apply(ISynAbsorberState input) {
					return input.getType().isStop();
				}
			});
		}

		public Iterable getFollowers(ISynAbsorberState node) {
			return node.getOutAbsorbers();
		}

		public ISynAbsorberState getStart() {
			return start;
		}

		public ISynAbsorberState getStop() {
			return stop;
		}

	}

	public class SynPredicates {
		public static Predicate absorber() {
			return new Predicate() {
				public boolean apply(ISynState input) {
					return input instanceof ISynAbsorberState;
				}
			};
		}

		public static Predicate absorber(final AbstractElement ele) {
			return new Predicate() {
				public boolean apply(ISynState input) {
					return input.getGrammarElement() == ele && input instanceof ISynAbsorberState;
				}
			};
		}

		public static Predicate element(final AbstractElement ele) {
			return new Predicate() {
				public boolean apply(ISynState input) {
					return input.getGrammarElement() == ele;
				}
			};
		}

		public static Predicate emitter(final AbstractElement ele) {
			return new Predicate() {
				public boolean apply(ISynState input) {
					return input.getGrammarElement() == ele && input instanceof ISynEmitterState;
				}
			};
		}

		public static Predicate ruleCallEnter(final RuleCall ele) {
			return new Predicate() {
				public boolean apply(ISynState input) {
					return input.getGrammarElement() == ele && input.getType().isRuleCallEnter();
				}
			};
		}

		public static Predicate ruleCallExit(final RuleCall ele) {
			return new Predicate() {
				public boolean apply(ISynState input) {
					return input.getGrammarElement() == ele && input.getType().isRuleCallExit();
				}
			};
		}

		public static Predicate ruleCallExits() {
			return new Predicate() {
				public boolean apply(ISynState input) {
					return input.getType().isRuleCallExit();
				}
			};
		}

		public static Predicate ruleCallExitsOrAbsorber() {
			return new Predicate() {
				public boolean apply(ISynState input) {
					return input.getType().isRuleCallExit() || input instanceof ISynAbsorberState;
				}
			};
		}
	}

	public enum SynStateType {
		ASSIGNED_ACTION_CALL(PDAStateType.ELEMENT), //
		ASSIGNED_BOOLEAN_KEYWORD(PDAStateType.ELEMENT), //
		ASSIGNED_CROSSREF_DATATYPE_RULE_CALL(PDAStateType.ELEMENT), //
		ASSIGNED_CROSSREF_ENUM_RULE_CALL(PDAStateType.ELEMENT), //  
		ASSIGNED_CROSSREF_KEYWORD(PDAStateType.ELEMENT), // 
		ASSIGNED_CROSSREF_TERMINAL_RULE_CALL(PDAStateType.ELEMENT), //
		ASSIGNED_DATATYPE_RULE_CALL(PDAStateType.ELEMENT), //
		ASSIGNED_ENUM_RULE_CALL(PDAStateType.ELEMENT), //
		ASSIGNED_KEYWORD(PDAStateType.ELEMENT), //
		ASSIGNED_PARSER_RULE_CALL(PDAStateType.ELEMENT), //
		ASSIGNED_TERMINAL_RULE_CALL(PDAStateType.ELEMENT), //
		START(PDAStateType.START), //
		STOP(PDAStateType.STOP), //
		TRANSITION(null), //
		UNASSIGEND_ACTION_CALL(PDAStateType.ELEMENT), //
		UNASSIGEND_KEYWORD(PDAStateType.ELEMENT), //
		UNASSIGNED_DATATYPE_RULE_CALL(PDAStateType.ELEMENT), //
		UNASSIGNED_PARSER_RULE_ENTER(PDAStateType.RULECALL_ENTER), //
		UNASSIGNED_PARSER_RULE_EXIT(PDAStateType.RULECALL_EXIT), //
		UNASSIGNED_TERMINAL_RULE_CALL(PDAStateType.ELEMENT);

		protected IPDAState.PDAStateType simpleType;

		private SynStateType(PDAStateType simpleType) {
			this.simpleType = simpleType;
		}

		public IPDAState.PDAStateType getSimpleType() {
			return simpleType;
		}

		public boolean isElement() {
			return simpleType == PDAStateType.ELEMENT;
		}

		public boolean isRuleCallEnter() {
			return simpleType == PDAStateType.RULECALL_ENTER;
		}

		public boolean isRuleCallExit() {
			return simpleType == PDAStateType.RULECALL_EXIT;
		}

		public boolean isStart() {
			return simpleType == PDAStateType.START;
		}

		public boolean isStop() {
			return simpleType == PDAStateType.STOP;
		}

	}

	ISynAbsorberState getPDA(EObject context, EClass type);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy