diff --git a/interpreter/src/lib.rs b/interpreter/src/lib.rs index b11ff47..d01df8b 100644 --- a/interpreter/src/lib.rs +++ b/interpreter/src/lib.rs @@ -169,6 +169,12 @@ impl TryFrom<&str> for Program { } } +impl From for Program { + fn from(expression: Expression) -> Self { + Program { expression } + } +} + #[cfg(test)] mod tests { use crate::context::Context; diff --git a/parser/Cargo.toml b/parser/Cargo.toml index 0c48312..e4734d4 100644 --- a/parser/Cargo.toml +++ b/parser/Cargo.toml @@ -8,9 +8,14 @@ edition = "2021" license = "MIT" categories = ["parsing"] +[features] +default = [] +serde = ["dep:serde"] + [dependencies] lalrpop-util = { version = "0.22.0", features = ["lexer"] } regex = "1.4.2" +serde = { version = "1.0.215", features = ["derive", "rc"], optional = true } thiserror = "1.0.40" [dev-dependencies] diff --git a/parser/src/ast.rs b/parser/src/ast.rs index 6eeb54f..08bfd59 100644 --- a/parser/src/ast.rs +++ b/parser/src/ast.rs @@ -1,6 +1,10 @@ use std::collections::HashSet; use std::sync::Arc; +#[cfg(feature = "serde")] +use serde::{Deserialize, Serialize}; + +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Eq, PartialEq, Clone)] pub enum RelationOp { LessThan, @@ -12,6 +16,7 @@ pub enum RelationOp { In, } +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Eq, PartialEq, Clone)] pub enum ArithmeticOp { Add, @@ -21,6 +26,7 @@ pub enum ArithmeticOp { Modulus, } +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, Eq, PartialEq, Clone)] pub enum UnaryOp { Not, @@ -29,6 +35,7 @@ pub enum UnaryOp { DoubleMinus, } +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Clone)] pub enum Expression { Arithmetic(Box, ArithmeticOp, Box), @@ -49,6 +56,7 @@ pub enum Expression { Ident(Arc), } +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Clone)] pub enum Member { Attribute(Arc), @@ -56,6 +64,7 @@ pub enum Member { Fields(Vec<(Arc, Expression)>), } +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] #[derive(Debug, PartialEq, Clone)] pub enum Atom { Int(i64),