diff --git a/examples/exponent.not b/examples/exponent.not new file mode 100644 index 0000000..0d7ed68 --- /dev/null +++ b/examples/exponent.not @@ -0,0 +1,8 @@ +PRINT "Enter first number" +INPUT a +PRINT "Enter second number" +INPUT b + +LET c = a**b + +PRINT c \ No newline at end of file diff --git a/language/__pycache__/constants.cpython-310.pyc b/language/__pycache__/constants.cpython-310.pyc index b371ef4..87c2000 100644 Binary files a/language/__pycache__/constants.cpython-310.pyc and b/language/__pycache__/constants.cpython-310.pyc differ diff --git a/language/__pycache__/emitter.cpython-310.pyc b/language/__pycache__/emitter.cpython-310.pyc index 6f95755..bd5be29 100644 Binary files a/language/__pycache__/emitter.cpython-310.pyc and b/language/__pycache__/emitter.cpython-310.pyc differ diff --git a/language/__pycache__/lexer.cpython-310.pyc b/language/__pycache__/lexer.cpython-310.pyc index d1a3e37..9e36987 100644 Binary files a/language/__pycache__/lexer.cpython-310.pyc and b/language/__pycache__/lexer.cpython-310.pyc differ diff --git a/language/__pycache__/parser.cpython-310.pyc b/language/__pycache__/parser.cpython-310.pyc index 5a53662..ea47c12 100644 Binary files a/language/__pycache__/parser.cpython-310.pyc and b/language/__pycache__/parser.cpython-310.pyc differ diff --git a/language/constants.py b/language/constants.py index ee5fe5f..5478604 100644 --- a/language/constants.py +++ b/language/constants.py @@ -29,6 +29,7 @@ class TokenType(enum.Enum): GT = 210 GTEQ = 211 MODULO = 212 + EXP = 213 # Brackets. LPAREN = 301 RPAREN = 302 @@ -40,4 +41,4 @@ class TokenType(enum.Enum): COMPARISON_TOKENS = [ TokenType.EQEQ, TokenType.NOTEQ, TokenType.LT, TokenType.LTEQ, TokenType.GT, TokenType.GTEQ -] +] \ No newline at end of file diff --git a/language/errors/__pycache__/lexing_error.cpython-310.pyc b/language/errors/__pycache__/lexing_error.cpython-310.pyc index 4640efd..48fb34b 100644 Binary files a/language/errors/__pycache__/lexing_error.cpython-310.pyc and b/language/errors/__pycache__/lexing_error.cpython-310.pyc differ diff --git a/language/errors/__pycache__/parseing_error.cpython-310.pyc b/language/errors/__pycache__/parseing_error.cpython-310.pyc index d8317fa..5c9551a 100644 Binary files a/language/errors/__pycache__/parseing_error.cpython-310.pyc and b/language/errors/__pycache__/parseing_error.cpython-310.pyc differ diff --git a/language/lexer.py b/language/lexer.py index 99a8511..5a46709 100644 --- a/language/lexer.py +++ b/language/lexer.py @@ -55,9 +55,17 @@ def parse_operators(self): elif self.curChar == '-': return(Token(self.curChar, TokenType.MINUS)) elif self.curChar == '*': - return(Token(self.curChar, TokenType.ASTERISK)) + # Check whether this token is * or ** + if self.peek() == '*': + lastChar = self.curChar + self.next_char() + return (Token(lastChar + self.curChar, TokenType.EXP)) + else: + return(Token(self.curChar, TokenType.ASTERISK)) elif self.curChar == '/': return(Token(self.curChar, TokenType.SLASH)) + elif self.curChar == '**': + return(Token(self.curChar, TokenType.EXP)) elif self.curChar == '%': return(Token(self.curChar, TokenType.MODULO)) elif self.curChar == '=': @@ -155,6 +163,12 @@ def get_token(self) -> Token: token = (self.parse_special_symbols() or self.parse_operators() or self.parse_literals() or self.parse_brackets()) + + if self.curChar == '*': + self.next_char() + if self.curChar == '*': + self.next_char() + return Token(TokenType.EXP, "**") if token is None: raise UnknownTokenError(self.curChar, self.curPos) diff --git a/language/parser.py b/language/parser.py index 2548ca7..3b4c8a8 100644 --- a/language/parser.py +++ b/language/parser.py @@ -74,15 +74,23 @@ def term(self): self.unary() while self.check_token(TokenType.ASTERISK) or self.check_token(TokenType.SLASH) or \ - self.check_token(TokenType.MODULO): + self.check_token(TokenType.MODULO) or self.check_token(TokenType.EXP): self.emitter.emit(self.cur_token.text) + if self.check_token(TokenType.EXP): + self.emitter.emit("**") # Use the ** operator for exponentiation + else: + self.emitter.emit(self.cur_token.text) + self.next_token() + if self.check_token(TokenType.MODULO): self.emitter.emit("(int)") - self.next_token() self.unary() + if self.check_token(TokenType.EXP): + self.emitter.emit(")") + def expression(self): self.term() while self.check_token(TokenType.PLUS) or self.check_token(TokenType.MINUS): @@ -220,4 +228,4 @@ def program(self): self.emitter.emit_line("return 0;") self.emitter.emit_line("}") - self.emitter.write_file() + self.emitter.write_file() \ No newline at end of file