Skip to content

Commit c79b977

Browse files
committed
---
yaml --- r: 553 b: refs/heads/master c: 0f224f9 h: refs/heads/master i: 551: 2043d42 v: v3
1 parent 2c813d9 commit c79b977

File tree

5 files changed

+202
-5
lines changed

5 files changed

+202
-5
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: 9fc4fc6692c6684487eb57c6608ee34ab94dd9f5
2+
refs/heads/master: 0f224f977d9edeb7f8ca56c052c1202fab384552

trunk/src/comp/driver/rustc.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ fn write_module() {
1717
llvm.LLVMDisposeModule(llmod);
1818
}
1919

20-
fn main(vec[str] args) -> () {
20+
fn main(vec[str] args) {
2121

2222
log "This is the rust 'self-hosted' compiler.";
2323
log "The one written in rust.";
@@ -30,6 +30,16 @@ fn main(vec[str] args) -> () {
3030
auto p = parser.new_parser(filename);
3131
log "opened file: " + filename;
3232
auto tok = p.peek();
33+
while (true) {
34+
alt (tok) {
35+
case (token.EOF()) { ret; }
36+
case (_) {
37+
log token.to_str(tok);
38+
p.bump();
39+
tok = p.peek();
40+
}
41+
}
42+
}
3343
}
3444
i += 1;
3545
}

trunk/src/comp/fe/lexer.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,36 @@ fn next_token(stdio_reader rdr) -> token.token {
3838

3939
if (c == eof) { ret token.EOF(); }
4040
if (is_alpha(c)) {
41-
accum += (c as u8);
41+
while (is_alpha(c)) {
42+
accum += (c as u8);
43+
c = rdr.getc() as char;
44+
ret token.IDENT(accum);
45+
}
4246
}
47+
48+
if (is_dec_digit(c)) {
49+
if (c == '0') {
50+
} else {
51+
while (is_dec_digit(c)) {
52+
accum += (c as u8);
53+
ret token.LIT_INT(0);
54+
}
55+
}
56+
}
57+
58+
// One-byte structural symbols.
59+
if (c == ';') { ret token.SEMI(); }
60+
if (c == '.') { ret token.DOT(); }
61+
if (c == '(') { ret token.LPAREN(); }
62+
if (c == ')') { ret token.RPAREN(); }
63+
if (c == '{') { ret token.LBRACE(); }
64+
if (c == '}') { ret token.RBRACE(); }
65+
if (c == '[') { ret token.LBRACKET(); }
66+
if (c == ']') { ret token.RBRACKET(); }
67+
if (c == '@') { ret token.AT(); }
68+
if (c == '#') { ret token.POUND(); }
69+
70+
log "lexer stopping at ";
4371
log c;
4472
ret token.EOF();
4573
}

trunk/src/comp/fe/token.rs

Lines changed: 148 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
import util.common.ty_mach;
2+
import util.common.ty_mach_to_str;
3+
import std._int;
4+
import std._uint;
25

36
type op = tag
47
(PLUS(),
@@ -107,10 +110,10 @@ type token = tag
107110

108111
/* Literals */
109112
LIT_INT(int),
110-
LIT_UINT(int),
113+
LIT_UINT(uint),
111114
LIT_MACH_INT(ty_mach, int),
112115
LIT_STR(str),
113-
LIT_CHAR(int),
116+
LIT_CHAR(char),
114117
LIT_BOOL(bool),
115118

116119
/* Name components */
@@ -149,6 +152,149 @@ type token = tag
149152
BRACEQUOTE(str),
150153
EOF());
151154

155+
fn to_str(token t) -> str {
156+
alt (t) {
157+
case (OP(_)) { ret "<op>"; }
158+
case (OPEQ(_)) { ret "<op>="; }
159+
case (AS()) { ret "as"; }
160+
case (WITH()) { ret "with"; }
161+
162+
/* Structural symbols */
163+
case (AT()) { ret "@"; }
164+
case (DOT()) { ret "."; }
165+
case (COMMA()) { ret ","; }
166+
case (SEMI()) { ret ";"; }
167+
case (COLON()) { ret ":"; }
168+
case (RARROW()) { ret "->"; }
169+
case (SEND()) { ret "<|"; }
170+
case (LARROW()) { ret "<-"; }
171+
case (LPAREN()) { ret "("; }
172+
case (RPAREN()) { ret ")"; }
173+
case (LBRACKET()) { ret "["; }
174+
case (RBRACKET()) { ret "]"; }
175+
case (LBRACE()) { ret "{"; }
176+
case (RBRACE()) { ret "}"; }
177+
178+
/* Module and crate keywords */
179+
case (MOD()) { ret "mod"; }
180+
case (USE()) { ret "use"; }
181+
case (AUTH()) { ret "auth"; }
182+
case (META()) { ret "meta"; }
183+
184+
/* Metaprogramming keywords */
185+
case (SYNTAX()) { ret "syntax"; }
186+
case (POUND()) { ret "#"; }
187+
188+
/* Statement keywords */
189+
case (IF()) { ret "if"; }
190+
case (ELSE()) { ret "else"; }
191+
case (DO()) { ret "do"; }
192+
case (WHILE()) { ret "while"; }
193+
case (ALT()) { ret "alt"; }
194+
case (CASE()) { ret "case"; }
195+
196+
case (FAIL()) { ret "fail"; }
197+
case (DROP()) { ret "drop"; }
198+
199+
case (IN()) { ret "in"; }
200+
case (FOR()) { ret "for"; }
201+
case (EACH()) { ret "each"; }
202+
case (PUT()) { ret "put"; }
203+
case (RET()) { ret "ret"; }
204+
case (BE()) { ret "be"; }
205+
206+
/* Type and type-state keywords */
207+
case (TYPE()) { ret "type"; }
208+
case (CHECK()) { ret "check"; }
209+
case (CLAIM()) { ret "claim"; }
210+
case (PROVE()) { ret "prove"; }
211+
212+
/* Effect keywords */
213+
case (IO()) { ret "io"; }
214+
case (STATE()) { ret "state"; }
215+
case (UNSAFE()) { ret "unsafe"; }
216+
217+
/* Type qualifiers */
218+
case (NATIVE()) { ret "native"; }
219+
case (AUTO()) { ret "auto"; }
220+
case (MUTABLE()) { ret "mutable"; }
221+
222+
/* Name management */
223+
case (IMPORT()) { ret "import"; }
224+
case (EXPORT()) { ret "export"; }
225+
226+
/* Value / stmt declarators */
227+
case (LET()) { ret "let"; }
228+
229+
/* Magic runtime services */
230+
case (LOG()) { ret "log"; }
231+
case (SPAWN()) { ret "spawn"; }
232+
case (BIND()) { ret "bind"; }
233+
case (THREAD()) { ret "thread"; }
234+
case (YIELD()) { ret "yield"; }
235+
case (JOIN()) { ret "join"; }
236+
237+
/* Literals */
238+
case (LIT_INT(i)) { ret _int.to_str(i, 10u); }
239+
case (LIT_UINT(u)) { ret _uint.to_str(u, 10u); }
240+
case (LIT_MACH_INT(tm, i)) {
241+
ret _int.to_str(i, 10u)
242+
+ "_" + ty_mach_to_str(tm);
243+
}
244+
245+
case (LIT_STR(s)) {
246+
// FIXME: escape.
247+
ret "\"" + s + "\"";
248+
}
249+
case (LIT_CHAR(c)) {
250+
// FIXME: escape and encode.
251+
auto tmp = "";
252+
tmp += (c as u8);
253+
ret tmp;
254+
}
255+
256+
case (LIT_BOOL(b)) {
257+
if (b) { ret "true"; } else { ret "false"; }
258+
}
259+
260+
/* Name components */
261+
case (IDENT(s)) { ret s; }
262+
case (IDX(i)) { ret "_" + _int.to_str(i, 10u); }
263+
case (UNDERSCORE()) { ret "_"; }
264+
265+
/* Reserved type names */
266+
case (BOOL()) { ret "bool"; }
267+
case (INT()) { ret "int"; }
268+
case (UINT()) { ret "uint"; }
269+
case (FLOAT()) { ret "float"; }
270+
case (CHAR()) { ret "char"; }
271+
case (STR()) { ret "str"; }
272+
case (MACH(tm)) { ret ty_mach_to_str(tm); }
273+
274+
/* Algebraic type constructors */
275+
case (REC()) { ret "rec"; }
276+
case (TUP()) { ret "tup"; }
277+
case (TAG()) { ret "tag"; }
278+
case (VEC()) { ret "vec"; }
279+
case (ANY()) { ret "any"; }
280+
281+
/* Callable type constructors */
282+
case (FN()) { ret "fn"; }
283+
case (ITER()) { ret "iter"; }
284+
285+
/* Object type */
286+
case (OBJ()) { ret "obj"; }
287+
288+
/* Comm and task types */
289+
case (CHAN()) { ret "chan"; }
290+
case (PORT()) { ret "port"; }
291+
case (TASK()) { ret "task"; }
292+
293+
case (BRACEQUOTE(_)) { ret "<bracequote>"; }
294+
case (EOF()) { ret "<eof>"; }
295+
}
296+
}
297+
152298

153299

154300
// Local Variables:

trunk/src/comp/util/common.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,19 @@ type ty_mach = tag( ty_i8(), ty_i16(), ty_i32(), ty_i64(),
33
ty_u8(), ty_u16(), ty_u32(), ty_u64(),
44
ty_f32(), ty_f16() );
55

6+
fn ty_mach_to_str(ty_mach tm) -> str {
7+
alt (tm) {
8+
case (ty_u8()) { ret "u8"; }
9+
case (ty_i8()) { ret "i8"; }
10+
case (ty_u16()) { ret "u16"; }
11+
case (ty_i16()) { ret "i16"; }
12+
case (ty_u32()) { ret "u32"; }
13+
case (ty_i32()) { ret "i32"; }
14+
case (ty_u64()) { ret "u64"; }
15+
case (ty_i64()) { ret "i64"; }
16+
}
17+
}
18+
619
//
720
// Local Variables:
821
// mode: rust

0 commit comments

Comments
 (0)