|
From: Teiniker E. <tei...@us...> - 2007-01-18 17:12:33
|
Update of /cvsroot/ccmtools/ccmtools/src/ccmtools/parser/idl In directory sc8-pr-cvs4.sourceforge.net:/tmp/cvs-serv3173/src/ccmtools/parser/idl Modified Files: ParserHelper.java idlscanner.flex Added Files: ParserManager.java Log Message: Refactored IDL parser to support different PreProcessor implementations --- NEW FILE: ParserManager.java --- package ccmtools.parser.idl; import java.io.File; import java.io.FileReader; import java.io.StringReader; import java.util.List; import ccmtools.CcmtoolsException; import ccmtools.metamodel.BaseIDL.MContainer; import ccmtools.parser.cpp.CppManager; import ccmtools.ui.UserInterfaceDriver; public class ParserManager { public static MContainer loadCcmModel(UserInterfaceDriver uiDriver, String idlSource) throws CcmtoolsException { try { uiDriver.printMessage("parse"); ParserHelper.getInstance().init(); IdlScanner scanner = new IdlScanner(new StringReader(idlSource)); IdlParser parser = new IdlParser(scanner); MContainer ccmModel = (MContainer) parser.parse().value; uiDriver.printMessage("done"); return ccmModel; } catch (Exception e) { e.printStackTrace(); throw new CcmtoolsException(e.getMessage()); } } public static MContainer loadCcmModel(UserInterfaceDriver uiDriver, String idlFileName, List<String> includePaths) throws CcmtoolsException { try { CppManager.createCpp().process(uiDriver, idlFileName, includePaths); MContainer ccmModel = parseIdlFile(uiDriver, idlFileName); return ccmModel; } catch (Exception e) { throw new CcmtoolsException(e.getMessage()); } } public static MContainer parseIdlFile(UserInterfaceDriver uiDriver, String idlFileName) throws CcmtoolsException { try { File idlFile = new File(idlFileName); File tmpIdlFile = new File(idlFileName + ".tmp"); tmpIdlFile.deleteOnExit(); uiDriver.printMessage("use JFlex&Cup based IDL parser"); ParserHelper.getInstance().init(); ParserHelper.getInstance().setMainSourceFile(idlFile.getAbsolutePath()); IdlScanner scanner = new IdlScanner(new FileReader(tmpIdlFile)); IdlParser parser = new IdlParser(scanner); MContainer ccmModel = (MContainer) parser.parse().value; String identifier = idlFileName.substring(0, idlFileName.lastIndexOf(".idl")); ccmModel.setIdentifier(identifier); uiDriver.printMessage("done"); return ccmModel; } catch (Exception e) { throw new CcmtoolsException(e.getMessage()); } } public static void reportError(String message) { StringBuilder out = new StringBuilder(); out.append("ERROR [IDL parser]: "); out.append(message); throw new RuntimeException(out.toString()); } } Index: ParserHelper.java =================================================================== RCS file: /cvsroot/ccmtools/ccmtools/src/ccmtools/parser/idl/ParserHelper.java,v retrieving revision 1.41 retrieving revision 1.42 diff -C2 -d -r1.41 -r1.42 *** ParserHelper.java 15 Jan 2007 15:00:15 -0000 1.41 --- ParserHelper.java 18 Jan 2007 17:11:48 -0000 1.42 *************** *** 1,10 **** package ccmtools.parser.idl; - import java.io.BufferedReader; - import java.io.File; - import java.io.FileReader; - import java.io.FileWriter; - import java.io.InputStreamReader; - import java.io.StringReader; import java.math.BigInteger; import java.util.ArrayList; --- 1,4 ---- *************** *** 15,20 **** import java_cup.runtime.Symbol; - import ccmtools.CcmtoolsException; - import ccmtools.Constants; import ccmtools.metamodel.BaseIDL.MAliasDef; import ccmtools.metamodel.BaseIDL.MAliasDefImpl; --- 9,12 ---- *************** *** 81,86 **** import ccmtools.metamodel.ComponentIDL.MUsesDef; import ccmtools.metamodel.ComponentIDL.MUsesDefImpl; - import ccmtools.ui.UserInterfaceDriver; - import ccmtools.utils.ConfigurationLocator; import ccmtools.utils.Text; --- 73,76 ---- *************** *** 2281,2284 **** --- 2271,2277 ---- // # 1 "/home/eteinik/sandbox/workspace-development/TelegramGenerator/examples/simple_test/example1.tgen" // # 30 "/home/eteinik/sandbox/workspace-development/ccmtools/test/JavaLocalComponents/component_mirror/xxx/idl3/component/world/Test.idl" + + // #line 1 "c:\\temp\\Message.idl" + public void handlePreprocessorLine(String line) { *************** *** 2365,2489 **** return in.substring(in.indexOf('"')+1, in.lastIndexOf('"')); } - - public MContainer loadCcmModel(UserInterfaceDriver uiDriver, String idlSource) - throws CcmtoolsException - { - try - { - uiDriver.printMessage("parse"); - ParserHelper.getInstance().init(); - IdlScanner scanner = new IdlScanner(new StringReader(idlSource)); - IdlParser parser = new IdlParser(scanner); - MContainer ccmModel = (MContainer) parser.parse().value; - uiDriver.printMessage("done"); - return ccmModel; - } - catch (Exception e) - { - e.printStackTrace(); - throw new CcmtoolsException(e.getMessage()); - } - } - - - public MContainer loadCcmModel(UserInterfaceDriver uiDriver, String idlFileName, List<String> includePaths) - throws CcmtoolsException - { - try - { - uiDriver.printMessage("Use JFlex&Cup based IDL parser"); - File idlFile = new File(idlFileName); - String tmpFileName = idlFile.getName() + ".tmp"; - File tmpIdlFile = new File(tmpFileName); - tmpIdlFile.deleteOnExit(); - - useCpp(uiDriver, idlFile.getAbsolutePath(), includePaths, tmpFileName); - - uiDriver.printMessage("parse " + tmpFileName); - ParserHelper.getInstance().init(); - ParserHelper.getInstance().setMainSourceFile(idlFile.getAbsolutePath()); - IdlScanner scanner = new IdlScanner(new FileReader(tmpIdlFile)); - IdlParser parser = new IdlParser(scanner); - MContainer ccmModel = (MContainer)parser.parse().value; - - String identifier = idlFileName.substring(0, idlFileName.lastIndexOf(".idl")); - ccmModel.setIdentifier(identifier); - getLogger().fine("CCM Model = " + ccmModel); - uiDriver.printMessage("done"); - - //!!!!!!!!!!! - // XStream xstream = new XStream(); - // String xml = xstream.toXML(ccmModel); - // System.out.println(xml); - //!!!!!!!!!!! - return ccmModel; - } - catch (Exception e) - { - throw new CcmtoolsException(e.getMessage()); - } - } - - private void useCpp(UserInterfaceDriver uiDriver, String sourceFileName, List<String> includes, String tmpFileName) - throws CcmtoolsException - { - File tmpFile = new File(System.getProperty("user.dir"), tmpFileName); - try - { - // Run a C preprocessor on the input file, in a separate process. - StringBuffer cmd = new StringBuffer(); - if (ConfigurationLocator.getInstance().get("ccmtools.cpp").length() != 0) - { - cmd.append(ConfigurationLocator.getInstance().get("ccmtools.cpp")); - } - else - { - cmd.append(Constants.CPP_PATH); - } - cmd.append(" "); - for (String includePath : includes) - { - cmd.append("-I").append(includePath).append(" "); - } - cmd.append(sourceFileName); - uiDriver.printMessage(cmd.toString()); // print cpp command line - - Process preproc = Runtime.getRuntime().exec(cmd.toString()); - BufferedReader stdInput = new BufferedReader(new InputStreamReader(preproc.getInputStream())); - BufferedReader stdError = new BufferedReader(new InputStreamReader(preproc.getErrorStream())); - - // Read the output and any errors from the command - String s; - StringBuffer code = new StringBuffer(); - while ((s = stdInput.readLine()) != null) - { - code.append(s).append("\n"); - } - while ((s = stdError.readLine()) != null) - { - uiDriver.printMessage(s); - } - - // Wait for the process to complete and evaluate the return - // value of the attempted command - preproc.waitFor(); - if (preproc.exitValue() != 0) - { - reportError("Preprocessor Error: Please verify your include paths or file names (" - + sourceFileName + ")!!"); - } - else - { - FileWriter writer = new FileWriter(tmpFile); - writer.write(code.toString(), 0, code.toString().length()); - writer.close(); - } - // tmpFile.deleteOnExit(); - } - catch (Exception e) - { - throw new CcmtoolsException(e.getMessage()); - } - } - } --- 2358,2360 ---- Index: idlscanner.flex =================================================================== RCS file: /cvsroot/ccmtools/ccmtools/src/ccmtools/parser/idl/idlscanner.flex,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** idlscanner.flex 21 Sep 2006 15:33:26 -0000 1.3 --- idlscanner.flex 18 Jan 2007 17:11:49 -0000 1.4 *************** *** 44,48 **** PreprocessorLine = "#" {InputCharacter}* {LineTerminator} PragmaLine = "#pragma" {InputCharacter}* {LineTerminator} ! EndOfLineComment = "//" {InputCharacter}* {LineTerminator} Digits = [0-9]+ --- 44,55 ---- PreprocessorLine = "#" {InputCharacter}* {LineTerminator} PragmaLine = "#pragma" {InputCharacter}* {LineTerminator} ! ! Comment = {TraditionalComment} | {EndOfLineComment} | {DocumentationComment} ! TraditionalComment = "/*" [^*] ~"*/" | "/*" "*"+ "/" ! EndOfLineComment = "//" {InputCharacter}* {LineTerminator} ! DocumentationComment = "/**" {CommentContent} "*"+ "/" ! CommentContent = ( [^*] | \*+ [^/*] )* ! ! Digits = [0-9]+ *************** *** 87,91 **** {WhiteSpace} { /* no actions*/ } ! {EndOfLineComment} { /* no actions*/ } {LineTerminator} { --- 94,98 ---- {WhiteSpace} { /* no actions*/ } ! {Comment} { /* no actions*/ } {LineTerminator} { |