package com.sap.furcas.runtime.parser.testbase; import com.sap.furcas.parsergenerator.GrammarGenerationException; import com.sap.furcas.parsergenerator.TCSParserGenerator; import com.sap.furcas.parsergenerator.TCSParserGeneratorFactory; import com.sap.furcas.parsergenerator.TCSSyntaxContainerBean; import com.sap.furcas.runtime.common.exceptions.ParserGeneratorInvocationException; import com.sap.furcas.runtime.common.exceptions.ParserInvokationException; import com.sap.furcas.runtime.parser.ParserFacade; import com.sap.furcas.runtime.parser.exceptions.InvalidParserImplementationException; /** * A Test base class that allows to generate a language specific parser from a given TCS file. * * The base class is configured (what to create, where to create it, ...) with the help * {@link GeneratedParserTestConfiguration}. * * @author Stephan Erb * */ public abstract class GeneratedParserBasedTest { public static TCSSyntaxContainerBean parseSyntax(GeneratedParserTestConfiguration testConfig) throws ParserGeneratorInvocationException, ParserInvokationException { SystemOutErrorHandler errorHandler = new SystemOutErrorHandler(); TCSParserGenerator generator = TCSParserGeneratorFactory.INSTANCE.createTCSParserGenerator(); TCSSyntaxContainerBean syntaxBean = generator.parseSyntax(testConfig.getSourceConfiguration(), testConfig.getSyntaxDefinitionFile(), errorHandler); if (errorHandler.hasFailedWithError()) { throw new RuntimeException("Failed to parse the TCS of language " + testConfig.getLanguageName() + ". Errors have been logged to stdout."); } return syntaxBean; } protected static ParserFacade generateParserForLanguage(TCSSyntaxContainerBean syntaxBean, GeneratedParserTestConfiguration testConfig, ClassLookup classLookup) throws GrammarGenerationException, ParserGeneratorInvocationException, InvalidParserImplementationException { ParserGenerator generator = new ParserGenerator(testConfig); boolean failed = false; try { System.out.println(""); // spacing to make our generation report easier to spot. generator.generateGrammar(syntaxBean); System.out.println(""); // spacing to make our generation report easier to spot. generator.generateParser(); generator.compileParser(); return generator.loadParserFacade(classLookup); } catch (RuntimeException e) { failed = true; throw e; } finally { if (!failed) { generator.cleanUp(); } } } }