gameServer2/src/protocol/lexer.rs
changeset 12131 a4d22f197bd2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gameServer2/src/protocol/lexer.rs	Fri Jan 06 01:00:21 2017 +0300
@@ -0,0 +1,38 @@
+pub type Spanned<Tok, Loc, Error> = Result<(Loc, Tok, Loc), Error>;
+
+#[derive(Debug)]
+pub enum Tok {
+    Linefeed,
+}
+
+#[derive(Debug)]
+pub enum LexicalError {
+    // Not possible
+}
+
+use std::str::CharIndices;
+
+pub struct Lexer<'input> {
+    chars: CharIndices<'input>,
+}
+
+impl<'input> Lexer<'input> {
+    pub fn new(input: &'input str) -> Self {
+        Lexer { chars: input.char_indices() }
+    }
+}
+
+impl<'input> Iterator for Lexer<'input> {
+    type Item = Spanned<Tok, usize, LexicalError>;
+
+    fn next(&mut self) -> Option<Self::Item> {
+        loop {
+            match self.chars.next() {
+                Some((i, '\n')) => return Some(Ok((i, Tok::Linefeed, i+1))),
+
+                None => return None, // End of file
+                _ => continue, // Comment; skip this character
+            }
+        }
+    }
+}