Skip to content

Commit f9b6f97

Browse files
committed
---
yaml --- r: 628 b: refs/heads/master c: cfca901 h: refs/heads/master v: v3
1 parent 3fbbb8a commit f9b6f97

File tree

3 files changed

+165
-61
lines changed

3 files changed

+165
-61
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 47e86a05ae7c76046319e8f326f2e85de1c505b1
2+
refs/heads/master: cfca901cfe0e9671569f0a77274c713b7da6d637

trunk/src/comp/fe/lexer.rs

Lines changed: 120 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -238,16 +238,48 @@ fn consume_any_whitespace(reader rdr) {
238238

239239
fn consume_any_line_comment(reader rdr) {
240240
if (rdr.curr() == '/') {
241-
if (rdr.next() == '/') {
242-
while (rdr.curr() != '\n') {
241+
alt (rdr.next()) {
242+
case ('/') {
243+
while (rdr.curr() != '\n') {
244+
rdr.bump();
245+
}
246+
// Restart whitespace munch.
247+
be consume_any_whitespace(rdr);
248+
}
249+
case ('*') {
243250
rdr.bump();
251+
rdr.bump();
252+
be consume_block_comment(rdr);
253+
}
254+
case (_) {
255+
ret;
244256
}
245-
// Restart whitespace munch.
246-
be consume_any_whitespace(rdr);
247257
}
248258
}
249259
}
250260

261+
262+
fn consume_block_comment(reader rdr) {
263+
let int level = 1;
264+
while (level > 0) {
265+
if (rdr.curr() == '/' && rdr.next() == '*') {
266+
rdr.bump();
267+
rdr.bump();
268+
level += 1;
269+
} else {
270+
if (rdr.curr() == '*' && rdr.next() == '/') {
271+
rdr.bump();
272+
rdr.bump();
273+
level -= 1;
274+
} else {
275+
rdr.bump();
276+
}
277+
}
278+
}
279+
// restart whitespace munch.
280+
be consume_any_whitespace(rdr);
281+
}
282+
251283
fn next_token(reader rdr) -> token.token {
252284
auto accum_str = "";
253285
auto accum_int = 0;
@@ -310,18 +342,19 @@ fn next_token(reader rdr) -> token.token {
310342
}
311343

312344

313-
fn op_or_opeq(reader rdr, token.op op) -> token.token {
345+
fn binop(reader rdr, token.binop op) -> token.token {
314346
rdr.bump();
315347
if (rdr.next() == '=') {
316348
rdr.bump();
317-
ret token.OPEQ(op);
349+
ret token.BINOPEQ(op);
318350
} else {
319-
ret token.OP(op);
351+
ret token.BINOP(op);
320352
}
321353
}
322354

323355
alt (c) {
324356
// One-byte tokens.
357+
case (':') { rdr.bump(); ret token.COLON(); }
325358
case (';') { rdr.bump(); ret token.SEMI(); }
326359
case (',') { rdr.bump(); ret token.COMMA(); }
327360
case ('.') { rdr.bump(); ret token.DOT(); }
@@ -334,16 +367,74 @@ fn next_token(reader rdr) -> token.token {
334367
case ('@') { rdr.bump(); ret token.AT(); }
335368
case ('#') { rdr.bump(); ret token.POUND(); }
336369
case ('_') { rdr.bump(); ret token.UNDERSCORE(); }
370+
case ('~') { rdr.bump(); ret token.TILDE(); }
371+
337372

338373
// Multi-byte tokens.
339374
case ('=') {
340-
if (rdr.next() == '=') {
341-
rdr.bump();
375+
rdr.bump();
376+
if (rdr.curr() == '=') {
342377
rdr.bump();
343-
ret token.OP(token.EQEQ());
378+
ret token.EQEQ();
344379
} else {
380+
ret token.EQ();
381+
}
382+
}
383+
384+
case ('!') {
385+
rdr.bump();
386+
if (rdr.curr() == '=') {
345387
rdr.bump();
346-
ret token.OP(token.EQ());
388+
ret token.NE();
389+
} else {
390+
ret token.NOT();
391+
}
392+
}
393+
394+
case ('<') {
395+
rdr.bump();
396+
alt (rdr.curr()) {
397+
case ('=') {
398+
rdr.bump();
399+
ret token.LE();
400+
}
401+
case ('<') {
402+
ret binop(rdr, token.LSL());
403+
}
404+
case ('-') {
405+
rdr.bump();
406+
ret token.LARROW();
407+
}
408+
case ('|') {
409+
rdr.bump();
410+
ret token.SEND();
411+
}
412+
case (_) {
413+
ret token.LT();
414+
}
415+
}
416+
}
417+
418+
case ('>') {
419+
rdr.bump();
420+
alt (rdr.curr()) {
421+
case ('=') {
422+
rdr.bump();
423+
ret token.GE();
424+
}
425+
426+
case ('>') {
427+
if (rdr.next() == '>') {
428+
rdr.bump();
429+
ret binop(rdr, token.ASR());
430+
} else {
431+
ret binop(rdr, token.LSR());
432+
}
433+
}
434+
435+
case (_) {
436+
ret token.GT();
437+
}
347438
}
348439
}
349440

@@ -426,42 +517,48 @@ fn next_token(reader rdr) -> token.token {
426517
rdr.bump();
427518
ret token.RARROW();
428519
} else {
429-
ret op_or_opeq(rdr, token.MINUS());
520+
ret binop(rdr, token.MINUS());
430521
}
431522
}
432523

433524
case ('&') {
434525
if (rdr.next() == '&') {
435526
rdr.bump();
436527
rdr.bump();
437-
ret token.OP(token.ANDAND());
528+
ret token.ANDAND();
438529
} else {
439-
ret op_or_opeq(rdr, token.AND());
530+
ret binop(rdr, token.AND());
531+
}
532+
}
533+
534+
case ('|') {
535+
if (rdr.next() == '|') {
536+
rdr.bump();
537+
rdr.bump();
538+
ret token.OROR();
539+
} else {
540+
ret binop(rdr, token.OR());
440541
}
441542
}
442543

443544
case ('+') {
444-
ret op_or_opeq(rdr, token.PLUS());
545+
ret binop(rdr, token.PLUS());
445546
}
446547

447548
case ('*') {
448-
ret op_or_opeq(rdr, token.STAR());
549+
ret binop(rdr, token.STAR());
449550
}
450551

451552
case ('/') {
452-
ret op_or_opeq(rdr, token.STAR());
453-
}
454-
455-
case ('!') {
456-
ret op_or_opeq(rdr, token.NOT());
553+
ret binop(rdr, token.STAR());
457554
}
458555

459556
case ('^') {
460-
ret op_or_opeq(rdr, token.CARET());
557+
ret binop(rdr, token.CARET());
461558
}
462559

463560
case ('%') {
464-
ret op_or_opeq(rdr, token.PERCENT());
561+
ret binop(rdr, token.PERCENT());
465562
}
466563

467564
}

trunk/src/comp/fe/token.rs

Lines changed: 44 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,36 @@ import util.common.ty_mach_to_str;
33
import std._int;
44
import std._uint;
55

6-
type op = tag
6+
type binop = tag
77
(PLUS(),
88
MINUS(),
99
STAR(),
1010
SLASH(),
1111
PERCENT(),
12+
CARET(),
13+
AND(),
14+
OR(),
15+
LSL(),
16+
LSR(),
17+
ASR());
18+
19+
type token = tag
20+
(/* Expression-operator symbols. */
1221
EQ(),
1322
LT(),
1423
LE(),
1524
EQEQ(),
1625
NE(),
1726
GE(),
1827
GT(),
19-
NOT(),
20-
TILDE(),
21-
CARET(),
22-
AND(),
2328
ANDAND(),
24-
OR(),
2529
OROR(),
26-
LSL(),
27-
LSR(),
28-
ASR());
30+
NOT(),
31+
TILDE(),
32+
33+
BINOP(binop),
34+
BINOPEQ(binop),
2935

30-
type token = tag
31-
(OP(op),
32-
OPEQ(op),
3336
AS(),
3437
WITH(),
3538

@@ -152,40 +155,44 @@ type token = tag
152155
BRACEQUOTE(str),
153156
EOF());
154157

155-
fn op_to_str(op o) -> str {
158+
fn binop_to_str(binop o) -> str {
156159
alt (o) {
157-
case (PLUS()) { ret "+"; }
158-
case (MINUS()) { ret "-"; }
159-
case (STAR()) { ret "*"; }
160-
case (SLASH()) { ret "/"; }
161-
case (PERCENT()) { ret "%"; }
162-
case (EQ()) { ret "="; }
163-
case (LT()) { ret "<"; }
164-
case (LE()) { ret "<="; }
165-
case (EQEQ()) { ret "=="; }
166-
case (NE()) { ret "!="; }
167-
case (GE()) { ret ">="; }
168-
case (GT()) { ret ">"; }
169-
case (NOT()) { ret "!"; }
170-
case (TILDE()) { ret "~"; }
171-
case (CARET()) { ret "^"; }
172-
case (AND()) { ret "&"; }
173-
case (ANDAND()) { ret "&&"; }
174-
case (OR()) { ret "|"; }
175-
case (OROR()) { ret "||"; }
176-
case (LSL()) { ret "<<"; }
177-
case (LSR()) { ret ">>"; }
178-
case (ASR()) { ret ">>>"; }
160+
case (PLUS()) { ret "+"; }
161+
case (MINUS()) { ret "-"; }
162+
case (STAR()) { ret "*"; }
163+
case (SLASH()) { ret "/"; }
164+
case (PERCENT()) { ret "%"; }
165+
case (CARET()) { ret "^"; }
166+
case (AND()) { ret "&"; }
167+
case (OR()) { ret "|"; }
168+
case (LSL()) { ret "<<"; }
169+
case (LSR()) { ret ">>"; }
170+
case (ASR()) { ret ">>>"; }
179171
}
180172
}
181173
182174
fn to_str(token t) -> str {
183175
alt (t) {
184-
case (OP(op)) { ret op_to_str(op); }
185-
case (OPEQ(op)) { ret op_to_str(op) + "="; }
176+
177+
case (EQ()) { ret "="; }
178+
case (LT()) { ret "<"; }
179+
case (LE()) { ret "<="; }
180+
case (EQEQ()) { ret "=="; }
181+
case (NE()) { ret "!="; }
182+
case (GE()) { ret ">="; }
183+
case (GT()) { ret ">"; }
184+
case (NOT()) { ret "!"; }
185+
case (TILDE()) { ret "~"; }
186+
case (OROR()) { ret "||"; }
187+
case (ANDAND()) { ret "&&"; }
188+
189+
case (BINOP(op)) { ret binop_to_str(op); }
190+
case (BINOPEQ(op)) { ret binop_to_str(op) + "="; }
191+
186192
case (AS()) { ret "as"; }
187193
case (WITH()) { ret "with"; }
188194

195+
189196
/* Structural symbols */
190197
case (AT()) { ret "@"; }
191198
case (DOT()) { ret "."; }

0 commit comments

Comments
 (0)