Search in sources :

Example 1 with Rule

use of org.whole.lang.grammars.model.Rule in project whole by wholeplatform.

the class ParserTemplateFactory method updateRule.

protected void updateRule(Set<ActiveRule> completeSet, ActiveRule ar, Rule dotRule) {
    Rule dotRuleParent = (Rule) dotRule.wGetParent();
    switch(dotRuleParent.wGetEntityOrd()) {
        case GrammarsEntityDescriptorEnum.Concatenate_ord:
            int dotRuleIndex = dotRuleParent.wIndexOf(dotRule);
            if (dotRuleIndex + 1 < dotRuleParent.wSize())
                ar.setDotRule((Rule) dotRuleParent.wGet(dotRuleIndex + 1));
            else
                updateRule(completeSet, ar, dotRuleParent);
            break;
        case GrammarsEntityDescriptorEnum.Optional_ord:
        case GrammarsEntityDescriptorEnum.As_ord:
            updateRule(completeSet, ar, dotRuleParent);
            break;
        case GrammarsEntityDescriptorEnum.Production_ord:
            ar.setDotRule(dotRuleParent);
            completeSet.add(ar);
            break;
    }
}
Also used : Rule(org.whole.lang.grammars.model.Rule)

Example 2 with Rule

use of org.whole.lang.grammars.model.Rule in project whole by wholeplatform.

the class ParserTemplateFactory method propagateActivation.

protected void propagateActivation(Set<ActiveRule> terminalSet, Set<NonTerminal> recursiveSet, ListIterator<ActiveRule> activeRules, ActiveRule ar) {
    Rule dotRule = ar.getDotRule();
    switch(dotRule.wGetEntityOrd()) {
        case GrammarsEntityDescriptorEnum.DataTerminal_ord:
        case GrammarsEntityDescriptorEnum.LiteralTerminal_ord:
            terminalSet.add(ar);
            break;
        case GrammarsEntityDescriptorEnum.NonTerminal_ord:
            NonTerminal nt = (NonTerminal) dotRule;
            if (recursiveSet.add(nt)) {
                activeRules.add(ar = createActiveRule(nt));
                propagateActivation(terminalSet, recursiveSet, activeRules, ar);
            } else
                ar.setRecursive(true);
            break;
        case GrammarsEntityDescriptorEnum.Concatenate_ord:
            Concatenate c = (Concatenate) dotRule;
            if (c.wSize() > 0) {
                ar.setDotRule((Rule) c.wGet(0));
                propagateActivation(terminalSet, recursiveSet, activeRules, ar);
            }
            break;
        case GrammarsEntityDescriptorEnum.Optional_ord:
            Optional o = (Optional) dotRule;
            ar.setDotRule(o.getRule());
            propagateActivation(terminalSet, recursiveSet, activeRules, ar);
            // TODO add also the rule after the optional
            break;
        case GrammarsEntityDescriptorEnum.Repeat_ord:
            Repeat r = (Repeat) dotRule;
            // TODO check lower bound and split active state for repeat continuation if 0
            ar.setDotRule(r.getRule());
            propagateActivation(terminalSet, recursiveSet, activeRules, ar);
            break;
        case GrammarsEntityDescriptorEnum.As_ord:
            As as = (As) dotRule;
            ar.setDotRule(as.getRule());
            propagateActivation(terminalSet, recursiveSet, activeRules, ar);
            break;
    }
}
Also used : As(org.whole.lang.grammars.model.As) Optional(org.whole.lang.grammars.model.Optional) Concatenate(org.whole.lang.grammars.model.Concatenate) NonTerminal(org.whole.lang.grammars.model.NonTerminal) Repeat(org.whole.lang.grammars.model.Repeat) Rule(org.whole.lang.grammars.model.Rule)

Example 3 with Rule

use of org.whole.lang.grammars.model.Rule in project whole by wholeplatform.

the class ParserTemplateFactory method matchTerminals.

/*
	 * For every ActiveRule in currentStates starting with a Terminal
	 * match it with the lexer and advance or remove it.
	 * 
	 */
public Set<ActiveRule> matchTerminals() {
    Set<ActiveRule> matchSet = new HashSet<ActiveRule>();
    java.util.regex.Pattern pattern = null;
    for (ActivationState as : currentStates) {
        ListIterator<ActiveRule> activeRules = as.getActiveRules().listIterator();
        while (activeRules.hasNext()) {
            ActiveRule ar = activeRules.next();
            Rule dotRule = ar.getDotRule();
            switch(dotRule.wGetEntityOrd()) {
                case GrammarsEntityDescriptorEnum.DataTerminal_ord:
                case GrammarsEntityDescriptorEnum.LiteralTerminal_ord:
                    java.util.regex.Pattern p = (java.util.regex.Pattern) dotRule.wGet(GrammarsFeatureDescriptorEnum.pattern).wGetValue();
                    lexer.withPattern(p);
                    if (lexer.hasNext()) {
                        if (pattern == null || p.pattern().equals(pattern.pattern())) {
                            pattern = p;
                            matchSet.add(ar);
                            String token = lexer.next();
                            if (dotRule.wGetEntityDescriptor().equals(GrammarsEntityDescriptorEnum.DataTerminal))
                                builder.wEntity(ed, token);
                        } else
                            throw new IllegalStateException("Backtracking is required for processing multiple matching patterns: ..., " + pattern.pattern());
                    } else
                        activeRules.remove();
            }
        }
    }
    return matchSet;
}
Also used : Rule(org.whole.lang.grammars.model.Rule) HashSet(java.util.HashSet)

Example 4 with Rule

use of org.whole.lang.grammars.model.Rule in project whole by wholeplatform.

the class GenericGrammarBasedValidatorVisitor method calculateDataTerminals.

private void calculateDataTerminals(Grammar grammar) {
    this.dataTerminals = new HashMap<EntityDescriptor<?>, DataTerminal>();
    // TODO ensure grammar normalized
    Map<String, Rule> productions = new HashMap<String, Rule>();
    IEntityIterator<Production> pi = IteratorFactory.<Production>childIterator();
    pi.reset(grammar.getPhraseStructure());
    for (Production p : pi) productions.put(p.getName().getValue(), p.getRule());
    Map<String, Rule> lexicon = new HashMap<String, Rule>();
    IEntityIterator<Production> li = IteratorFactory.<Production>childIterator();
    li.reset(grammar.getLexicalStructure());
    for (Production p : li) lexicon.put(p.getName().getValue(), p.getRule());
    ILanguageKit languageKit = ReflectionFactory.getLanguageKit(GrammarsUtils.getLanguageURI(grammar), false, null);
    EntityDescriptorEnum edEnum = languageKit.getEntityDescriptorEnum();
    for (EntityDescriptor<?> ed : edEnum) if (EntityUtils.isData(ed)) {
        Rule production = productions.get(ed.getName());
        if (!ed.getDataKind().isEnumValue()) {
            DataTerminal dataTerminal = Matcher.find(GrammarsEntityDescriptorEnum.DataTerminal, production, false);
            if (dataTerminal == null) {
                NonTerminal nonTerminal = Matcher.find(GrammarsEntityDescriptorEnum.NonTerminal, production, false);
                dataTerminal = Matcher.find(GrammarsEntityDescriptorEnum.DataTerminal, lexicon.get(nonTerminal.getValue()), false);
            }
            dataTerminals.put(ed, EntityUtils.clone(dataTerminal));
        }
    }
}
Also used : EntityDescriptorEnum(org.whole.lang.reflect.EntityDescriptorEnum) GrammarsEntityDescriptorEnum(org.whole.lang.grammars.reflect.GrammarsEntityDescriptorEnum) HashMap(java.util.HashMap) NonTerminal(org.whole.lang.grammars.model.NonTerminal) ILanguageKit(org.whole.lang.reflect.ILanguageKit) EntityDescriptor(org.whole.lang.reflect.EntityDescriptor) Production(org.whole.lang.grammars.model.Production) DataTerminal(org.whole.lang.grammars.model.DataTerminal) Rule(org.whole.lang.grammars.model.Rule)

Example 5 with Rule

use of org.whole.lang.grammars.model.Rule in project whole by wholeplatform.

the class GrammarBasedUnparserVisitor method visit.

@Override
public void visit(Choose entity) {
    if (!appendModelEntityAsFragment()) {
        if (Matcher.match(GrammarsEntityDescriptorEnum.As, entity.wGet(0)))
            append(getAsString(model));
        else {
            // get rule using model entity
            EntityDescriptorEnum edEnum = model.wGetLanguageKit().getEntityDescriptorEnum();
            Rule rule = null;
            for (int size = entity.wSize(), i = 0; rule == null && i < size; i++) {
                Rule child = (Rule) entity.wGet(i);
                NonTerminal nt = (NonTerminal) Matcher.find(phraseNonTerminal, child, false);
                if (// TODO test was isAssignableFrom
                Matcher.isAssignableAsIsFrom(edEnum.valueOf(nt.getValue()), model))
                    rule = child;
            }
            if (rule != null)
                rule.accept(this);
            else
                throw new IllegalStateException("missing choose rule for model entity");
        }
    }
}
Also used : EntityDescriptorEnum(org.whole.lang.reflect.EntityDescriptorEnum) GrammarsEntityDescriptorEnum(org.whole.lang.grammars.reflect.GrammarsEntityDescriptorEnum) NonTerminal(org.whole.lang.grammars.model.NonTerminal) Rule(org.whole.lang.grammars.model.Rule)

Aggregations

Rule (org.whole.lang.grammars.model.Rule)14 IEntity (org.whole.lang.model.IEntity)7 Test (org.junit.Test)6 Grammar (org.whole.lang.grammars.model.Grammar)6 TestXmlGrammar (org.whole.lang.grammars.util.TestXmlGrammar)6 NonTerminal (org.whole.lang.grammars.model.NonTerminal)5 Production (org.whole.lang.grammars.model.Production)3 As (org.whole.lang.grammars.model.As)2 Repeat (org.whole.lang.grammars.model.Repeat)2 GrammarsEntityDescriptorEnum (org.whole.lang.grammars.reflect.GrammarsEntityDescriptorEnum)2 AbstractPatternFilterIterator (org.whole.lang.iterators.AbstractPatternFilterIterator)2 ModelsEntityFactory (org.whole.lang.models.factories.ModelsEntityFactory)2 EntityDescriptorEnum (org.whole.lang.reflect.EntityDescriptorEnum)2 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 Choose (org.whole.lang.grammars.model.Choose)1 Concatenate (org.whole.lang.grammars.model.Concatenate)1 DataTerminal (org.whole.lang.grammars.model.DataTerminal)1 Optional (org.whole.lang.grammars.model.Optional)1 Template (org.whole.lang.grammars.model.Template)1