#![allow(unused)] use std::str::FromStr; use crate::parser::ast::*; use crate::prelude::*; use crate::parser::lexer::{SpannedToken, Token}; use byte_unit::Byte; grammar<'input>; pub Pipeline: Pipeline = { => Pipeline::new(vec![first]), )+> => Pipeline::from_parts(first, rest), } Command: ParsedCommand = { => ParsedCommand::new(command.to_string(), vec![]), => ParsedCommand::new(command.to_string(), expr), => ParsedCommand::new(command.to_string(), vec![expr]), } Leaf: Expression = { => Expression::Leaf(Leaf::String(<>)), => Expression::Leaf(Leaf::Int(<>)), => Expression::Leaf(Leaf::Int(<>)), => Expression::VariableReference(<>), } BinaryExpression: Expression = { => Expression::Binary(Box::new(Binary::new(left, op, right))), } Parenthesized: Expression = { "(" ")" => Expression::Parenthesized(Box::new(Parenthesized::new(<>))), "(" ")" => Expression::Parenthesized(Box::new(Parenthesized::new(<>))), } AtomicExpression: Expression = { , , } Block: Expression = { "{" "}" => Expression::Block(Box::new(Block::new(<>))), "{" "}" => Expression::Block(Box::new(Block::new(<>))), } WholeExpression: Expression = { , , } PathHead: Expression = { , => Expression::Leaf(Leaf::Bare(<>)), => Expression::Flag(<>), } PathExpression: Expression = { )+> => Expression::Path(Box::new(Path::new(head, tail))) } Expr: Expression = { , } Variable: Variable = { "$" <"variable"> => Variable::from_str(<>.as_slice()).unwrap(), } Member: String = { <"member"> => <>.to_string(), } Operator: Operator = { "==" => Operator::Equal, "!=" => Operator::NotEqual, "<" => Operator::LessThan, ">" => Operator::GreaterThan, "<=" => Operator::LessThanOrEqual, ">=" => Operator::GreaterThanOrEqual } Flag: Flag = { "-" => Flag::Shorthand(<>.to_string()), "--" => Flag::Longhand(<>.to_string()), } String: String = { <"sqstring"> => <>.as_slice()[1..(<>.as_slice().len() - 1)].to_string(), <"dqstring"> => <>.as_slice()[1..(<>.as_slice().len() - 1)].to_string() } BarePath: BarePath = { )*> => BarePath::from_tokens(head, tail) } Int: i64 = { <"num"> => i64::from_str(<>.as_slice()).unwrap() } UnitsNum: i64 = { <"unitsnum"> => Byte::from_string(<>.as_slice()).unwrap().get_bytes() as i64 } extern { type Location = usize; type Error = ShellError; enum SpannedToken<'input> { "|" => SpannedToken { token: Token::Pipe, .. }, "(" => SpannedToken { token: Token::OpenParen, .. }, ")" => SpannedToken { token: Token::CloseParen, .. }, "{" => SpannedToken { token: Token::OpenBrace, .. }, "}" => SpannedToken { token: Token::CloseBrace, .. }, "==" => SpannedToken { token: Token::OpEq, .. }, "!=" => SpannedToken { token: Token::OpNeq, .. }, "<" => SpannedToken { token: Token::OpLt, .. }, "<=" => SpannedToken { token: Token::OpLte, .. }, ">" => SpannedToken { token: Token::OpGt, .. }, ">=" => SpannedToken { token: Token::OpGte, .. }, "-" => SpannedToken { token: Token::Dash, .. }, "--" => SpannedToken { token: Token::DashDash, .. }, "$" => SpannedToken { token: Token::Dollar, .. }, "???." => SpannedToken { token: Token::PathDot, .. }, "num" => SpannedToken { token: Token::Num, .. }, "member" => SpannedToken { token: Token::Member, .. }, "variable" => SpannedToken { token: Token::Variable, .. }, "bare" => SpannedToken { token: Token::Bare, .. }, "dqstring" => SpannedToken { token: Token::DQString, .. }, "sqstring" => SpannedToken { token: Token::SQString, .. }, "unitsnum" => SpannedToken { token: Token::UnitsNum, .. }, } }