diff --git a/.idea/sonarlint/issuestore/index.pb b/.idea/sonarlint/issuestore/index.pb index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..26eff8de636fbd6f2cd082374427f6e9e1f1b207 100644 --- a/.idea/sonarlint/issuestore/index.pb +++ b/.idea/sonarlint/issuestore/index.pb @@ -0,0 +1,10 @@ + +H +desolation-vm/src/lib.rs,d/2/d223e57cb8e5a300f8967d2aa903ba0ce9bb7fc0 +A +src/lex/consts.rs,d/6/d6ac01c8a58d9dff09212d8593829096a491440e +: + +Cargo.toml,1/b/1b290eb385892bfd4870c08a785598e98c8691b7 +@ +src/lex/token.rs,e/f/ef992bfb55ea19c324d0baced9107bb35e7403e4 \ No newline at end of file diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 9d1821fbf1f940032491334f4241672d9f81a4b2..7403f980eb1f3fe0a54ecd00ee693960a4832fa7 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -1,21 +1,29 @@ -// mod node; -// -// pub enum Program { -// VarList(Vec<Var>), -// FunList(Vec<Fun>), -// } -// -// pub struct ID { -// pub name: String, -// } -// -// pub struct Var { -// pub name: String, -// pub value: Option<Expr>, -// } -// -// pub struct Fun { -// pub name: String, -// pub params: Vec<ID>, -// pub body: Vec<Stmt>, -// } +mod node; + +pub enum Program { + VarList(Vec<Var>), + FunList(Vec<Fun>), +} + +pub struct ID { + pub name: String, +} + +pub struct Var { + pub name: String, + pub value: Option<Expr>, +} + +pub struct Expr { + +} + +pub struct Fun { + pub name: String, + pub params: Vec<ID>, + pub body: Vec<Stmt>, +} + +pub struct Stmt { + +} diff --git a/src/lex/lexer.rs b/src/lex/lexer.rs index c77cdcd24e5c4c94b711bf4a1f11fd95c5117336..be1f51e2bfbfc5346090c334100da84ffdef82bd 100644 --- a/src/lex/lexer.rs +++ b/src/lex/lexer.rs @@ -93,6 +93,12 @@ impl TokenStream { .cloned() .collect::<TokenStream>() } + + pub fn reverse(&self) -> Self { + let mut tokens = self.tokens.clone(); + tokens.reverse(); + TokenStream { tokens } + } } impl FromIterator<Token> for TokenStream { diff --git a/src/parser/mod.rs b/src/parser/mod.rs index 2f4ef427069fe50f14b1475d5becae8d2777d1ff..8c02de9c6660d28280c3e68824521d23f797ce15 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -1,12 +1,36 @@ +use thiserror::Error; +use anyhow::{bail, ensure, Result}; +use crate::ast; +use crate::ast::Program; use crate::lex::lexer::TokenStream; +use crate::lex::token::Token; + +#[derive(Debug, Error)] +enum ParseError { + #[error("Unexpected token")] + UnexpectedToken, + #[error("Unexpected end of file")] + UnexpectedEOF, +} pub struct Parser { tokens: TokenStream, + stack: Vec<Token> +} + +pub enum ParserActions { + Shift, + Reduce(usize), + Accept, } impl Parser { + pub fn new(tokens: TokenStream) -> Self { + Self { tokens, stack: vec![] } + } + // This should parse a token stream into an AST. - pub fn parse(_tokens: TokenStream) { + pub fn parse(&mut self) -> Result<Program> { todo!("Implement parser"); } }