@@ 382,7 382,18 @@ impl Parser {
ASTType::Binary(
Box::new(lit!(Ident, name.clone(), ident)),
BinOp::Asn,
- Box::new(ast!(ASTType::Binary(Box::new(lit!(Ident, name, ident)), BinOp::Add, Box::new(expr.clone())), expr, expr).clone())
+ Box::new(
+ ast!(
+ ASTType::Binary(
+ Box::new(lit!(Ident, name, ident)),
+ BinOp::Add,
+ Box::new(expr.clone())
+ ),
+ expr,
+ expr
+ )
+ .clone()
+ )
),
ident,
expr
@@ 392,7 403,18 @@ impl Parser {
ASTType::Binary(
Box::new(lit!(Ident, name.clone(), ident)),
BinOp::Asn,
- Box::new(ast!(ASTType::Binary(Box::new(lit!(Ident, name, ident)), BinOp::Sub, Box::new(expr.clone())), expr, expr).clone())
+ Box::new(
+ ast!(
+ ASTType::Binary(
+ Box::new(lit!(Ident, name, ident)),
+ BinOp::Sub,
+ Box::new(expr.clone())
+ ),
+ expr,
+ expr
+ )
+ .clone()
+ )
),
ident,
expr
@@ 402,7 424,18 @@ impl Parser {
ASTType::Binary(
Box::new(lit!(Ident, name.clone(), ident)),
BinOp::Asn,
- Box::new(ast!(ASTType::Binary(Box::new(lit!(Ident, name, ident)), BinOp::Mul, Box::new(expr.clone())), expr, expr).clone())
+ Box::new(
+ ast!(
+ ASTType::Binary(
+ Box::new(lit!(Ident, name, ident)),
+ BinOp::Mul,
+ Box::new(expr.clone())
+ ),
+ expr,
+ expr
+ )
+ .clone()
+ )
),
ident,
expr
@@ 412,7 445,18 @@ impl Parser {
ASTType::Binary(
Box::new(lit!(Ident, name.clone(), ident)),
BinOp::Asn,
- Box::new(ast!(ASTType::Binary(Box::new(lit!(Ident, name.clone(), ident)), BinOp::Div, Box::new(expr.clone())), expr, expr).clone())
+ Box::new(
+ ast!(
+ ASTType::Binary(
+ Box::new(lit!(Ident, name.clone(), ident)),
+ BinOp::Div,
+ Box::new(expr.clone())
+ ),
+ expr,
+ expr
+ )
+ .clone()
+ )
),
ident,
expr
@@ 422,7 466,18 @@ impl Parser {
ASTType::Binary(
Box::new(lit!(Ident, name.clone(), ident)),
BinOp::Asn,
- Box::new(ast!(ASTType::Binary(Box::new(lit!(Ident, name, ident)), BinOp::Mod, Box::new(expr.clone())), expr, expr).clone())
+ Box::new(
+ ast!(
+ ASTType::Binary(
+ Box::new(lit!(Ident, name, ident)),
+ BinOp::Mod,
+ Box::new(expr.clone())
+ ),
+ expr,
+ expr
+ )
+ .clone()
+ )
),
ident,
expr
@@ 432,7 487,18 @@ impl Parser {
ASTType::Binary(
Box::new(lit!(Ident, name.clone(), ident)),
BinOp::Asn,
- Box::new(ast!(ASTType::Binary(Box::new(lit!(Ident, name, ident)), BinOp::BitAnd, Box::new(expr.clone())), expr, expr).clone())
+ Box::new(
+ ast!(
+ ASTType::Binary(
+ Box::new(lit!(Ident, name, ident)),
+ BinOp::BitAnd,
+ Box::new(expr.clone())
+ ),
+ expr,
+ expr
+ )
+ .clone()
+ )
),
ident,
expr
@@ 442,7 508,18 @@ impl Parser {
ASTType::Binary(
Box::new(lit!(Ident, name.clone(), ident)),
BinOp::Asn,
- Box::new(ast!(ASTType::Binary(Box::new(lit!(Ident, name, ident)), BinOp::BitXor, Box::new(expr.clone())), expr, expr).clone())
+ Box::new(
+ ast!(
+ ASTType::Binary(
+ Box::new(lit!(Ident, name, ident)),
+ BinOp::BitXor,
+ Box::new(expr.clone())
+ ),
+ expr,
+ expr
+ )
+ .clone()
+ )
),
ident,
expr
@@ 452,7 529,18 @@ impl Parser {
ASTType::Binary(
Box::new(lit!(Ident, name.clone(), ident)),
BinOp::Asn,
- Box::new(ast!(ASTType::Binary(Box::new(lit!(Ident, name, ident)), BinOp::BitOr, Box::new(expr.clone())), expr, expr).clone())
+ Box::new(
+ ast!(
+ ASTType::Binary(
+ Box::new(lit!(Ident, name, ident)),
+ BinOp::BitOr,
+ Box::new(expr.clone())
+ ),
+ expr,
+ expr
+ )
+ .clone()
+ )
),
ident,
expr
@@ 460,10 548,28 @@ impl Parser {
}
}
self.current -= 1;
- return self.logical_or();
+ return self.ternary();
}
- return self.logical_or();
+ return self.ternary();
+ }
+
+ pub fn ternary(&mut self) -> Result<AST, KabelError> {
+ let condition = self.logical_or()?;
+
+ if let TokenType::Question = self.peek()?.token_type {
+ self.read_token()?;
+ let true_expr = self.expression()?;
+ if let TokenType::Colon = self.peek()?.token_type {
+ self.read_token()?;
+ let false_expr = self.expression()?;
+ return Ok(ast!(ASTType::Ternary(Box::new(condition.clone()), Box::new(true_expr), Box::new(false_expr.clone())), condition, false_expr));
+ } else {
+ return Err(unexpected_token!(self, "Expected : found {}", self.token));
+ }
+ }
+
+ Ok(condition)
}
pub fn logical_or(&mut self) -> Result<AST, KabelError> {
@@ 837,13 943,41 @@ impl Parser {
if let TokenType::Ident(name) = ident.token_type {
let oper = self.read_token()?;
if oper.token_type == TokenType::PlusPlus {
- return Ok(ast!(ASTType::Binary(Box::new(lit!(Ident, name.clone(), ident)), BinOp::Asn,
- Box::new(ast!(ASTType::Binary(Box::new(lit!(Ident, name, ident)), BinOp::Add,
- Box::new(lit!(Num, 1., oper))), oper, oper))), ident, oper))
+ return Ok(ast!(
+ ASTType::Binary(
+ Box::new(lit!(Ident, name.clone(), ident)),
+ BinOp::Asn,
+ Box::new(ast!(
+ ASTType::Binary(
+ Box::new(lit!(Ident, name, ident)),
+ BinOp::Add,
+ Box::new(lit!(Num, 1., oper))
+ ),
+ oper,
+ oper
+ ))
+ ),
+ ident,
+ oper
+ ));
} else {
- return Ok(ast!(ASTType::Binary(Box::new(lit!(Ident, name.clone(), ident)), BinOp::Asn,
- Box::new(ast!(ASTType::Binary(Box::new(lit!(Ident, name, ident)), BinOp::Sub,
- Box::new(lit!(Num, 1., oper))), oper, oper))), ident, oper))
+ return Ok(ast!(
+ ASTType::Binary(
+ Box::new(lit!(Ident, name.clone(), ident)),
+ BinOp::Asn,
+ Box::new(ast!(
+ ASTType::Binary(
+ Box::new(lit!(Ident, name, ident)),
+ BinOp::Sub,
+ Box::new(lit!(Num, 1., oper))
+ ),
+ oper,
+ oper
+ ))
+ ),
+ ident,
+ oper
+ ));
}
}
panic!("Inc/dec logic broke");
@@ 942,6 1076,7 @@ pub enum ASTType {
// expressions
Decl(Box<AST>, Box<AST>), // identifier, expression
+ Ternary(Box<AST>, Box<AST>, Box<AST>),
Subscript(Box<AST>, Box<AST>),
Binary(Box<AST>, BinOp, Box<AST>),
Unary(UnOp, Box<AST>),