Add expressions
This commit is contained in:
parent
3a5d81c8fb
commit
9cda9643a9
10 changed files with 57 additions and 9 deletions
|
@ -120,6 +120,7 @@ pub enum Literal {
|
||||||
Int(i32),
|
Int(i32),
|
||||||
Float(f32),
|
Float(f32),
|
||||||
Bool(bool),
|
Bool(bool),
|
||||||
|
Nil
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct BinaryExpr {
|
pub struct BinaryExpr {
|
||||||
|
|
|
@ -102,6 +102,7 @@ impl<'a, T: Iterator<Item = token::Token<'a>>> Parser<'a, T> {
|
||||||
TokenType::Int(i) => ExpressionNode::Literal(Literal::Int(i)),
|
TokenType::Int(i) => ExpressionNode::Literal(Literal::Int(i)),
|
||||||
TokenType::String(i) => ExpressionNode::Literal(Literal::String(i)),
|
TokenType::String(i) => ExpressionNode::Literal(Literal::String(i)),
|
||||||
TokenType::Float(f) => ExpressionNode::Literal(Literal::Float(f)),
|
TokenType::Float(f) => ExpressionNode::Literal(Literal::Float(f)),
|
||||||
|
TokenType::Nil => ExpressionNode::Literal(Literal::Nil),
|
||||||
TokenType::LeftParen => {
|
TokenType::LeftParen => {
|
||||||
let expr = self.expression()?;
|
let expr = self.expression()?;
|
||||||
let group = GroupingExpr::new(Box::new(expr));
|
let group = GroupingExpr::new(Box::new(expr));
|
||||||
|
|
|
@ -7,8 +7,19 @@ pub enum Statement {
|
||||||
Print(PrintStatement),
|
Print(PrintStatement),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
macro_rules! all_variants {
|
||||||
|
($expr:expr, $val_name:ident => $expr_arm:expr) => {
|
||||||
|
{
|
||||||
|
use match_any::match_any;
|
||||||
|
use $crate::ast::statement::statement_node::*;
|
||||||
|
match_any!($expr, Statement::Expression($val_name) | Statement::Print($val_name) => $expr_arm)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
pub(crate) use all_variants;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct ExpressionStatement(ExpressionNode);
|
pub struct ExpressionStatement(pub ExpressionNode);
|
||||||
impl ExpressionStatement {
|
impl ExpressionStatement {
|
||||||
pub fn new(expr: ExpressionNode) -> Self {
|
pub fn new(expr: ExpressionNode) -> Self {
|
||||||
Self(expr)
|
Self(expr)
|
||||||
|
@ -16,7 +27,7 @@ impl ExpressionStatement {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct PrintStatement(ExpressionNode);
|
pub struct PrintStatement(pub ExpressionNode);
|
||||||
impl PrintStatement {
|
impl PrintStatement {
|
||||||
pub fn new(expr: ExpressionNode) -> Self {
|
pub fn new(expr: ExpressionNode) -> Self {
|
||||||
Self(expr)
|
Self(expr)
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
mod expression_interpreter;
|
mod expression_interpreter;
|
||||||
|
mod statement_interpreter;
|
||||||
pub use super::{error::RuntimeError, types};
|
pub use super::{error::RuntimeError, types};
|
||||||
use super::types::Value;
|
use super::types::Value;
|
||||||
|
|
||||||
|
|
26
src/interpreter/ast_walker/statement_interpreter.rs
Normal file
26
src/interpreter/ast_walker/statement_interpreter.rs
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
use super::{RuntimeError, types::Value};
|
||||||
|
use super::Interpret;
|
||||||
|
use crate::ast::statement::statement_node;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
impl Interpret for statement_node::Statement {
|
||||||
|
fn interpret(&self) -> Result<Value, RuntimeError> {
|
||||||
|
statement_node::all_variants!(self, n => n.interpret())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
impl Interpret for statement_node::PrintStatement {
|
||||||
|
fn interpret(&self) -> Result<Value, RuntimeError> {
|
||||||
|
let res = self.0.interpret()?;
|
||||||
|
println!("{:?}", res);
|
||||||
|
Ok(res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Interpret for statement_node::ExpressionStatement {
|
||||||
|
fn interpret(&self) -> Result<Value, RuntimeError> {
|
||||||
|
self.0.interpret()
|
||||||
|
}
|
||||||
|
}
|
3
src/interpreter/environment.rs
Normal file
3
src/interpreter/environment.rs
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
struct Environment {
|
||||||
|
|
||||||
|
}
|
|
@ -1,3 +1,4 @@
|
||||||
pub mod ast_walker;
|
pub mod ast_walker;
|
||||||
pub mod types;
|
pub mod types;
|
||||||
pub mod error;
|
pub mod error;
|
||||||
|
mod environment;
|
||||||
|
|
|
@ -6,7 +6,7 @@ pub enum Value {
|
||||||
Int(i32),
|
Int(i32),
|
||||||
Float(f32),
|
Float(f32),
|
||||||
Bool(bool),
|
Bool(bool),
|
||||||
Null,
|
Nil,
|
||||||
// TODO: create a cow(not rust cow) string instead of cloning a normal string
|
// TODO: create a cow(not rust cow) string instead of cloning a normal string
|
||||||
String(String),
|
String(String),
|
||||||
}
|
}
|
||||||
|
@ -14,14 +14,15 @@ pub enum Value {
|
||||||
impl From<expression_node::Literal> for Value {
|
impl From<expression_node::Literal> for Value {
|
||||||
fn from(l: expression_node::Literal) -> Self {
|
fn from(l: expression_node::Literal) -> Self {
|
||||||
match_any::match_any!(l,
|
match_any::match_any!(l,
|
||||||
expression_node::Literal::Int(v) | expression_node::Literal::Bool(v) | expression_node::Literal::Float(v) | expression_node::Literal::String(v) => v.into()
|
expression_node::Literal::Int(v) | expression_node::Literal::Bool(v) | expression_node::Literal::Float(v) | expression_node::Literal::String(v) => v.into(),
|
||||||
|
expression_node::Literal::Nil => Self::Nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for Value {
|
impl Default for Value {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self::Null
|
Self::Nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,12 +23,11 @@ pub fn parse(tokens: Vec<Token>) -> ParseAllResult {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn exec(nodes: Vec<Statement>) -> Result<Value, RuntimeError> {
|
pub fn exec(nodes: Vec<Statement>) -> Result<Value, RuntimeError> {
|
||||||
todo!();
|
let mut last_res = Value::Nil;
|
||||||
/*
|
|
||||||
for statement in nodes {
|
for statement in nodes {
|
||||||
//statement.interpret()?;
|
last_res = statement.interpret()?;
|
||||||
}
|
}
|
||||||
*/
|
Ok(last_res)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn run(code: &str) -> Result<Value, run::Error> {
|
pub fn run(code: &str) -> Result<Value, run::Error> {
|
||||||
|
|
4
test.lox
4
test.lox
|
@ -1 +1,5 @@
|
||||||
1 == 1;
|
1 == 1;
|
||||||
|
1 == 2;
|
||||||
|
print 1;
|
||||||
|
print 2;
|
||||||
|
nil;
|
||||||
|
|
Loading…
Reference in a new issue