cl-parser: Move inline modules out of line
This commit is contained in:
parent
ab17ebbadc
commit
abf00f383c
209
cl-parser/src/error.rs
Normal file
209
cl-parser/src/error.rs
Normal file
@ -0,0 +1,209 @@
|
||||
use super::*;
|
||||
|
||||
use conlang::lexer::error::{Error as LexError, Reason};
|
||||
use std::fmt::Display;
|
||||
pub type PResult<T> = Result<T, Error>;
|
||||
|
||||
/// Contains information about [Parser] errors
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
pub struct Error {
|
||||
pub reason: ErrorKind,
|
||||
pub while_parsing: Parsing,
|
||||
pub loc: Loc,
|
||||
}
|
||||
impl std::error::Error for Error {}
|
||||
|
||||
/// Represents the reason for parse failure
|
||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
||||
pub enum ErrorKind {
|
||||
Lexical(LexError),
|
||||
EndOfInput,
|
||||
UnmatchedParentheses,
|
||||
UnmatchedCurlyBraces,
|
||||
UnmatchedSquareBrackets,
|
||||
Unexpected(Type),
|
||||
Expected {
|
||||
want: Type,
|
||||
got: Type,
|
||||
},
|
||||
/// No rules matched
|
||||
Nothing,
|
||||
/// Indicates unfinished code
|
||||
Todo,
|
||||
}
|
||||
impl From<LexError> for ErrorKind {
|
||||
fn from(value: LexError) -> Self {
|
||||
match value.reason() {
|
||||
Reason::EndOfFile => Self::EndOfInput,
|
||||
_ => Self::Lexical(value),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Compactly represents the stage of parsing an [Error] originated in
|
||||
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
|
||||
pub enum Parsing {
|
||||
File,
|
||||
|
||||
Attrs,
|
||||
Meta,
|
||||
|
||||
Item,
|
||||
Visibility,
|
||||
Mutability,
|
||||
ItemKind,
|
||||
Alias,
|
||||
Const,
|
||||
Static,
|
||||
Module,
|
||||
ModuleKind,
|
||||
Function,
|
||||
Param,
|
||||
Struct,
|
||||
StructKind,
|
||||
StructMember,
|
||||
Enum,
|
||||
EnumKind,
|
||||
Variant,
|
||||
VariantKind,
|
||||
Impl,
|
||||
|
||||
Ty,
|
||||
TyKind,
|
||||
TyTuple,
|
||||
TyRef,
|
||||
TyFn,
|
||||
|
||||
Stmt,
|
||||
StmtKind,
|
||||
Let,
|
||||
|
||||
Expr,
|
||||
ExprKind,
|
||||
Assign,
|
||||
AssignKind,
|
||||
Binary,
|
||||
BinaryKind,
|
||||
Unary,
|
||||
UnaryKind,
|
||||
Index,
|
||||
Call,
|
||||
Member,
|
||||
PathExpr,
|
||||
PathPart,
|
||||
Identifier,
|
||||
Literal,
|
||||
Array,
|
||||
ArrayRep,
|
||||
AddrOf,
|
||||
Block,
|
||||
Group,
|
||||
Tuple,
|
||||
While,
|
||||
If,
|
||||
For,
|
||||
Else,
|
||||
Break,
|
||||
Return,
|
||||
Continue,
|
||||
}
|
||||
|
||||
impl Display for Error {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
let Self { reason, while_parsing, loc } = self;
|
||||
match reason {
|
||||
// TODO entries are debug-printed
|
||||
ErrorKind::Todo => write!(f, "{loc} {reason} {while_parsing:?}"),
|
||||
// lexical errors print their own higher-resolution loc info
|
||||
ErrorKind::Lexical(e) => write!(f, "{e} (while parsing {while_parsing})"),
|
||||
_ => write!(f, "{loc} {reason} while parsing {while_parsing}"),
|
||||
}
|
||||
}
|
||||
}
|
||||
impl Display for ErrorKind {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
match self {
|
||||
ErrorKind::Lexical(e) => e.fmt(f),
|
||||
ErrorKind::EndOfInput => write!(f, "End of input"),
|
||||
ErrorKind::UnmatchedParentheses => write!(f, "Unmatched parentheses"),
|
||||
ErrorKind::UnmatchedCurlyBraces => write!(f, "Unmatched curly braces"),
|
||||
ErrorKind::UnmatchedSquareBrackets => write!(f, "Unmatched square brackets"),
|
||||
ErrorKind::Unexpected(t) => write!(f, "Encountered unexpected token `{t}`"),
|
||||
ErrorKind::Expected { want: e, got: g } => {
|
||||
write!(f, "Expected {e}, but got {g}")
|
||||
}
|
||||
ErrorKind::Nothing => write!(f, "Nothing found"),
|
||||
ErrorKind::Todo => write!(f, "TODO:"),
|
||||
}
|
||||
}
|
||||
}
|
||||
impl Display for Parsing {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
match self {
|
||||
Parsing::File => "a file",
|
||||
|
||||
Parsing::Attrs => "an attribute-set",
|
||||
Parsing::Meta => "an attribute",
|
||||
|
||||
Parsing::Item => "an item",
|
||||
Parsing::Visibility => "a visibility qualifier",
|
||||
Parsing::Mutability => "a mutability qualifier",
|
||||
Parsing::ItemKind => "an item",
|
||||
Parsing::Alias => "a type alias",
|
||||
Parsing::Const => "a const item",
|
||||
Parsing::Static => "a static variable",
|
||||
Parsing::Module => "a module",
|
||||
Parsing::ModuleKind => "a module",
|
||||
Parsing::Function => "a function",
|
||||
Parsing::Param => "a function parameter",
|
||||
Parsing::Struct => "a struct",
|
||||
Parsing::StructKind => "a struct",
|
||||
Parsing::StructMember => "a struct member",
|
||||
Parsing::Enum => "an enum",
|
||||
Parsing::EnumKind => "an enum",
|
||||
Parsing::Variant => "an enum variant",
|
||||
Parsing::VariantKind => "an enum variant",
|
||||
Parsing::Impl => "an impl block",
|
||||
|
||||
Parsing::Ty => "a type",
|
||||
Parsing::TyKind => "a type",
|
||||
Parsing::TyTuple => "a tuple of types",
|
||||
Parsing::TyRef => "a reference type",
|
||||
Parsing::TyFn => "a function pointer type",
|
||||
|
||||
Parsing::Stmt => "a statement",
|
||||
Parsing::StmtKind => "a statement",
|
||||
Parsing::Let => "a local variable declaration",
|
||||
|
||||
Parsing::Expr => "an expression",
|
||||
Parsing::ExprKind => "an expression",
|
||||
Parsing::Assign => "an assignment",
|
||||
Parsing::AssignKind => "an assignment operator",
|
||||
Parsing::Binary => "a binary expression",
|
||||
Parsing::BinaryKind => "a binary operator",
|
||||
Parsing::Unary => "a unary expression",
|
||||
Parsing::UnaryKind => "a unary operator",
|
||||
Parsing::Index => "an indexing expression",
|
||||
Parsing::Call => "a call expression",
|
||||
Parsing::Member => "a member access expression",
|
||||
Parsing::PathExpr => "a path",
|
||||
Parsing::PathPart => "a path component",
|
||||
Parsing::Identifier => "an identifier",
|
||||
Parsing::Literal => "a literal",
|
||||
Parsing::Array => "an array",
|
||||
Parsing::ArrayRep => "an array of form [k;N]",
|
||||
Parsing::AddrOf => "a borrow op",
|
||||
Parsing::Block => "a block",
|
||||
Parsing::Group => "a grouped expression",
|
||||
Parsing::Tuple => "a tuple",
|
||||
Parsing::While => "a while expression",
|
||||
Parsing::If => "an if expression",
|
||||
Parsing::For => "a for expression",
|
||||
Parsing::Else => "an else block",
|
||||
Parsing::Break => "a break expression",
|
||||
Parsing::Return => "a return expression",
|
||||
Parsing::Continue => "a continue expression",
|
||||
}
|
||||
.fmt(f)
|
||||
}
|
||||
}
|
1272
cl-parser/src/lib.rs
1272
cl-parser/src/lib.rs
File diff suppressed because it is too large
Load Diff
1057
cl-parser/src/parser.rs
Normal file
1057
cl-parser/src/parser.rs
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user