A simple interpreter written to simulate and run BDScript Language in JavaScript
npm install bds.jsContext
Lexer
Parser
Evaluator
Runtime
operator type breaks punctuations
$async, $wait, $safejs, $if
FNHandler
Script
Nodes
sh
$ npm install bds.js
`
or getting releases from github
API & Usage
$3
`js
const lib = require('bds.js');
const runtime = new lib.Runtime();
const input = '$async[$swait $print[Hello world!]] This bottom text is async output!'
const result = runtime.runInput('helloWorld.bds', input);
result.then(output => console.log(output));
`
$3
> v1.1 is using Runtime and Evaluator, different from v1.0
> This approach is used for the reason; Runtime error and error tracing within code for easier debugging
`js
const runtime = new lib.Runtime();
const input = "$print[Hello World!]";
// Running an input
runtime.runInput('myInput.js', input);
`
$3
> Currently v1.1 use Interpreter system which can impact the performance for large-scale productions.
> Later versions to be improved, can also be a change of system.
`js
// Creating a AST
const input = "> This is the code$print[> Hello World!]"
const lexer = new lib.Lexer(input);
const parser = new lib.Parser();
const Ast = parser.parseToAst(lexer.main() / Tokenizing input /) // Parsing tokens to AST
// Evaluating the AST as simple as possible
const evaluator = lib.Evaluator.singleton // One instance is for one process
const result = evaluator.evaluate(Ast) // Evaluating AST
// Printing the output of input
result.then(output => console.log(output))
`
$3
> Context instance are usually used to handle functions in code
`js
const env = new lib.Environment();
env.set('luckyfn', async (context) => {
context.argsCheck(1); // Check if has required arguments (1), throws error if below from required
const arguments = context.getArgs() // Getting arguments
const minimum_chance = await context.evaluateArgs(arguments)[0] // Get the first argument of evaluated arguments
// Calling other identifiers (Advanced use)
const chance = await context.callIdentifier({type: "call", value: "$random"}) * 100;
if (chance > minimum_chance) {
return 'You are lucky!'
} else {
return 'A sad day for no luck...'
}
});
`
$3
> In bds.js, variables are accessed from the Environment class instance
`js
const os = require("node:os");
const env = new lib.Environment();
// Creating static variables
env.set('myname', 'Nivry'); // result in string
env.set('myage', 14); // result in number
env.set('mycats', ['Kitty', 'Rivi']) // result in array
env.set('totalmem', os.totalmem); // Run function
env.set('lowercase', async (ctx) => {
ctx.argsCheck(1); // Built-in args check, automatically throws error if arguments size is below the required
const arguments = ctx.getArgs();
// Evaluate / Run the arguments beforehand
const text = await ctx.evaluateArgs(arguments)[0] // The first compiled arg
return text.toLowerCase();
});
`
$3
> Global variables are sourced from Runtime.global, allowing many codes to access the global environment while also keeping its own.
`js
const runtime = new lib.Runtime();
runtime.global.set('$helloWorld', 'Hello World!');
``