1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
use scanner::Scanner;
pub fn scan_number(scanner: &mut Scanner<char>) -> Option<String> {
let backtrack = scanner.pos();
let digits = "0123456789";
scanner.accept_any_char("+-");
if !scanner.skip_all_chars(digits) {
scanner.set_pos(backtrack);
return None;
}
let backtrack = scanner.pos();
if scanner.accept_any_char(".").is_some() && !scanner.skip_all_chars(digits) {
scanner.set_pos(backtrack);
return Some(scanner.extract_string());
}
let backtrack = scanner.pos();
if scanner.accept_any_char("Ee").is_some() {
scanner.accept_any_char("+-");
if !scanner.skip_all_chars(digits) {
scanner.set_pos(backtrack);
return Some(scanner.extract_string());
}
}
scanner.accept_any_char("i");
Some(scanner.extract_string())
}
pub fn scan_math_op(scanner: &mut Scanner<char>) -> Option<String> {
if scanner.accept_any_char(">=<").is_some() {
scanner.accept_any_char("=");
Some(scanner.extract_string())
} else if scanner.accept_any_char("*").is_some() {
scanner.accept_any_char("*");
Some(scanner.extract_string())
} else if scanner.accept_any_char("+-*/%^!(),").is_some() {
Some(scanner.extract_string())
} else {
None
}
}
pub fn scan_xob_integers(scanner: &mut Scanner<char>) -> Option<String> {
let backtrack = scanner.pos();
if scanner.accept_any_char("0").is_some() {
if match scanner.accept_any_char("xob") {
Some('x') => scanner.skip_all_chars("0123456789ABCDEFabcdef"),
Some('o') => scanner.skip_all_chars("01234567"),
Some('b') => scanner.skip_all_chars("01"),
_ => false,
} {
return Some(scanner.extract_string());
}
}
scanner.set_pos(backtrack);
None
}
pub fn scan_quoted_string(scanner: &mut Scanner<char>, q: char) -> Option<String> {
let backtrack = scanner.pos();
if ! scanner.accept_char(q) { return None; }
while let Some(n) = scanner.next() {
if n == '\\' { scanner.next(); continue; }
if n == q { return Some(scanner.extract_string()); }
}
scanner.set_pos(backtrack);
None
}
pub fn scan_identifier(scanner: &mut Scanner<char>) -> Option<String> {
let alfa = concat!("abcdefghijklmnopqrstuvwxyz",
"ABCDEFGHIJKLMNOPQRSTUVWXYZ_");
let alnum = concat!("0123456789",
"abcdefghijklmnopqrstuvwxyz",
"ABCDEFGHIJKLMNOPQRSTUVWXYZ_");
if scanner.accept_any_char(alfa).is_none() { return None; }
scanner.skip_all_chars(alnum);
Some(scanner.extract_string())
}