From 1ef6f0e6b9083748e5b91743f15f10f09c6b8432 Mon Sep 17 00:00:00 2001 From: Elias Haugsbakk Date: Fri, 18 Sep 2026 23:10:31 +0200 Subject: Implement parser creating AST --- .../eliashaugsbakk/kompilator/parsing/Parser.java | 79 ++++++++++++++++++++++ 1 file changed, 79 insertions(+) (limited to 'src/main/java/no/eliashaugsbakk/kompilator/parsing/Parser.java') diff --git a/src/main/java/no/eliashaugsbakk/kompilator/parsing/Parser.java b/src/main/java/no/eliashaugsbakk/kompilator/parsing/Parser.java index a41a1bf..53af71c 100644 --- a/src/main/java/no/eliashaugsbakk/kompilator/parsing/Parser.java +++ b/src/main/java/no/eliashaugsbakk/kompilator/parsing/Parser.java @@ -1,4 +1,83 @@ package no.eliashaugsbakk.kompilator.parsing; +import static no.eliashaugsbakk.kompilator.tokenization.TokenType.EOF; +import static no.eliashaugsbakk.kompilator.tokenization.TokenType.KEYWORD; +import static no.eliashaugsbakk.kompilator.tokenization.TokenType.LPAREN; +import static no.eliashaugsbakk.kompilator.tokenization.TokenType.RPAREN; +import static no.eliashaugsbakk.kompilator.tokenization.TokenType.SEMICOLON; +import static no.eliashaugsbakk.kompilator.tokenization.TokenType.STRING; + +import java.util.ArrayList; +import java.util.List; +import no.eliashaugsbakk.kompilator.parsing.node.Program; +import no.eliashaugsbakk.kompilator.parsing.node.expression.Expression; +import no.eliashaugsbakk.kompilator.parsing.node.expression.FunctionCall; +import no.eliashaugsbakk.kompilator.parsing.node.expression.StringLiteral; +import no.eliashaugsbakk.kompilator.parsing.node.statement.ExpressionStatement; +import no.eliashaugsbakk.kompilator.tokenization.Token; + public class Parser { + private final List tokens; + private int position = 0; + + public Parser(List tokens) { + this.tokens = tokens; + } + + public AST parse() throws ParserException { + Program rootNode = new Program(); + + while (position < tokens.size()) { + Token token = tokens.get(position); + + if (token.type() == KEYWORD) { + String functionName = token.value(); + position++; + + List arguments = parseArguments(); + + FunctionCall functionCall = new FunctionCall(functionName, arguments); + rootNode.addStatement(new ExpressionStatement(functionCall)); + } else if (token.type() == EOF) { + break; + } else { + IO.println("Unknown token: " + token.value() + ". Skipping..."); + position++; + } + } + + return new AST(rootNode); + } + + List parseArguments() throws ParserException { + List arguments = new ArrayList<>(); + + if (position >= tokens.size() || tokens.get(position).type() != LPAREN) { + throw new ParserException(tokens.get(position).line(), tokens.get(position).colum(), + "Unexpected token:" + tokens.get(position).value() + "\n Expected: ("); + } + position++; + + while (position < tokens.size() && tokens.get(position).type() != RPAREN) { + if (tokens.get(position).type() == STRING) { + arguments.add(new StringLiteral(tokens.get(position).value())); + } + position++; + } + + if (position >= tokens.size()) { + throw new ParserException(-1, -1, "Unexpected end of file, expected )"); + } + position++; + + if (position >= tokens.size() || tokens.get(position).type() != SEMICOLON) { + throw new ParserException(position < tokens.size() ? tokens.get(position).line() : -1, + position < tokens.size() ? tokens.get(position).colum() : -1, + "Unexpected token: " + (position < tokens.size() ? tokens.get(position).value() : "EOF") + + "\n" + "Expected: ;"); + } + position++; + + return arguments; + } } -- cgit v1.2.3