lang: kinda fun parsing things that can now parse attribute sets with one attribute

This commit is contained in:
Schrottkatze 2024-04-12 21:31:55 +02:00
parent 1711d17fa6
commit be637846b1
Signed by: schrottkatze
SSH key fingerprint: SHA256:hXb3t1vINBFCiDCmhRABHX5ocdbLiKyCdKI4HK2Rbbc
2 changed files with 55 additions and 19 deletions

View file

@ -40,7 +40,7 @@ pub mod parser_to_events {
} }
pub fn to_events(tokens: &[(SyntaxKind, &str)]) -> Vec<Event> { pub fn to_events(tokens: &[(SyntaxKind, &str)]) -> Vec<Event> {
let mut only_toks: Vec<SyntaxKind> = tokens.iter().map(|(t, _)| *t).collect(); let only_toks: Vec<SyntaxKind> = tokens.iter().map(|(t, _)| *t).collect();
let res = parser().parse(&only_toks); let res = parser().parse(&only_toks);
res.unwrap() res.unwrap()
} }
@ -60,27 +60,28 @@ pub mod parser_to_events {
}) })
}}; }};
} }
macro_rules! parenthesized {
($parser:expr) => {
just(L_PAREN)
.to(vec![Event::EatToken])
.then($parser)
.then(just(R_PAREN).to(vec![Event::EatToken]))
.map(|((mut before, mut c), mut after)| {
before.insert(0, Event::StartNode(PARENTHESIZED_EXPR));
before.append(&mut c);
before.append(&mut after);
before.push(Event::FinishNode);
before
})
};
}
pub fn parser<'toks>() -> impl Parser<'toks, &'toks [SyntaxKind], Vec<Event>> { pub fn parser<'toks>() -> impl Parser<'toks, &'toks [SyntaxKind], Vec<Event>> {
let ws = one_of([WHITESPACE, NEWLINE]) let ws = one_of([WHITESPACE, NEWLINE])
.to(Event::EatToken) .to(Event::EatToken)
.repeated() .repeated()
.collect::<Vec<Event>>(); .collect::<Vec<Event>>();
// let ws_without_newlines = just(WHITESPACE) let ident = just(IDENT).to(vec![Event::EatToken]);
// .to(Event::EatToken)
// .repeated()
// .collect::<Vec<Event>>();
let parenthesized = |c| {
just(L_PAREN)
.to(vec![Event::EatToken])
.then(c)
.then(just(R_PAREN).to(vec![Event::EatToken]))
.map(|((mut before, mut c), mut after)| {
before.append(&mut c);
before.append(&mut after);
before
})
};
let expr = recursive(|expr| { let expr = recursive(|expr| {
let lit = one_of([INT_NUM, FLOAT_NUM, STRING]).to(vec![ let lit = one_of([INT_NUM, FLOAT_NUM, STRING]).to(vec![
@ -88,10 +89,39 @@ pub mod parser_to_events {
Event::EatToken, Event::EatToken,
Event::FinishNode, Event::FinishNode,
]); ]);
let attrset = just(L_CURLY)
.then(
padded!(just(IDENT).to(vec![
Event::StartNode(ATTR),
Event::StartNode(ATTR_NAME),
Event::EatToken,
Event::FinishNode
]))
.then(just(COLON))
.then(padded!(expr.clone().map(|mut exp: Vec<Event>| {
exp.insert(0, Event::StartNode(ATTR_VALUE));
exp.push(Event::FinishNode);
exp.push(Event::FinishNode);
exp
})))
.map(|((mut name, _), mut value)| {
// colon
name.push(Event::EatToken);
name.append(&mut value);
name
}),
)
.then(just(R_CURLY))
.map(|((_, mut attrs), _)| {
attrs.insert(0, Event::StartNode(ATTR_SET));
attrs.insert(0, Event::EatToken);
attrs.push(Event::EatToken);
attrs.push(Event::FinishNode);
attrs
});
let atom = lit.clone().or(parenthesized(expr)); let atom = lit.clone().or(attrset).or(parenthesized!(expr));
let ident = just(IDENT).to(vec![Event::EatToken]);
let instr_name = ident let instr_name = ident
.clone() .clone()
.map(|mut v| { .map(|mut v| {

View file

@ -1 +1,7 @@
hello world test 42 3.14 "uwu" hello world test
42
(another command 3.14 "meow")
"uwu"
{
some: attrs 42 (meow gay 1)
}