Browse Source

Add stdlib

github-actions
Garrit Franke 3 years ago
parent
commit
57f403cc9b
  1. 0
      builtin/README.md
  2. 0
      builtin/builtin.js
  3. 2
      examples/playground.sb
  4. 0
      lib/stdio.sb
  5. 5
      src/builtin/mod.rs
  6. 7
      src/generator/js.rs
  7. 28
      src/main.rs
  8. 1
      src/parser/rules.rs

0
src/builtin/README.md → builtin/README.md

0
src/builtin/builtin.js → builtin/builtin.js

2
examples/playground.sb

@ -1,5 +1,5 @@
fn main() {
let x = 10
x = 5
_printf("Hello World!\n")
print("Hello World!")
}

0
src/lib/stdio.sb → lib/stdio.sb

5
src/builtin/mod.rs

@ -1,5 +0,0 @@
use rust_embed::RustEmbed;
#[derive(RustEmbed)]
#[folder = "src/builtin/"]
pub struct Builtins;

7
src/generator/js.rs

@ -22,8 +22,8 @@ impl Generator for JsGenerator {
fn generate(prog: Program) -> String {
let mut code = String::new();
let raw_builtins = crate::builtin::Builtins::get("builtin.js")
.expect("Could not locate builtin functions");
let raw_builtins =
crate::Builtins::get("builtin.js").expect("Could not locate builtin functions");
code += std::str::from_utf8(raw_builtins.as_ref())
.expect("Unable to interpret builtin functions");
let funcs: String = prog
@ -34,8 +34,7 @@ impl Generator for JsGenerator {
code += &funcs;
// Until we have a stdlib, it should suffice to print the result of main to stdout
code += "console.log(main())";
code += "main();";
return code;
}

28
src/main.rs

@ -24,11 +24,19 @@ use std::io::Write;
use std::path::PathBuf;
use structopt::StructOpt;
mod builtin;
mod generator;
mod lexer;
mod parser;
mod util;
use rust_embed::RustEmbed;
#[derive(RustEmbed)]
#[folder = "lib/"]
pub struct Lib;
#[derive(RustEmbed)]
#[folder = "builtin/"]
pub struct Builtins;
#[derive(StructOpt, Debug)]
enum Opt {
@ -49,19 +57,29 @@ fn main() -> Result<(), String> {
};
let mut file = File::open(in_file).expect("Could not open file");
let mut contents = String::new();
contents = append_stdlib(contents);
file.read_to_string(&mut contents)
.expect("Could not read file");
let tokens = lexer::tokenize(&contents);
// let ast = parser::parse(tokens.into_iter());
let program = parser::parse(tokens, Some(contents))?;
dbg!(":#?", &program);
let output = generator::js::JsGenerator::generate(program);
let mut file = std::fs::File::create(out_file).expect("create failed");
file.write_all(output.as_bytes()).expect("write failed");
file.flush().expect("Could not flush file");
Ok(())
}
fn append_stdlib(mut buffer: String) -> String {
buffer += "// START stdlib\n\n";
let stdlib = Lib::get("stdio.sb").expect("Standard library not found. This should not occur.");
buffer += std::str::from_utf8(&stdlib).expect("Could not interpret standard library.");
buffer += "\n// END stdlib\n\n";
buffer
}

1
src/parser/rules.rs

@ -42,7 +42,6 @@ impl Parser {
while let Err(_) = self.peek_token(TokenKind::CurlyBracesClose) {
let statement = self.parse_statement()?;
dbg!("{:?}", &statement);
statements.push(statement);
}

Loading…
Cancel
Save