@@ -102,6 +102,22 @@ pub struct Token {
102102 pub literal : String ,
103103}
104104
105+ fn comment ( stream : & mut Stream ) {
106+ stream. advance ( ) ; // move past semicolon character
107+ loop {
108+ if stream. is_end ( ) {
109+ break ;
110+ }
111+
112+ let ( c, _) = stream. peek ( 0 ) . unwrap ( ) ;
113+ if c == '\n' {
114+ break ;
115+ }
116+
117+ stream. advance ( ) ;
118+ }
119+ }
120+
105121fn open_brace ( stream : & mut Stream ) -> Token {
106122 let ( _, p) = stream. take ( ) ;
107123 Token {
@@ -127,15 +143,11 @@ fn identifier(stream: &mut Stream) -> Token {
127143 literal. push ( c) ;
128144
129145 loop {
130- if stream . is_end ( ) {
146+ if is_end_of_nonstring_literal ( stream ) {
131147 break ;
132148 }
133149
134150 let ( c, p) = stream. peek ( 0 ) . unwrap ( ) ;
135- if c. is_whitespace ( ) || c == '(' || c == ')' {
136- break ;
137- }
138-
139151 stream. advance ( ) ;
140152 end = p;
141153 literal. push ( c) ;
@@ -190,14 +202,11 @@ fn number(stream: &mut Stream) -> Result<Token, Error> {
190202 let mut period_ok = true ;
191203
192204 loop {
193- if stream . is_end ( ) {
205+ if is_end_of_nonstring_literal ( stream ) {
194206 break ;
195207 }
196208
197209 let ( c, p) = stream. peek ( 0 ) . unwrap ( ) ;
198- if c. is_whitespace ( ) || c == '(' || c == ')' {
199- break ;
200- }
201210
202211 // Next char must be a digit, or it must be a period and
203212 if !( c. is_digit ( 10 ) || ( c == '.' && period_ok) ) {
@@ -227,6 +236,7 @@ pub fn scan(src: &str) -> Result<Vec<Token>, Error> {
227236 while !stream. is_end ( ) {
228237 let ( c, _) = stream. peek ( 0 ) . unwrap ( ) ;
229238 match c {
239+ ';' => comment ( & mut stream) ,
230240 '(' => tokens. push ( open_brace ( & mut stream) ) ,
231241 ')' => tokens. push ( close_brace ( & mut stream) ) ,
232242 '"' => tokens. push ( string ( & mut stream) ?) ,
@@ -249,6 +259,15 @@ pub fn scan(src: &str) -> Result<Vec<Token>, Error> {
249259 Ok ( tokens)
250260}
251261
262+ fn is_end_of_nonstring_literal ( stream : & mut Stream ) -> bool {
263+ if stream. is_end ( ) {
264+ return true ;
265+ }
266+
267+ let ( c, _) = stream. peek ( 0 ) . unwrap ( ) ;
268+ return c. is_whitespace ( ) || c == '(' || c == ')' || c == ';' ;
269+ }
270+
252271#[ test]
253272fn scan_test ( ) {
254273 assert_eq ! (
@@ -277,16 +296,16 @@ fn scan_test() {
277296 ]
278297 ) ;
279298
280- // newline handling
299+ // newline/comment handling handling
281300 assert_eq ! (
282301 scan(
283302 "
284303a
285- b
304+ b ;comment
286305 c
287306
288- d
289- "
307+ d;comment
308+ ;comment "
290309 )
291310 . unwrap( ) ,
292311 vec![
0 commit comments