-
Notifications
You must be signed in to change notification settings - Fork 0
/
lexer.rs
150 lines (129 loc) · 6.34 KB
/
lexer.rs
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
use crate::lexer::*;
//<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>\\
#[test]
fn test_lexer_symbol() {
let mut lex = LadderTypeLexer::from("symbol".chars());
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("symbol".into()))) );
assert_eq!( lex.next(), None );
}
#[test]
fn test_lexer_num() {
let mut lex = LadderTypeLexer::from("1234".chars());
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Num(1234))) );
assert_eq!( lex.next(), None );
}
#[test]
fn test_lexer_num_error() {
let mut lex = LadderTypeLexer::from("123xxx".chars());
assert_eq!( lex.next(), Some(Err(LexError::InvalidDigit)) );
}
#[test]
fn test_lexer_char() {
let mut lex = LadderTypeLexer::from("'x'".chars());
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Char('x'))) );
assert_eq!( lex.next(), None );
}
#[test]
fn test_lexer_char_error() {
let mut lex = LadderTypeLexer::from("'xx'".chars());
assert_eq!( lex.next(), Some(Err(LexError::InvalidChar)) );
}
#[test]
fn test_lexer_ladder() {
let mut lex = LadderTypeLexer::from("abc~def".chars());
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("abc".into()))) );
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Ladder)) );
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("def".into()))) );
assert_eq!( lex.next(), None );
}
#[test]
fn test_lexer_ladder_space() {
let mut lex = LadderTypeLexer::from("abc ~ def".chars());
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("abc".into()))) );
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Ladder)) );
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("def".into()))) );
assert_eq!( lex.next(), None );
}
#[test]
fn test_lexer_app() {
let mut lex = LadderTypeLexer::from("<Seq Char>".chars());
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Open)) );
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Seq".into()))) );
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Char".into()))) );
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Close)) );
assert_eq!( lex.next(), None );
}
#[test]
fn test_lexer_app_space() {
let mut lex = LadderTypeLexer::from(" <Seq Char >".chars());
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Open)) );
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Seq".into()))) );
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Char".into()))) );
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Close)) );
assert_eq!( lex.next(), None );
}
#[test]
fn test_lexer_large() {
let mut lex = LadderTypeLexer::from(
"<Seq Date
~<TimeSince UnixEpoch>
~<Duration Seconds>
~ℕ
~<PosInt 10 BigEndian>
~< Seq <Digit 10>~Unicode > >
~<SepSeq Unicode ':'>
~<Seq Unicode>
~UTF-8
~<Seq Byte>".chars());
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Open)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Seq".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Date".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Ladder)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Open)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("TimeSince".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("UnixEpoch".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Close)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Ladder)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Open)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Duration".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Seconds".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Close)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Ladder)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("ℕ".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Ladder)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Open)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("PosInt".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Num(10))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("BigEndian".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Close)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Ladder)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Open)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Seq".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Open)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Digit".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Num(10))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Close)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Ladder)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Unicode".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Close)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Close)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Ladder)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Open)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("SepSeq".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Unicode".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Char(':'))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Close)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Ladder)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Open)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Seq".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Unicode".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Close)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Ladder)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("UTF-8".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Ladder)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Open)));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Seq".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Symbol("Byte".into()))));
assert_eq!( lex.next(), Some(Ok(LadderTypeToken::Close)));
assert_eq!( lex.next(), None );
}