From 8140e3c5e6d110dfed72b533bdf4e0b0be853ef0 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Sat, 24 Dec 2016 09:17:08 -0700 Subject: [PATCH] Pass over whitespace and count lines --- src/lexer/char.rs | 5 +++++ src/lexer/mod.rs | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/src/lexer/char.rs b/src/lexer/char.rs index 3ef608f..42e5f7e 100644 --- a/src/lexer/char.rs +++ b/src/lexer/char.rs @@ -10,6 +10,7 @@ pub trait Lexable { fn is_identifier_initial(&self) -> bool; fn is_identifier_subsequent(&self) -> bool; fn is_identifier_single(&self) -> bool; + fn is_newline(&self) -> bool; } impl Lexable for char { @@ -32,5 +33,9 @@ impl Lexable for char { fn is_identifier_single(&self) -> bool { charset::identifier_singles().contains(&self) } + + fn is_newline(&self) -> bool { + *self == '\n' + } } diff --git a/src/lexer/mod.rs b/src/lexer/mod.rs index e64f5fa..793de3d 100644 --- a/src/lexer/mod.rs +++ b/src/lexer/mod.rs @@ -22,6 +22,7 @@ pub struct Lexer { input: String, begin: usize, forward: usize, + line: u32, state: State, } @@ -31,6 +32,7 @@ impl Lexer { input: input, begin: 0, forward: 0, + line: 1, state: State::Initial, } } @@ -83,6 +85,12 @@ impl Lexer { self.state = State::Identifier; self.advance(); } + else if c.is_whitespace() { + if c.is_newline() { + self.line += 1; + } + self.advance(); + } } /// Handle self.state == State::Identifier