blob: f4bf58a3d164a5969184a899b3aa56f7f4a1f0da [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.gymnast.generators.parser.javacc;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.InputStreamReader;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.IPath;
import org.eclipse.gymnast.generator.core.generator.GeneratorContext;
import org.eclipse.gymnast.generator.core.registry.ParserGenerator;
import org.eclipse.gymnast.generators.parser.javacc.templates.ExtSimpleCharStreamTemplate;
import org.eclipse.gymnast.generators.parser.javacc.templates.ExtTokenManagerTemplate;
import org.eclipse.gymnast.generators.parser.javacc.templates.ExtTokenTemplate;
import org.eclipse.gymnast.generators.parser.javacc.templates.JavaCCParserTemplate;
import org.eclipse.gymnast.generators.parser.javacc.templates.ParserDriverTemplate;
import org.eclipse.gymnast.runtime.core.util.IReporter;
import org.eclipse.jdt.core.IPackageFragment;
public class JavaCCParserGenerator extends ParserGenerator {
public void generateParser(GeneratorContext context) throws Exception {
IPackageFragment parserPackageFragment = context.getParserPackage();
IFile grammarFile = writeGrammarFile(context, parserPackageFragment);
invokeJavaCC(context, grammarFile);
writeParserDriver(context, parserPackageFragment);
writeExtToken(context, parserPackageFragment);
writeExtTokenManager(context, parserPackageFragment);
writeExtSimpleCharStream(context, parserPackageFragment);
}
private IFile writeGrammarFile(GeneratorContext context, IPackageFragment parserPackageFragment) throws Exception {
String grammarFileName = context.getASTName() + ".jj";
context.getUtil().report("Writing JavaCC grammar: " + grammarFileName);
JavaCCParserTemplate parserTemplate = new JavaCCParserTemplate();
parserTemplate.init(context);
StringBuffer grammarFileText = new StringBuffer(parserTemplate.generate());
JavaCCGrammarWriter grammarWriter = new JavaCCGrammarWriter(context);
grammarFileText.append(grammarWriter.writeGrammar());
appendLexerFile(context, grammarFileText);
IPath parserPackagePath = parserPackageFragment.getResource().getProjectRelativePath();
IPath grammarFilePath = parserPackagePath.append(grammarFileName);
IFile grammarFile = context.getProject().getFile(grammarFilePath);
writeFile(grammarFile, grammarFileText.toString());
return grammarFile;
}
private void appendLexerFile(GeneratorContext context, StringBuffer grammarFileText) throws Exception {
IPath astFolderPath = context.getASTFile().getProjectRelativePath().removeLastSegments(1);
String lexerFileName = context.getASTName() + "Lexer.jj";
IPath lexerFilePath = astFolderPath.append(lexerFileName);
IFile lexerFile = context.getProject().getFile(lexerFilePath);
if (lexerFile.exists()) {
grammarFileText.append("\n");
BufferedReader reader = new BufferedReader(new InputStreamReader(lexerFile.getContents()));
String line = reader.readLine();
while(line != null) {
grammarFileText.append(line + "\n");
line = reader.readLine();
}
}
}
private void invokeJavaCC(GeneratorContext context, IFile grammarFile) throws Exception {
final IReporter reporter = context.getUtil().getReporter();
reporter.report("Running JavaCC on file: " + grammarFile.getName());
String grammarFilePath = grammarFile.getLocation().toOSString();
String outputFolderPath = grammarFile.getParent().getLocation().toOSString();
String outputDirectoryArg = "-OUTPUT_DIRECTORY=" + outputFolderPath;
String optionStatic = "-STATIC=false";
String optionLookahead = "-LOOKAHEAD=3";
// String optionForceLookaheadCheck = "-FORCE_LA_CHECK=true";
String[] args = new String[] {
optionLookahead,
// optionForceLookaheadCheck,
optionStatic,
outputDirectoryArg,
grammarFilePath
};
// TODO waiting for javacc.jar ... int status = Main.mainProgram(args);
Runtime r = Runtime.getRuntime();
String argsStr = optionLookahead + " " + optionStatic + " " + outputDirectoryArg + " " + grammarFilePath;
String cmdLine = "java org.javacc.parser.Main " + argsStr;
System.out.println("GymnastGenerator about to run : " + cmdLine);
Process p = r.exec(cmdLine);
DataInputStream inStream = new DataInputStream(p.getInputStream());
String line = inStream.readLine();
System.out.println("GymnastGenerator JavaCC returned : " + line);
// make sure the JavaCC generated files show in the workspace
grammarFile.getParent().refreshLocal(IResource.DEPTH_ONE, null);
/* if (status != 0) {
reporter.reportError("JavaCC returned error code: " + status);
}
*/
}
private void writeParserDriver(GeneratorContext context, IPackageFragment parserPackageFragment) throws Exception {
ParserDriverTemplate parserDriverTemplate = new ParserDriverTemplate();
parserDriverTemplate.init(context);
String fileText = parserDriverTemplate.generate();
IFolder parserPackageFolder = (IFolder)parserPackageFragment.getResource();
IFile parserDriverFile = parserPackageFolder.getFile(context.getASTName() + "ParserDriver.java");
writeFile(parserDriverFile, fileText);
}
private void writeExtToken(GeneratorContext context, IPackageFragment parserPackageFragment) throws Exception {
ExtTokenTemplate extTokenTemplate = new ExtTokenTemplate();
extTokenTemplate.init(context);
String fileText = extTokenTemplate.generate();
IFolder parserPackageFolder = (IFolder)parserPackageFragment.getResource();
IFile extTokenFile = parserPackageFolder.getFile("ExtToken.java");
writeFile(extTokenFile, fileText);
}
private void writeExtTokenManager(GeneratorContext context, IPackageFragment parserPackageFragment) throws Exception {
ExtTokenManagerTemplate extTokenManagerTemplate = new ExtTokenManagerTemplate();
extTokenManagerTemplate.init(context);
String fileText = extTokenManagerTemplate.generate();
IFolder parserPackageFolder = (IFolder)parserPackageFragment.getResource();
IFile extTokenManagerFile = parserPackageFolder.getFile("Ext" + context.getASTName() + "ParserTokenManager.java");
writeFile(extTokenManagerFile, fileText);
}
private void writeExtSimpleCharStream(GeneratorContext context, IPackageFragment parserPackageFragment) throws Exception {
ExtSimpleCharStreamTemplate extSimpleCharStreamTemplate = new ExtSimpleCharStreamTemplate();
extSimpleCharStreamTemplate.init(context);
String fileText = extSimpleCharStreamTemplate.generate();
IFolder parserPackageFolder = (IFolder)parserPackageFragment.getResource();
IFile extTokenManagerFile = parserPackageFolder.getFile("ExtSimpleCharStream.java");
writeFile(extTokenManagerFile, fileText);
}
}