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

28
src/main.rs

@ -24,11 +24,19 @@ use std::io::Write;
use std::path::PathBuf; use std::path::PathBuf;
use structopt::StructOpt; use structopt::StructOpt;
mod builtin;
mod generator; mod generator;
mod lexer; mod lexer;
mod parser; mod parser;
mod util; mod util;
use rust_embed::RustEmbed;
#[derive(RustEmbed)]
#[folder = "lib/"]
pub struct Lib;
#[derive(RustEmbed)]
#[folder = "builtin/"]
pub struct Builtins;
#[derive(StructOpt, Debug)] #[derive(StructOpt, Debug)]
enum Opt { enum Opt {
@ -49,19 +57,29 @@ fn main() -> Result<(), String> {
}; };
let mut file = File::open(in_file).expect("Could not open file"); let mut file = File::open(in_file).expect("Could not open file");
let mut contents = String::new(); let mut contents = String::new();
contents = append_stdlib(contents);
file.read_to_string(&mut contents) file.read_to_string(&mut contents)
.expect("Could not read file"); .expect("Could not read file");
let tokens = lexer::tokenize(&contents); let tokens = lexer::tokenize(&contents);
// let ast = parser::parse(tokens.into_iter());
let program = parser::parse(tokens, Some(contents))?; let program = parser::parse(tokens, Some(contents))?;
dbg!(":#?", &program);
let output = generator::js::JsGenerator::generate(program); let output = generator::js::JsGenerator::generate(program);
let mut file = std::fs::File::create(out_file).expect("create failed"); let mut file = std::fs::File::create(out_file).expect("create failed");
file.write_all(output.as_bytes()).expect("write failed"); file.write_all(output.as_bytes()).expect("write failed");
file.flush().expect("Could not flush file"); file.flush().expect("Could not flush file");
Ok(()) 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) { while let Err(_) = self.peek_token(TokenKind::CurlyBracesClose) {
let statement = self.parse_statement()?; let statement = self.parse_statement()?;
dbg!("{:?}", &statement);
statements.push(statement); statements.push(statement);
} }

Loading…
Cancel
Save