This commit is contained in:
nora 2022-01-30 21:10:50 +01:00
parent 0d3c4d913e
commit 700c8624f6
4 changed files with 213 additions and 13 deletions

170
Cargo.lock generated
View file

@ -20,6 +20,12 @@ dependencies = [
"yansi", "yansi",
] ]
[[package]]
name = "autocfg"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
[[package]] [[package]]
name = "beef" name = "beef"
version = "0.5.1" version = "0.5.1"
@ -41,6 +47,19 @@ dependencies = [
"ahash", "ahash",
] ]
[[package]]
name = "console"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a28b32d32ca44b70c3e4acd7db1babf555fa026e385fb95f18028f88848b3c31"
dependencies = [
"encode_unicode",
"libc",
"once_cell",
"terminal_size",
"winapi",
]
[[package]] [[package]]
name = "const-random" name = "const-random"
version = "0.1.13" version = "0.1.13"
@ -69,6 +88,12 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
[[package]]
name = "encode_unicode"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
[[package]] [[package]]
name = "fnv" name = "fnv"
version = "1.0.7" version = "1.0.7"
@ -86,12 +111,49 @@ dependencies = [
"wasi", "wasi",
] ]
[[package]]
name = "hashbrown"
version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
[[package]]
name = "indexmap"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282a6247722caba404c065016bbfa522806e51714c34f5dfc3e4a3a46fcb4223"
dependencies = [
"autocfg",
"hashbrown",
]
[[package]]
name = "insta"
version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4c0c443f6dceb3a1cb7607c87501aa91e4b9c976044f725c2a74ca2152c91a4"
dependencies = [
"console",
"once_cell",
"serde",
"serde_json",
"serde_yaml",
"similar",
]
[[package]]
name = "itoa"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
[[package]] [[package]]
name = "lambda-calculus" name = "lambda-calculus"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"ariadne", "ariadne",
"chumsky", "chumsky",
"insta",
"logos", "logos",
] ]
@ -107,6 +169,12 @@ version = "0.2.116"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "565dbd88872dbe4cc8a46e527f26483c1d1f7afa6b884a3bd6cd893d4f98da74" checksum = "565dbd88872dbe4cc8a46e527f26483c1d1f7afa6b884a3bd6cd893d4f98da74"
[[package]]
name = "linked-hash-map"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
[[package]] [[package]]
name = "logos" name = "logos"
version = "0.12.0" version = "0.12.0"
@ -131,6 +199,12 @@ dependencies = [
"utf8-ranges", "utf8-ranges",
] ]
[[package]]
name = "once_cell"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5"
[[package]] [[package]]
name = "proc-macro-hack" name = "proc-macro-hack"
version = "0.5.19" version = "0.5.19"
@ -161,6 +235,61 @@ version = "0.6.25"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
[[package]]
name = "ryu"
version = "1.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f"
[[package]]
name = "serde"
version = "1.0.136"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.136"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.78"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d23c1ba4cf0efd44be32017709280b32d1cea5c3f1275c3b6d9e8bc54f758085"
dependencies = [
"itoa",
"ryu",
"serde",
]
[[package]]
name = "serde_yaml"
version = "0.8.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4a521f2940385c165a24ee286aa8599633d162077a54bdcae2a6fd5a7bfa7a0"
dependencies = [
"indexmap",
"ryu",
"serde",
"yaml-rust",
]
[[package]]
name = "similar"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e24979f63a11545f5f2c60141afe249d4f19f84581ea2138065e400941d83d3"
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.86" version = "1.0.86"
@ -172,6 +301,16 @@ dependencies = [
"unicode-xid", "unicode-xid",
] ]
[[package]]
name = "terminal_size"
version = "0.1.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "633c1a546cee861a1a6d0dc69ebeca693bf4296661ba7852b9d21d159e0506df"
dependencies = [
"libc",
"winapi",
]
[[package]] [[package]]
name = "tiny-keccak" name = "tiny-keccak"
version = "2.0.2" version = "2.0.2"
@ -199,6 +338,37 @@ version = "0.10.2+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
[[package]]
name = "winapi"
version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "yaml-rust"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
dependencies = [
"linked-hash-map",
]
[[package]] [[package]]
name = "yansi" name = "yansi"
version = "0.5.0" version = "0.5.0"

View file

@ -9,3 +9,6 @@ edition = "2021"
ariadne = "0.1.3" ariadne = "0.1.3"
chumsky = "0.7.0" chumsky = "0.7.0"
logos = "0.12.0" logos = "0.12.0"
[dev-dependencies]
insta = "1.12.0"

View file

@ -23,7 +23,8 @@ mod lexer {
#[token(")")] #[token(")")]
ParenC, ParenC,
#[regex("[a-zA-Z]+")] #[regex("[a-z]")]
#[regex("[A-Z]+[0-9]*")]
Ident(&'a str), Ident(&'a str),
#[error] #[error]
@ -54,11 +55,11 @@ mod parser {
pub enum Expr { pub enum Expr {
Name(String), Name(String),
Application { Application {
function: Box<Expr>, callee: Box<Expr>,
argument: Box<Expr>, argument: Box<Expr>,
}, },
Abstraction { Abstraction {
args: Vec<char>, params: Vec<char>,
body: Box<Expr>, body: Box<Expr>,
}, },
} }
@ -71,20 +72,40 @@ mod parser {
}) })
.labelled("ident"); .labelled("ident");
let parameters = ident
.map(|ident| ident.chars().collect::<Vec<_>>())
.labelled("parameters");
let abstraction = just(Token::Lambda) let abstraction = just(Token::Lambda)
.ignore_then(ident) .ignore_then(parameters)
.then_ignore(just(Token::Dot)) .then_ignore(just(Token::Dot))
.then(expr) .then(expr.clone())
.map(|(args, body)| Expr::Abstraction { .map(|(params, body)| Expr::Abstraction {
args: args.chars().collect(), params,
body: Box::new(body), body: Box::new(body),
}) })
.labelled("abstraction"); .labelled("abstraction");
ident let name_expr = ident
.or(abstraction) .map(|ident| Expr::Name(ident.to_string()))
.or(expr.delimited_by(Token::ParenO, Token::ParenC)) .labelled("name");
let application = expr
.clone()
.then(expr.clone())
.map(|(callee, arg)| Expr::Application {
callee: Box::new(callee),
argument: Box::new(arg),
})
.labelled("application");
abstraction
.or(expr.clone().delimited_by(Token::ParenO, Token::ParenC))
.or(name_expr)
.or(expr)
.or(application)
.then_ignore(end()) .then_ignore(end())
.labelled("expression")
}) })
} }
} }
@ -93,7 +114,12 @@ pub fn run(input: &str) {
let lexer = lexer::Token::lexer(input); let lexer = lexer::Token::lexer(input);
let length = lexer.source().len(); let length = lexer.source().len();
match parser::expr_parser().parse(Stream::from_iter(length..length + 1, lexer.spanned())) { match parser::expr_parser().parse(Stream::from_iter(
length..length + 1,
lexer.spanned().inspect(|val| {
dbg!(val);
}),
)) {
Ok(ast) => println!("parsed: {ast:#?}"), Ok(ast) => println!("parsed: {ast:#?}"),
Err(errs) => errs Err(errs) => errs
.into_iter() .into_iter()

View file

@ -1,6 +1,7 @@
fn main() { fn main() {
lambda_calculus::run("λa.a"); lambda_calculus::run("fa");
// lambda_calculus::run("λa.a"); // lambda_calculus::run("λa.a");
// lambda_calculus::run("λab.a"); // lambda_calculus::run("λa.a");
// lambda_calculus::run("λab.PAIR a");
// lambda_calculus::run("U := λab.a"); // lambda_calculus::run("U := λab.a");
} }