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
57pub 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}