From 2988c7d6dcdc2e565daf5e986445aee45c891066 Mon Sep 17 00:00:00 2001 From: ahmedsamyh Date: Wed, 20 Nov 2024 11:08:36 +0500 Subject: [PATCH] WIP: Working on Ast Parsing. --- main.py | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/main.py b/main.py index 4706e51..10355c8 100644 --- a/main.py +++ b/main.py @@ -313,10 +313,83 @@ class Lexer: token = self.next_token() return tokens + +class AstNodeType(IntEnum): + EXPR = auto() + STMT = auto() + INT = auto() + FLOAT = auto() + IDENT = auto() + COUNT = auto() + +ast_node_type_as_str_map: {AstNodeType : str} = { + AstNodeType.EXPR : "Expr", + AstNodeType.STMT : "Stmt", + AstNodeType.INT : "Int", + AstNodeType.FLOAT : "Float", + AstNodeType.IDENT : "Identifier", +} + +assert len(ast_node_type_as_str_map) == AstNodeType.COUNT-1, "Every AstNodeType is not handled in ast_node_type_as_str_map" + +''' +NOTE: ¢ is a zero length string, meaning nothing will be substituted +Grammar: + Statement => Ident :? Ident? =? Expression* ; + Expression => Name Binop Name + Name => Value | Ident + Value => Int | Float + BinaryOperator => ArithmeticOp | ComparisionOp | LogicalOp + ComparisionOp => > | >= | < | <= | == | != + ArithmeticOp => + | - | * | / | % + LogicalOp => && | '||' + BinArithmeticOp => ^ | '|' | & +''' + +class AstNode: + def __init__(self, typ: AstNodeType): + self.typ = typ + +class StatementAstNode(AstNode): + def __init__(self): + __super__(AstNodeType.STMT) + +class ExpressionAstNode(AstNode): + def __init__(self): + __super__(AstNodeType.EXPR) + +class IntAstNode(AstNode): + def __init__(self, value: int): + __super__(AstNodeType.IDENT) + self.value = value + class Parser: def __init__(self, tokens): self.tokens = tokens + def parse(self, tokens: [Token]) -> AstNode: + stmt = self.parseStatement(tokens) + + def parseStatement(self, tokens: [Token]) -> StatementAstNode: + if len(tokens) <= 0: return None + t: Token = tokens.pop(0) + expr = self.parseExpr(tokens) + + def parseExpr(self, tokens: [Token]) -> ExpressionAstNode: + lhs = self.parseIdent(tokens) + op = self.parseBinaryOp(tokens) + rhs = self.parseIdent(tokens) + + # def parseIdent(self, tokens: [Token]) -> IdentAstNode: + # if len(tokens) <= 0: return None + # t: Token = tokens.pop(0) + + # if t.typ == TokenType.NUMBER: + # return IdentAstNode(int(t.lexeme)) + # elif t.typ == TokenType.IDENT: + # return IdentAstNode(t.lexeme) + + def main(): program: str = sys.argv.pop(0) -- 2.39.5