/*******************************************************************************
* Copyright (c) 2008 SAP
* see https://research.qkal.sap.corp/mediawiki/index.php/CoMONET
*
* Date: $Date: 2009-09-18 14:13:44 +0200 (Fr, 18 Sep 2009) $
* @version $Revision: 7886 $
* @author: $Author: c5106462 $
*******************************************************************************/
package com.sap.furcas.parsergenerator.tcs.t2m.grammar;
import java.util.Set;
import com.sap.furcas.metamodel.FURCAS.TCS.Keyword;
import com.sap.furcas.metamodel.FURCAS.TCS.PrimitiveTemplate;
import com.sap.furcas.parsergenerator.tcs.t2m.grammar.rules.ClassProductionRule;
import com.sap.furcas.runtime.common.exceptions.NameResolutionFailedException;
import com.sap.furcas.runtime.common.exceptions.SyntaxElementException;
import com.sap.furcas.runtime.parser.exceptions.SyntaxParsingException;
import com.sap.furcas.runtime.tcs.MessageHelper;
import com.sap.furcas.runtime.tcs.MetaModelElementResolutionHelper;
import com.sap.furcas.runtime.tcs.SyntaxLookup;
import com.sap.furcas.runtime.tcs.TemplateNamingHelper;
/**
* The Class PrimitiveTemplateHandler. Creates rules such as
* identifier returns[Object ret2] @init{java.lang.Object ret=null;}
* :
* (ast=NAME {ret = ast.getText();})
* {
* ret2=ret;
* }
* ;
*/
public class PrimitiveTemplateHandler {
private static final String ASTSTRING = "(ast=";
private static final String RESTBODY_STRING_START = " {ret = ";
private static final String RESTBODY_STRING_GETTEXT = " ast.getText()";
private static final String RESTBODY_STRING_MIDDLE = ";\n}";
private static final String RESTBODY_STRING_END = ")\n{\nret2=ret;\n}";
/** The writer. */
private final ANTLR3GrammarWriter writer;
private final SyntaxLookup syntaxLookup;
private final TemplateNamingHelper<?> namingHelper;
private final SemanticErrorBucket errorBucket;
private final MetaModelElementResolutionHelper<?> resolutionHelper;
/**
* keeping this constructor for testing.
*
* @param writer the writer
* @param syntaxLookup
* @param metaLookup
* @param namingHelper
* @param syntaxLookup
* @param errorBucket
* @param metaModelElementResolutionHelper
*/
protected PrimitiveTemplateHandler(ANTLR3GrammarWriter writer, TemplateNamingHelper<?> namingHelper,
SyntaxLookup syntaxLookup, SemanticErrorBucket errorBucket,
MetaModelElementResolutionHelper<?> metaModelElementResolutionHelper) {
this.writer = writer;
this.namingHelper = namingHelper;
this.syntaxLookup = syntaxLookup;
this.errorBucket = errorBucket;
this.resolutionHelper = metaModelElementResolutionHelper;
}
/**
* @param handlerConfig
*/
public PrimitiveTemplateHandler(SyntaxElementHandlerConfigurationBean<?> handlerConfig) {
this(handlerConfig.getWriter(), handlerConfig.getNamingHelper(), handlerConfig.getSyntaxLookup(), handlerConfig
.getErrorBucket(), handlerConfig.getResolutionHelper());
}
/**
* Adds the template.
*
* @param prim the prim
* @throws SyntaxParsingException
*/
public void addTemplate(PrimitiveTemplate prim) {
String content;
if (prim.getValue() != null) {
content = prim.getValue().replaceAll("%token%", RESTBODY_STRING_GETTEXT);
} else {
content = RESTBODY_STRING_GETTEXT;
}
StringBuilder rulebody = new StringBuilder();
rulebody.append(ASTSTRING).append(prim.getTokenName()).append(RESTBODY_STRING_START);
rulebody.append(content);
rulebody.append(RESTBODY_STRING_MIDDLE);
// add all keywords if allowed explicitly
if (prim.isOrKeyword()) {
Set<Keyword> keywords = syntaxLookup.getAllKeywords();
for (Keyword keyword : keywords) {
rulebody.append("\n | '");
if (keyword.getName() != null) {
rulebody.append(keyword.getName());
} else {
rulebody.append(keyword.getValue());
}
rulebody.append("' {ret = \"").append(keyword.getValue()).append("\";}");
}
}
rulebody.append(RESTBODY_STRING_END);
try {
if (resolutionHelper.resolve(prim) == null) {
errorBucket.addError("Metamodel could not resolve primitive type " + MessageHelper.getTemplateName(prim), prim);
}
} catch (NameResolutionFailedException e) {
errorBucket.addError(
"Metamodel could not resolve primitive type " + MessageHelper.getTemplateName(prim) + " " + e.getMessage(),
prim);
}
try {
String rulename = namingHelper.getRuleName(prim);
writer.addRule(new ClassProductionRule(rulename, "Object ret2", "java.lang.Object ret=null;", rulebody.toString(),
null));
} catch (SyntaxElementException e) {
errorBucket.addException(e);
}
}
}