Changeset 308

Show
Ignore:
Timestamp:
05/27/08 21:37:50 (6 months ago)
Author:
pragma
Message:

Restructuring Enki2

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/enki2/enki/Backend.d

    r305 r308  
    2727public import enki.types; 
    2828 
    29 import tango.io.FileConduit; 
    30 import tango.io.Buffer; 
    31 import tango.io.GrowBuffer; 
    32 import tango.io.Stdout; 
    33  
    34  
    3529abstract class BackendT(CharT,BaseClass = Object) : BaseClass{ 
    3630    mixin AllTypesMixin!(CharT); 
    3731     
    38     protected AttributeSet attributes; 
     32    public AttributeSet attributes; 
    3933    public RuleSet ruleSet; 
    40     protected String[] imports; 
    4134 
    4235    public this(){ 
     
    8679    } 
    8780 
    88     public void toCode(Generator)(bool test=false){ 
    89         auto buffer = new GrowBuffer(); 
    90         auto generator = new Generator(buffer); 
    91  
    92         //TODO: handle includes 
    93         //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 validity 
    105             buffer.drain(fc); 
    106             fc.close; 
    107         }    
    108     } 
    10981} 
  • trunk/enki2/enki/bootstrap/Lexer.d

    r305 r308  
    55        setAttribute("d","baseclass","EnkiLexerBase!(CharT)"); 
    66        setAttribute("d","header"," 
    7 module enki.EnkiLexer; 
     7module enki.frontend.EnkiLexer; 
    88import enki.EnkiToken; 
    99import enki.EnkiLexerBase; 
    1010"); 
    11         setAttribute("d","filename","./enki/EnkiLexer.d"); 
     11        setAttribute("d","filename","./enki/frontend/EnkiLexer.d"); 
    1212        setAttribute("d","classname","EnkiLexerT(CharT)"); 
    1313        setAttribute("bootstrap","modulename","./enki.bootstrap.Lexer"); 
  • trunk/enki2/enki/bootstrap/Parser.d

    r306 r308  
    33class Parser(CharT) : BootstrapT!(CharT){ 
    44    void runBootstrap(){ 
    5         setAttribute("d","baseclass","EnkiParserBase!(CharT)"); 
     5        setAttribute("d","baseclass","Enki2ParserBaseT!(CharT)"); 
    66        setAttribute("d","header"," 
    77module enki.frontend.Enki2Parser; 
    88 
     9private import enki.frontend.Enki2ParserBase; 
    910private import enki.EnkiToken; 
    10 private import enki.EnkiParserBase; 
    1111private import enki.Binding; 
    1212private import enki.Expression; 
  • trunk/enki2/enki/enki.d

    r307 r308  
    5151`; 
    5252 
    53 alias char CharT; 
    54 alias EnkiParserT!(CharT) EnkiParser; 
    55  
    5653static char[] defaultFrontend = "enki2"; 
    5754static char[] defaultGenerator = "d"; 
     
    5956void displayHelp(){ 
    6057    Stdout(helpText).newline; 
     58     
    6159    Stdout("Supported code generators:").newline; 
    6260    foreach(name, gen; registeredGenerators){        
     
    6664        Stdout.format("{0} ",name); 
    6765    } 
     66    Stdout.newline; 
     67     
    6868    Stdout("Supported frontend grammars:").newline; 
    6969    foreach(name, frontend; registeredFrontends){ 
     
    131131     
    132132    if(helpMode){ 
    133         if(helpGeneratorName is null){ 
     133        if(helpName is null){ 
    134134            displayHelp(); 
    135135        } 
    136136        else{ 
    137137            if(helpName in registeredGenerators){ 
    138                 registeredGenerators[helpName].getHelp(); 
     138                Stdout(registeredGenerators[helpName].getHelp()); 
    139139            } 
    140140            else if(helpName in registeredFrontends){ 
    141                 registeredFrontends[helpName].getHelp(); 
     141                Stdout(registeredFrontends[helpName].getHelp()); 
    142142            } 
    143143            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; 
    145145                return 1; 
    146146            } 
     
    169169    } 
    170170 
     171    auto parser = registeredFrontends[frontendName].create(); 
    171172    try{     
    172173        // init the Enki Parser - this runs the lexer pass 
    173         auto parser = registeredFrontends[frontendName].create(); 
    174174        parser.initialize(inputFilename); 
    175175         
     
    183183 
    184184        // run the selected generator 
    185         auto generator = registeredGenerators[generatorName].toCode(parser,testMode); 
     185        auto generator = registeredGenerators[generatorName].create(); 
     186        generator.toCode(parser,testMode); 
    186187    } 
    187188    catch(Exception e){ 
  • trunk/enki2/enki/frontend/Enki2Parser.d

    r307 r308  
    2727module enki.frontend.Enki2Parser; 
    2828 
     29private import enki.frontend.Enki2ParserBase; 
    2930private import enki.EnkiToken; 
    30 private import enki.EnkiParserBase; 
    3131private import enki.Binding; 
    3232private import enki.Expression; 
     
    3838debug import tango.io.Stdout; 
    3939 
    40 class Enki2ParserT(CharT):EnkiParserBase!(CharT){ 
     40class Enki2ParserT(CharT):Enki2ParserBaseT!(CharT){ 
    4141    /* 
    4242    Syntax 
  • trunk/enki2/enki/frontend/all.d

    r307 r308  
    3030//public import enki.frontend.ABNFParser; 
    3131 
    32 private import tango.io.Stdout; 
     32private import enki.EnkiParserBase; 
     33 
     34alias char CharT; 
    3335 
    3436interface FrontendRef{ 
    35     public T create(); 
    36     public void getHelp(); 
     37    public EnkiParserBase!(CharT) create(); 
     38    public char[] getHelp(); 
    3739} 
    3840 
    39 class FrontendRefT(T) : FrontendRef{ 
    40     public T create(){ 
     41class FrontendRefT(T : EnkiParserBase!(CharT)) : FrontendRef{ 
     42    public EnkiParserBase!(CharT) create(){ 
    4143        return new T(); 
    4244    } 
    43     public void getHelp(){ 
    44         Stdout(T.getHelp()); 
     45    public char[] getHelp(){ 
     46        return T.getHelp(); 
    4547    } 
    4648} 
     
    4951 
    5052static this(){ 
    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//  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)); 
    5557} 
  • trunk/enki2/enki/generator/BNFGenerator.d

    r305 r308  
    2626 
    2727import enki.types; 
    28 import enki.TextGenerator; 
     28import enki.generator.TextGenerator; 
    2929 
    3030import tango.io.model.IBuffer; 
  • trunk/enki2/enki/generator/BootstrapGenerator.d

    r305 r308  
    2626 
    2727import enki.types; 
     28import enki.generator.TextGenerator; 
    2829 
    2930import tango.io.model.IBuffer; 
  • trunk/enki2/enki/generator/DGenerator.d

    r305 r308  
    2626 
    2727import enki.types; 
     28import enki.generator.TextGenerator; 
    2829import enki.generator.BNFGenerator; 
    2930import enkilib.d.ParserException; 
  • trunk/enki2/enki/generator/JavaGenerator.d

    r303 r308  
    2626 
    2727import enki.types; 
     28import enki.generator.TextGenerator; 
    2829import enki.generator.BNFGenerator; 
    2930import enkilib.d.ParserException; 
  • trunk/enki2/enki/generator/JavascriptGenerator.d

    r303 r308  
    2626 
    2727import enki.types; 
     28import enki.generator.TextGenerator; 
    2829import enki.generator.BNFGenerator; 
    2930import enkilib.d.ParserException; 
  • trunk/enki2/enki/generator/PythonGenerator.d

    r303 r308  
    2626 
    2727import enki.types; 
     28import enki.generator.TextGenerator; 
    2829import enki.generator.BNFGenerator; 
    2930import enkilib.d.ParserException; 
  • trunk/enki2/enki/generator/TextGenerator.d

    r302 r308  
    2323    OTHER DEALINGS IN THE SOFTWARE. 
    2424+/ 
    25 module enki.TextGenerator; 
     25module enki.generator.TextGenerator; 
    2626 
    2727import enki.AttributeSet; 
    2828import enki.RuleSet; 
     29import enki.EnkiParserBase; 
    2930 
    3031import tango.io.Print; 
    3132import tango.io.GrowBuffer; 
     33import tango.io.FileConduit; 
     34import tango.io.Buffer; 
     35import tango.io.Stdout; 
     36 
    3237import tango.text.convert.Layout; 
    33  
    34 import tango.io.model.IBuffer; 
    3538import tango.text.Util; 
    36  
    37 debug import tango.io.Stdout; 
    38  
    3939 
    4040//TODO: customize using a custom layout instead of the startLine hackery 
     
    103103        startLine = true; 
    104104    } 
     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    }    
    105124} 
    106125 
  • trunk/enki2/enki/generator/all.d

    r307 r308  
    3232public import enki.generator.JavascriptGenerator; 
    3333 
    34 private import tango.io.Stdout; 
     34private import enki.generator.TextGenerator; 
     35private import tango.io.GrowBuffer; 
     36 
     37alias char CharT; 
     38alias TextGeneratorT!(CharT) TextGenerator; 
    3539 
    3640interface GeneratorRef{ 
    37     public void toCode(EnkiParser backend,bool testMode); 
    38     public void getHelp(); 
     41    public TextGenerator create(); 
     42    public CharT[] getHelp(); 
    3943} 
    4044 
    41 class GeneratorRefT(T) : GeneratorRef{ 
    42     public void toCode(EnkiParser backend,bool testMode){ 
    43         backend.toCode!(T)(testMode); 
     45class GeneratorRefT(T : TextGenerator) : GeneratorRef{ 
     46    public TextGenerator create(){ 
     47        return new T(new GrowBuffer()); 
    4448    } 
    45     public void getHelp(){ 
    46         Stdout(T.getHelp()); 
     49     
     50    public CharT[] getHelp(){ 
     51        return T.getHelp(); 
    4752    } 
    4853} 
  • trunk/enki2/enki/types.d

    r303 r308  
    3636public import enki.RulePredicate; 
    3737public import enki.RuleSet; 
    38 public import enki.TextGenerator; 
    3938public import enki.VariableRef; 
    4039public import enkilib.d.ParserException;