Search in sources :

Example 1 with As

use of org.whole.lang.grammars.model.As 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 2 with As

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

the class PathExpressionsQueriesTest method testPatternPredicate.

@Test
public void testPatternPredicate() {
    ITemplateManager tm = PathExpressionsQueriesTemplateManager.instance();
    Grammar g = new TestXmlGrammar().create();
    int count = 0;
    for (As as : BehaviorUtils.<As>compileAndLazyEvaluate((PathExpression) tm.create("path7"), g)) {
        Assert.assertEquals("tag", as.getName().wStringValue());
        count++;
    }
    Assert.assertEquals(2, count);
}
Also used : As(org.whole.lang.grammars.model.As) TestXmlGrammar(org.whole.lang.grammars.util.TestXmlGrammar) ITemplateManager(org.whole.lang.templates.ITemplateManager) TestXmlGrammar(org.whole.lang.grammars.util.TestXmlGrammar) Grammar(org.whole.lang.grammars.model.Grammar) QueriesGrammar(org.whole.lang.grammars.codebase.QueriesGrammar) Test(org.junit.Test)

Example 3 with As

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

the class SelectQueriesTest method testSelectTemplate1.

@Test
public void testSelectTemplate1() {
    ITemplateManager tm = SelectQueriesTemplateManager.instance();
    Grammar model = new TestXmlGrammar().create();
    IBindingManager bm = BindingManagerFactory.instance.createArguments();
    PathExpression query = (PathExpression) tm.create("selectTemplate1");
    for (IEntity tuple : BehaviorUtils.compileAndLazyEvaluate(query, model, bm)) {
        Feature f = (Feature) tuple.wGet(0);
        As e = (As) tuple.wGet(1);
        assertEquals(e.getName().getValue(), f.getName().wStringValue());
        assertEquals(e.getRule().wStringValue(), f.getType().wStringValue());
    }
}
Also used : As(org.whole.lang.grammars.model.As) PathExpression(org.whole.lang.queries.model.PathExpression) IEntity(org.whole.lang.model.IEntity) TestXmlGrammar(org.whole.lang.grammars.util.TestXmlGrammar) IBindingManager(org.whole.lang.bindings.IBindingManager) ITemplateManager(org.whole.lang.templates.ITemplateManager) TestXmlGrammar(org.whole.lang.grammars.util.TestXmlGrammar) Grammar(org.whole.lang.grammars.model.Grammar) Feature(org.whole.lang.models.model.Feature) Test(org.junit.Test)

Example 4 with As

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

the class Grammars2ModelsVisitor method visit.

@Override
public void visit(Production entity) {
    ModelsEntityFactory mf = ModelsEntityFactory.instance;
    String eName = getMappedEntityName(entity);
    Rule rule = entity.getRule();
    AbstractPatternFilterIterator<Rule> ruleIterator = IteratorFactory.<Rule>descendantOrSelfMatcherIterator().withPattern(GrammarsEntityDescriptorEnum.Rule);
    ruleIterator.reset(rule);
    while (ruleIterator.hasNext()) {
        rule = ruleIterator.next();
        switch(rule.wGetEntityOrd()) {
            // map productions with a single lexical non-terminal as data entities
            case GrammarsEntityDescriptorEnum.NonTerminal_ord:
                if (!isLexicalNonTerminal((NonTerminal) rule) || !EntityUtils.hasParent(rule) || !Matcher.match(GrammarsEntityDescriptorEnum.Production, rule.wGetParent()) || !Matcher.match(GrammarsEntityDescriptorEnum.DataTerminal, lexiconMap.get(((NonTerminal) rule).getValue()).getRule()))
                    break;
            case GrammarsEntityDescriptorEnum.DataTerminal_ord:
                DataEntity de = getModelDeclaration(eName, ModelsEntityDescriptorEnum.DataEntity);
                Template template = entity.getTemplate();
                if (Matcher.matchImpl(GrammarsEntityDescriptorEnum.DataType, template))
                    de.getDataType().wSetValue(GrammarsUtils.getDataType((DataType) template));
                else if (Matcher.matchImpl(GrammarsEntityDescriptorEnum.CustomDataType, template))
                    de.getDataType().wSetValue(template.wStringValue());
                return;
            case GrammarsEntityDescriptorEnum.Choose_ord:
                boolean isPolymorphic = false;
                AbstractPatternFilterIterator<NonTerminal> ruleIterator2 = IteratorFactory.<NonTerminal>descendantOrSelfMatcherIterator().withPattern(GrammarsEntityDescriptorEnum.NonTerminal);
                ruleIterator2.reset(rule);
                for (NonTerminal nt2 : ruleIterator2) if (!isLexicalNonTerminal(nt2)) {
                    ensureType(getModelDeclaration(getMappedEntityName(nt2)).getTypes(), eName);
                    isPolymorphic = true;
                }
                if (isPolymorphic) {
                    SimpleEntity se = getModelDeclaration(eName, ModelsEntityDescriptorEnum.SimpleEntity);
                    se.getModifiers().wAdd(mf.createEntityModifier(EntityModifierEnum._abstract));
                    return;
                } else if (!rule.wIsEmpty() && Matcher.match(GrammarsEntityDescriptorEnum.As, rule.wGet(0))) {
                    EnumEntity ee = getModelDeclaration(eName, ModelsEntityDescriptorEnum.EnumEntity);
                    EnumValues enumValues = ModelsEntityFactory.instance.createEnumValues(0);
                    AbstractPatternFilterIterator<As> ruleIterator3 = IteratorFactory.<As>descendantOrSelfMatcherIterator().withPattern(GrammarsEntityDescriptorEnum.As);
                    ruleIterator3.reset(rule);
                    for (As as : ruleIterator3) enumValues.wAdd(ModelsEntityFactory.instance.createEnumValue(as.getName().getValue()));
                    ee.setValues(enumValues);
                    return;
                }
                // }
                break;
            case GrammarsEntityDescriptorEnum.Repeat_ord:
                if (ruleIterator.skipTo(GrammarsEntityDescriptorEnum.NonTerminal)) {
                    // FIXME wrongly assumes that the separator, if present, is a lexical token
                    if (!EntityUtils.isResolver(((Repeat) rule).getSeparator())) {
                        // if (Matcher.matchImpl(GrammarsEntityDescriptorEnum.NonTerminal, ((Repeat) rule).getSeparator())) {
                        ruleIterator.next();
                        ruleIterator.skipTo(GrammarsEntityDescriptorEnum.NonTerminal);
                    }
                    NonTerminal nt = null;
                    AbstractPatternFilterIterator<NonTerminal> ruleIterator4 = IteratorFactory.<NonTerminal>descendantOrSelfMatcherIterator().withPattern(GrammarsEntityDescriptorEnum.NonTerminal);
                    ruleIterator4.reset(rule);
                    for (NonTerminal nt2 : ruleIterator4) if (!isLexicalNonTerminal(nt2)) {
                        nt = nt2;
                        break;
                    }
                    // by now we assume that the separator, if present, is a lexical token
                    if (nt == null)
                        break;
                    // the above statements replace this code, allowing lexical Repeat rule
                    // NonTerminal nt = ruleIterator.next(GrammarsEntityDescriptorEnum.NonTerminal);
                    // while (isLexicalNonTerminal(nt)) {
                    // nt = ruleIterator.next(GrammarsEntityDescriptorEnum.NonTerminal);
                    // }
                    CompositeEntity ce = getModelDeclaration(eName, ModelsEntityDescriptorEnum.CompositeEntity);
                    ce.setComponentType(mf.createSimpleName(getMappedEntityName(nt)));
                    ce.getComponentModifiers().wAdd(mf.createComponentModifier(ComponentModifierEnum.ordered));
                }
                return;
            case GrammarsEntityDescriptorEnum.As_ord:
                As asRule = (As) rule;
                // normalization invariants assure that this branch is unreachable
                // if (Matcher.match(GrammarsEntityDescriptorEnum.LiteralTerminal, asRule.getRule())) {
                // EnumEntity ee = getModelDeclaration(eName, ModelsEntityDescriptorEnum.EnumEntity);
                // 
                // ee.getValues().wAdd(mf.createEnumValue(getMappedName(asRule)));
                // 
                // while (ruleIterator.skipTo(GrammarsEntityDescriptorEnum.As)) {
                // rule = ruleIterator.next(GrammarsEntityDescriptorEnum.As);
                // asRule = (As) rule;
                // 
                // ee.getValues().wAdd(mf.createEnumValue(getMappedName(asRule)));
                // }
                // } else {
                SimpleEntity se = getModelDeclaration(eName, ModelsEntityDescriptorEnum.SimpleEntity);
                Features features = se.getFeatures();
                ensureFeature(features, ruleIterator, asRule);
                while (ruleIterator.hasNext()) {
                    rule = ruleIterator.next();
                    switch(rule.wGetEntityOrd()) {
                        case GrammarsEntityDescriptorEnum.As_ord:
                            asRule = (As) rule;
                            ensureFeature(features, ruleIterator, asRule);
                            break;
                    }
                }
                // }
                return;
            case GrammarsEntityDescriptorEnum.Concatenate_ord:
                break;
        }
    }
    getModelDeclaration(eName, ModelsEntityDescriptorEnum.SimpleEntity);
}
Also used : EnumEntity(org.whole.lang.models.model.EnumEntity) SimpleEntity(org.whole.lang.models.model.SimpleEntity) ModelsEntityFactory(org.whole.lang.models.factories.ModelsEntityFactory) NonTerminal(org.whole.lang.grammars.model.NonTerminal) Repeat(org.whole.lang.grammars.model.Repeat) EnumValues(org.whole.lang.models.model.EnumValues) Template(org.whole.lang.grammars.model.Template) As(org.whole.lang.grammars.model.As) AbstractPatternFilterIterator(org.whole.lang.iterators.AbstractPatternFilterIterator) CompositeEntity(org.whole.lang.models.model.CompositeEntity) DataEntity(org.whole.lang.models.model.DataEntity) Features(org.whole.lang.models.model.Features) Rule(org.whole.lang.grammars.model.Rule)

Example 5 with As

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

the class AsPart method getModelSpecificChildren.

protected List<IEntity> getModelSpecificChildren() {
    As entity = getModelEntity();
    List<IEntity> list = new ArrayList<IEntity>(2);
    list.add(entity.getRule());
    list.add(entity.getName());
    return list;
}
Also used : As(org.whole.lang.grammars.model.As) IEntity(org.whole.lang.model.IEntity) ArrayList(java.util.ArrayList)

Aggregations

As (org.whole.lang.grammars.model.As)6 Test (org.junit.Test)3 Grammar (org.whole.lang.grammars.model.Grammar)3 TestXmlGrammar (org.whole.lang.grammars.util.TestXmlGrammar)3 IEntity (org.whole.lang.model.IEntity)3 ITemplateManager (org.whole.lang.templates.ITemplateManager)3 IBindingManager (org.whole.lang.bindings.IBindingManager)2 NonTerminal (org.whole.lang.grammars.model.NonTerminal)2 Repeat (org.whole.lang.grammars.model.Repeat)2 Rule (org.whole.lang.grammars.model.Rule)2 Feature (org.whole.lang.models.model.Feature)2 PathExpression (org.whole.lang.queries.model.PathExpression)2 ArrayList (java.util.ArrayList)1 QueriesGrammar (org.whole.lang.grammars.codebase.QueriesGrammar)1 Concatenate (org.whole.lang.grammars.model.Concatenate)1 Optional (org.whole.lang.grammars.model.Optional)1 Template (org.whole.lang.grammars.model.Template)1 AbstractPatternFilterIterator (org.whole.lang.iterators.AbstractPatternFilterIterator)1 FieldDeclaration (org.whole.lang.java.model.FieldDeclaration)1 ModelsEntityFactory (org.whole.lang.models.factories.ModelsEntityFactory)1