more work on plasma parser
This commit is contained in:
44
AST.py
Normal file
44
AST.py
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
from abc import ABC, abstractmethod
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
|
||||||
|
class NodeType(Enum):
|
||||||
|
Program = "Program"
|
||||||
|
|
||||||
|
# Statements
|
||||||
|
ExpressionStatement = "ExpressionStatement"
|
||||||
|
|
||||||
|
# Expressions
|
||||||
|
InfixExpression = "InfixExpression"
|
||||||
|
|
||||||
|
# Literals
|
||||||
|
IntegerLiteral = "IntegerLiteral"
|
||||||
|
FloatLiteral = "FloatLiteral"
|
||||||
|
|
||||||
|
class Node:
|
||||||
|
@abstractmethod
|
||||||
|
def type(self) -> NodeType:
|
||||||
|
pass
|
||||||
|
|
||||||
|
@abstractmethod
|
||||||
|
def json(self) -> dict:
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Statement(Node):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Expression(Node):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class Program(Node):
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.statements: list[Statement] = []
|
||||||
|
|
||||||
|
def type(self) -> NodeType:
|
||||||
|
return NodeType.Program
|
||||||
|
|
||||||
|
def json(self) -> dict:
|
||||||
|
return {
|
||||||
|
"type": self.type().value,
|
||||||
|
"statements": []
|
||||||
|
}
|
||||||
@@ -54,9 +54,24 @@ class Parser:
|
|||||||
self.__peek_error(tt)
|
self.__peek_error(tt)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def __current_precedence(self) -> PrecedenceType:
|
||||||
|
prec = PRECEDENCES.get(self.current_token.type)
|
||||||
|
if prec is None:
|
||||||
|
return PrecedenceType.P_LOWEST
|
||||||
|
return prec
|
||||||
|
|
||||||
|
def __peek_precedence(self) -> PrecedenceType:
|
||||||
|
prec = PRECEDENCES.get(self.peek_token.type)
|
||||||
|
if prec is None:
|
||||||
|
return PrecedenceType.P_LOWEST
|
||||||
|
return prec
|
||||||
|
|
||||||
def __peek_error(self, tt: TokenType):
|
def __peek_error(self, tt: TokenType):
|
||||||
self.errors.append(f"Expected next token to be {tt}, got {self.peek_token.type} instead.")
|
self.errors.append(f"Expected next token to be {tt}, got {self.peek_token.type} instead.")
|
||||||
|
|
||||||
def __no_prefix_parse_function_error(self, tt: TokenType):
|
def __no_prefix_parse_function_error(self, tt: TokenType):
|
||||||
self.errors.append(f"No Prefix Parse Function for {tt} found.")
|
self.errors.append(f"No Prefix Parse Function for {tt} found.")
|
||||||
# endregion
|
# endregion
|
||||||
|
|
||||||
|
def parse_program(self) -> None:
|
||||||
|
pass
|
||||||
Reference in New Issue
Block a user