forked from katzen-cafe/iowo
lang: kinda fun parsing things that can now parse attribute sets with one attribute
This commit is contained in:
parent
1711d17fa6
commit
be637846b1
2 changed files with 55 additions and 19 deletions
|
@ -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| {
|
||||||
|
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue