package com.sap.furcas.ide.parserfactory; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import org.antlr.runtime.CharStream; import org.antlr.runtime.CommonTokenStream; import org.antlr.runtime.Lexer; import org.antlr.runtime.TokenStream; import com.sap.furcas.runtime.common.exceptions.ParserInstantiationException; import com.sap.furcas.runtime.common.interfaces.IRuleName; import com.sap.furcas.runtime.parser.ANTLR3LocationToken; import com.sap.furcas.runtime.parser.IModelAdapter; import com.sap.furcas.runtime.parser.InjectionOptionsBean; import com.sap.furcas.runtime.parser.antlr3.ITokenFactory; import com.sap.furcas.runtime.parser.impl.ModelInjector; import com.sap.furcas.runtime.parser.impl.ObservableInjectingParser; import com.sap.furcas.runtime.tcs.RuleNameFinder; import com.sap.ide.cts.parser.incremental.antlr.ANTLRParserFactory; public abstract class AbstractParserFactory<P extends ObservableInjectingParser, L extends Lexer> extends ANTLRParserFactory<P, L> { @Override public P createParser(TokenStream input, IModelAdapter modelAdapter) throws ParserInstantiationException { try { Class<P> parserClass = getParserClass(); Constructor<P> c = parserClass.getConstructor(TokenStream.class); P parser; parser = c.newInstance(input); ModelInjector mi = new ModelInjector(parser.getTokenNames()); InjectionOptionsBean injectionOptionsBean = new InjectionOptionsBean(); injectionOptionsBean.setLocationsPropertyNameInModel(false, null); mi.setOptions(injectionOptionsBean); mi.setModelAdapter(modelAdapter); parser.setLanguageId(getLanguageId()); parser.setInjector(mi); return parser; } catch (IllegalArgumentException e) { throw new ParserInstantiationException(e); } catch (InstantiationException e) { throw new ParserInstantiationException(e); } catch (IllegalAccessException e) { throw new ParserInstantiationException(e); } catch (InvocationTargetException e) { throw new ParserInstantiationException(e.getCause()); } catch (SecurityException e) { throw new ParserInstantiationException(e); } catch (NoSuchMethodException e) { throw new ParserInstantiationException(e); } } @Override public L createLexer(CharStream input, ITokenFactory<? extends ANTLR3LocationToken> factory) { L lex = createLexer(input); try { Field tokenFactory = lex.getClass().getDeclaredField("tokenFactory"); tokenFactory.set(lex, factory); return lex; } catch (Exception e) { throw new RuntimeException(e); } } @Override public L createLexer(CharStream input) { try { Constructor<L> c = getLexerClass().getConstructor(CharStream.class); L lexer = c.newInstance(input); return lexer; } catch (Exception e) { throw new RuntimeException(e); } } @Override public String getSyntaxUUID() { Class<P> parserClass = getParserClass(); try { Constructor<P> c = parserClass.getConstructor(TokenStream.class); P parser = c.newInstance(new CommonTokenStream()); return parser.getSyntaxUUID(); } catch (Exception e) { return null; } } @Override public IRuleName getRuleNameFinder() { return new RuleNameFinder(); } }