This commit is contained in:
2025-05-28 03:41:40 +02:00
parent d8422261f6
commit 3125ee5a96
6 changed files with 161 additions and 47 deletions

77
src/parse/mod.rs Normal file
View File

@ -0,0 +1,77 @@
mod macros;
use crate::{
ast, expect_any_keyword, expect_identifier, expect_keyword, expect_token, peek_keyword,
peek_match,
token::{KeywordKind, Token, TokenKind},
};
pub struct Parser {
tokens: Vec<Token>,
current: usize,
}
impl Parser {
pub fn new(tokens: Vec<Token>) -> Parser {
Self { tokens, current: 0 }
}
pub fn statement(&mut self) -> ast::Statement {
if peek_keyword!(self, KeywordKind::function) {
return self.function_declaration();
}
return self.expression_statement();
todo!("No statement");
}
fn function_declaration(&mut self) -> ast::Statement {
expect_keyword!(self, KeywordKind::function);
let id = expect_identifier!(self);
expect_token!(self, TokenKind::LeftParen);
let mut parameters = Vec::new();
while peek_match!(self, TokenKind::Identifier(_)) {
let name = expect_identifier!(self);
expect_token!(self, TokenKind::Colon);
let typename = expect_any_keyword!(self);
let parameter = ast::ParameterDeclaration {
name: name.clone(),
typename: typename.clone(),
};
parameters.push(parameter);
}
expect_token!(self, TokenKind::RightParen);
expect_token!(self, TokenKind::LeftCurly);
let mut statements = Vec::new();
while !peek_match!(self, TokenKind::RightCurly) {
let statement = self.statement();
statements.push(statement);
}
expect_token!(self, TokenKind::RightCurly);
ast::Statement::FunctionDeclaration {
name: id.clone(),
parameters,
statements,
}
}
fn expression_statement(&mut self) -> ast::Statement {
todo!()
}
}
impl Parser {
fn peek(&self) -> &Token {
&self.tokens[self.current]
}
fn consume(&mut self) -> Token {
let token = &self.tokens[self.current];
self.current += 1;
token.clone()
}
}