93 lines
1.8 KiB
Rust
93 lines
1.8 KiB
Rust
use crate::FileId;
|
|
|
|
#[derive(Debug)]
|
|
pub struct ParsedFile {
|
|
pub file_id: FileId,
|
|
pub root: Expr,
|
|
pub nodes: Vec<Node>,
|
|
pub tokens: Vec<Token>,
|
|
pub errors: Vec<ParseError>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub struct Node {
|
|
pub range: SourceRange,
|
|
pub data: NodeData,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
pub struct SourceRange {
|
|
pub start: usize,
|
|
pub end: usize,
|
|
}
|
|
|
|
impl std::fmt::Display for SourceRange {
|
|
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
write!(formatter, "{}..{}", self.start, self.end)
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub enum NodeData {
|
|
Binding(Binding),
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub struct Binding {
|
|
pub range: SourceRange,
|
|
pub key: Ident,
|
|
pub value: Expr,
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub struct Ident {
|
|
pub name: String,
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub enum Expr {
|
|
Ident(Ident),
|
|
Select(Select),
|
|
Apply(Apply),
|
|
Let {
|
|
range: SourceRange,
|
|
bindings: Vec<Binding>,
|
|
body: Box<Expr>,
|
|
},
|
|
AttrSet(Vec<Binding>),
|
|
Lambda {
|
|
parameters: Vec<Ident>,
|
|
body: Box<Expr>,
|
|
},
|
|
Other(Vec<Expr>),
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub struct Select {
|
|
pub receiver: String,
|
|
pub attr: Ident,
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub struct Apply {
|
|
pub lambda: Box<Expr>,
|
|
pub argument: Box<Expr>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub struct Token {
|
|
pub range: SourceRange,
|
|
pub data: TokenData,
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub enum TokenData {
|
|
UnquotedUri(String),
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub struct ParseError {
|
|
pub range: SourceRange,
|
|
pub message: String,
|
|
}
|