dnascript

A tiny tool for templated code generation with JavaScript as the meta language.

Usage no npm install needed!

<script type="module">
  import dnascript from 'https://cdn.skypack.dev/dnascript';
</script>

README

dnascript

A tiny tool for templated code generation with JavaScript as the meta language.

"We need to go deeper"

Heavily inspired by ribosome

Main Concepts

  • Meta Language: the language which will do the code generation (here: JavaScript)
  • Target Language: the language of which code will be generated
  • DNA File:
    • mostly looks like the target language
    • contains meta code in target-style comments
    • contains template variables that will be interpolated during generation
  • RNA File
    • written in the meta language (here: Javascript)
    • contains target code in ES6 template-literal strings
    • produces the final generated target code when executed

Example

Generating C code

DNA File: greeter.dna.c

//_ DNA __insertHere__
//_ let n = 6;
//_ let OUT = '';
#include <stdio.h>

int main() {
//_ for (var i = 0; i < n; i++) {
    int greeter__i__Message = __i__;
//_ }
//_ 
//_ for (var i = 0; i < n; i++) {
    printf("%d\n", greeter__i__Message);
//_ }
}
//_ console.log(OUT);
  • notice how this file actually looks like valid C
  • you get syntax highlighing, maybe even autocompletion in your editor

RNA File: greeter.rna.c.js

// RNA ["//_","__","__",""]
let n = 6;
let OUT = '';
OUT += `#include <stdio.h>\n`;
OUT += `\n`;
OUT += `int main() {\n`;
for (var i = 0; i < n; i++) {
    OUT += `    int greeter${i}Message = ${i};\n`;
}

for (var i = 0; i < n; i++) {
    OUT += `    printf("%d\\n", greeter${i}Message);\n`;
}
OUT += `}\n`;
console.log(OUT);
  • notice how this is valid and executable JavaScript

  • Get this RNA file by running the transcriber:
    node bin/transcribe.js examples

Output: greeter.c

#include <stdio.h>

int main() {
    int greeter0Message = 0;
    int greeter1Message = 1;
    int greeter2Message = 2;
    int greeter3Message = 3;
    int greeter4Message = 4;
    int greeter5Message = 5;
    printf("%d\n", greeter0Message);
    printf("%d\n", greeter1Message);
    printf("%d\n", greeter2Message);
    printf("%d\n", greeter3Message);
    printf("%d\n", greeter4Message);
    printf("%d\n", greeter5Message);
}
  • Execute the RNA file to get this final C code
    node examples/greeter.rna.c.js > examples/greeter.c