AST - Program and basic statements
This commit is contained in:
parent
407fbe26b0
commit
f17cafd910
1 changed files with 36 additions and 0 deletions
36
src/ast.rs
36
src/ast.rs
|
@ -1,5 +1,22 @@
|
||||||
use crate::tokens::Token;
|
use crate::tokens::Token;
|
||||||
|
|
||||||
|
/* --------- *
|
||||||
|
* AST nodes *
|
||||||
|
* --------- */
|
||||||
|
|
||||||
|
/// The AST node for the program
|
||||||
|
#[derive(Default, Debug, Clone)]
|
||||||
|
pub struct ProgramNode(Vec<StmtNode>);
|
||||||
|
|
||||||
|
/// An AST node that represents a statement.
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub enum StmtNode {
|
||||||
|
/// An single expression
|
||||||
|
Expression(ExprNode),
|
||||||
|
/// The print statement
|
||||||
|
Print(ExprNode),
|
||||||
|
}
|
||||||
|
|
||||||
/// An AST node that represents an expression.
|
/// An AST node that represents an expression.
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub enum ExprNode {
|
pub enum ExprNode {
|
||||||
|
@ -33,6 +50,25 @@ pub trait AstDumper {
|
||||||
fn dump(&self) -> String;
|
fn dump(&self) -> String;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl AstDumper for ProgramNode {
|
||||||
|
fn dump(&self) -> String {
|
||||||
|
self.0
|
||||||
|
.iter()
|
||||||
|
.map(|node| node.dump())
|
||||||
|
.collect::<Vec<String>>()
|
||||||
|
.join(" ")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AstDumper for StmtNode {
|
||||||
|
fn dump(&self) -> String {
|
||||||
|
match self {
|
||||||
|
Self::Expression(expr) => format!("( {} )", expr.dump()),
|
||||||
|
Self::Print(expr) => format!("(print {})", expr.dump()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl AstDumper for ExprNode {
|
impl AstDumper for ExprNode {
|
||||||
fn dump(&self) -> String {
|
fn dump(&self) -> String {
|
||||||
match self {
|
match self {
|
||||||
|
|
Loading…
Reference in a new issue