© Copyright 2005 Peri Hankey - documentation license Gnu FDL - code license Gnu GPL - validate HTML
SourceForge.net Logo the D-to-D translator

home Makefile target for building the translator

 d2d.lm: d2xfe.lmn d2dbe.lmn
         $(LMN2M) $+ -o $@ -s $(LM); 
         chmod +x $@

home build the ruleset as a shell script

Compile the rules so as to combine the frontend and backend in a single ruleset:

 [peri@p2 v]$ make d2d.lm
 lmn2m d2xfe.lmn d2dbe.lmn -o d2d.lm -s /usr/bin/lm;
 chmod u+x d2d.lm

home builtin.d: source text to be translated

Here is a D language source text: builtin.d from the language machine itself:

 module lm.builtin; 
 import lm.licenseGnuGPLv2;
 import lm.versionInfo;
 import lm.element;
 import lm.engine;
 import std.string;
 extern (C) {
   element include       (inout stream s, element x){
     char[] y = x.toVal().toString();
     if(y == "-") s.lm.addinput(new graminput(s.lm)); else s.lm.addinput(new graminputfile(s.lm, y));
     return x; 
   }
   element trOn     (inout stream s, element x){
     number y = cast(number) x.toVal();
     if(!y)            return s.ssy.zlm; 
     return new number(s.lm.settrace(y.toUlong)); 
   }
   element trOff    (inout stream s, element x){
     number y = cast(number) x.toVal();
     if(!y)            return s.ssy.zlm; 
     return new number(s.lm.unsettrace(y.toUlong)); 
   }
   element use      (inout stream s, element x){
     s.lm.setGrammar(x.toVal());
     return x; 
   }
   element toChars (inout stream s, element x){
     char[]    t = x.toVal().toString();
     element[] v = new element[t.length];
     uint n = 0; for(uint i = 0; i < t.length; ){ v[n++] = s.lm.tsy.unique(std.utf.decode(t, i)); }
     v.length = n;
     return new chrStr(v); 
   }
   element varSi         (inout stream s, var     v){ return new number(v.si); }
   element varGsy        (inout stream s, var     v){ return v.gsy; }
   element varLsy        (inout stream s, var     v){ return v.lsy; }
   element varRsy        (inout stream s, var     v){ return v.rsy; }
   element varIfn        (inout stream s, var     v){ return new quote(s.nsy.unique(new sym(v.ifn))); }
   element varCp         (inout stream s, var     v){ return new number(v.cp); }
   element varLn         (inout stream s, var     v){ return new number(v.ln); }
   element varCn         (inout stream s, var     v){ return new number(v.cn); }
   element lmVersion     (inout stream s           ){ return new quote(s.nsy.unique(new sym(versionString))); }
   element lmDate        (inout stream s           ){ return new quote(s.nsy.unique(new sym(dateStamp    ))); }
   private element * toPtr(inout element f) { return &f; }
   element format(inout stream s, element f, ...) {
     char[]    rs = new char[0];   
     char[]    fs = f.toString();  
     int       nf = 1 + count(fs, "%") - count(fs, "%%");
     element[] av = new element[nf];
     element   *p = toPtr(f);
     for(int i = 0; i < nf; i++){ av[i] = p[i]; }; 
     variadic  vv = new variadic(av);
     void putc(dchar c){ rs ~= c; }
     doFormat(&putc, vv.argtypes(), vv.argvalues());
     return new sym(rs); 
   }
 }

home results of D-to-D translation

 [peri@p2 v]$ ./d2d.lm builtin.d
 module lm.builtin;
 import lm.licenseGnuGPLv2;
 import lm.versionInfo;
 import lm.element;
 import lm.engine;
 import std.string;
 extern (C)  {
   element include(inout stream s, element x) {
     char[] y = x.toVal().toString();
     if(y == "-")s.lm.addinput(new graminput(s.lm));
     else s.lm.addinput(new graminputfile(s.lm, y));
     return x;
     }
   element trOn(inout stream s, element x) {
     number y = cast(number)x.toVal();
     if(!y)return s.ssy.zlm;
     return new number(s.lm.settrace(y.toUlong));
     }
   element trOff(inout stream s, element x) {
     number y = cast(number)x.toVal();
     if(!y)return s.ssy.zlm;
     return new number(s.lm.unsettrace(y.toUlong));
     }
   element use(inout stream s, element x) {
     s.lm.setGrammar(x.toVal());
     return x;
     }
   element toChars(inout stream s, element x) {
     char[] t = x.toVal().toString();
     element[] v = new element[t.length];
     uint n = 0;
     for(uint i = 0; i < t.length; ) {
       v[n++] = s.lm.tsy.unique(std.utf.decode(t, i));
       }
     v.length = n;
     return new chrStr(v);
     }
   element varSi(inout stream s, var v) {
     return new number(v.si);
     }
   element varGsy(inout stream s, var v) {
     return v.gsy;
     }
   element varLsy(inout stream s, var v) {
     return v.lsy;
     }
   element varRsy(inout stream s, var v) {
     return v.rsy;
     }
   element varIfn(inout stream s, var v) {
     return new quote(s.nsy.unique(new sym(v.ifn)));
     }
   element varCp(inout stream s, var v) {
     return new number(v.cp);
     }
   element varLn(inout stream s, var v) {
     return new number(v.ln);
     }
   element varCn(inout stream s, var v) {
     return new number(v.cn);
     }
   element lmVersion(inout stream s) {
     return new quote(s.nsy.unique(new sym(versionString)));
     }
   element lmDate(inout stream s) {
     return new quote(s.nsy.unique(new sym(dateStamp)));
     }
   private
   element* toPtr(inout element f) {
     return &f;
     }
   element format(inout stream s, element f, ...) {
     char[] rs = new char[0];
     char[] fs = f.toString();
     int nf = 1 + count(fs, "%") - count(fs, "%%");
     element[] av = new element[nf];
     element * p = toPtr(f);
     for(int i = 0; i < nf; i++) {
       av[i] = p[i];
       }
     variadic vv = new variadic(av);
     void putc(dchar c) {
       rs ~= c;
       }
     doFormat(&putc, vv.argtypes(), vv.argvalues());
     return new sym(rs);
     }
   }
home