Skip to content

Commit 8207271

Browse files
committed
add comment handling
1 parent 81068a3 commit 8207271

File tree

1 file changed

+32
-13
lines changed

1 file changed

+32
-13
lines changed

src/lex.rs

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
105121
fn 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]
253272
fn 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
"
284303
a
285-
b
304+
b ;comment
286305
c
287306
288-
d
289-
"
307+
d;comment
308+
;comment"
290309
)
291310
.unwrap(),
292311
vec![

0 commit comments

Comments
 (0)