Expr error system
This commit is contained in:
@@ -56,6 +56,16 @@ impl<'a, T, TE, TE2> IntoErr<AstResult<'a, T, TE2>> for AstResult<'a, T, TE> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub trait GetLength {
|
||||||
|
fn len(&self) -> usize;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T, E> GetLength for Result<Vec<T>, E> {
|
||||||
|
fn len(&self) -> usize {
|
||||||
|
if let Ok(v) = self { v.len() } else { 0 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn collect_recovered<'a, T: Debug, ET>(
|
pub fn collect_recovered<'a, T: Debug, ET>(
|
||||||
pairs: impl Iterator<Item = pest::iterators::Pair<'a, Rule>>,
|
pairs: impl Iterator<Item = pest::iterators::Pair<'a, Rule>>,
|
||||||
) -> AstResult<'a, Vec<T>, Vec<T>>
|
) -> AstResult<'a, Vec<T>, Vec<T>>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use crate::{
|
|||||||
Rule,
|
Rule,
|
||||||
ast::*,
|
ast::*,
|
||||||
ast_expr,
|
ast_expr,
|
||||||
error::{AstError, IntoErr, collect_recovered, collect_recovered_map},
|
error::{AstError, GetLength, IntoErr, collect_recovered, collect_recovered_map},
|
||||||
};
|
};
|
||||||
|
|
||||||
impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Expression {
|
impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Expression {
|
||||||
@@ -21,19 +21,19 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Expression {
|
|||||||
|
|
||||||
let exp = Expression::try_from(inner.next().unwrap());
|
let exp = Expression::try_from(inner.next().unwrap());
|
||||||
|
|
||||||
if inner.len() > 0 {
|
if inner.len() > 0 || prefixes.len() > 0 {
|
||||||
ast_expr!(Expression::Fix {
|
ast_expr!(Expression::Fix {
|
||||||
initial: exp.map(Box::new),
|
initial: exp.map(Box::new),
|
||||||
prefixes: prefixes,
|
prefixes: prefixes,
|
||||||
postfixes: collect_recovered(inner),
|
postfixes: collect_recovered(inner),
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
Ok(exp?)
|
exp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Rule::primary => Expression::try_from(inner.next().unwrap()),
|
Rule::primary => inner.next().unwrap().try_into(),
|
||||||
Rule::static_path => Ok(Expression::Path(Path::try_from(pair).get()?)),
|
Rule::static_path => ast_expr!(Expression::Path(pair.try_into())),
|
||||||
Rule::literal => Ok(Expression::Literal(Literal::try_from(pair).get()?)),
|
Rule::literal => ast_expr!(Expression::Literal(pair.try_into())),
|
||||||
_ => unimplemented!("{rule:#?}"),
|
_ => unimplemented!("{rule:#?}"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -62,27 +62,26 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Postfix {
|
|||||||
let rule = pair.as_rule();
|
let rule = pair.as_rule();
|
||||||
let mut inner = pair.into_inner();
|
let mut inner = pair.into_inner();
|
||||||
|
|
||||||
Ok(match rule {
|
match rule {
|
||||||
Rule::postfix => Postfix::try_from(inner.next().unwrap())?,
|
Rule::postfix => Postfix::try_from(inner.next().unwrap()),
|
||||||
|
|
||||||
Rule::field_px => {
|
Rule::field_px => {
|
||||||
Postfix::FieldAccess(Identifier::try_from(inner.next().unwrap()).get()?)
|
ast_expr!(Postfix::FieldAccess(inner.next().unwrap().try_into()))
|
||||||
}
|
}
|
||||||
|
|
||||||
Rule::call_px => Postfix::Call(collect_recovered(inner).get()?),
|
Rule::call_px => ast_expr!(Postfix::Call(collect_recovered(inner))),
|
||||||
|
|
||||||
Rule::struct_px => Postfix::StructCall(
|
Rule::struct_px => ast_expr!(Postfix::StructCall(collect_recovered_map(inner, |p| {
|
||||||
collect_recovered_map(inner, |p| {
|
|
||||||
let mut pi = p.into_inner();
|
let mut pi = p.into_inner();
|
||||||
Ok((
|
Ok((
|
||||||
Identifier::try_from(pi.next().unwrap())?,
|
Identifier::try_from(pi.next().unwrap())?,
|
||||||
Expression::try_from(pi.next().unwrap()).get()?,
|
Expression::try_from(pi.next().unwrap()).get()?,
|
||||||
))
|
))
|
||||||
})
|
}))),
|
||||||
.get()?,
|
|
||||||
),
|
|
||||||
|
|
||||||
Rule::index_px => Postfix::Index(Expression::try_from(inner.next().unwrap()).get()?),
|
Rule::index_px => {
|
||||||
|
ast_expr!(Postfix::Index(Expression::try_from(inner.next().unwrap())))
|
||||||
|
}
|
||||||
|
|
||||||
Rule::binary_px => {
|
Rule::binary_px => {
|
||||||
let op_pair = inner.next().unwrap();
|
let op_pair = inner.next().unwrap();
|
||||||
@@ -105,12 +104,13 @@ impl<'a> TryFrom<pest::iterators::Pair<'a, Rule>> for Postfix {
|
|||||||
unimplemented!("Binary operator not implemented yet: {}", op_pair.as_str())
|
unimplemented!("Binary operator not implemented yet: {}", op_pair.as_str())
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Postfix::Binary(op, Expression::try_from(inner.next().unwrap()).get()?)
|
|
||||||
|
Ok(Postfix::Binary(op, inner.next().unwrap().try_into().get()?))
|
||||||
}
|
}
|
||||||
|
|
||||||
Rule::macro_call_px => Postfix::MacroCall(inner.as_str().to_string()),
|
Rule::macro_call_px => Ok(Postfix::MacroCall(inner.as_str().to_string())),
|
||||||
|
|
||||||
_ => unimplemented!("{rule:#?}"),
|
_ => unimplemented!("{rule:#?}"),
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user