[DevState] Improved Parsing for AST Lib, Class, Func, Var, Call

This commit is contained in:
Sven Heidemann
2020-09-23 19:38:14 +02:00
parent 7058927970
commit fa2a42dcc8
11 changed files with 664 additions and 181 deletions

View File

@@ -1,30 +1,92 @@
from typing import List, Union
from Models.Interpreter.Datatypes import Datatypes
from Models.Token.Token import Token
from Models.Token.TokenTypes import TokenTypes
from Models.Token.TokenValueTypes import ExpressionCharacters
class ValueNode:
def __init__(self, value: Token = 'empty', datatype: Token = Token(TokenTypes.Type, Datatypes.strings.value[Datatypes.Empty.value])):
class AbstractSyntaxTree:
def __init__(self):
self.libraries: List[LibraryDefinitionNode] = []
class ASTElement:
def __init__(self):
pass
class ValueNode(ASTElement):
def __init__(self, value: str, datatype: Datatypes):
super().__init__()
self.value = value
self.type = datatype
class BinaryOperationNode:
def __init__(self, left: Token, op_token: Token, right: Token):
class BinaryOperationNode(ASTElement):
def __init__(self, left: str, op_token: str, right: str):
super().__init__()
self.left = left
self.op_token = op_token
self.right = right
self.operation_chars = [
ExpressionCharacters.chars.value[ExpressionCharacters.Plus.value],
ExpressionCharacters.chars.value[ExpressionCharacters.Minus.value],
ExpressionCharacters.chars.value[ExpressionCharacters.Asterisk.value],
ExpressionCharacters.chars.value[ExpressionCharacters.Slash.value],
ExpressionCharacters.chars.value[ExpressionCharacters.Caret.value]
ExpressionCharacters.Plus.value,
ExpressionCharacters.Minus.value,
ExpressionCharacters.Asterisk.value,
ExpressionCharacters.Slash.value,
ExpressionCharacters.Caret.value
]
def eval(self):
if self.op_token.value not in self.operation_chars:
return eval(f'{self.left.value} {self.op_token.value} {self.right.value}')
if self.op_token in self.operation_chars:
return eval(f'{self.left} {self.op_token} {self.right}')
class LibraryDefinitionNode(ASTElement):
def __init__(self, is_public: bool, name: str):
super().__init__()
self.is_public = is_public
self.name = name
self.classes: List[ClassDefinitionNode] = []
class ClassDefinitionNode(ASTElement):
def __init__(self, is_public: bool, name: str):
super().__init__()
self.is_public = is_public
self.name = name
self.variables: [VariableDefinitionNode] = []
self.functions: List[FunctionDefinitionNode] = []
class CallDefinitionNode(ASTElement):
def __init__(self, name: str):
super().__init__()
self.name = name
self.args: List[ValueNode] = []
class FunctionDefinitionNode(ASTElement):
def __init__(self, is_public: bool, name: str, return_type: Datatypes):
super().__init__()
self.is_public = is_public
self.name = name
self.args: List[VariableDefinitionNode] = []
self.return_type = return_type
self.variables: [VariableDefinitionNode] = []
self.instructions: List[ASTElement] = []
class VariableDefinitionNode(ASTElement):
def __init__(self, is_public: bool, name: str, datatype: Union[str, Datatypes], value: Union[str, CallDefinitionNode]):
super().__init__()
self.is_public = is_public
self.name = name
self.datatype = datatype
self.value = value