4 个版本

0.2.1 2019年5月24日
0.2.0 2019年5月24日
0.1.1 2019年3月30日
0.1.0 2019年3月30日

#2493解析器实现

21 每月下载量
用于 2 crates

MIT 许可证

16KB
217

text-reader

Build Status

Rust 字符串字符读取器。

用法

[dependencies]
text-reader = "0.2"

示例

TextReader

use text_reader::TextReader;

#[test]
fn test_while() {
  let mut reader = TextReader::new("華文\ndef");
  while reader.has_next() {
    let position = reader.position();
    match reader.next() {
      Some(ch) => match position {
        0 => assert_eq!('', ch),
        1 => assert_eq!('', ch),
        2 => assert_eq!('\n', ch),
        3 => assert_eq!('d', ch),
        4 => assert_eq!('e', ch),
        5 => assert_eq!('f', ch),
        _ => {}
      },
      None => panic!("None")
    }
  }
}

TextReader 和 Detector

#[test]
fn test_detector() {
  let text = r#"
{"type": "typeA", "name": "Earth", "continent": ["Asia", "Europe"]}
  "#;
  let mut reader = TextReader::new(text);
  let mut rets = Vec::new();
  while reader.has_next() {
    match reader.next() {
      Some('"') => {
        let mut detector = reader.detector();
        rets.push('"');
        if detector.next_text("type").yes() {
          detector.rollback();
          rets.push('t');
        }
        continue;
      },
      Some(ch) => {
        rets.push(ch);
        continue;
      }
      None => {}
    }
  }
  let ret = rets.iter().collect::<String>();
  println!("{}", ret);
}

更多

更多

分析

use text_reader::TextReader;

#[test]
fn test_stat() {
  let mut reader = TextReader::new("abc\ndef");
  println!("{:?}", reader);
  reader.next();
  println!("{:?}", reader);
  reader.back();
  println!("{:?}", reader);
  let line_text = reader.this_line();
  println!("{:?}", line_text);
  let position = reader.position();
  println!("{:?}", position);
  println!("{:?}", reader);

  reader.next();
  reader.next();
  reader.next();
  let line = reader.line(); // 1
  assert_eq!(1, line);
  println!("{:?}", reader);
  reader.next();
  let line = reader.line(); // 2
  assert_eq!(2, line);
  println!("{:?}", reader);
}

当创建一个 TextReader TextReader::new("abc\ndef") 时,TextReader 状态是

TextReader{len: 7,text: ['a', 'b', 'c', '\n', 'd', 'e', 'f'],position: 0,line: 1,cursor: 0 }

next

然后,读取下一个字符 let ch = reader.next()ch 将返回 Some('a');TextReader 状态

TextReader{len: 7,text: ['a', 'b', 'c', '\n', 'd', 'e', 'f'],position: 1,line: 1,cursor: 1 }

peek

peek 函数不会改变状态,只获取当前字符 let ch = reader.peek()

TextReader{len: 7,text: ['a', 'b', 'c', '\n', 'd', 'e', 'f'],position: 1,line: 1,cursor: 1 }

back

后退将 TextReader 改变为之前的状态。返回 TextReader 引用。 reader.back()

TextReader{len: 7,text: ['a', 'b', 'c', '\n', 'd', 'e', 'f'],position: 0,line: 1,cursor: 0 }

this_line

此行返回当前行的文本,不会改变 TextReader 状态。 let line_text = reader.this_line()

TextReader{len: 7,text: ['a', 'b', 'c', '\n', 'd', 'e', 'f'],position: 0,line: 1,cursor: 0 }

line_text 是 Some("abc")

position

position 函数返回 TextReader 位置值。字符位置的数量。 let position = reader.position()

位置是 0

TextReader{len: 7,text: ['a', 'b', 'c', '\n', 'd', 'e', 'f'],position: 0,line: 1,cursor: 0 }

line

返回当前行号,由 \n 分割。

reader.next();
reader.next();
reader.next();
let line = reader.line(); // 1
// TextReader { len: 7, text: ['a', 'b', 'c', '\n', 'd', 'e', 'f'], position: 3, line: 1, cursor: 3 }
reader.next();
let line = reader.line(); // 2
// TextReader { len: 7, text: ['a', 'b', 'c', '\n', 'd', 'e', 'f'], position: 4, line: 2, cursor: 0 }

cursor

行的位置。从0开始,遇到\n时变为0。

has_next

具有下一个字符。可以与while一起使用,或确定是否是最后一个字符。

无运行时依赖