From 218bc36d34be7f221b94fac8ef26f9c72397d2a3 Mon Sep 17 00:00:00 2001 From: Jan-Eric Nitschke <47750513+JanEricNitschke@users.noreply.github.com> Date: Sun, 28 Apr 2024 18:08:36 +0200 Subject: [PATCH] Some reordering for clarity and minor performance (#34) --- Makefile | 4 ++-- src/chunk.rs | 11 +++++---- src/compiler/front.rs | 24 ++++++++++---------- src/compiler/rules.rs | 2 +- src/scanner.rs | 53 ++++++++++++++++++++++--------------------- 5 files changed, 48 insertions(+), 46 deletions(-) diff --git a/Makefile b/Makefile index 35b3aa9..c5b1937 100644 --- a/Makefile +++ b/Makefile @@ -36,12 +36,12 @@ more-benchmark: $(REL_BIN) for filename in benchmark/*.gen; do \ echo $$filename; \ filebase=$${filename%.*}; \ - hyperfine --show-output --warmup 1 ".\\target\\release\\generic $${filebase}.gen" ".\\reference\\craftinginterpreters\\clox $${filebase}.lox.nom" ".\\reference\\craftinginterpreters\\jlox.bat $${filebase}.lox.nom"; \ + hyperfine --reference ".\\target\\release\\generic $${filebase}.gen" --show-output --warmup 1 ".\\reference\\craftinginterpreters\\clox $${filebase}.lox.nom" ".\\reference\\craftinginterpreters\\jlox.bat $${filebase}.lox.nom"; \ done .PHONY: fib-benchmark fib-benchmark: $(REL_BIN) - hyperfine --warmup 1 ".\\target\release\\generic benchmark\\fib\\fib.gen" ".\\reference\\craftinginterpreters\\clox benchmark\\fib\\fib.lox.nom" \ + hyperfine --reference ".\\target\release\\generic benchmark\\fib\\fib.gen" --warmup 1 ".\\reference\\craftinginterpreters\\clox benchmark\\fib\\fib.lox.nom" \ "python benchmark\\fib\\fib.py" "ruby benchmark\\fib\\fib.rb" ".\\reference\\craftinginterpreters\\jlox.bat benchmark\\fib\\fib.lox.nom" \ .PHONY: benchmark-ci diff --git a/src/chunk.rs b/src/chunk.rs index 9299b24..f215cf7 100644 --- a/src/chunk.rs +++ b/src/chunk.rs @@ -39,7 +39,6 @@ impl TryFrom for ConstantIndex { pub enum OpCode { Constant, ConstantLong, - Closure, DefineGlobal, DefineGlobalLong, @@ -72,10 +71,11 @@ pub enum OpCode { StopIteration, Equal, - Greater, - Less, NotEqual, + + Greater, GreaterEqual, + Less, LessEqual, LoadOne, @@ -106,13 +106,14 @@ pub enum OpCode { DupN, Swap, + Invoke, + Method, + Closure, Return, Class, SetProperty, GetProperty, - Method, - Invoke, Inherit, GetSuper, SuperInvoke, diff --git a/src/compiler/front.rs b/src/compiler/front.rs index f3f7570..a3aecd3 100644 --- a/src/compiler/front.rs +++ b/src/compiler/front.rs @@ -260,14 +260,14 @@ impl<'scanner, 'heap> Compiler<'scanner, 'heap> { } pub(super) fn declaration(&mut self) { - if self.match_(TK::Class) { - self.class_declaration(); - } else if self.match_(TK::Fun) { - self.fun_declaration(); - } else if self.match_(TK::Var) { + if self.match_(TK::Var) { self.var_declaration(true); } else if self.match_(TK::Const) { self.var_declaration(false); + } else if self.match_(TK::Fun) { + self.fun_declaration(); + } else if self.match_(TK::Class) { + self.class_declaration(); } else { self.statement(); } @@ -277,24 +277,24 @@ impl<'scanner, 'heap> Compiler<'scanner, 'heap> { } fn statement(&mut self) { - if self.match_(TK::For) { + if self.match_(TK::If) || self.match_(TK::Unless) { + self.conditional_statement(self.check_previous(TK::If)); + } else if self.match_(TK::LeftBrace) { + self.scoped_block(); + } else if self.match_(TK::For) { self.for_statement(); } else if self.match_(TK::ForEach) { self.foreach_statement(); - } else if self.match_(TK::If) || self.match_(TK::Unless) { - self.conditional_statement(self.check_previous(TK::If)); } else if self.match_(TK::Return) { self.return_statement(); } else if self.match_(TK::While) || self.match_(TK::Until) { self.loop_statement(self.check_previous(TK::While)); - } else if self.match_(TK::Switch) { - self.switch_statement(); } else if self.match_(TK::Continue) { self.continue_statement(); } else if self.match_(TK::Break) { self.break_statement(); - } else if self.match_(TK::LeftBrace) { - self.scoped_block(); + } else if self.match_(TK::Switch) { + self.switch_statement(); } else if self.match_(TK::Import) { self.import_statement(); } else if self.match_(TK::From) { diff --git a/src/compiler/rules.rs b/src/compiler/rules.rs index b22ceda..99ecef7 100644 --- a/src/compiler/rules.rs +++ b/src/compiler/rules.rs @@ -112,7 +112,7 @@ pub(super) fn make_rules<'scanner, 'arena>() -> Rules<'scanner, 'arena> { Identifier = [variable, None, None ], In = [None, binary, In ], String = [string, None, None ], - Number = [number, None, None ], + Float = [number, None, None ], Integer = [integer, None, None ], And = [None, and, And ], Case = [None, None, None ], diff --git a/src/scanner.rs b/src/scanner.rs index 2db103d..290dc8f 100644 --- a/src/scanner.rs +++ b/src/scanner.rs @@ -16,10 +16,11 @@ pub enum TokenKind { RightBrace, LeftBracket, RightBracket, - Colon, + Colon, Comma, Dot, + Minus, MinusEqual, Plus, @@ -37,11 +38,8 @@ pub enum TokenKind { AmperEqual, Hat, HatEqual, - StarStar, SlashSlash, - - // One Or Two Character Tokens. Bang, BangEqual, Equal, @@ -51,38 +49,43 @@ pub enum TokenKind { Less, LessEqual, + In, + // Literals. Identifier, String, - Number, + Float, Integer, + False, + True, + Nil, + StopIteration, // Keywords. And, - Case, - Class, - Continue, - Break, - Default, + Or, + If, + Unless, Else, - False, For, ForEach, - Fun, - If, - In, - Unless, - Nil, - Or, - Return, + While, + Until, + Continue, + Break, Switch, - Super, - This, - True, + Default, + Case, + Const, Var, - While, - Until, + + Class, + This, + Super, + + Fun, + Return, Error, Eof, @@ -94,8 +97,6 @@ pub enum TokenKind { Yield, Async, Await, - - StopIteration, } impl std::fmt::Display for TokenKind { @@ -320,7 +321,7 @@ impl<'a> Scanner<'a> { return self.make_token(TokenKind::Integer); } - self.make_token(TokenKind::Number) + self.make_token(TokenKind::Float) } #[allow(clippy::trivially_copy_pass_by_ref)]