/** * Copyright 2004-2016 Riccardo Solmi. All rights reserved. * This file is part of the Whole Platform. * * The Whole Platform is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The Whole Platform is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>. */ package org.whole.lang.grammars.factories; import static org.whole.lang.commons.factories.CommonsEntityAdapterFactory.createResolver; import org.whole.lang.events.IdentityEventHandler; import org.whole.lang.factories.DefaultEntityRegistryConfiguration; import org.whole.lang.factories.IEntityRegistry; import org.whole.lang.grammars.model.CategoryEnum; import org.whole.lang.grammars.model.Literal; import org.whole.lang.grammars.model.LiteralTerminal; import org.whole.lang.grammars.model.RegExp; import org.whole.lang.grammars.reflect.GrammarsEntityDescriptorEnum; import org.whole.lang.grammars.reflect.GrammarsFeatureDescriptorEnum; import org.whole.lang.model.IEntity; import org.whole.lang.reflect.FeatureDescriptor; import org.whole.lang.util.StringUtils; /** * @author Riccardo Solmi */ public class GrammarsDefaultEntityRegistryConfiguration extends DefaultEntityRegistryConfiguration { public void apply(IEntityRegistry er) { super.apply(er); GrammarsEntityFactory ef = GrammarsEntityFactory.instance(er); RegExp regex; Literal literal; IdentityEventHandler deriveLiteralPattern = new IdentityEventHandler() { private static final long serialVersionUID = 1L; private String derivedPattern; @Override public void notifyChanged(IEntity source, FeatureDescriptor featureDesc, String oldValue, String newValue) { IEntity parent = source.wGetParent(); if (parent instanceof LiteralTerminal) { LiteralTerminal literalTerminal = (LiteralTerminal) parent; Literal literal = literalTerminal.getLiteral(); if (literal == source) { derivedPattern = StringUtils.quoteRegex(newValue); literalTerminal.getPattern().wSetValue(derivedPattern); } else if (newValue != derivedPattern) { source.wRemoveChangeEventHandler(this); literal.wRemoveChangeEventHandler(this); } } } }; er.put(ef.createEmpty(ef.createLiteral(""))); er.put(ef.createChoose(2)); er.put(ef.createConcatenate(2)); er.put(ef.createLiteralTerminal( regex = ef.createRegExp("pattern"), ef.createCategory(CategoryEnum.DELIMITER), literal = ef.createLiteral("literal"))); regex.wAddChangeEventHandler(deriveLiteralPattern); literal.wAddChangeEventHandler(deriveLiteralPattern); er.put(ef.createDataTerminal( ef.createRegExp(".*"), ef.createCategory(CategoryEnum.LITERAL), ef.createFormat("%s"))); er.put(ef.createAs( ef.createNonTerminal("nt"), ef.createName("name"))); er.put(ef.createByLines(1)); er.put(ef.createBySize(10)); er.put(ef.createRepeat( ef.createSize(0), ef.createUnbounded(), ef.buildLiteralTerminal().set(GrammarsFeatureDescriptorEnum.literal, ",").getResult(), createResolver(GrammarsEntityDescriptorEnum.Rule))); er.put(ef.createBySize(5)); er.put(ef.createGrammar( ef.createName("GrammarName"), createResolver(GrammarsEntityDescriptorEnum.TargetLanguage), createResolver(GrammarsEntityDescriptorEnum.NonTerminal), ef.createLiteralTerminal( ef.createRegExp("\\p{javaWhitespace}*"), ef.createCategory(CategoryEnum.SEPARATOR), ef.createLiteral("")), ef.createProductions(0), ef.createProductions( ef.create(GrammarsEntityDescriptorEnum.Production, ef.createNonTerminal("StartSymbol"), createResolver(GrammarsEntityDescriptorEnum.Rule))), // ef.createURI("http://examples.whole.org/GrammarName"), // ef.createNamespace("org.whole.examples.grammarname"), createResolver(GrammarsEntityDescriptorEnum.URI), createResolver(GrammarsEntityDescriptorEnum.Namespace), createResolver(GrammarsEntityDescriptorEnum.Version), createResolver(GrammarsEntityDescriptorEnum.Literal), createResolver(GrammarsEntityDescriptorEnum.Literal), createResolver(GrammarsEntityDescriptorEnum.Literal))); } }