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");
     }
 }