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",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "albireo-language"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"albireo",
|
||||
"executor",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "block-buffer"
|
||||
version = "0.10.4"
|
||||
@ -54,6 +62,13 @@ dependencies = [
|
||||
"crypto-common",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "executor"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"albireo",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "generic-array"
|
||||
version = "0.14.7"
|
||||
@ -72,9 +87,9 @@ checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.7.1"
|
||||
version = "2.7.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
|
||||
checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
|
||||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
@ -84,9 +99,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
||||
|
||||
[[package]]
|
||||
name = "pest"
|
||||
version = "2.7.7"
|
||||
version = "2.7.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "219c0dcc30b6a27553f9cc242972b67f75b60eb0db71f0b5462f38b058c41546"
|
||||
checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"thiserror",
|
||||
@ -95,9 +110,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "pest_derive"
|
||||
version = "2.7.7"
|
||||
version = "2.7.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "22e1288dbd7786462961e69bfd4df7848c1e37e8b74303dbdab82c3a9cdd2809"
|
||||
checksum = "b0d24f72393fd16ab6ac5738bc33cdb6a9aa73f8b902e8fe29cf4e67d7dd1026"
|
||||
dependencies = [
|
||||
"pest",
|
||||
"pest_generator",
|
||||
@ -105,9 +120,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "pest_generator"
|
||||
version = "2.7.7"
|
||||
version = "2.7.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1381c29a877c6d34b8c176e734f35d7f7f5b3adaefe940cb4d1bb7af94678e2e"
|
||||
checksum = "fdc17e2a6c7d0a492f0158d7a4bd66cc17280308bbaff78d5bef566dca35ab80"
|
||||
dependencies = [
|
||||
"pest",
|
||||
"pest_meta",
|
||||
@ -118,9 +133,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "pest_meta"
|
||||
version = "2.7.7"
|
||||
version = "2.7.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d0934d6907f148c22a3acbda520c7eed243ad7487a30f51f6ce52b58b7077a8a"
|
||||
checksum = "934cd7631c050f4674352a6e835d5f6711ffbfb9345c2fc0107155ac495ae293"
|
||||
dependencies = [
|
||||
"once_cell",
|
||||
"pest",
|
||||
@ -129,9 +144,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.78"
|
||||
version = "1.0.79"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
|
||||
checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
@ -158,9 +173,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.48"
|
||||
version = "2.0.55"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
|
||||
checksum = "002a1b3dbf967edfafc32655d0f377ab0bb7b994aa1d32c8cc7e9b8bf3ebb8f0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@ -169,18 +184,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.57"
|
||||
version = "1.0.58"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b"
|
||||
checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297"
|
||||
dependencies = [
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.57"
|
||||
version = "1.0.58"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81"
|
||||
checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
12
Cargo.toml
12
Cargo.toml
@ -1,10 +1,14 @@
|
||||
[package]
|
||||
name = "albireo"
|
||||
name = "albireo-language"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
[workspace]
|
||||
members = [
|
||||
"albireo"
|
||||
, "executor"
|
||||
]
|
||||
|
||||
[dependencies]
|
||||
pest = "2.7.6"
|
||||
pest_derive = "2.7.6"
|
||||
albireo = { path = "albireo" }
|
||||
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 = {
|
||||
SOI ~ module_declare ~ declaration*
|
||||
SOI ~ module_declare ~ declaration* ~ EOI
|
||||
}
|
||||
|
||||
WHITESPACE = _{ " " | NEWLINE }
|
@ -2,20 +2,23 @@
|
||||
#[grammar = "albireo.pest"]
|
||||
pub struct AlbireoParser;
|
||||
|
||||
use pest::Parser;
|
||||
use pest::iterators::Pair;
|
||||
|
||||
use std::vec::Vec;
|
||||
use std::path::Path;
|
||||
use std::error::Error;
|
||||
use std::fs;
|
||||
use std::collections::HashMap;
|
||||
|
||||
#[derive(Clone, Debug, Eq, PartialEq, Hash)]
|
||||
pub struct Identifier {
|
||||
name: String,
|
||||
pub name: String,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Module {
|
||||
module: ModuleInformation,
|
||||
declaration: Vec<Declaration>
|
||||
pub module: ModuleInformation,
|
||||
pub declaration: HashMap<Identifier, Declaration>
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
@ -363,10 +366,16 @@ pub fn parse_module(parsed: Pair<Rule>) -> Option<Module> {
|
||||
let module = p.next()?;
|
||||
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() {
|
||||
if declaration.as_rule() == Rule::EOI {
|
||||
continue
|
||||
}
|
||||
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 {
|
||||
@ -374,3 +383,16 @@ pub fn parse_module(parsed: Pair<Rule>) -> Option<Module> {
|
||||
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;
|
||||
use pest::Parser;
|
||||
|
||||
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);
|
||||
fn main() -> Result<(), Box<dyn Error>> {
|
||||
let module = parse_file("test/simple/main.air")?;
|
||||
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
|
||||
function x is x + 2
|
||||
)(0)
|
||||
|
||||
|
||||
main : fn => number = function is
|
||||
1
|
||||
|
Loading…
Reference in New Issue
Block a user