aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/nivis-python
diff options
context:
space:
mode:
Diffstat (limited to 'nivis-python')
-rw-r--r--nivis-python/__init__.py4
-rw-r--r--nivis-python/exception.py3
-rw-r--r--nivis-python/execution.py3
-rw-r--r--nivis-python/interpreter.py3
-rw-r--r--nivis-python/lexer.py77
-rw-r--r--nivis-python/parsers.py29
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}")