Implement assignment
This commit is contained in:
parent
ff60640ff8
commit
e9db34be8b
@ -181,10 +181,14 @@ pub enum Statement {
|
|||||||
|
|
||||||
impl EvaluatorTree for Statement {
|
impl EvaluatorTree for Statement {
|
||||||
fn new(node: Node, source: &str) -> Result<Self> {
|
fn new(node: Node, source: &str) -> Result<Self> {
|
||||||
let child = node.child(0).unwrap();
|
let node = if node.kind() == "statement" {
|
||||||
|
node.child(0).unwrap()
|
||||||
|
} else {
|
||||||
|
node
|
||||||
|
};
|
||||||
|
|
||||||
match node.kind() {
|
match node.kind() {
|
||||||
"expression" => Ok(Self::Expression(Expression::new(child, source)?)),
|
"expression" => Ok(Self::Expression(Expression::new(node, source)?)),
|
||||||
_ => Err(Error::UnexpectedSyntax {
|
_ => Err(Error::UnexpectedSyntax {
|
||||||
expected: "expression",
|
expected: "expression",
|
||||||
actual: node.kind(),
|
actual: node.kind(),
|
||||||
@ -237,10 +241,10 @@ impl EvaluatorTree for Expression {
|
|||||||
|
|
||||||
fn run(&self, context: &mut VariableMap) -> Result<Value> {
|
fn run(&self, context: &mut VariableMap) -> Result<Value> {
|
||||||
match self {
|
match self {
|
||||||
Expression::Identifier(identifier) => identifier.run(context),
|
|
||||||
Expression::Value(value) => Ok(value.clone()),
|
Expression::Value(value) => Ok(value.clone()),
|
||||||
|
Expression::Identifier(identifier) => identifier.run(context),
|
||||||
Expression::ControlFlow(control_flow) => control_flow.run(context),
|
Expression::ControlFlow(control_flow) => control_flow.run(context),
|
||||||
Expression::Assignment(_) => todo!(),
|
Expression::Assignment(assignment) => assignment.run(context),
|
||||||
Expression::Math(math) => math.run(context),
|
Expression::Math(math) => math.run(context),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -253,6 +257,10 @@ impl Identifier {
|
|||||||
pub fn take_inner(self) -> String {
|
pub fn take_inner(self) -> String {
|
||||||
self.0
|
self.0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn inner(&self) -> &String {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl EvaluatorTree for Identifier {
|
impl EvaluatorTree for Identifier {
|
||||||
@ -311,25 +319,33 @@ impl EvaluatorTree for ControlFlow {
|
|||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)]
|
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)]
|
||||||
pub struct Assignment {
|
pub struct Assignment {
|
||||||
identifier: String,
|
identifier: Identifier,
|
||||||
statement: Statement,
|
statement: Statement,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Assignment {
|
impl EvaluatorTree for Assignment {
|
||||||
pub fn new(node: Node, source: &str) -> Result<Self> {
|
fn new(node: Node, source: &str) -> Result<Self> {
|
||||||
let sexp = node.to_sexp();
|
let sexp = node.to_sexp();
|
||||||
println!("{sexp}");
|
println!("{sexp}");
|
||||||
|
|
||||||
let identifier_node = node.child(0).unwrap();
|
let identifier_node = node.child(0).unwrap();
|
||||||
let statement_node = node.child(2).unwrap();
|
let statement_node = node.child(2).unwrap();
|
||||||
let identifier = source[identifier_node.byte_range()].to_string();
|
let identifier = Identifier::new(identifier_node, source)?;
|
||||||
let statement = Statement::new(statement_node, source)?;
|
let statement = Statement::new(statement_node, source)?;
|
||||||
|
|
||||||
Ok(Self {
|
Ok(Assignment {
|
||||||
identifier,
|
identifier,
|
||||||
statement,
|
statement,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn run(&self, context: &mut VariableMap) -> Result<Value> {
|
||||||
|
let value = self.statement.run(context)?;
|
||||||
|
|
||||||
|
context.set_value(self.identifier.inner(), value)?;
|
||||||
|
|
||||||
|
Ok(Value::Empty)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)]
|
#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)]
|
||||||
|
Loading…
Reference in New Issue
Block a user