--- /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
+ }
+ }
+ }
+}