Changeset 308
- Timestamp:
- 05/27/08 21:37:50 (6 months ago)
- Files:
-
- trunk/enki2/enki/Backend.d (modified) (2 diffs)
- trunk/enki2/enki/bootstrap/Lexer.d (modified) (1 diff)
- trunk/enki2/enki/bootstrap/Parser.d (modified) (1 diff)
- trunk/enki2/enki/enki.d (modified) (6 diffs)
- trunk/enki2/enki/frontend/Enki2Parser.d (modified) (2 diffs)
- trunk/enki2/enki/frontend/EnkiLexer.bnf (moved) (moved from trunk/enki2/enki/EnkiLexer.bnf)
- trunk/enki2/enki/frontend/EnkiLexer.d (moved) (moved from trunk/enki2/enki/EnkiLexer.d)
- trunk/enki2/enki/frontend/all.d (modified) (2 diffs)
- trunk/enki2/enki/generator/BNFGenerator.d (modified) (1 diff)
- trunk/enki2/enki/generator/BootstrapGenerator.d (modified) (1 diff)
- trunk/enki2/enki/generator/DGenerator.d (modified) (1 diff)
- trunk/enki2/enki/generator/JavaGenerator.d (modified) (1 diff)
- trunk/enki2/enki/generator/JavascriptGenerator.d (modified) (1 diff)
- trunk/enki2/enki/generator/PythonGenerator.d (modified) (1 diff)
- trunk/enki2/enki/generator/TextGenerator.d (moved) (moved from trunk/enki2/enki/TextGenerator.d) (2 diffs)
- trunk/enki2/enki/generator/all.d (modified) (1 diff)
- trunk/enki2/enki/types.d (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/enki2/enki/Backend.d
r305 r308 27 27 public import enki.types; 28 28 29 import tango.io.FileConduit;30 import tango.io.Buffer;31 import tango.io.GrowBuffer;32 import tango.io.Stdout;33 34 35 29 abstract class BackendT(CharT,BaseClass = Object) : BaseClass{ 36 30 mixin AllTypesMixin!(CharT); 37 31 38 p rotectedAttributeSet attributes;32 public AttributeSet attributes; 39 33 public RuleSet ruleSet; 40 protected String[] imports;41 34 42 35 public this(){ … … 86 79 } 87 80 88 public void toCode(Generator)(bool test=false){89 auto buffer = new GrowBuffer();90 auto generator = new Generator(buffer);91 92 //TODO: handle includes93 //generator.visit(imports);94 generator.visit(attributes);95 generator.visit(ruleSet);96 97 if(test){98 buffer.drain(Stdout);99 }100 else{101 auto filename = generator.getFilename();102 debug Stdout("Writing to Conduit: ")(filename).newline;103 auto fc = new FileConduit(filename,FileConduit.ReadWriteCreate);104 //TODO: check fc for validity105 buffer.drain(fc);106 fc.close;107 }108 }109 81 } trunk/enki2/enki/bootstrap/Lexer.d
r305 r308 5 5 setAttribute("d","baseclass","EnkiLexerBase!(CharT)"); 6 6 setAttribute("d","header"," 7 module enki. EnkiLexer;7 module enki.frontend.EnkiLexer; 8 8 import enki.EnkiToken; 9 9 import enki.EnkiLexerBase; 10 10 "); 11 setAttribute("d","filename","./enki/ EnkiLexer.d");11 setAttribute("d","filename","./enki/frontend/EnkiLexer.d"); 12 12 setAttribute("d","classname","EnkiLexerT(CharT)"); 13 13 setAttribute("bootstrap","modulename","./enki.bootstrap.Lexer"); trunk/enki2/enki/bootstrap/Parser.d
r306 r308 3 3 class Parser(CharT) : BootstrapT!(CharT){ 4 4 void runBootstrap(){ 5 setAttribute("d","baseclass","Enki ParserBase!(CharT)");5 setAttribute("d","baseclass","Enki2ParserBaseT!(CharT)"); 6 6 setAttribute("d","header"," 7 7 module enki.frontend.Enki2Parser; 8 8 9 private import enki.frontend.Enki2ParserBase; 9 10 private import enki.EnkiToken; 10 private import enki.EnkiParserBase;11 11 private import enki.Binding; 12 12 private import enki.Expression; trunk/enki2/enki/enki.d
r307 r308 51 51 `; 52 52 53 alias char CharT;54 alias EnkiParserT!(CharT) EnkiParser;55 56 53 static char[] defaultFrontend = "enki2"; 57 54 static char[] defaultGenerator = "d"; … … 59 56 void displayHelp(){ 60 57 Stdout(helpText).newline; 58 61 59 Stdout("Supported code generators:").newline; 62 60 foreach(name, gen; registeredGenerators){ … … 66 64 Stdout.format("{0} ",name); 67 65 } 66 Stdout.newline; 67 68 68 Stdout("Supported frontend grammars:").newline; 69 69 foreach(name, frontend; registeredFrontends){ … … 131 131 132 132 if(helpMode){ 133 if(help GeneratorName is null){133 if(helpName is null){ 134 134 displayHelp(); 135 135 } 136 136 else{ 137 137 if(helpName in registeredGenerators){ 138 registeredGenerators[helpName].getHelp();138 Stdout(registeredGenerators[helpName].getHelp()); 139 139 } 140 140 else if(helpName in registeredFrontends){ 141 registeredFrontends[helpName].getHelp();141 Stdout(registeredFrontends[helpName].getHelp()); 142 142 } 143 143 else{ 144 Stdout.format("Error: Could not find help for generator '{0}'.",helpGeneratorName).newline;144 Stdout.format("Error: Could not find help for '{0}'.",helpName).newline; 145 145 return 1; 146 146 } … … 169 169 } 170 170 171 auto parser = registeredFrontends[frontendName].create(); 171 172 try{ 172 173 // init the Enki Parser - this runs the lexer pass 173 auto parser = registeredFrontends[frontendName].create();174 174 parser.initialize(inputFilename); 175 175 … … 183 183 184 184 // run the selected generator 185 auto generator = registeredGenerators[generatorName].toCode(parser,testMode); 185 auto generator = registeredGenerators[generatorName].create(); 186 generator.toCode(parser,testMode); 186 187 } 187 188 catch(Exception e){ trunk/enki2/enki/frontend/Enki2Parser.d
r307 r308 27 27 module enki.frontend.Enki2Parser; 28 28 29 private import enki.frontend.Enki2ParserBase; 29 30 private import enki.EnkiToken; 30 private import enki.EnkiParserBase;31 31 private import enki.Binding; 32 32 private import enki.Expression; … … 38 38 debug import tango.io.Stdout; 39 39 40 class Enki2ParserT(CharT):Enki ParserBase!(CharT){40 class Enki2ParserT(CharT):Enki2ParserBaseT!(CharT){ 41 41 /* 42 42 Syntax trunk/enki2/enki/frontend/all.d
r307 r308 30 30 //public import enki.frontend.ABNFParser; 31 31 32 private import tango.io.Stdout; 32 private import enki.EnkiParserBase; 33 34 alias char CharT; 33 35 34 36 interface FrontendRef{ 35 public Tcreate();36 public voidgetHelp();37 public EnkiParserBase!(CharT) create(); 38 public char[] getHelp(); 37 39 } 38 40 39 class FrontendRefT(T ) : FrontendRef{40 public Tcreate(){41 class FrontendRefT(T : EnkiParserBase!(CharT)) : FrontendRef{ 42 public EnkiParserBase!(CharT) create(){ 41 43 return new T(); 42 44 } 43 public voidgetHelp(){44 Stdout(T.getHelp());45 public char[] getHelp(){ 46 return T.getHelp(); 45 47 } 46 48 } … … 49 51 50 52 static this(){ 51 // registered Generators["enki1"] = new FrontendRefT!(Enki1ParserT!(CharT));52 registered Generators["enki2"] = new FrontendRefT!(Enki2ParserT!(CharT));53 // registered Generators["iso"] = new FrontendRefT!(ISOParserT!(CharT));54 // registered Generators["abnf"] = new FrontendRefT!(ABNFParserT!(CharT));53 // registeredFrontends["enki1"] = new FrontendRefT!(Enki1ParserT!(CharT)); 54 registeredFrontends["enki2"] = new FrontendRefT!(Enki2ParserT!(CharT)); 55 // registeredFrontends["iso"] = new FrontendRefT!(ISOParserT!(CharT)); 56 // registeredFrontends["abnf"] = new FrontendRefT!(ABNFParserT!(CharT)); 55 57 } trunk/enki2/enki/generator/BNFGenerator.d
r305 r308 26 26 27 27 import enki.types; 28 import enki. TextGenerator;28 import enki.generator.TextGenerator; 29 29 30 30 import tango.io.model.IBuffer; trunk/enki2/enki/generator/BootstrapGenerator.d
r305 r308 26 26 27 27 import enki.types; 28 import enki.generator.TextGenerator; 28 29 29 30 import tango.io.model.IBuffer; trunk/enki2/enki/generator/DGenerator.d
r305 r308 26 26 27 27 import enki.types; 28 import enki.generator.TextGenerator; 28 29 import enki.generator.BNFGenerator; 29 30 import enkilib.d.ParserException; trunk/enki2/enki/generator/JavaGenerator.d
r303 r308 26 26 27 27 import enki.types; 28 import enki.generator.TextGenerator; 28 29 import enki.generator.BNFGenerator; 29 30 import enkilib.d.ParserException; trunk/enki2/enki/generator/JavascriptGenerator.d
r303 r308 26 26 27 27 import enki.types; 28 import enki.generator.TextGenerator; 28 29 import enki.generator.BNFGenerator; 29 30 import enkilib.d.ParserException; trunk/enki2/enki/generator/PythonGenerator.d
r303 r308 26 26 27 27 import enki.types; 28 import enki.generator.TextGenerator; 28 29 import enki.generator.BNFGenerator; 29 30 import enkilib.d.ParserException; trunk/enki2/enki/generator/TextGenerator.d
r302 r308 23 23 OTHER DEALINGS IN THE SOFTWARE. 24 24 +/ 25 module enki. TextGenerator;25 module enki.generator.TextGenerator; 26 26 27 27 import enki.AttributeSet; 28 28 import enki.RuleSet; 29 import enki.EnkiParserBase; 29 30 30 31 import tango.io.Print; 31 32 import tango.io.GrowBuffer; 33 import tango.io.FileConduit; 34 import tango.io.Buffer; 35 import tango.io.Stdout; 36 32 37 import tango.text.convert.Layout; 33 34 import tango.io.model.IBuffer;35 38 import tango.text.Util; 36 37 debug import tango.io.Stdout;38 39 39 40 40 //TODO: customize using a custom layout instead of the startLine hackery … … 103 103 startLine = true; 104 104 } 105 106 public void toCode(EnkiParserBase!(CharT) parser,bool test=false){ 107 visit(parser.attributes); 108 visit(parser.ruleSet); 109 110 if(test){ 111 //this.conduit.drain(Stdout); 112 Stdout.copy(this.conduit); 113 } 114 else{ 115 auto filename = this.getFilename(); 116 debug Stdout("Writing to Conduit: ")(filename).newline; 117 auto fc = new FileConduit(filename,FileConduit.ReadWriteCreate); 118 //TODO: check fc for validity 119 //this.getBuffer().drain(fc); 120 fc.copy(this.conduit); 121 fc.close; 122 } 123 } 105 124 } 106 125 trunk/enki2/enki/generator/all.d
r307 r308 32 32 public import enki.generator.JavascriptGenerator; 33 33 34 private import tango.io.Stdout; 34 private import enki.generator.TextGenerator; 35 private import tango.io.GrowBuffer; 36 37 alias char CharT; 38 alias TextGeneratorT!(CharT) TextGenerator; 35 39 36 40 interface GeneratorRef{ 37 public void toCode(EnkiParser backend,bool testMode);38 public voidgetHelp();41 public TextGenerator create(); 42 public CharT[] getHelp(); 39 43 } 40 44 41 class GeneratorRefT(T ) : GeneratorRef{42 public void toCode(EnkiParser backend,bool testMode){43 backend.toCode!(T)(testMode);45 class GeneratorRefT(T : TextGenerator) : GeneratorRef{ 46 public TextGenerator create(){ 47 return new T(new GrowBuffer()); 44 48 } 45 public void getHelp(){ 46 Stdout(T.getHelp()); 49 50 public CharT[] getHelp(){ 51 return T.getHelp(); 47 52 } 48 53 } trunk/enki2/enki/types.d
r303 r308 36 36 public import enki.RulePredicate; 37 37 public import enki.RuleSet; 38 public import enki.TextGenerator;39 38 public import enki.VariableRef; 40 39 public import enkilib.d.ParserException;
