diff options
Diffstat (limited to 'nivis-python')
| -rw-r--r-- | nivis-python/__init__.py | 4 | ||||
| -rw-r--r-- | nivis-python/exception.py | 3 | ||||
| -rw-r--r-- | nivis-python/execution.py | 3 | ||||
| -rw-r--r-- | nivis-python/interpreter.py | 3 | ||||
| -rw-r--r-- | nivis-python/lexer.py | 77 | ||||
| -rw-r--r-- | nivis-python/parsers.py | 29 |
6 files changed, 75 insertions, 44 deletions
diff --git a/nivis-python/__init__.py b/nivis-python/__init__.py index b3e08df..f19e06b 100644 --- a/nivis-python/__init__.py +++ b/nivis-python/__init__.py @@ -3,10 +3,10 @@ @BODY 似乎要写的还蛮多的,所以先写几个TODO List """ -__all__ = ['psi', 'Exception', 'interpreter', 'lexer', 'Parser'] +__all__ = ["psi", "Exception", "interpreter", "lexer", "Parser"] from .psi import psi from .execution import Execution from .interpreter import Interpreter from .lexer import Lexer -from .parsers import Parser
\ No newline at end of file +from .parsers import Parser diff --git a/nivis-python/exception.py b/nivis-python/exception.py index a8b7201..0ec22e5 100644 --- a/nivis-python/exception.py +++ b/nivis-python/exception.py @@ -10,7 +10,7 @@ class PsiException(Exception): ``` """ - + class ValueError(PsiException): """ An exception class for value-related errors in Psi code. @@ -23,6 +23,7 @@ class ValueError(PsiException): ``` """ + class GrammarError(PsiException): """ An exception class for grammar-related errors in Psi code. diff --git a/nivis-python/execution.py b/nivis-python/execution.py index 0abdf2c..a11d55b 100644 --- a/nivis-python/execution.py +++ b/nivis-python/execution.py @@ -1,7 +1,8 @@ from psi.parsers import Parser from psi.interpreter import Interpreter -__all__ = ['Execution'] +__all__ = ["Execution"] + class Execution: """ diff --git a/nivis-python/interpreter.py b/nivis-python/interpreter.py index 8aa8fad..0817274 100644 --- a/nivis-python/interpreter.py +++ b/nivis-python/interpreter.py @@ -1,7 +1,8 @@ from psi.lexer import Token -__all__ = ['Interpreter'] +__all__ = ["Interpreter"] + class Interpreter: """ diff --git a/nivis-python/lexer.py b/nivis-python/lexer.py index 474891b..f4dafc4 100644 --- a/nivis-python/lexer.py +++ b/nivis-python/lexer.py @@ -54,7 +54,8 @@ print([t['type'] for t in lexer]) """ from psi.exception import ValueError -__all__ = ['Token', 'Lexer'] +__all__ = ["Token", "Lexer"] + class Token(dict): """ @@ -124,6 +125,7 @@ class Lexer: print(token) ``` """ + def __init__(self, input): """ Initializes a Lexer object. @@ -155,17 +157,25 @@ class Lexer: self.position += 1 continue - if current_char == '#': + if current_char == "#": self.position += 1 - while (self.position < len(self.input) and - self.input[self.position] != '\n'): + while ( + self.position < len(self.input) + and self.input[self.position] != "\n" + ): self.position += 1 continue - if current_char == '/' and self.position + 1 < len(self.input) and self.input[self.position + 1] == '*': + if ( + current_char == "/" + and self.position + 1 < len(self.input) + and self.input[self.position + 1] == "*" + ): self.position += 2 - while (self.position < len(self.input) - 1 and - (self.input[self.position] != '*' or self.input[self.position + 1] != '/')): + while self.position < len(self.input) - 1 and ( + self.input[self.position] != "*" + or self.input[self.position + 1] != "/" + ): self.position += 1 if self.position < len(self.input) - 1: self.position += 2 @@ -173,41 +183,58 @@ class Lexer: if current_char.isalpha(): start_position = self.position - while (self.position < len(self.input) and - self.input[self.position].isalnum()): + while ( + self.position < len(self.input) + and self.input[self.position].isalnum() + ): self.position += 1 - token = Token('IDENTIFIER', self.input[start_position:self.position], start_position) + token = Token( + "IDENTIFIER", + self.input[start_position : self.position], + start_position, + ) self.tokens.append(token) return token if current_char.isdigit(): start_position = self.position - while (self.position < len(self.input) and - self.input[self.position].isdigit()): + while ( + self.position < len(self.input) + and self.input[self.position].isdigit() + ): self.position += 1 - token = Token('INTEGER', int(self.input[start_position:self.position]), start_position) + token = Token( + "INTEGER", + int(self.input[start_position : self.position]), + start_position, + ) self.tokens.append(token) return token - if current_char in {'<', '>', '=', '!', '&', '|', '@'}: - if (self.position + 1 < len(self.input) and - self.input[self.position + 1] in {'=', '&', '|'}): - token = Token('OPERATOR', current_char + self.input[self.position + 1], self.position) + if current_char in {"<", ">", "=", "!", "&", "|", "@"}: + if self.position + 1 < len(self.input) and self.input[ + self.position + 1 + ] in {"=", "&", "|"}: + token = Token( + "OPERATOR", + current_char + self.input[self.position + 1], + self.position, + ) self.position += 2 else: - token = Token('OPERATOR', current_char, self.position) + token = Token("OPERATOR", current_char, self.position) self.position += 1 self.tokens.append(token) return token - if current_char in {'{', '}', '(', ')', '[', ']', ';', ',', '.', ':'}: - return self._extracted_from_get_next_token_64('SEPARATOR', current_char) - if current_char in {'?', '!', '|'}: - return self._extracted_from_get_next_token_64('CONTROL', current_char) + if current_char in {"{", "}", "(", ")", "[", "]", ";", ",", ".", ":"}: + return self._extracted_from_get_next_token_64("SEPARATOR", current_char) + if current_char in {"?", "!", "|"}: + return self._extracted_from_get_next_token_64("CONTROL", current_char) self.position += 1 - raise ValueError(f'Unknown character: {current_char}') + raise ValueError(f"Unknown character: {current_char}") - token = Token('EOF', None, self.position) + token = Token("EOF", None, self.position) self.tokens.append(token) return token @@ -246,4 +273,4 @@ class Lexer: Returns: The number of tokens. """ - return len(self.tokens)
\ No newline at end of file + return len(self.tokens) diff --git a/nivis-python/parsers.py b/nivis-python/parsers.py index f68f95f..08c3a2c 100644 --- a/nivis-python/parsers.py +++ b/nivis-python/parsers.py @@ -1,7 +1,8 @@ from psi.lexer import Lexer, Token -__all__ = ['Parser'] +__all__ = ["Parser"] + class Parser: """ @@ -51,12 +52,12 @@ class Parser: The result of the parsing. """ token = self.current_token - if token.value == '?': - self.eat('?') + if token.value == "?": + self.eat("?") condition = self.parse_condition() - self.eat(':') + self.eat(":") if condition: result = self.parse_reply() @@ -73,7 +74,7 @@ class Parser: The result of the parsing. """ variable = self.parse_variable() - self.eat('==') + self.eat("==") value = self.parse_value() return variable == value @@ -86,7 +87,7 @@ class Parser: The result of the parsing. """ token = self.current_token - self.eat('IDENTIFIER') + self.eat("IDENTIFIER") return token.value def parse_value(self): @@ -100,11 +101,11 @@ class Parser: Exception: Raised when an invalid value is encountered. """ token = self.current_token - if token.type == 'INTEGER': - self.eat('INTEGER') + if token.type == "INTEGER": + self.eat("INTEGER") return token.value else: - raise Exception(f'Invalid value: {token.value}') + raise Exception(f"Invalid value: {token.value}") def parse_reply(self): """ @@ -116,12 +117,12 @@ class Parser: Raises: Exception: Raised when an invalid reply is encountered. """ - self.eat('reply') - self.eat(':') + self.eat("reply") + self.eat(":") token = self.current_token - if token.type != 'SEPARATOR': - raise Exception(f'Invalid reply: {token.value}') + if token.type != "SEPARATOR": + raise Exception(f"Invalid reply: {token.value}") return token.value @@ -141,4 +142,4 @@ class Parser: if self.current_token.type == expected_type: self.current_token = next(self.tokens) else: - raise Exception(f'Unexpected token: {self.current_token.value}') + raise Exception(f"Unexpected token: {self.current_token.value}") |
