From bb9c0d186951ab78f6f64a2254ceeab9da6b81b5 Mon Sep 17 00:00:00 2001 From: Alosh Denny <97750960+aloshdenny@users.noreply.github.com> Date: Mon, 6 Nov 2023 21:39:10 +0530 Subject: [PATCH] Added exponentiation operator --- examples/exponent.not | 8 ++++++++ .../__pycache__/constants.cpython-310.pyc | Bin 941 -> 997 bytes language/__pycache__/emitter.cpython-310.pyc | Bin 1077 -> 1101 bytes language/__pycache__/lexer.cpython-310.pyc | Bin 4350 -> 4546 bytes language/__pycache__/parser.cpython-310.pyc | Bin 5603 -> 5749 bytes language/constants.py | 3 ++- .../__pycache__/lexing_error.cpython-310.pyc | Bin 1520 -> 1544 bytes .../parseing_error.cpython-310.pyc | Bin 1441 -> 1465 bytes language/lexer.py | 16 +++++++++++++++- language/parser.py | 14 +++++++++++--- 10 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 examples/exponent.not 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 b371ef42baefdfac54159ae0135bd7cbf9303258..87c2000aac528fe28258212f77fbb5acfff48b88 100644 GIT binary patch delta 238 zcmZ3>{*;|JpO=@50SGksJySnSI3_VC zzc?etKQGm#D6=dz#wE2lyClCLCM?+5-^F$E2_|h3C!hun1{Ov*WMW~Q%*w1fS%X>4 zQ43_GHi*yx5xO8k4@Bq#i6}v5f8PMdAkScbzxWV;Z&$xyu=PlU<>Y>5X=Zhf{{W88 BIC}s9 delta 179 zcmaFLzLuRgpO=@50SF{cEKR;Lk++tyWnyC`>NmHPPA`tOQ-^D7%C9xziCZMt;BR_BQA0}-^yU7~Na+58X1tv!^>qu#U z)M|nVEfAp%B6L86?&Jl`;(BnSz~&X10cCD+*yQG?l;)(`F#>tT96*ADL5NvGmE%7E DaZV|| diff --git a/language/__pycache__/emitter.cpython-310.pyc b/language/__pycache__/emitter.cpython-310.pyc index 6f95755f423424ec25d9c285ca1ee84a906031e0..bd5be298fa636655743e22c26010b50fee2fddb7 100644 GIT binary patch delta 65 zcmdnWah8K8pO=@50SI>Sd8SU}`J?XYY!wq)oLW>IlbDlVoDt)nm+DfKS(X~(l3JWy Tl3x%L7VPZr;<{O!QH~h^l$;dB delta 41 vcmX@hv6X`-pO=@50SF%Kn4CP3=MTTGi&czEVo735KxIire%@w%Mmc5x1s@E{ diff --git a/language/__pycache__/lexer.cpython-310.pyc b/language/__pycache__/lexer.cpython-310.pyc index d1a3e373e7b093ad6f5617a320e70e9c437d57d6..9e36987a0ad5dfa1ff9c18b7c05b5d0a1bf39840 100644 GIT binary patch delta 878 zcmaJn*N~O{r z1o4)ef^J^Ki!yrNMLc^DyzJu9{~?Fzdzpq#*aGjD_xwbDJGv9=GEwTqg$CxDvFY+}wwKmm)q9@iFAv z5g&Gk^)m9eBVOr84RQSN{O>T7KcVtnhDq)iCKYK2?0Y|=@n#Q=bg0q)=SYo25-9R@ zL}X(Rk<5-kvXO>@8ox#~e(t7G!^7Mkij0{_D#AFhA`QS~IxD5-1DFip)Fw;>a31YtjQSos|IwxwtE3BO7l*c20w>TN;{`1pCY(S zFhkHFxJWR5l#o0+GJ!-;A&3za{g;`^;wq-@5d?vzvS^L}rcfk-b_JwBaQ|CII~;0< Yvf&2dexYj9&r3O9%jTi%-^srH1IIYap8x;= delta 600 zcmX@4{7;cDpO=@50SJyAUz$8aY$IO}BfqwbRg6nwNn%VuWl2VU-sXdh^H~}DCMUAn zOg_!!Q6E>suz+JBLke3qQ&D&gLl#3VBT$5MAp;{r31bbAoy8!|P{NeO)yxzO5&`mo zJZ=yV#7T5tUqY{r9JSb-Hf_U{{LpXqjEJ8A5HXcLxPz>RRJA@Nx#!)0Q_Tn)^ z0BnX}3RjIW&<{X`Le0!gj42Gk44T}2zZkWDG3wr8)cVD!|BF%e7o+VjM!R2(Hoq7Z ztC$pRHH9a~ampx1aX1EtxCVI!dq=Sb`#1)BM6vn$yM+4q7ij{+zeoj0OkTv9%IG$E z4Y%ZGU9L(-#`w+4xeJ&Wb2m%yu`@DGnykPd$QU%ah~Fd>Xmu$=k#Y$e&?)Rd%+bu$ z1doOqMxe78{WQ6X^gt#XfCvu|VFe=GL4*T{UKMqrFF+zSkbyREp9(R zA&8dYUuf4q5ZcsFh&Dmgz0(61(S`GI&iTIYoWp${dmRr{HBFWHvwD_EHhLGhfw+-L z*?EUh$1d(xoh{p{5QA&3`*UIL`Per9;rwvHG8r zeoqxA@EPK~l1B_INjW!kdA+VAwktKgj*`hY&~=TD^6#REL)*J%8TnO7+Pp>Ov*CDYtIHqZK(YrM{!<%%TLmMqG(Tu2) zqLR(koJki&9TzYsV1dQ@3W{i+w@&*U(9%5BRT>dwmc92!y{==P#X{rIW^19N$h6?x UEh&+?8(h%_dkm!@%)$c?pZ;u;0RR91 delta 427 zcmeyW^H`fNpO=@50SKP4E=y*Y*~qt?kzdEfD#j(TBrztSvLquvZ}T0-es-o643l#? zb?cRC7#6UVFlKQqWGsfUnHDk@1=TQQF)v^NlAKvw3mF+1pz1(!W)Qg)MyNRVLI$ur zE0hMA$Btwkn%TulDGb33Agsy6M0WLjx8KCQV7g@evM@4QOt$9B zXUyHanlF)AzzS$m6>DlvajL>E#_A&L$udG2dgegEB3mGFi^_L2W5Mcu%>?Us#ieLo^Hg4t@E@tGl1~N6dilji2ev|t}WZA$vY$tCL(P6wa`MyY* clo?14Y>Nem1-1dKC}eWJs1>8Y38*Z|$j{sCz<7cM0Ol493jhEB diff --git a/language/errors/__pycache__/parseing_error.cpython-310.pyc b/language/errors/__pycache__/parseing_error.cpython-310.pyc index d8317faddf4deafe578d3aea7eeb6c698363978d..5c9551a83148c7d7ba0261cdbf4f65c0d4eb26c2 100644 GIT binary patch delta 65 zcmZ3;y_1_KpO=@50SI>Sd8SU}`Jf)`Y!wq)oLW>IlbDlVoDt)nm+DfKS(X~(l3JWy Tl3x%L7VPZr;<}leaT*H%jTaRX delta 41 vcmdnVy^xzHpO=@50SMTZPEMZ4^MT*m#VW=nu_Q4jpt2+*KX0=#<1`ik=CTYc 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