Skip to content

Instantly share code, notes, and snippets.

@BenChung
Created June 3, 2014 02:16
Show Gist options
  • Save BenChung/940de1f94c6d5ef224c6 to your computer and use it in GitHub Desktop.
Save BenChung/940de1f94c6d5ef224c6 to your computer and use it in GitHub Desktop.
ParserBean host;
try (InputStream is = new FileInputStream(hostGrammar)) {
host = new CupSkinParser().parse(new InputStreamReader(is), hostGrammar.getName());
} catch (Exception e) {
throw new BuildException(e);
}
ParserBean extension;
try (InputStream is = new FileInputStream(extensionGrammar)) {
ArrayList<Pair<String,Reader>> files = new ArrayList<>();
files.add(new Pair<String, Reader>(extensionGrammar.getName(), new InputStreamReader(is)));
XMLSkinParser xmlSkinParser = new XMLSkinParser(files,
new CompilerLogger(new PrintCompilerLogHandler(new PrintStream(new OutputStream() {
public void write(int b) {
//Nothing - suppress all messages
}
}))));
xmlSkinParser.parse();
Field parserField = xmlSkinParser.getClass().getDeclaredField("currentParser");
parserField.setAccessible(true);
extension = (ParserBean)parserField.get(xmlSkinParser);
} catch (Exception e) {
throw new BuildException(e);
}
try {
CopperElementName grammarName = CopperElementName.newName("_" + hostGrammarName);
((ExtendedParserBean)extension).setHostGrammar(host.getGrammar(grammarName));
Field grammarField = extension.getClass().getSuperclass().getDeclaredField("grammars");
grammarField.setAccessible(true);
Hashtable<CopperElementName,Grammar> grammars =
(Hashtable<CopperElementName, Grammar>) grammarField.get(extension);
grammars.put(grammarName,host.getGrammar(grammarName));
} catch (Exception e) {
throw new BuildException(e);
}
try {
CompilerLogger logger = new CompilerLogger(new PrintCompilerLogHandler(System.out));
ParserSpecProcessor.normalizeParser(extension, logger);
} catch (CopperException e) {
throw new BuildException(e);
}
ParserCompilerParameters pcp = new ParserCompilerParameters();
ParserCompiler.compile(extension, pcp);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment