@@ -50,10 +50,12 @@ pub enum OpCode {
5050 LoadConst , LoadName , StoreName , Call , PopTop , ReturnValue ,
5151 BuildString , CallPrint , CallLen , FormatValue , CallAbs , Minus ,
5252 CallStr , CallInt , CallRange , Phi , CallChr , CallType ,
53+ MakeFunction , Add , Sub , Mul , Div , Eq ,
5354 CallFloat , CallBool , CallRound , CallMin , CallMax , CallSum ,
5455 CallSorted , CallEnumerate , CallZip , CallList , CallTuple , CallDict ,
55- CallIsInstance , CallSet , CallInput , CallOrd , BuildDict , BuildList ,
56- MakeFunction , Add , Sub , Mul , Div
56+ CallIsInstance , CallSet , CallInput , CallOrd , BuildDict , BuildList ,
57+ NotEq , Lt , Gt , LtEq , GtEq , And ,
58+ Or , Not
5759}
5860
5961#[ derive( Debug ) ] pub struct Instruction { pub opcode : OpCode , pub operand : u16 }
@@ -188,6 +190,7 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
188190 TokenType :: None => self . emit_const ( Value :: None ) ,
189191 TokenType :: FstringStart => self . fstring ( ) ,
190192 TokenType :: Minus => { self . expr ( ) ; self . chunk . emit ( OpCode :: Minus , 0 ) ; } ,
193+ TokenType :: Not => { self . expr ( ) ; self . chunk . emit ( OpCode :: Not , 0 ) ; }
191194 TokenType :: Lbrace => self . dict_literal ( ) ,
192195 TokenType :: Lsqb => self . list_literal ( ) ,
193196 _ => { }
@@ -197,10 +200,18 @@ impl<'src, I: Iterator<Item = Token>> Parser<'src, I> {
197200
198201 fn binary_op ( & mut self ) {
199202 match self . peek ( ) {
200- Some ( TokenType :: Plus ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: Add , 0 ) ; }
201- Some ( TokenType :: Minus ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: Sub , 0 ) ; }
202- Some ( TokenType :: Star ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: Mul , 0 ) ; }
203- Some ( TokenType :: Slash ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: Div , 0 ) ; }
203+ Some ( TokenType :: Plus ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: Add , 0 ) ; }
204+ Some ( TokenType :: Minus ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: Sub , 0 ) ; }
205+ Some ( TokenType :: Star ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: Mul , 0 ) ; }
206+ Some ( TokenType :: Slash ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: Div , 0 ) ; }
207+ Some ( TokenType :: EqEqual ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: Eq , 0 ) ; }
208+ Some ( TokenType :: NotEqual ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: NotEq , 0 ) ; }
209+ Some ( TokenType :: Less ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: Lt , 0 ) ; }
210+ Some ( TokenType :: Greater ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: Gt , 0 ) ; }
211+ Some ( TokenType :: LessEqual ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: LtEq , 0 ) ; }
212+ Some ( TokenType :: GreaterEqual ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: GtEq , 0 ) ; }
213+ Some ( TokenType :: And ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: And , 0 ) ; }
214+ Some ( TokenType :: Or ) => { self . advance ( ) ; self . expr ( ) ; self . chunk . emit ( OpCode :: Or , 0 ) ; }
204215 _ => { }
205216 }
206217 }
0 commit comments