From 6c5ca6b78251f5626e4d7f268d9484100ea63ab4 Mon Sep 17 00:00:00 2001 From: Adam Wick Date: Wed, 16 Feb 2022 20:52:23 -0800 Subject: [PATCH] Add parser (and etc.) support for print statements. --- src/syntax.rs | 48 ++++++++++++++++++++------------------- src/syntax/ast.rs | 2 +- src/syntax/parser.lalrpop | 8 ++++--- src/syntax/tokens.rs | 4 ++++ 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/syntax.rs b/src/syntax.rs index 74c25da..0304fd4 100644 --- a/src/syntax.rs +++ b/src/syntax.rs @@ -38,33 +38,35 @@ impl FromStr for Program { #[test] fn order_of_operations() { - let muladd1 = "1 + 2 * 3"; + let muladd1 = "1 + 2 * 3;"; let testfile = 0; assert_eq!( Program::from_str(muladd1).unwrap(), Program { - statements: vec![], - result: Expression::Primitive( - Location::InFile(testfile, 2), - "+".to_string(), - vec![ - Expression::Value(Location::InFile(testfile, 0), Value::Number(None, 1)), - Expression::Primitive( - Location::InFile(testfile, 6), - "*".to_string(), - vec![ - Expression::Value( - Location::InFile(testfile, 4), - Value::Number(None, 2), - ), - Expression::Value( - Location::InFile(testfile, 8), - Value::Number(None, 3), - ), - ] - ) - ] - ) + statements: vec![Statement::Expr( + Location::InFile(testfile, 0), + Expression::Primitive( + Location::InFile(testfile, 2), + "+".to_string(), + vec![ + Expression::Value(Location::InFile(testfile, 0), Value::Number(None, 1)), + Expression::Primitive( + Location::InFile(testfile, 6), + "*".to_string(), + vec![ + Expression::Value( + Location::InFile(testfile, 4), + Value::Number(None, 2), + ), + Expression::Value( + Location::InFile(testfile, 8), + Value::Number(None, 3), + ), + ] + ) + ] + ) + ),], } ); } diff --git a/src/syntax/ast.rs b/src/syntax/ast.rs index 09f5bd5..c821d97 100644 --- a/src/syntax/ast.rs +++ b/src/syntax/ast.rs @@ -3,12 +3,12 @@ use crate::syntax::token_stream::Location; #[derive(Debug, PartialEq)] pub struct Program { pub statements: Vec, - pub result: Expression, } #[derive(Debug, PartialEq)] pub enum Statement { Binding(Location, String, Expression), + Print(Location, String), Expr(Location, Expression), } diff --git a/src/syntax/parser.lalrpop b/src/syntax/parser.lalrpop index 0c03494..2e34778 100644 --- a/src/syntax/parser.lalrpop +++ b/src/syntax/parser.lalrpop @@ -13,6 +13,8 @@ extern { "=" => Token::Equals, ";" => Token::Semi, + "print" => Token::Print, + "+" => Token::Operator('+'), "-" => Token::Operator('-'), "*" => Token::Operator('*'), @@ -24,9 +26,8 @@ extern { } pub Program: Program = { - => Program { - statements: stmts, - result + => Program { + statements: stmts } } @@ -42,6 +43,7 @@ Statements: Vec = { Statement: Statement = { "> "=" ";" => Statement::Binding(l, v.to_string(), e), + "print" "> ";" => Statement::Print(l, v.to_string()), ";" => Statement::Expr(l, e), } diff --git a/src/syntax/tokens.rs b/src/syntax/tokens.rs index 9220b85..4955a6b 100644 --- a/src/syntax/tokens.rs +++ b/src/syntax/tokens.rs @@ -11,6 +11,9 @@ pub enum Token { #[token(";")] Semi, + #[token("print")] + Print, + #[regex(r"[+\-*/]", |v| v.slice().chars().next())] Operator(char), @@ -35,6 +38,7 @@ impl fmt::Display for Token { match self { Token::Equals => write!(f, "'='"), Token::Semi => write!(f, "';'"), + Token::Print => write!(f, "'print'"), Token::Operator(c) => write!(f, "'{}'", c), Token::Number((None, v)) => write!(f, "'{}'", v), Token::Number((Some(2), v)) => write!(f, "'0b{:b}'", v),