diff options
Diffstat (limited to 'src/psi/parsers.py')
| -rw-r--r-- | src/psi/parsers.py | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/src/psi/parsers.py b/src/psi/parsers.py index db3e52c..f68f95f 100644 --- a/src/psi/parsers.py +++ b/src/psi/parsers.py @@ -4,15 +4,52 @@ from psi.lexer import Lexer, Token __all__ = ['Parser'] class Parser: + """ + A class representing a parser for Psi code. + + Args: + input: The input code to be parsed. + + Returns: + None + + Example: + ```python + parser = Parser(input) + parser.parse() + ``` + """ + def __init__(self, input): + """ + Initializes a Parser object. + + Args: + input: The input code to be parsed. + + Returns: + None + """ self.lexer = Lexer(input) self.tokens = iter(self.lexer) self.current_token = next(self.tokens) def parse(self): + """ + Parses the input code. + + Returns: + The result of the parsing. + """ return self.parse_expr() def parse_expr(self): + """ + Parses an expression in the input code. + + Returns: + The result of the parsing. + """ token = self.current_token if token.value == '?': self.eat('?') @@ -29,6 +66,12 @@ class Parser: return result def parse_condition(self): + """ + Parses a condition in the input code. + + Returns: + The result of the parsing. + """ variable = self.parse_variable() self.eat('==') value = self.parse_value() @@ -36,11 +79,26 @@ class Parser: return variable == value def parse_variable(self): + """ + Parses a variable in the input code. + + Returns: + The result of the parsing. + """ token = self.current_token self.eat('IDENTIFIER') return token.value def parse_value(self): + """ + Parses a value in the input code. + + Returns: + The result of the parsing. + + Raises: + Exception: Raised when an invalid value is encountered. + """ token = self.current_token if token.type == 'INTEGER': self.eat('INTEGER') @@ -49,6 +107,15 @@ class Parser: raise Exception(f'Invalid value: {token.value}') def parse_reply(self): + """ + Parses a reply in the input code. + + Returns: + The result of the parsing. + + Raises: + Exception: Raised when an invalid reply is encountered. + """ self.eat('reply') self.eat(':') @@ -59,6 +126,18 @@ class Parser: return token.value def eat(self, expected_type): + """ + Consumes the current token if it matches the expected type. + + Args: + expected_type: The expected type of the token. + + Returns: + None + + Raises: + Exception: Raised when an unexpected token is encountered. + """ if self.current_token.type == expected_type: self.current_token = next(self.tokens) else: |
