rust/src/comp/syntax/parse/token.rs

193 lines
3.8 KiB
Rust
Raw Normal View History

import util::interner;
2011-11-10 10:41:42 -06:00
import std::{int, uint, str};
2010-08-18 13:35:12 -05:00
2011-05-09 16:17:28 -05:00
type str_num = uint;
tag binop {
PLUS;
MINUS;
STAR;
SLASH;
PERCENT;
CARET;
AND;
OR;
LSL;
LSR;
ASR;
}
tag token {
/* Expression-operator symbols. */
EQ;
LT;
LE;
EQEQ;
NE;
GE;
GT;
ANDAND;
OROR;
NOT;
TILDE;
BINOP(binop);
BINOPEQ(binop);
/* Structural symbols */
AT;
DOT;
2011-07-11 18:13:17 -05:00
ELLIPSIS;
COMMA;
SEMI;
COLON;
MOD_SEP;
QUES;
RARROW;
LARROW;
DARROW;
LPAREN;
RPAREN;
LBRACKET;
RBRACKET;
LBRACE;
RBRACE;
POUND;
POUND_LBRACE;
POUND_LT;
/* Literals */
LIT_INT(i64, ast::int_ty);
LIT_UINT(u64, ast::uint_ty);
LIT_FLOAT(str_num, ast::float_ty);
2011-05-09 16:17:28 -05:00
LIT_STR(str_num);
LIT_BOOL(bool);
/* Name components */
IDENT(str_num, bool);
IDX(int);
UNDERSCORE;
2011-05-09 16:17:28 -05:00
BRACEQUOTE(str_num);
EOF;
}
2010-08-18 13:35:12 -05:00
2011-09-02 17:34:58 -05:00
fn binop_to_str(o: binop) -> str {
2011-07-27 07:19:39 -05:00
alt o {
2011-09-02 17:34:58 -05:00
PLUS. { ret "+"; }
MINUS. { ret "-"; }
STAR. { ret "*"; }
SLASH. { ret "/"; }
PERCENT. { ret "%"; }
CARET. { ret "^"; }
AND. { ret "&"; }
OR. { ret "|"; }
LSL. { ret "<<"; }
LSR. { ret ">>"; }
ASR. { ret ">>>"; }
2010-08-20 17:57:59 -05:00
}
}
2011-09-02 17:34:58 -05:00
fn to_str(r: lexer::reader, t: token) -> str {
2011-07-27 07:19:39 -05:00
alt t {
2011-09-02 17:34:58 -05:00
EQ. { ret "="; }
LT. { ret "<"; }
LE. { ret "<="; }
EQEQ. { ret "=="; }
NE. { ret "!="; }
GE. { ret ">="; }
GT. { ret ">"; }
NOT. { ret "!"; }
TILDE. { ret "~"; }
OROR. { ret "||"; }
ANDAND. { ret "&&"; }
2011-07-27 07:19:39 -05:00
BINOP(op) { ret binop_to_str(op); }
2011-09-02 17:34:58 -05:00
BINOPEQ(op) { ret binop_to_str(op) + "="; }
2011-07-27 07:19:39 -05:00
/* Structural symbols */
AT. {
2011-09-02 17:34:58 -05:00
ret "@";
2011-07-27 07:19:39 -05:00
}
2011-09-02 17:34:58 -05:00
DOT. { ret "."; }
ELLIPSIS. { ret "..."; }
COMMA. { ret ","; }
SEMI. { ret ";"; }
COLON. { ret ":"; }
MOD_SEP. { ret "::"; }
QUES. { ret "?"; }
RARROW. { ret "->"; }
LARROW. { ret "<-"; }
DARROW. { ret "<->"; }
LPAREN. { ret "("; }
RPAREN. { ret ")"; }
LBRACKET. { ret "["; }
RBRACKET. { ret "]"; }
LBRACE. { ret "{"; }
RBRACE. { ret "}"; }
POUND. { ret "#"; }
POUND_LBRACE. { ret "#{"; }
POUND_LT. { ret "#<"; }
2011-07-27 07:19:39 -05:00
/* Literals */
LIT_INT(c, ast::ty_char.) {
// FIXME: escape.
let tmp = "'";
str::push_char(tmp, c as char);
str::push_byte(tmp, '\'' as u8);
ret tmp;
}
LIT_INT(i, t) {
ret int::to_str(i as int, 10u) + ast_util::int_ty_to_str(t);
2011-07-27 07:19:39 -05:00
}
LIT_UINT(u, t) {
ret uint::to_str(u as uint, 10u) + ast_util::uint_ty_to_str(t);
2011-07-27 07:19:39 -05:00
}
LIT_FLOAT(s, t) {
ret interner::get::<str>(*r.get_interner(), s) +
ast_util::float_ty_to_str(t);
2011-07-27 07:19:39 -05:00
}
LIT_STR(s) { // FIXME: escape.
2011-09-02 17:34:58 -05:00
ret "\"" + interner::get::<str>(*r.get_interner(), s) + "\"";
2011-07-27 07:19:39 -05:00
}
2011-09-02 17:34:58 -05:00
LIT_BOOL(b) { if b { ret "true"; } else { ret "false"; } }
2011-07-27 07:19:39 -05:00
/* Name components */
IDENT(s, _) {
2011-09-02 17:34:58 -05:00
ret interner::get::<str>(*r.get_interner(), s);
2011-07-27 07:19:39 -05:00
}
2011-09-02 17:34:58 -05:00
IDX(i) { ret "_" + int::to_str(i, 10u); }
UNDERSCORE. { ret "_"; }
BRACEQUOTE(_) { ret "<bracequote>"; }
EOF. { ret "<eof>"; }
}
}
pure fn can_begin_expr(t: token) -> bool {
2011-07-27 07:19:39 -05:00
alt t {
LPAREN. { true }
LBRACE. { true }
LBRACKET. { true }
IDENT(_, _) { true }
UNDERSCORE. { true }
TILDE. { true }
LIT_INT(_, _) { true }
LIT_UINT(_, _) { true }
LIT_FLOAT(_, _) { true }
2011-07-27 07:19:39 -05:00
LIT_STR(_) { true }
POUND. { true }
AT. { true }
NOT. { true }
BINOP(MINUS.) { true }
BINOP(STAR.) { true }
MOD_SEP. { true }
2011-07-27 07:19:39 -05:00
_ { false }
}
}
2010-08-18 13:35:12 -05:00
// Local Variables:
// fill-column: 78;
// indent-tabs-mode: nil
// c-basic-offset: 4
// buffer-file-coding-system: utf-8-unix
// End: