81 lines
1.5 KiB
Rust
81 lines
1.5 KiB
Rust
use crate::FileId;
|
|
|
|
#[derive(Debug)]
|
|
pub struct ParsedFile {
|
|
pub file_id: FileId,
|
|
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),
|
|
LetBlock(LetBlock),
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub struct Binding {
|
|
pub key: Ident,
|
|
pub value: Expr,
|
|
pub references: Vec<Ident>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub struct LetBlock {
|
|
pub bindings: Vec<Binding>,
|
|
pub body_references: Vec<Ident>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub struct Ident {
|
|
pub name: String,
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub enum Expr {
|
|
Ident(Ident),
|
|
Select(Select),
|
|
}
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
|
pub struct Select {
|
|
pub receiver: String,
|
|
pub attr: Ident,
|
|
}
|
|
|
|
#[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,
|
|
}
|