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
16KB
217 行
text-reader
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一起使用,或确定是否是最后一个字符。