Changeset 307
- Timestamp:
- 05/27/08 20:48:00 (8 months ago)
- Files:
-
- trunk/enki2/enki/EnkiLexer.bnf (moved) (moved from trunk/enki2/enki/frontend/EnkiLexer.bnf)
- trunk/enki2/enki/EnkiLexer.d (moved) (moved from trunk/enki2/enki/frontend/EnkiLexer.d)
- trunk/enki2/enki/EnkiParserBase.d (modified) (1 diff)
- trunk/enki2/enki/enki.d (modified) (9 diffs)
- trunk/enki2/enki/frontend/Enki2Parser.bnf (moved) (moved from trunk/enki2/enki/frontend/EnkiParser.bnf) (2 diffs)
- trunk/enki2/enki/frontend/Enki2Parser.d (moved) (moved from trunk/enki2/enki/frontend/EnkiParser.d) (2 diffs)
- trunk/enki2/enki/frontend/all.d (modified) (2 diffs)
- trunk/enki2/enki/generator/all.d (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/enki2/enki/EnkiParserBase.d
r305 r307 27 27 private import enki.EnkiToken; 28 28 private import enki.Backend; 29 private import enki. EnkiLexer;29 private import enki.frontend.EnkiLexer; 30 30 31 31 private import enkilib.d.TokenParser; trunk/enki2/enki/enki.d
r306 r307 25 25 module enki.enki; 26 26 27 private import enki.EnkiParser; 28 27 private import enki.frontend.all; 29 28 private import enki.generator.all; 30 29 … … 55 54 alias EnkiParserT!(CharT) EnkiParser; 56 55 56 static char[] defaultFrontend = "enki2"; 57 static char[] defaultGenerator = "d"; 58 57 59 void displayHelp(){ 58 60 Stdout(helpText).newline; 59 61 Stdout("Supported code generators:").newline; 60 foreach(name, gen; registeredGenerators){ 62 foreach(name, gen; registeredGenerators){ 63 if(name == defaultGenerator){ 64 Stdout("*"); 65 } 61 66 Stdout.format("{0} ",name); 62 67 } 63 68 Stdout("Supported frontend grammars:").newline; 64 69 foreach(name, frontend; registeredFrontends){ 70 if(name == defaultFrontend){ 71 Stdout("*"); 72 } 65 73 Stdout.format("{0} ",name); 66 74 } … … 76 84 // set defaults 77 85 FilePath inputFilename; 78 char[] generatorName = "d";79 char[] frontendNAme = "ebnf";86 char[] frontendName = defaultFrontend; 87 char[] generatorName = defaultGenerator; 80 88 bool testMode = false; 81 89 bool helpMode = false; … … 89 97 inputFilename = new FilePath(value); 90 98 }); 99 100 argParser.bind("-", "f",delegate void(char[] value){ 101 frontendName = value; 102 }); 91 103 92 104 argParser.bind("-", "g",delegate void(char[] value){ … … 96 108 argParser.bind("-", "h",delegate void(char[] value){ 97 109 if(value.length > 0){ 98 help GeneratorName = value;110 helpName = value; 99 111 } 100 112 helpMode = true; … … 123 135 } 124 136 else{ 125 if(!(helpGeneratorName in registeredGenerators)){ 137 if(helpName in registeredGenerators){ 138 registeredGenerators[helpName].getHelp(); 139 } 140 else if(helpName in registeredFrontends){ 141 registeredFrontends[helpName].getHelp(); 142 } 143 else{ 126 144 Stdout.format("Error: Could not find help for generator '{0}'.",helpGeneratorName).newline; 127 145 return 1; 128 146 } 129 registeredGenerators[helpGeneratorName].getHelp();130 147 } 131 148 return 0; … … 141 158 return 1; 142 159 } 160 161 if(!(frontendName in registeredFrontends)){ 162 Stdout.format("Error: Frontend '{0}' is not supported.",frontendName).newline; 163 return 1; 164 } 143 165 144 166 if(!(generatorName in registeredGenerators)){ … … 147 169 } 148 170 149 // init the Enki Parser - this runs the lexer pass150 auto parser = new EnkiParser();151 parser.initialize(inputFilename);152 153 171 try{ 172 // init the Enki Parser - this runs the lexer pass 173 auto parser = registeredFrontends[frontendName].create(); 174 parser.initialize(inputFilename); 175 154 176 // perform the full parse 155 177 if(!parser.parse()){ … … 161 183 162 184 // run the selected generator 163 registeredGenerators[generatorName].toCode(parser,testMode);185 auto generator = registeredGenerators[generatorName].toCode(parser,testMode); 164 186 } 165 187 catch(Exception e){ trunk/enki2/enki/frontend/Enki2Parser.bnf
r306 r307 1 1 .d-baseclass = "EnkiParserBase!(CharT)"; 2 2 .d-header = " 3 module enki. EnkiParser;3 module enki.frontend.Enki2Parser; 4 4 5 5 private import enki.EnkiToken; … … 12 12 private import enki.RulePredicate; 13 13 "; 14 .d-filename = "enki/ EnkiParser.d";15 .d-classname = "Enki ParserT(CharT)";14 .d-filename = "enki/frontend/Enki2Parser.d"; 15 .d-classname = "Enki2ParserT(CharT)"; 16 16 .bootstrap-modulename = "enki.bootstrap.Parser"; 17 17 .bootstrap-filename = "enki/bootstrap/Parser.d"; trunk/enki2/enki/frontend/Enki2Parser.d
r306 r307 25 25 +/ 26 26 27 module enki. EnkiParser;27 module enki.frontend.Enki2Parser; 28 28 29 29 private import enki.EnkiToken; … … 38 38 debug import tango.io.Stdout; 39 39 40 class EnkiParserT(CharT):EnkiParserBase!(CharT){ 41 42 43 44 40 class Enki2ParserT(CharT):EnkiParserBase!(CharT){ 45 41 /* 46 42 Syntax trunk/enki2/enki/frontend/all.d
r306 r307 26 26 27 27 public import enki.frontend.Enki2Parser; 28 public import enki.frontend.Enki1Parser; 29 public import enki.frontend.ISOParser; 30 public import enki.frontend.ABNFParser; 28 //public import enki.frontend.Enki1Parser; 29 //public import enki.frontend.ISOParser; 30 //public import enki.frontend.ABNFParser; 31 32 private import tango.io.Stdout; 31 33 32 34 interface FrontendRef{ 33 public void initialize(FilePath path);35 public T create(); 34 36 public void getHelp(); 35 37 } 36 38 37 39 class FrontendRefT(T) : FrontendRef{ 38 public void initialize(FilePath path){39 backend.toCode!(T)(testMode);40 public T create(){ 41 return new T(); 40 42 } 41 43 public void getHelp(){ … … 47 49 48 50 static this(){ 49 registeredGenerators["enki1"] = new GeneratorRefT!(Enki1ParserT!(CharT));50 registeredGenerators["enki2"] = new GeneratorRefT!(Enki2ParserT!(CharT));51 registeredGenerators["iso"] = new GeneratorRefT!(ISOParserT!(CharT));52 registeredGenerators["abnf"] = new GeneratorRefT!(ABNFParserT!(CharT));51 // registeredGenerators["enki1"] = new FrontendRefT!(Enki1ParserT!(CharT)); 52 registeredGenerators["enki2"] = new FrontendRefT!(Enki2ParserT!(CharT)); 53 // registeredGenerators["iso"] = new FrontendRefT!(ISOParserT!(CharT)); 54 // registeredGenerators["abnf"] = new FrontendRefT!(ABNFParserT!(CharT)); 53 55 } trunk/enki2/enki/generator/all.d
r306 r307 32 32 public import enki.generator.JavascriptGenerator; 33 33 34 private import tango.io.Stdout; 35 34 36 interface GeneratorRef{ 35 37 public void toCode(EnkiParser backend,bool testMode);
