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",
]
[[package]]
name = "autocfg"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a"
[[package]]
name = "beef"
version = "0.5.1"
@ -41,6 +47,19 @@ dependencies = [
"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]]
name = "const-random"
version = "0.1.13"
@ -69,6 +88,12 @@ version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
[[package]]
name = "encode_unicode"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
[[package]]
name = "fnv"
version = "1.0.7"
@ -86,12 +111,49 @@ dependencies = [
"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]]
name = "lambda-calculus"
version = "0.1.0"
dependencies = [
"ariadne",
"chumsky",
"insta",
"logos",
]
@ -107,6 +169,12 @@ version = "0.2.116"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "565dbd88872dbe4cc8a46e527f26483c1d1f7afa6b884a3bd6cd893d4f98da74"
[[package]]
name = "linked-hash-map"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3"
[[package]]
name = "logos"
version = "0.12.0"
@ -131,6 +199,12 @@ dependencies = [
"utf8-ranges",
]
[[package]]
name = "once_cell"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da32515d9f6e6e489d7bc9d84c71b060db7247dc035bbe44eac88cf87486d8d5"
[[package]]
name = "proc-macro-hack"
version = "0.5.19"
@ -161,6 +235,61 @@ version = "0.6.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
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]]
name = "syn"
version = "1.0.86"
@ -172,6 +301,16 @@ dependencies = [
"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]]
name = "tiny-keccak"
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"
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]]
name = "yansi"
version = "0.5.0"

View file

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

View file

@ -23,7 +23,8 @@ mod lexer {
#[token(")")]
ParenC,
#[regex("[a-zA-Z]+")]
#[regex("[a-z]")]
#[regex("[A-Z]+[0-9]*")]
Ident(&'a str),
#[error]
@ -54,11 +55,11 @@ mod parser {
pub enum Expr {
Name(String),
Application {
function: Box<Expr>,
callee: Box<Expr>,
argument: Box<Expr>,
},
Abstraction {
args: Vec<char>,
params: Vec<char>,
body: Box<Expr>,
},
}
@ -71,20 +72,40 @@ mod parser {
})
.labelled("ident");
let parameters = ident
.map(|ident| ident.chars().collect::<Vec<_>>())
.labelled("parameters");
let abstraction = just(Token::Lambda)
.ignore_then(ident)
.ignore_then(parameters)
.then_ignore(just(Token::Dot))
.then(expr)
.map(|(args, body)| Expr::Abstraction {
args: args.chars().collect(),
.then(expr.clone())
.map(|(params, body)| Expr::Abstraction {
params,
body: Box::new(body),
})
.labelled("abstraction");
ident
.or(abstraction)
.or(expr.delimited_by(Token::ParenO, Token::ParenC))
let name_expr = ident
.map(|ident| Expr::Name(ident.to_string()))
.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())
.labelled("expression")
})
}
}
@ -93,7 +114,12 @@ pub fn run(input: &str) {
let lexer = lexer::Token::lexer(input);
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:#?}"),
Err(errs) => errs
.into_iter()

View file

@ -1,6 +1,7 @@
fn main() {
lambda_calculus::run("λa.a");
lambda_calculus::run("fa");
// 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");
}