fix: var parsing

This commit is contained in:
rvcas 2022-06-06 22:40:15 -04:00
parent d4251206e7
commit 4c45c95620
No known key found for this signature in database
GPG Key ID: C09B64E263F7D68C
1 changed files with 23 additions and 18 deletions

View File

@ -3,9 +3,9 @@ use std::{collections::HashMap, str::FromStr};
use combine::{ use combine::{
attempt, between, choice, attempt, between, choice,
error::StringStreamError, error::StringStreamError,
many1, look_ahead, many1,
parser::{ parser::{
char::{alpha_num, digit, hex_digit, space, spaces, string}, char::{alpha_num, digit, hex_digit, letter, space, spaces, string},
combinator::no_partial, combinator::no_partial,
}, },
skip_many1, skip_many1,
@ -117,14 +117,7 @@ where
Input: Stream<Token = char>, Input: Stream<Token = char>,
Input::Error: ParseError<Input::Token, Input::Range, Input::Position>, Input::Error: ParseError<Input::Token, Input::Range, Input::Position>,
{ {
(many1(alpha_num()), spaces()).map_input( name().map(Term::Var)
|(text, _): (String, _), input: &mut StateStream<Input>| {
Term::Var(Name {
unique: input.state.intern(&text),
text,
})
},
)
} }
fn delay<Input>() -> impl Parser<StateStream<Input>, Output = Term<Name>> fn delay<Input>() -> impl Parser<StateStream<Input>, Output = Term<Name>>
@ -136,7 +129,7 @@ where
token('('), token('('),
token(')'), token(')'),
string("delay") string("delay")
.with(skip_many1(space())) .skip(skip_many1(space()))
.with(term()) .with(term())
.map(|term| Term::Delay(Box::new(term))), .map(|term| Term::Delay(Box::new(term))),
) )
@ -151,7 +144,7 @@ where
token('('), token('('),
token(')'), token(')'),
string("force") string("force")
.with(skip_many1(space())) .skip(skip_many1(space()))
.with(term()) .with(term())
.map(|term| Term::Force(Box::new(term))), .map(|term| Term::Force(Box::new(term))),
) )
@ -162,17 +155,12 @@ where
Input: Stream<Token = char>, Input: Stream<Token = char>,
Input::Error: ParseError<Input::Token, Input::Range, Input::Position>, Input::Error: ParseError<Input::Token, Input::Range, Input::Position>,
{ {
let name = many1(alpha_num()).map_input(|text: String, input: &mut StateStream<Input>| Name {
unique: input.state.intern(&text),
text,
});
between( between(
token('('), token('('),
token(')'), token(')'),
string("lam") string("lam")
.with(skip_many1(space())) .with(skip_many1(space()))
.with((name, skip_many1(space()), term())) .with((name(), skip_many1(space()), term()))
.map(|(parameter_name, _, term)| Term::Lambda { .map(|(parameter_name, _, term)| Term::Lambda {
parameter_name, parameter_name,
body: Box::new(term), body: Box::new(term),
@ -303,6 +291,23 @@ where
.map(|b| Constant::Bool(b == "True")) .map(|b| Constant::Bool(b == "True"))
} }
fn name<Input>() -> impl Parser<StateStream<Input>, Output = Name>
where
Input: Stream<Token = char>,
Input::Error: ParseError<Input::Token, Input::Range, Input::Position>,
{
look_ahead(letter())
.with(many1(alpha_num().or(token('_').or(token('\'')))))
.map_input(|text: String, input: &mut StateStream<Input>| {
println!("{:?}", text);
Name {
unique: input.state.intern(&text),
text,
}
})
}
#[cfg(test)] #[cfg(test)]
mod test { mod test {
#[test] #[test]