lang: rework ast structure

This commit is contained in:
Schrottkatze 2024-04-07 00:55:12 +02:00
parent ace69b0094
commit b6e304fa78
Signed by: schrottkatze
SSH key fingerprint: SHA256:hXb3t1vINBFCiDCmhRABHX5ocdbLiKyCdKI4HK2Rbbc
5 changed files with 209 additions and 164 deletions

View file

@ -2,35 +2,47 @@ use std::collections::{BTreeMap, HashMap};
use indexmap::IndexMap;
use super::Spanned;
use super::{Span, Spanned};
#[derive(Debug, PartialEq, Eq)]
pub struct File<'src> {
pub decls: IndexMap<Spanned<&'src str>, Spanned<Expr<'src>>>,
pub decls: IndexMap<Spanned<&'src str>, Expression<'src>>,
}
#[derive(Debug, PartialEq, Eq)]
pub struct Expression<'src> {
pub expr: Expr<'src>,
pub span: Span,
}
impl<'src> Expression<'src> {
pub fn new(expr: Expr<'src>, span: Span) -> Self {
Self { expr, span }
}
}
#[derive(Debug, PartialEq, Eq)]
pub enum Expr<'src> {
Node(
Spanned<&'src str>,
Option<Spanned<IndexMap<Spanned<&'src str>, Expr<'src>>>>,
Option<Spanned<IndexMap<Spanned<&'src str>, Expression<'src>>>>,
),
SimplePipe(Box<Expr<'src>>, Box<Expr<'src>>),
SimplePipe(Box<Expression<'src>>, Box<Expression<'src>>),
NamingPipe(
Box<Expr<'src>>,
Box<Expression<'src>>,
(Vec<Spanned<&'src str>>, Vec<Spanned<&'src str>>),
Box<Expr<'src>>,
Box<Expression<'src>>,
),
MappingPipe(Box<Expr<'src>>, Box<Expr<'src>>),
NullPipe(Box<Expr<'src>>, Box<Expr<'src>>),
MultiPipe(IndexMap<Spanned<&'src str>, Expr<'src>>),
MappingPipe(Box<Expression<'src>>, Box<Expression<'src>>),
NullPipe(Box<Expression<'src>>, Box<Expression<'src>>),
MultiPipe(IndexMap<Spanned<&'src str>, Expression<'src>>),
LetIn(
IndexMap<Spanned<&'src str>, Box<Expr<'src>>>,
Box<Expr<'src>>,
IndexMap<Spanned<&'src str>, Box<Expression<'src>>>,
Box<Expression<'src>>,
),
// $
Var(Spanned<&'src str>),
Var(&'src str),
// @
InputVar(Spanned<&'src str>),
AttrSet(Spanned<IndexMap<Spanned<&'src str>, Expr<'src>>>),
InputVar(&'src str),
AttrSet(Spanned<IndexMap<Spanned<&'src str>, Expression<'src>>>),
}

View file

@ -6,138 +6,138 @@ use chumsky::prelude::*;
use indexmap::IndexMap;
use logos::Logos;
#[test]
fn test_parse_node_with_params() {
const INPUT: &str = "meow [ hello: $foo, world: @bar]";
assert_eq!(
parse(INPUT).unwrap(),
File {
decls: IndexMap::from_iter([(
("main", (0..0).into()),
(
Expr::Node(
("meow", (0..4).into()),
Some((
IndexMap::from_iter([
(
("hello", (7..12).into()),
Expr::Var(("foo", (14..18).into()))
),
(
("world", (20..25).into()),
Expr::InputVar(("bar", (27..31).into()))
)
]),
(5..32).into()
))
),
(0..32).into()
)
)])
}
);
}
// #[test]
// fn test_parse_node_with_params() {
// const INPUT: &str = "meow [ hello: $foo, world: @bar]";
// assert_eq!(
// parse(INPUT).unwrap(),
// File {
// decls: IndexMap::from_iter([(
// ("main", (0..0).into()),
// (
// Expr::Node(
// ("meow", (0..4).into()),
// Some((
// IndexMap::from_iter([
// (
// ("hello", (7..12).into()),
// Expr::Var(("foo", (14..18).into()))
// ),
// (
// ("world", (20..25).into()),
// Expr::InputVar(("bar", (27..31).into()))
// )
// ]),
// (5..32).into()
// ))
// ),
// (0..32).into()
// )
// )])
// }
// );
// }
fn test_parse_multiple_top_level_complex() {
const INPUT: &str = r"def main = meow
| uwu
[ foo: @bar
, hello: world @| test [ more: params ] | yay
]
!| awa
@| nya
| rawr;
// fn test_parse_multiple_top_level_complex() {
// const INPUT: &str = r"def main = meow
// | uwu
// [ foo: @bar
// , hello: world @| test [ more: params ] | yay
// ]
// !| awa
// @| nya
// | rawr;
def test = meow
[ hello: $foo
, world: @bar
];
";
assert_eq!(
parse(INPUT).unwrap(),
File {
decls: IndexMap::from_iter([
(
("main", (4..8).into()),
(
Expr::SimplePipe(
Box::new(Expr::Node(("meow", (11..15).into()), None)),
Box::new(Expr::NullPipe(
Box::new(Expr::Node(
("uwu", (20..23).into()),
Some((
IndexMap::from_iter([
(
("foo", (29..32).into()),
Expr::InputVar(("bar", (34..38).into()))
),
(
("hello", (44..49).into()),
Expr::MappingPipe(
Box::new(Expr::Node(
("world", (51..56).into()),
None
)),
Box::new(Expr::SimplePipe(
Box::new(Expr::Node(
("test", (60..64).into()),
Some((
IndexMap::from_iter([(
("more", (67..71).into()),
Expr::Node(
("params", (73..79).into()),
None
)
)]),
(65..81).into()
))
)),
Box::new(Expr::Node(
("yay", (84..87).into()),
None
))
))
)
)
]),
(27..92).into()
))
)),
Box::new(Expr::MappingPipe(
Box::new(Expr::Node(("awa", (97..100).into()), None)),
Box::new(Expr::SimplePipe(
Box::new(Expr::Node(("nya", (106..109).into()), None)),
Box::new(Expr::Node(("rawr", (114..118).into()), None))
))
))
))
),
(11..118).into()
),
),
(
("test", (125..129).into()),
(
Expr::Node(
("meow", (132..136).into()),
Some((
IndexMap::from_iter([
(
("hello", (141..146).into()),
Expr::Var(("foo", (148..152).into()))
),
(
("world", (156..161).into()),
Expr::InputVar(("bar", (163..167).into()))
)
]),
(139..171).into()
))
),
(132..171).into()
)
)
])
}
);
}
// def test = meow
// [ hello: $foo
// , world: @bar
// ];
// ";
// assert_eq!(
// parse(INPUT).unwrap(),
// File {
// decls: IndexMap::from_iter([
// (
// ("main", (4..8).into()),
// (
// Expr::SimplePipe(
// Box::new(Expr::Node(("meow", (11..15).into()), None)),
// Box::new(Expr::NullPipe(
// Box::new(Expr::Node(
// ("uwu", (20..23).into()),
// Some((
// IndexMap::from_iter([
// (
// ("foo", (29..32).into()),
// Expr::InputVar(("bar", (34..38).into()))
// ),
// (
// ("hello", (44..49).into()),
// Expr::MappingPipe(
// Box::new(Expr::Node(
// ("world", (51..56).into()),
// None
// )),
// Box::new(Expr::SimplePipe(
// Box::new(Expr::Node(
// ("test", (60..64).into()),
// Some((
// IndexMap::from_iter([(
// ("more", (67..71).into()),
// Expr::Node(
// ("params", (73..79).into()),
// None
// )
// )]),
// (65..81).into()
// ))
// )),
// Box::new(Expr::Node(
// ("yay", (84..87).into()),
// None
// ))
// ))
// )
// )
// ]),
// (27..92).into()
// ))
// )),
// Box::new(Expr::MappingPipe(
// Box::new(Expr::Node(("awa", (97..100).into()), None)),
// Box::new(Expr::SimplePipe(
// Box::new(Expr::Node(("nya", (106..109).into()), None)),
// Box::new(Expr::Node(("rawr", (114..118).into()), None))
// ))
// ))
// ))
// ),
// (11..118).into()
// ),
// ),
// (
// ("test", (125..129).into()),
// (
// Expr::Node(
// ("meow", (132..136).into()),
// Some((
// IndexMap::from_iter([
// (
// ("hello", (141..146).into()),
// Expr::Var(("foo", (148..152).into()))
// ),
// (
// ("world", (156..161).into()),
// Expr::InputVar(("bar", (163..167).into()))
// )
// ]),
// (139..171).into()
// ))
// ),
// (132..171).into()
// )
// )
// ])
// }
// );
// }