@@ -3,10 +3,22 @@ pub(crate) enum LexItem {
33 At ( String ) ,
44 Paren ( char ) ,
55 Word ( String ) ,
6- Space ,
6+ Whitespace ( char ) ,
77 NewLine ,
88}
99
10+ impl LexItem {
11+ pub ( crate ) fn push_to ( & self , acc : & mut String ) {
12+ match self {
13+ LexItem :: At ( s) => acc. push_str ( s) ,
14+ LexItem :: Paren ( c) => acc. push ( * c) ,
15+ LexItem :: Word ( s) => acc. push_str ( s) ,
16+ LexItem :: Whitespace ( c) => acc. push ( * c) ,
17+ LexItem :: NewLine => acc. push ( '\n' ) ,
18+ }
19+ }
20+ }
21+
1022pub ( crate ) fn lex ( input : String ) -> Vec < LexItem > {
1123 let mut result = vec ! [ ] ;
1224
@@ -34,12 +46,8 @@ pub(crate) fn lex(input: String) -> Vec<LexItem> {
3446 '{' | '}' => {
3547 result. push ( LexItem :: Paren ( c) ) ;
3648 }
37- ' ' => {
38- if let Some ( v) = result. last_mut ( ) {
39- if !matches ! ( v, LexItem :: Space ) {
40- result. push ( LexItem :: Space ) ;
41- }
42- }
49+ ' ' | '\t' => {
50+ result. push ( LexItem :: Whitespace ( c) ) ;
4351 }
4452 '\n' => {
4553 result. push ( LexItem :: NewLine ) ;
@@ -72,9 +80,9 @@ mod test {
7280 vec![
7381 LexItem :: At ( "@" . into( ) ) ,
7482 LexItem :: Word ( "name" . into( ) ) ,
75- LexItem :: Space ,
83+ LexItem :: Whitespace ( ' ' ) ,
7684 LexItem :: Word ( "Memory" . into( ) ) ,
77- LexItem :: Space ,
85+ LexItem :: Whitespace ( ' ' ) ,
7886 LexItem :: Word ( "Management" . into( ) )
7987 ]
8088 ) ;
@@ -85,9 +93,9 @@ mod test {
8593 vec![
8694 LexItem :: At ( "\\ " . into( ) ) ,
8795 LexItem :: Word ( "name" . into( ) ) ,
88- LexItem :: Space ,
96+ LexItem :: Whitespace ( ' ' ) ,
8997 LexItem :: Word ( "Memory" . into( ) ) ,
90- LexItem :: Space ,
98+ LexItem :: Whitespace ( ' ' ) ,
9199 LexItem :: Word ( "Management" . into( ) )
92100 ]
93101 ) ;
@@ -98,9 +106,9 @@ mod test {
98106 vec![
99107 LexItem :: At ( "\\ \\ " . into( ) ) ,
100108 LexItem :: Word ( "name" . into( ) ) ,
101- LexItem :: Space ,
109+ LexItem :: Whitespace ( ' ' ) ,
102110 LexItem :: Word ( "Memory" . into( ) ) ,
103- LexItem :: Space ,
111+ LexItem :: Whitespace ( ' ' ) ,
104112 LexItem :: Word ( "Management" . into( ) )
105113 ]
106114 ) ;
@@ -116,12 +124,12 @@ mod test {
116124 LexItem :: Paren ( '{' ) ,
117125 LexItem :: NewLine ,
118126 LexItem :: Word ( "*" . into( ) ) ,
119- LexItem :: Space ,
127+ LexItem :: Whitespace ( ' ' ) ,
120128 LexItem :: At ( "@" . into( ) ) ,
121129 LexItem :: Word ( "name" . into( ) ) ,
122- LexItem :: Space ,
130+ LexItem :: Whitespace ( ' ' ) ,
123131 LexItem :: Word ( "Memory" . into( ) ) ,
124- LexItem :: Space ,
132+ LexItem :: Whitespace ( ' ' ) ,
125133 LexItem :: Word ( "Management" . into( ) ) ,
126134 LexItem :: NewLine ,
127135 LexItem :: At ( "@" . into( ) ) ,
0 commit comments