qbe_parser/
ast.rs

1#[macro_use]
2mod macros;
3mod core;
4pub mod data;
5pub mod functions;
6pub mod linkage;
7pub mod span;
8pub mod types;
9
10use crate::ast::data::DataDef;
11use crate::ast::functions::FunctionDef;
12use crate::ast::types::TypeDef;
13use crate::lexer::TokenParser;
14use crate::parse::{Parse, impl_fromstr_via_parse};
15use crate::utils::{IterExt, delegate_enum_getters, impl_enum_display};
16use chumsky::prelude::*;
17use std::fmt::Display;
18
19pub use core::*;
20pub use span::{Location, Span};
21
22#[derive(Clone, Debug, Eq, PartialEq, Hash)]
23#[non_exhaustive]
24pub enum Item {
25    FunctionDef(FunctionDef),
26    DataDef(DataDef),
27    TypeDef(TypeDef),
28}
29delegate_enum_getters! {
30    enum Item {
31        FunctionDef,
32        DataDef,
33        TypeDef,
34    } get {
35        pub fn span(&self) -> Span;
36    }
37}
38impl Parse for Item {
39    const DESC: &'static str = "top-level item";
40    fn parser<'a>() -> impl TokenParser<'a, Self> {
41        choice((
42            FunctionDef::parser().map(Item::FunctionDef),
43            DataDef::parser().map(Item::DataDef),
44            TypeDef::parser().map(Item::TypeDef),
45        ))
46    }
47}
48impl_fromstr_via_parse!(Item);
49impl_enum_display!(
50    enum Item {
51        FunctionDef,
52        DataDef,
53        TypeDef,
54    }
55);
56
57/// A file of QBE IR, containing a series of [items](Item).
58pub struct File {
59    pub span: Span,
60    pub items: Vec<Item>,
61}
62impl Display for File {
63    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
64        write!(f, "{}", self.items.iter().format("\n\n"))
65    }
66}
67impl_fromstr_via_parse!(File);
68impl Parse for File {
69    const DESC: &'static str = "QBE IR file";
70    fn parser<'a>() -> impl TokenParser<'a, Self> {
71        Item::parser()
72            .repeated()
73            .collect()
74            .map_with(|items, extra| File {
75                span: extra.span(),
76                items,
77            })
78    }
79}