[DevState] Improved Parsing for AST Lib, Class, Func, Var, Call
This commit is contained in:
		| @@ -1,9 +1,12 @@ | ||||
| from typing import Optional | ||||
|  | ||||
| from Interpreter.Validator import Validator | ||||
| from Interpreter.Lexer import Lexer | ||||
| # from Interpreter.Parser_Old import Parser | ||||
| from Interpreter.Parser import Parser | ||||
| from Interpreter.Repo import Repo | ||||
| from Interpreter.Utils import Utils | ||||
| from Models.AbstractSyntaxTree.AbstractSyntaxTree import AbstractSyntaxTree | ||||
|  | ||||
|  | ||||
| class Interpreter: | ||||
| @@ -22,12 +25,34 @@ class Interpreter: | ||||
|         :return: | ||||
|         """ | ||||
|         tokens = [] | ||||
|         ast: Optional[AbstractSyntaxTree] = None | ||||
|  | ||||
|         if self.__repo.is_error is None: | ||||
|             tokens = self.__lexer.tokenize(line_str) | ||||
|  | ||||
|         if self.__repo.is_error is None: | ||||
|             self.__parser.parse(tokens) | ||||
|             ast = self.__parser.parse(tokens) | ||||
|  | ||||
|         """ print('#####\n') | ||||
|             if ast is not None: | ||||
|             for lib in ast.libraries: | ||||
|                 print('lib', lib.name) | ||||
|                 for cl in lib.classes: | ||||
|                     print('class', cl.name) | ||||
|                     for var in cl.variables: | ||||
|                         print('cl var', var.name) | ||||
|  | ||||
|                     for func in cl.functions: | ||||
|                         print('func', func.name) | ||||
|                         for arg in func.args: | ||||
|                             print('func arg', arg.name) | ||||
|  | ||||
|                         for var in func.variables: | ||||
|                             print('func var', var.name) | ||||
|  | ||||
|                         for ins in func.instructions: | ||||
|                             print('ins', ins) | ||||
|         """ | ||||
|  | ||||
|         # if self.__repo.is_error is None: | ||||
|             # self.__validator.validate(self.__repo.AST) | ||||
|         # self.__validator.validate(self.__repo.AST) | ||||
|   | ||||
| @@ -89,6 +89,10 @@ class Lexer: | ||||
|                 # end of number | ||||
|                 elif not c.isdigit() and c != '.' and is_number: | ||||
|                     self.__add_tok(tokens, word, UnresolvedTokenTypes.Number) | ||||
|                     local_tokens = self.tokenize(c) | ||||
|                     for local_token in local_tokens: | ||||
|                         tokens.append(local_token) | ||||
|  | ||||
|                     word = '' | ||||
|                     is_number = False | ||||
|  | ||||
|   | ||||
| @@ -1,8 +1,14 @@ | ||||
| from typing import List, Optional | ||||
| from typing import List, Optional, Union | ||||
|  | ||||
| from Interpreter.Repo import Repo | ||||
| from Interpreter.Utils import Utils | ||||
| from Models.AbstractSyntaxTree.AbstractSyntaxTree import LibraryDefinitionNode, ClassDefinitionNode, AbstractSyntaxTree, \ | ||||
|     FunctionDefinitionNode, VariableDefinitionNode, CallDefinitionNode, ValueNode, ASTElement | ||||
| from Models.Interpreter.Datatypes import Datatypes | ||||
| from Models.Interpreter.Error import Error, ErrorCodes | ||||
| from Models.Token.Token import Token | ||||
| from Models.Token.TokenTypes import TokenTypes | ||||
| from Models.Token.TokenValueTypes import Keywords, FormatCharacters, ExpressionCharacters | ||||
|  | ||||
|  | ||||
| class Parser: | ||||
| @@ -11,16 +17,399 @@ class Parser: | ||||
|         self.__repo = repo | ||||
|         self.__utils = utils | ||||
|  | ||||
|         self.__next_is_public = False | ||||
|  | ||||
|         self.__ast: AbstractSyntaxTree = AbstractSyntaxTree() | ||||
|         self.__saved_tokens: List[Token] = [] | ||||
|         self.__expected_tokens: List[Token] = [] | ||||
|  | ||||
|         self.__ast: Optional[None] = None | ||||
|         # for validation if type is created | ||||
|         self.__is_saving_type = False | ||||
|         self.__is_saving_value = False | ||||
|         self.__is_saving_call = False | ||||
|         self.__is_end = False | ||||
|  | ||||
|         self.__saved_ast_elements: List[ASTElement] = [] | ||||
|  | ||||
|     def parse(self, tokens: List[Token]) -> AbstractSyntaxTree: | ||||
|         self.__is_end = False | ||||
|  | ||||
|     def parse(self, tokens: List[Token]) -> None: | ||||
|         if len(tokens) > 0: | ||||
|             toks = [] | ||||
|             for tok in tokens: | ||||
|                 toks.append({tok.type.name, tok.value}) | ||||
|  | ||||
|             print(toks) | ||||
|             print(self.__repo.line_number, toks) | ||||
|  | ||||
|         for i in range(0, len(tokens)): | ||||
|             token = tokens[i] | ||||
|  | ||||
|             self.__check_for_expected_tokens(token) | ||||
|  | ||||
|             # keywords | ||||
|             if token.type == TokenTypes.Keyword: | ||||
|                 if token.value == Keywords.Public.value: | ||||
|                     self.__saved_tokens.append(token) | ||||
|                     print('save public') | ||||
|                     self.__add_expected_token(TokenTypes.Keyword, Keywords.Library.value) | ||||
|                     self.__add_expected_token(TokenTypes.Keyword, Keywords.Class.value) | ||||
|                     self.__add_expected_token(TokenTypes.Keyword, Keywords.Function.value) | ||||
|                     self.__add_expected_token(TokenTypes.Keyword, Keywords.Variable.value) | ||||
|  | ||||
|                 elif token.value == Keywords.Library.value: | ||||
|                     self.__saved_tokens.append(token) | ||||
|                     print('save lib') | ||||
|                     self.__add_expected_token(TokenTypes.Name) | ||||
|  | ||||
|                 elif token.value == Keywords.Class.value: | ||||
|                     self.__saved_tokens.append(token) | ||||
|                     print('save class') | ||||
|                     self.__add_expected_token(TokenTypes.Name) | ||||
|  | ||||
|                 elif token.value == Keywords.Function.value: | ||||
|                     self.__saved_tokens.append(token) | ||||
|                     print('save function') | ||||
|                     self.__add_expected_token(TokenTypes.Name) | ||||
|  | ||||
|                 elif token.value == Keywords.Variable.value: | ||||
|                     self.__saved_tokens.append(token) | ||||
|                     print('save var') | ||||
|                     self.__add_expected_token(TokenTypes.Name) | ||||
|  | ||||
|             # names | ||||
|             elif token.type == TokenTypes.Name: | ||||
|                 if self.__is_saving_variable() and self.__is_saving_value: | ||||
|                     self.__save_name(token) | ||||
|                     if self.__is_saving_variable(): | ||||
|                         self.__is_saving_call = True | ||||
|  | ||||
|                 # names could be variable types, validation check in evaluator | ||||
|                 elif self.__is_saving_variable() and self.__is_saving_type: | ||||
|                     self.__save_type(token) | ||||
|                     self.__add_expected_token(TokenTypes.Format_Character, FormatCharacters.Left_Parenthesis.value) | ||||
|  | ||||
|                 elif self.__is_saving_variable(): | ||||
|                     self.__save_name(token) | ||||
|                     self.__add_expected_token(TokenTypes.Format_Character, FormatCharacters.Colon.value) | ||||
|  | ||||
|                 elif self.__is_saving_function(): | ||||
|                     self.__save_name(token) | ||||
|                     self.__add_expected_token(TokenTypes.Format_Character, FormatCharacters.Left_Parenthesis.value) | ||||
|  | ||||
|                 elif self.__is_saving_library() or self.__is_saving_class(): | ||||
|                     self.__save_name(token) | ||||
|                     self.__add_expected_token(TokenTypes.Format_Character, FormatCharacters.Left_Brace.value) | ||||
|  | ||||
|             # format chars | ||||
|             elif token.type == TokenTypes.Format_Character: | ||||
|                 if token.value == FormatCharacters.Left_Brace.value: | ||||
|                     if self.__is_saving_library(): | ||||
|                         self.__save_library() | ||||
|  | ||||
|                     elif self.__is_saving_class(): | ||||
|                         self.__save_class() | ||||
|  | ||||
|                 elif token.value == FormatCharacters.Colon.value: | ||||
|                     if self.__is_saving_variable(): | ||||
|                         self.__is_saving_type = True | ||||
|                         self.__add_expected_token(TokenTypes.Type) | ||||
|                         self.__add_expected_token(TokenTypes.Name) | ||||
|  | ||||
|                 elif token.value == FormatCharacters.Semicolon.value: | ||||
|                     self.__end_line() | ||||
|  | ||||
|                 elif token.value == FormatCharacters.Left_Parenthesis.value: | ||||
|                     self.__add_expected_token(TokenTypes.Name) | ||||
|                     self.__add_expected_token(TokenTypes.Format_Character, FormatCharacters.Right_Parenthesis.value) | ||||
|                     self.__add_expected_token(TokenTypes.Keyword, Keywords.This.value) | ||||
|                     self.__add_expected_token(TokenTypes.Name) | ||||
|                     self.__add_expected_token(TokenTypes.Empty) | ||||
|                     self.__add_expected_token(TokenTypes.Number) | ||||
|                     self.__add_expected_token(TokenTypes.String) | ||||
|                     self.__add_expected_token(TokenTypes.Bool) | ||||
|  | ||||
|                     if self.__is_saving_call: | ||||
|                         self.__saved_tokens.append(token) | ||||
|  | ||||
|                 elif token.value == FormatCharacters.Right_Parenthesis.value: | ||||
|                     self.__add_expected_token(TokenTypes.Format_Character, FormatCharacters.Semicolon.value) | ||||
|                     self.__add_expected_token(TokenTypes.Format_Character, FormatCharacters.Colon.value) | ||||
|  | ||||
|                     if self.__is_saving_call: | ||||
|                         self.__saved_tokens.append(token) | ||||
|                         self.__save_call() | ||||
|                         self.__is_saving_call = False | ||||
|  | ||||
|             # expr chars | ||||
|             elif token.type == TokenTypes.Expression_Character: | ||||
|                 if token.value == ExpressionCharacters.Equal.value: | ||||
|                     self.__is_saving_value = True | ||||
|                     self.__add_expected_token(TokenTypes.Bool) | ||||
|                     self.__add_expected_token(TokenTypes.Number) | ||||
|                     self.__add_expected_token(TokenTypes.String) | ||||
|                     self.__add_expected_token(TokenTypes.Empty) | ||||
|                     self.__add_expected_token(TokenTypes.Name) | ||||
|                     self.__add_expected_token(TokenTypes.Keyword, Keywords.This.value) | ||||
|                     self.__add_expected_token(TokenTypes.Keyword, Keywords.Input.value) | ||||
|                     self.__add_expected_token(TokenTypes.Keyword, Keywords.Range.value) | ||||
|                     self.__add_expected_token(TokenTypes.Keyword, Keywords.Length.value) | ||||
|                     self.__add_expected_token(TokenTypes.Format_Character, FormatCharacters.Left_Parenthesis.value) | ||||
|                     self.__add_expected_token(TokenTypes.Type, Datatypes.Empty.value) | ||||
|  | ||||
|             # types | ||||
|             elif token.type == TokenTypes.Type: | ||||
|                 if self.__is_saving_variable() and self.__is_saving_value: | ||||
|                     self.__save_value(token) | ||||
|  | ||||
|                 elif self.__is_saving_variable(): | ||||
|                     self.__save_type(token) | ||||
|  | ||||
|             # values | ||||
|             elif token.type == TokenTypes.Bool or token.type == TokenTypes.Number or token.type == TokenTypes.String: | ||||
|                 if self.__is_saving_call: | ||||
|                     self.__saved_tokens.append(token) | ||||
|  | ||||
|                 elif self.__is_saving_value: | ||||
|                     self.__save_value(token) | ||||
|  | ||||
|         return self.__ast | ||||
|  | ||||
|     """ | ||||
|         Utils | ||||
|     """ | ||||
|  | ||||
|     def __save_name(self, token: Token): | ||||
|         self.__saved_tokens.append(token) | ||||
|         print('save name') | ||||
|  | ||||
|     def __add_expected_token(self, token_type: TokenTypes, value: str = ''): | ||||
|         self.__expected_tokens.append(Token(token_type, value)) | ||||
|  | ||||
|     def __check_for_expected_tokens(self, token: Token): | ||||
|         error_token: Optional[Token] = None | ||||
|         is_error = True | ||||
|  | ||||
|         for expected_token in self.__expected_tokens: | ||||
|             if self.__is_end or token.type != expected_token.type or expected_token.value != '' and token.value != expected_token.value: | ||||
|                 error_token = token | ||||
|             else: | ||||
|                 is_error = False | ||||
|  | ||||
|         if error_token is not None and is_error: | ||||
|             self.__utils.error(Error(ErrorCodes.Unexpected, f'{error_token.type.name} {error_token.value}')) | ||||
|  | ||||
|         self.__expected_tokens = [] | ||||
|  | ||||
|     def __end_line(self): | ||||
|         if self.__is_saving_variable(): | ||||
|             self.__save_variable() | ||||
|  | ||||
|         self.__is_end = True | ||||
|         self.__expected_tokens = [] | ||||
|         self.__is_saving_type = False | ||||
|         self.__is_saving_value = False | ||||
|  | ||||
|     """ | ||||
|         Library | ||||
|     """ | ||||
|  | ||||
|     def __is_saving_library(self) -> bool: | ||||
|         found = False | ||||
|         for token in self.__saved_tokens: | ||||
|             if token.type == TokenTypes.Keyword and token.value == Keywords.Library.value: | ||||
|                 found = True | ||||
|  | ||||
|         return found | ||||
|  | ||||
|     def __save_library(self) -> None: | ||||
|         is_public = False | ||||
|         name_token: Optional[Token] = None | ||||
|  | ||||
|         for token in self.__saved_tokens: | ||||
|             if token.type == TokenTypes.Name: | ||||
|                 name_token = token | ||||
|             elif token.type == TokenTypes.Keyword and token.value == Keywords.Public.value: | ||||
|                 is_public = True | ||||
|  | ||||
|         if name_token is not None: | ||||
|             self.__ast.libraries.append(LibraryDefinitionNode(is_public, name_token.value)) | ||||
|             self.__saved_tokens = [] | ||||
|             self.__add_expected_token(TokenTypes.Keyword, Keywords.Public.value) | ||||
|             self.__add_expected_token(TokenTypes.Keyword, Keywords.Class.value) | ||||
|             print('saved library') | ||||
|  | ||||
|     """ | ||||
|         Class | ||||
|     """ | ||||
|  | ||||
|     def __is_saving_class(self) -> bool: | ||||
|         found = False | ||||
|         for token in self.__saved_tokens: | ||||
|             if token.type == TokenTypes.Keyword and token.value == Keywords.Class.value: | ||||
|                 found = True | ||||
|  | ||||
|         return found | ||||
|  | ||||
|     def __save_class(self) -> None: | ||||
|         is_public = False | ||||
|         name_token: Optional[Token] = None | ||||
|  | ||||
|         for token in self.__saved_tokens: | ||||
|             if token.type == TokenTypes.Name: | ||||
|                 name_token = token | ||||
|             elif token.type == TokenTypes.Keyword and token.value == Keywords.Public.value: | ||||
|                 is_public = True | ||||
|  | ||||
|         if name_token is not None: | ||||
|             self.__ast.libraries[len(self.__ast.libraries) - 1].classes.append(ClassDefinitionNode(is_public, name_token.value)) | ||||
|             self.__saved_tokens = [] | ||||
|             self.__add_expected_token(TokenTypes.Keyword, Keywords.Public.value) | ||||
|             self.__add_expected_token(TokenTypes.Keyword, Keywords.Variable.value) | ||||
|             self.__add_expected_token(TokenTypes.Keyword, Keywords.Function.value) | ||||
|             print('saved class') | ||||
|  | ||||
|     """ | ||||
|         Call | ||||
|     """ | ||||
|     def __save_call(self) -> None: | ||||
|         name_token: Optional[Token] = None | ||||
|         args: List[ValueNode] = [] | ||||
|         remove_tokens = [] | ||||
|         is_call = False | ||||
|  | ||||
|         for i in range(0, len(self.__saved_tokens)): | ||||
|             token = self.__saved_tokens[i] | ||||
|             last_token: Optional[Token] = None | ||||
|             if i-1 > 0: | ||||
|                 last_token = self.__saved_tokens[i-1] | ||||
|  | ||||
|             if token.type == TokenTypes.Name and last_token is not None and last_token.type == TokenTypes.Format_Character and last_token.value == FormatCharacters.Left_Parenthesis.value: | ||||
|                 pass | ||||
|  | ||||
|             if token.type == TokenTypes.Format_Character and token.value == FormatCharacters.Left_Parenthesis.value and last_token is not None and last_token.type == TokenTypes.Name: | ||||
|                 name_token = last_token | ||||
|                 remove_tokens.append(last_token) | ||||
|                 remove_tokens.append(token) | ||||
|                 is_call = True | ||||
|             elif is_call and token.type == TokenTypes.Format_Character and token.value == FormatCharacters.Right_Parenthesis.value: | ||||
|                 remove_tokens.append(token) | ||||
|             elif is_call and token.type == TokenTypes.Bool or token.type == TokenTypes.Number or token.type == TokenTypes.String: | ||||
|                 args.append(ValueNode(token.value, Datatypes[token.type.name])) | ||||
|                 remove_tokens.append(token) | ||||
|  | ||||
|         if name_token is not None: | ||||
|             call = CallDefinitionNode(name_token.value) | ||||
|             call.args = args | ||||
|             self.__saved_ast_elements.append(call) | ||||
|  | ||||
|             for token in remove_tokens: | ||||
|                 self.__saved_tokens.remove(token) | ||||
|  | ||||
|             self.__add_expected_token(TokenTypes.Format_Character, FormatCharacters.Semicolon.value) | ||||
|             print('saved call') | ||||
|  | ||||
|     """ | ||||
|         Function | ||||
|     """ | ||||
|  | ||||
|     def __is_saving_function(self) -> bool: | ||||
|         found = False | ||||
|         for token in self.__saved_tokens: | ||||
|             if token.type == TokenTypes.Keyword and token.value == Keywords.Function.value: | ||||
|                 found = True | ||||
|  | ||||
|         return found | ||||
|  | ||||
|     def __save_function(self) -> None: | ||||
|         is_public = False | ||||
|         name_token: Optional[Token] = None | ||||
|         return_type: Optional[Token] = None | ||||
|  | ||||
|         for token in self.__saved_tokens: | ||||
|             if token.type == TokenTypes.Name: | ||||
|                 name_token = token | ||||
|             elif token.type == TokenTypes.Keyword and token.value == Keywords.Public.value: | ||||
|                 is_public = True | ||||
|             elif token.type == TokenTypes.Type: | ||||
|                 return_type = token | ||||
|  | ||||
|         if name_token is not None and return_type is not None: | ||||
|             self.__ast.libraries[len(self.__ast.libraries) - 1].classes[len(self.__ast.libraries) - 1].functions.append( | ||||
|                 FunctionDefinitionNode(is_public, name_token.value, Datatypes[return_type.value])) | ||||
|             self.__saved_tokens = [] | ||||
|             print('saved function') | ||||
|  | ||||
|     """ | ||||
|         Variable | ||||
|     """ | ||||
|  | ||||
|     def __is_saving_variable(self) -> bool: | ||||
|         found = False | ||||
|         for token in self.__saved_tokens: | ||||
|             if token.type == TokenTypes.Keyword and token.value == Keywords.Variable.value: | ||||
|                 found = True | ||||
|  | ||||
|         return found | ||||
|  | ||||
|     def __save_type(self, token: Token) -> None: | ||||
|         self.__saved_tokens.append(token) | ||||
|         self.__add_expected_token(TokenTypes.Format_Character, FormatCharacters.Semicolon.value) | ||||
|         self.__add_expected_token(TokenTypes.Expression_Character, ExpressionCharacters.Equal.value) | ||||
|         self.__is_saving_type = False | ||||
|         print('save type') | ||||
|  | ||||
|     def __save_variable(self): | ||||
|         is_public = False | ||||
|         name_token: Optional[Token] = None | ||||
|         datatype: Optional[Token] = None | ||||
|         value: Optional[Union[str, Token, CallDefinitionNode]] = None | ||||
|  | ||||
|         reset_saved_ast = False | ||||
|  | ||||
|         for token in self.__saved_tokens: | ||||
|             if token.type == TokenTypes.Name and name_token is None: | ||||
|                 name_token = token | ||||
|             elif token.type == TokenTypes.Keyword and token.value == Keywords.Public.value: | ||||
|                 is_public = True | ||||
|             elif token.type == TokenTypes.Type or name_token is not None and token.type == TokenTypes.Name: | ||||
|                 datatype = token | ||||
|  | ||||
|             value = Token(TokenTypes.Empty, TokenTypes.Empty.value) | ||||
|  | ||||
|         for saved_ast_element in self.__saved_ast_elements: | ||||
|             if isinstance(saved_ast_element, CallDefinitionNode): | ||||
|                 value = saved_ast_element | ||||
|                 reset_saved_ast = True | ||||
|  | ||||
|         if reset_saved_ast: | ||||
|             self.__saved_ast_elements = [] | ||||
|  | ||||
|         if name_token is not None and datatype is not None and value is not None: | ||||
|             if not isinstance(value, CallDefinitionNode): | ||||
|                 value = value.value | ||||
|  | ||||
|             if datatype.type == TokenTypes.Name: | ||||
|                 variable = VariableDefinitionNode(is_public, name_token.value, datatype.value, value) | ||||
|             else: | ||||
|                 variable = VariableDefinitionNode(is_public, name_token.value, Datatypes[str(datatype.value).capitalize()], value) | ||||
|  | ||||
|             if len(self.__ast.libraries) > 0: | ||||
|                 lib = self.__ast.libraries[len(self.__ast.libraries) - 1] | ||||
|                 if len(lib.classes) > 0: | ||||
|                     cl = lib.classes[len(lib.classes) - 1] | ||||
|                     if len(cl.functions) == 0: | ||||
|                         cl.variables.append(variable) | ||||
|                     else: | ||||
|                         cl.functions[len(cl.functions) - 1].variables.append(variable) | ||||
|  | ||||
|                     self.__saved_tokens = [] | ||||
|                     print('saved variable') | ||||
|  | ||||
|     """ | ||||
|         Value | ||||
|     """ | ||||
|  | ||||
|     def __save_value(self, token: Token): | ||||
|         self.__saved_tokens.append(token) | ||||
|         self.__add_expected_token(TokenTypes.Format_Character, FormatCharacters.Left_Parenthesis.value) | ||||
|         self.__add_expected_token(TokenTypes.Format_Character, FormatCharacters.Semicolon.value) | ||||
|         self.__is_saving_value = False | ||||
|         print('save value') | ||||
|   | ||||
| @@ -11,62 +11,63 @@ class Repo: | ||||
|         # interpreter | ||||
|         self.keywords = [ | ||||
|             # define keywords | ||||
|             Keywords.Library, | ||||
|             Keywords.Class, | ||||
|             Keywords.Function, | ||||
|             Keywords.Variable, | ||||
|             Keywords.Use, | ||||
|             Keywords.From, | ||||
|             Keywords.Library.value, | ||||
|             Keywords.Class.value, | ||||
|             Keywords.Function.value, | ||||
|             Keywords.Variable.value, | ||||
|             Keywords.Use.value, | ||||
|             Keywords.From.value, | ||||
|             # builtin functions | ||||
|             Keywords.Output, | ||||
|             Keywords.Input, | ||||
|             Keywords.Length, | ||||
|             Keywords.Range, | ||||
|             Keywords.Exit, | ||||
|             Keywords.Output.value, | ||||
|             Keywords.Input.value, | ||||
|             Keywords.Length.value, | ||||
|             Keywords.Range.value, | ||||
|             Keywords.Exit.value, | ||||
|             # normal keywords | ||||
|             Keywords.If, | ||||
|             Keywords.ElseIf, | ||||
|             Keywords.Else, | ||||
|             Keywords.Continue, | ||||
|             Keywords.If, | ||||
|             Keywords.Return, | ||||
|             Keywords.If.value, | ||||
|             Keywords.ElseIf.value, | ||||
|             Keywords.Else.value, | ||||
|             Keywords.Continue.value, | ||||
|             Keywords.If.value, | ||||
|             Keywords.Return.value, | ||||
|             # loops | ||||
|             Keywords.While, | ||||
|             Keywords.For, | ||||
|             Keywords.While.value, | ||||
|             Keywords.For.value, | ||||
|             # access | ||||
|             Keywords.Public | ||||
|             Keywords.Public.value, | ||||
|             Keywords.This.value | ||||
|         ] | ||||
|         self.datatypes = [ | ||||
|             Datatypes.strings.value[Datatypes.Empty.value], | ||||
|             Datatypes.strings.value[Datatypes.Any.value], | ||||
|             Datatypes.strings.value[Datatypes.Number.value], | ||||
|             Datatypes.strings.value[Datatypes.String.value], | ||||
|             Datatypes.strings.value[Datatypes.Bool.value], | ||||
|             Datatypes.strings.value[Datatypes.List.value], | ||||
|             Datatypes.strings.value[Datatypes.Dict.value] | ||||
|             Datatypes.Empty.value, | ||||
|             Datatypes.Any.value, | ||||
|             Datatypes.Number.value, | ||||
|             Datatypes.String.value, | ||||
|             Datatypes.Bool.value, | ||||
|             Datatypes.List.value, | ||||
|             Datatypes.Dict.value | ||||
|         ] | ||||
|         self.format_chars = [ | ||||
|             FormatCharacters.chars.value[FormatCharacters.Left_Brace.value], | ||||
|             FormatCharacters.chars.value[FormatCharacters.Right_Brace.value], | ||||
|             FormatCharacters.chars.value[FormatCharacters.Left_Parenthesis.value], | ||||
|             FormatCharacters.chars.value[FormatCharacters.Right_Parenthesis.value], | ||||
|             FormatCharacters.chars.value[FormatCharacters.Left_Bracket.value], | ||||
|             FormatCharacters.chars.value[FormatCharacters.Right_Bracket.value], | ||||
|             FormatCharacters.chars.value[FormatCharacters.Semicolon.value], | ||||
|             FormatCharacters.chars.value[FormatCharacters.Colon.value], | ||||
|             FormatCharacters.chars.value[FormatCharacters.Comma.value], | ||||
|             FormatCharacters.chars.value[FormatCharacters.Point.value] | ||||
|             FormatCharacters.Left_Brace.value, | ||||
|             FormatCharacters.Right_Brace.value, | ||||
|             FormatCharacters.Left_Parenthesis.value, | ||||
|             FormatCharacters.Right_Parenthesis.value, | ||||
|             FormatCharacters.Left_Bracket.value, | ||||
|             FormatCharacters.Right_Bracket.value, | ||||
|             FormatCharacters.Semicolon.value, | ||||
|             FormatCharacters.Colon.value, | ||||
|             FormatCharacters.Comma.value, | ||||
|             FormatCharacters.Point.value | ||||
|         ] | ||||
|         self.expr_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.Equal.value], | ||||
|             ExpressionCharacters.chars.value[ExpressionCharacters.Caret.value] | ||||
|             ExpressionCharacters.Plus.value, | ||||
|             ExpressionCharacters.Minus.value, | ||||
|             ExpressionCharacters.Asterisk.value, | ||||
|             ExpressionCharacters.Slash.value, | ||||
|             ExpressionCharacters.Equal.value, | ||||
|             ExpressionCharacters.Caret.value | ||||
|         ] | ||||
|         self.bool_expr_chars = ['<', '>', '!', '!=', '==', '>=', '<=', '&&', '||'] | ||||
|         self.bool_values = [Booleans.Right, Booleans.Wrong] | ||||
|         self.bool_values = [Booleans.Right.value, Booleans.Wrong.value] | ||||
|  | ||||
|         # runtime | ||||
|         self.is_error = None | ||||
|   | ||||
		Reference in New Issue
	
	Block a user