re-organize project
This commit is contained in:
parent
8f7685e8ea
commit
2689fd9d1b
51
Cargo.lock
generated
51
Cargo.lock
generated
@ -10,6 +10,14 @@ dependencies = [
|
|||||||
"pest_derive",
|
"pest_derive",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "albireo-language"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"albireo",
|
||||||
|
"executor",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "block-buffer"
|
name = "block-buffer"
|
||||||
version = "0.10.4"
|
version = "0.10.4"
|
||||||
@ -54,6 +62,13 @@ dependencies = [
|
|||||||
"crypto-common",
|
"crypto-common",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "executor"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"albireo",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "generic-array"
|
name = "generic-array"
|
||||||
version = "0.14.7"
|
version = "0.14.7"
|
||||||
@ -72,9 +87,9 @@ checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memchr"
|
name = "memchr"
|
||||||
version = "2.7.1"
|
version = "2.7.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
|
checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "once_cell"
|
name = "once_cell"
|
||||||
@ -84,9 +99,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pest"
|
name = "pest"
|
||||||
version = "2.7.7"
|
version = "2.7.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546"
|
checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
@ -95,9 +110,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pest_derive"
|
name = "pest_derive"
|
||||||
version = "2.7.7"
|
version = "2.7.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "22e1288dbd7786462961e69bfd4df7848c1e37e8b74303dbdab82c3a9cdd2809"
|
checksum = "b0d24f72393fd16ab6ac5738bc33cdb6a9aa73f8b902e8fe29cf4e67d7dd1026"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"pest",
|
"pest",
|
||||||
"pest_generator",
|
"pest_generator",
|
||||||
@ -105,9 +120,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pest_generator"
|
name = "pest_generator"
|
||||||
version = "2.7.7"
|
version = "2.7.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1381c29a877c6d34b8c176e734f35d7f7f5b3adaefe940cb4d1bb7af94678e2e"
|
checksum = "fdc17e2a6c7d0a492f0158d7a4bd66cc17280308bbaff78d5bef566dca35ab80"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"pest",
|
"pest",
|
||||||
"pest_meta",
|
"pest_meta",
|
||||||
@ -118,9 +133,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pest_meta"
|
name = "pest_meta"
|
||||||
version = "2.7.7"
|
version = "2.7.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d0934d6907f148c22a3acbda520c7eed243ad7487a30f51f6ce52b58b7077a8a"
|
checksum = "934cd7631c050f4674352a6e835d5f6711ffbfb9345c2fc0107155ac495ae293"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"pest",
|
"pest",
|
||||||
@ -129,9 +144,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.78"
|
version = "1.0.79"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
|
checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
@ -158,9 +173,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.48"
|
version = "2.0.55"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
|
checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@ -169,18 +184,18 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror"
|
name = "thiserror"
|
||||||
version = "1.0.57"
|
version = "1.0.58"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b"
|
checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thiserror-impl",
|
"thiserror-impl",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thiserror-impl"
|
name = "thiserror-impl"
|
||||||
version = "1.0.57"
|
version = "1.0.58"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81"
|
checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
12
Cargo.toml
12
Cargo.toml
@ -1,10 +1,14 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "albireo"
|
name = "albireo-language"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
[workspace]
|
||||||
|
members = [
|
||||||
|
"albireo"
|
||||||
|
, "executor"
|
||||||
|
]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
pest = "2.7.6"
|
albireo = { path = "albireo" }
|
||||||
pest_derive = "2.7.6"
|
executor = { path = "executor" }
|
||||||
|
12
albireo/Cargo.toml
Normal file
12
albireo/Cargo.toml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[package]
|
||||||
|
name = "albireo"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
path = "src/albireo.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
pest = "2.7.6"
|
||||||
|
pest_derive = "2.7.6"
|
||||||
|
|
@ -194,7 +194,7 @@ module_declare = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
program = {
|
program = {
|
||||||
SOI ~ module_declare ~ declaration*
|
SOI ~ module_declare ~ declaration* ~ EOI
|
||||||
}
|
}
|
||||||
|
|
||||||
WHITESPACE = _{ " " | NEWLINE }
|
WHITESPACE = _{ " " | NEWLINE }
|
@ -2,20 +2,23 @@
|
|||||||
#[grammar = "albireo.pest"]
|
#[grammar = "albireo.pest"]
|
||||||
pub struct AlbireoParser;
|
pub struct AlbireoParser;
|
||||||
|
|
||||||
|
use pest::Parser;
|
||||||
use pest::iterators::Pair;
|
use pest::iterators::Pair;
|
||||||
|
|
||||||
use std::vec::Vec;
|
use std::path::Path;
|
||||||
|
use std::error::Error;
|
||||||
|
use std::fs;
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
|
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
|
||||||
pub struct Identifier {
|
pub struct Identifier {
|
||||||
name: String,
|
pub name: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct Module {
|
pub struct Module {
|
||||||
module: ModuleInformation,
|
pub module: ModuleInformation,
|
||||||
declaration: Vec<Declaration>
|
pub declaration: HashMap<Identifier, Declaration>
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug)]
|
||||||
@ -363,10 +366,16 @@ pub fn parse_module(parsed: Pair<Rule>) -> Option<Module> {
|
|||||||
let module = p.next()?;
|
let module = p.next()?;
|
||||||
let module_info = parse_module_declaration(module)?;
|
let module_info = parse_module_declaration(module)?;
|
||||||
|
|
||||||
let mut declaration_list = Vec::new();
|
let mut declaration_list = HashMap::new();
|
||||||
while let Some(declaration) = p.next() {
|
while let Some(declaration) = p.next() {
|
||||||
|
if declaration.as_rule() == Rule::EOI {
|
||||||
|
continue
|
||||||
|
}
|
||||||
let declare = parse_declaration(declaration);
|
let declare = parse_declaration(declaration);
|
||||||
declaration_list.push(declare);
|
match declare {
|
||||||
|
Declaration::Type(ref id, _) => declaration_list.insert(id.clone(), declare),
|
||||||
|
Declaration::Variable(ref id, _, _) => declaration_list.insert(id.clone(), declare),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(Module {
|
Some(Module {
|
||||||
@ -374,3 +383,16 @@ pub fn parse_module(parsed: Pair<Rule>) -> Option<Module> {
|
|||||||
declaration: declaration_list,
|
declaration: declaration_list,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn parse_file<P: AsRef<Path>>(file: P) -> Result<Module, Box<dyn Error>> {
|
||||||
|
let input = fs::read_to_string(file).expect("cannot read file");
|
||||||
|
|
||||||
|
let parsed = AlbireoParser::parse(Rule::program, &input)
|
||||||
|
.expect("file format is wrong or the parser is wrong")
|
||||||
|
.next()
|
||||||
|
.expect("cannot parse input file as a Albireo program");
|
||||||
|
|
||||||
|
let module = parse_module(parsed)
|
||||||
|
.ok_or("Cannot parse module completely")?;
|
||||||
|
Ok(module)
|
||||||
|
}
|
7
executor/Cargo.toml
Normal file
7
executor/Cargo.toml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
[package]
|
||||||
|
name = "executor"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
albireo = { path = "../albireo" }
|
22
executor/src/errors.rs
Normal file
22
executor/src/errors.rs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
use std::fmt;
|
||||||
|
|
||||||
|
pub type Result<T> = std::result::Result<T, ExecutionError>;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum ExecutionError {
|
||||||
|
MainNotFound,
|
||||||
|
MainSignatureIncorrect,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::error::Error for ExecutionError {}
|
||||||
|
|
||||||
|
impl fmt::Display for ExecutionError {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
match self {
|
||||||
|
ExecutionError::MainNotFound =>
|
||||||
|
write!(f, "main function not found"),
|
||||||
|
ExecutionError::MainSignatureIncorrect =>
|
||||||
|
write!(f, "main function signature is incorrect, expecting Fn([], T) for any output type T"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
23
executor/src/lib.rs
Normal file
23
executor/src/lib.rs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
pub mod errors;
|
||||||
|
|
||||||
|
use errors::{Result, ExecutionError};
|
||||||
|
|
||||||
|
use albireo::{Expression, Type, Identifier, Module, Declaration};
|
||||||
|
|
||||||
|
// TODO: accepting a module map not a module
|
||||||
|
pub fn run_program(module: Module) -> Result<()> {
|
||||||
|
let main = module.declaration.get(&Identifier { name: "main".into() })
|
||||||
|
.ok_or(ExecutionError::MainNotFound)?;
|
||||||
|
|
||||||
|
// expecting main to be function receiving no parameter
|
||||||
|
if let Declaration::Variable(_, Type::Function(input, _), _) = main {
|
||||||
|
if input.len() != 0 {
|
||||||
|
return Err(ExecutionError::MainSignatureIncorrect)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return Err(ExecutionError::MainSignatureIncorrect)
|
||||||
|
};
|
||||||
|
|
||||||
|
println!("main {:?}", main);
|
||||||
|
Ok(())
|
||||||
|
}
|
29
src/main.rs
29
src/main.rs
@ -1,18 +1,19 @@
|
|||||||
mod albireo;
|
use albireo::parse_file;
|
||||||
|
use executor::run_program;
|
||||||
|
|
||||||
use crate::albireo::{AlbireoParser, Rule, parse_module};
|
use std::error::Error;
|
||||||
|
|
||||||
use std::fs;
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
use pest::Parser;
|
let module = parse_file("test/simple/main.air")?;
|
||||||
|
|
||||||
fn main() {
|
|
||||||
let input = fs::read_to_string("test/simple/main.air").expect("cannot read file");
|
|
||||||
|
|
||||||
let parsed = AlbireoParser::parse(Rule::program, &input)
|
|
||||||
.expect("file format is wrong or the parser is wrong")
|
|
||||||
.next()
|
|
||||||
.expect("cannot parse input file as a Albireo program");
|
|
||||||
|
|
||||||
let module = parse_module(parsed);
|
|
||||||
println!("{:?}", module);
|
println!("{:?}", module);
|
||||||
|
match run_program(module) {
|
||||||
|
Ok(_) => {
|
||||||
|
println!("program executed successfully");
|
||||||
|
Ok(())
|
||||||
|
},
|
||||||
|
Err(e) => {
|
||||||
|
println!("program executed with error: {}", e);
|
||||||
|
Err(Box::new(e))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,3 +54,7 @@ bruh2 : fn bool => number = function cond is
|
|||||||
else
|
else
|
||||||
function x is x + 2
|
function x is x + 2
|
||||||
)(0)
|
)(0)
|
||||||
|
|
||||||
|
|
||||||
|
main : fn => number = function is
|
||||||
|
1
|
||||||
|
Loading…
Reference in New Issue
Block a user