use std::fmt;
#[derive(Clone, Debug, PartialEq)]
pub enum UnaryExpression {
BitNot(Box<Expression>),
Not(Box<Expression>),
Minus(Box<Expression>),
Cast(TypeSpecifier, Box<Expression>),
}
#[derive(Clone, Debug, PartialEq)]
pub enum BinaryExpression {
Plus(Box<Expression>, Box<Expression>),
Minus(Box<Expression>, Box<Expression>),
Multiply(Box<Expression>, Box<Expression>),
Divide(Box<Expression>, Box<Expression>),
Modulo(Box<Expression>, Box<Expression>),
Equals(Box<Expression>, Box<Expression>),
NotEquals(Box<Expression>, Box<Expression>),
LogicalAnd(Box<Expression>, Box<Expression>),
LogicalOr(Box<Expression>, Box<Expression>),
BitOr(Box<Expression>, Box<Expression>),
BitAnd(Box<Expression>, Box<Expression>),
BitXor(Box<Expression>, Box<Expression>),
LeftShift(Box<Expression>, Box<Expression>),
RightShift(Box<Expression>, Box<Expression>),
LessThan(Box<Expression>, Box<Expression>),
LessThanEquals(Box<Expression>, Box<Expression>),
GreaterThan(Box<Expression>, Box<Expression>),
GreaterThanEquals(Box<Expression>, Box<Expression>),
}
#[derive(Clone, Debug, PartialEq)]
pub enum Constant {
Integer(i128),
Boolean(bool),
}
#[derive(Debug, PartialEq, Hash, PartialOrd, Ord, Eq, Clone)]
pub struct Identifier(pub String);
impl fmt::Display for Identifier {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.0)
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum TypeSpecifier {
Struct(Box<Expression>),
}
#[derive(Clone, Debug, PartialEq)]
pub enum PrimaryExpression {
Identifier(Identifier),
Constant(Constant),
Str(String),
Paren(Box<Expression>),
}
#[derive(Clone, Debug, PartialEq)]
pub enum Expression {
PrimaryExpression(PrimaryExpression),
FieldAccess(Box<Expression>, Box<Expression>),
ArrayIndex(Box<Expression>, Box<Expression>),
FunctionCall(Box<Expression>, Vec<Expression>),
BinaryExpression(BinaryExpression),
UnaryExpression(UnaryExpression),
}
#[derive(Debug, PartialEq)]
pub enum BlockStatement {
If(Expression, Vec<Statement>, Vec<Statement>),
While(Expression, Vec<Statement>),
For(Expression, Expression, Vec<Statement>),
}
#[derive(Debug, PartialEq)]
pub enum JumpStatement {
Break,
Continue,
}
impl fmt::Display for JumpStatement {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let name = match self {
JumpStatement::Break => "break",
JumpStatement::Continue => "continue",
};
write!(f, "{}", name)
}
}
#[derive(Debug, PartialEq)]
pub enum BuiltinStatement {
Help,
Quit,
Filesystem(Expression),
Print(Expression),
}
#[derive(Debug, PartialEq)]
pub enum Statement {
AssignStatement(Expression, Expression),
BlockStatement(BlockStatement),
JumpStatement(JumpStatement),
BuiltinStatement(BuiltinStatement),
ExpressionStatement(Expression),
}