rust/src/librustsyntax/parse/token.rs

201 lines
3.9 KiB
Rust
Raw Normal View History

import util::interner;
import util::interner::interner;
2010-08-18 13:35:12 -05:00
2011-05-09 16:17:28 -05:00
type str_num = uint;
2012-01-19 16:24:03 -06:00
enum binop {
2012-01-19 19:56:05 -06:00
PLUS,
MINUS,
STAR,
SLASH,
PERCENT,
CARET,
AND,
OR,
LSL,
LSR,
ASR,
}
2012-01-19 16:24:03 -06:00
enum token {
/* Expression-operator symbols. */
2012-01-19 19:56:05 -06:00
EQ,
LT,
LE,
EQEQ,
NE,
GE,
GT,
ANDAND,
OROR,
NOT,
TILDE,
BINOP(binop),
BINOPEQ(binop),
/* Structural symbols */
2012-01-19 19:56:05 -06:00
AT,
DOT,
ELLIPSIS,
COMMA,
SEMI,
COLON,
MOD_SEP,
RARROW,
LARROW,
DARROW,
LPAREN,
RPAREN,
LBRACKET,
RBRACKET,
LBRACE,
RBRACE,
POUND,
POUND_LBRACE,
POUND_LT,
DOLLAR_LPAREN,
DOLLAR_NUM(uint),
/* Literals */
2012-01-19 19:56:05 -06:00
LIT_INT(i64, ast::int_ty),
LIT_UINT(u64, ast::uint_ty),
LIT_FLOAT(str_num, ast::float_ty),
LIT_STR(str_num),
LIT_BOOL(bool),
/* Name components */
2012-01-19 19:56:05 -06:00
IDENT(str_num, bool),
IDX(int),
UNDERSCORE,
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 {
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
}
}
fn to_str(in: interner<str>, t: token) -> str {
2011-07-27 07:19:39 -05:00
alt t {
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
}
DOT { ret "."; }
ELLIPSIS { ret "..."; }
COMMA { ret ","; }
SEMI { ret ";"; }
COLON { ret ":"; }
MOD_SEP { 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-09-02 17:34:58 -05:00
DOLLAR_LPAREN { ret "$("; }
DOLLAR_NUM(u) {
ret "$" + uint::to_str(u as uint, 10u);
}
2011-07-27 07:19:39 -05:00
/* Literals */
LIT_INT(c, ast::ty_char) {
// FIXME: escape.
let mut tmp = "'";
str::push_char(tmp, c as char);
str::push_char(tmp, '\'');
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>(in, s) +
ast_util::float_ty_to_str(t);
2011-07-27 07:19:39 -05:00
}
LIT_STR(s) { // FIXME: escape.
ret "\"" + interner::get::<str>(in, 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, _) {
ret interner::get::<str>(in, 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 "_"; }
2011-09-02 17:34:58 -05:00
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 }
2011-07-27 07:19:39 -05:00
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 }
BINOP(AND) { 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: