Skip to content

Commit 476d5a0

Browse files
committed
syntax: Extract prec mod from parser mod
1 parent aa4278a commit 476d5a0

File tree

4 files changed

+52
-40
lines changed

4 files changed

+52
-40
lines changed

src/librustsyntax/parse/parser.rs

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import util::interner;
77
import ast::{node_id, spanned};
88
import ast_util::{mk_sp, ident_to_path};
99
import lexer::reader;
10+
import prec::{op_spec, binop_prec_table, as_prec};
1011

11-
export as_prec;
1212
export expr_requires_semi_to_be_stmt;
1313
export file_type;
1414
export mk_item;
@@ -31,9 +31,7 @@ export parse_pat;
3131
export parse_sess;
3232
export parse_stmt;
3333
export parse_ty;
34-
export prec_table;
3534
export stmt_ends_with_semi;
36-
export unop_prec;
3735

3836
enum restriction {
3937
UNRESTRICTED,
@@ -71,7 +69,7 @@ type parser = @{
7169
mut buffer: [{tok: token::token, span: span}],
7270
mut restriction: restriction,
7371
reader: reader,
74-
precs: @[op_spec],
72+
binop_precs: @[op_spec],
7573
bad_expr_words: hashmap<str, ()>
7674
};
7775

@@ -161,7 +159,7 @@ fn new_parser(sess: parse_sess, cfg: ast::crate_cfg, rdr: reader,
161159
mut buffer: [],
162160
mut restriction: UNRESTRICTED,
163161
reader: rdr,
164-
precs: prec_table(),
162+
binop_precs: binop_prec_table(),
165163
bad_expr_words: bad_expr_word_table()}
166164
}
167165

@@ -1301,49 +1299,19 @@ fn parse_prefix_expr(p: parser) -> pexpr {
13011299
ret mk_pexpr(p, lo, hi, ex);
13021300
}
13031301

1304-
type op_spec = {tok: token::token, op: ast::binop, prec: int};
1305-
1306-
1307-
// FIXME make this a const, don't store it in parser state
1308-
fn prec_table() -> @[op_spec] {
1309-
ret @[{tok: token::BINOP(token::STAR), op: ast::mul, prec: 12},
1310-
{tok: token::BINOP(token::SLASH), op: ast::div, prec: 12},
1311-
{tok: token::BINOP(token::PERCENT), op: ast::rem, prec: 12},
1312-
// 'as' sits between here with 11
1313-
{tok: token::BINOP(token::PLUS), op: ast::add, prec: 10},
1314-
{tok: token::BINOP(token::MINUS), op: ast::subtract, prec: 10},
1315-
{tok: token::BINOP(token::LSL), op: ast::lsl, prec: 9},
1316-
{tok: token::BINOP(token::LSR), op: ast::lsr, prec: 9},
1317-
{tok: token::BINOP(token::ASR), op: ast::asr, prec: 9},
1318-
{tok: token::BINOP(token::AND), op: ast::bitand, prec: 8},
1319-
{tok: token::BINOP(token::CARET), op: ast::bitxor, prec: 7},
1320-
{tok: token::BINOP(token::OR), op: ast::bitor, prec: 6},
1321-
{tok: token::LT, op: ast::lt, prec: 4},
1322-
{tok: token::LE, op: ast::le, prec: 4},
1323-
{tok: token::GE, op: ast::ge, prec: 4},
1324-
{tok: token::GT, op: ast::gt, prec: 4},
1325-
{tok: token::EQEQ, op: ast::eq, prec: 3},
1326-
{tok: token::NE, op: ast::ne, prec: 3},
1327-
{tok: token::ANDAND, op: ast::and, prec: 2},
1328-
{tok: token::OROR, op: ast::or, prec: 1}];
1329-
}
13301302

13311303
fn parse_binops(p: parser) -> @ast::expr {
13321304
ret parse_more_binops(p, parse_prefix_expr(p), 0);
13331305
}
13341306

1335-
const unop_prec: int = 100;
1336-
1337-
const as_prec: int = 11;
1338-
13391307
fn parse_more_binops(p: parser, plhs: pexpr, min_prec: int) ->
13401308
@ast::expr {
13411309
let lhs = to_expr(plhs);
13421310
if expr_is_complete(p, plhs) { ret lhs; }
13431311
let peeked = p.token;
13441312
if peeked == token::BINOP(token::OR) &&
13451313
p.restriction == RESTRICT_NO_BAR_OP { ret lhs; }
1346-
for vec::each(*p.precs) {|cur|
1314+
for vec::each(*p.binop_precs) {|cur|
13471315
if cur.prec > min_prec && cur.tok == peeked {
13481316
p.bump();
13491317
let expr = parse_prefix_expr(p);

src/librustsyntax/parse/prec.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
export as_prec;
2+
export unop_prec;
3+
export binop_prec_table;
4+
export op_spec;
5+
6+
#[doc = "Unary operators have higher precedence than binary"]
7+
const unop_prec: int = 100;
8+
9+
#[doc = "
10+
Precedence of the `as` operator, which is a binary operator
11+
but is not represented in the precedence table.
12+
"]
13+
const as_prec: int = 11;
14+
15+
type op_spec = {tok: token::token, op: ast::binop, prec: int};
16+
17+
// FIXME make this a const, don't store it in parser state
18+
#[doc = "The precedence of binary operators"]
19+
fn binop_prec_table() -> @[op_spec] {
20+
ret @[{tok: token::BINOP(token::STAR), op: ast::mul, prec: 12},
21+
{tok: token::BINOP(token::SLASH), op: ast::div, prec: 12},
22+
{tok: token::BINOP(token::PERCENT), op: ast::rem, prec: 12},
23+
// 'as' sits between here with 11
24+
{tok: token::BINOP(token::PLUS), op: ast::add, prec: 10},
25+
{tok: token::BINOP(token::MINUS), op: ast::subtract, prec: 10},
26+
{tok: token::BINOP(token::LSL), op: ast::lsl, prec: 9},
27+
{tok: token::BINOP(token::LSR), op: ast::lsr, prec: 9},
28+
{tok: token::BINOP(token::ASR), op: ast::asr, prec: 9},
29+
{tok: token::BINOP(token::AND), op: ast::bitand, prec: 8},
30+
{tok: token::BINOP(token::CARET), op: ast::bitxor, prec: 7},
31+
{tok: token::BINOP(token::OR), op: ast::bitor, prec: 6},
32+
{tok: token::LT, op: ast::lt, prec: 4},
33+
{tok: token::LE, op: ast::le, prec: 4},
34+
{tok: token::GE, op: ast::ge, prec: 4},
35+
{tok: token::GT, op: ast::gt, prec: 4},
36+
{tok: token::EQEQ, op: ast::eq, prec: 3},
37+
{tok: token::NE, op: ast::ne, prec: 3},
38+
{tok: token::ANDAND, op: ast::and, prec: 2},
39+
{tok: token::OROR, op: ast::or, prec: 1}];
40+
}

src/librustsyntax/print/pprust.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -934,7 +934,7 @@ fn print_expr(s: ps, &&expr: @ast::expr) {
934934
}
935935
ast::expr_unary(op, expr) {
936936
word(s.s, ast_util::unop_to_str(op));
937-
print_op_maybe_parens(s, expr, parse::parser::unop_prec);
937+
print_op_maybe_parens(s, expr, parse::prec::unop_prec);
938938
}
939939
ast::expr_addr_of(m, expr) {
940940
word(s.s, "&");
@@ -943,7 +943,7 @@ fn print_expr(s: ps, &&expr: @ast::expr) {
943943
}
944944
ast::expr_lit(lit) { print_literal(s, lit); }
945945
ast::expr_cast(expr, ty) {
946-
print_op_maybe_parens(s, expr, parse::parser::as_prec);
946+
print_op_maybe_parens(s, expr, parse::prec::as_prec);
947947
space(s.s);
948948
word_space(s, "as");
949949
print_type(s, ty);
@@ -1488,7 +1488,7 @@ fn print_view_item(s: ps, item: @ast::view_item) {
14881488
// FIXME: The fact that this builds up the table anew for every call is
14891489
// not good. Eventually, table should be a const.
14901490
fn operator_prec(op: ast::binop) -> int {
1491-
for vec::each(*parse::parser::prec_table()) {|spec|
1491+
for vec::each(*parse::prec::binop_prec_table()) {|spec|
14921492
if spec.op == op { ret spec.prec; }
14931493
}
14941494
core::unreachable();
@@ -1497,7 +1497,7 @@ fn operator_prec(op: ast::binop) -> int {
14971497
fn need_parens(expr: @ast::expr, outer_prec: int) -> bool {
14981498
alt expr.node {
14991499
ast::expr_binary(op, _, _) { operator_prec(op) < outer_prec }
1500-
ast::expr_cast(_, _) { parse::parser::as_prec < outer_prec }
1500+
ast::expr_cast(_, _) { parse::prec::as_prec < outer_prec }
15011501
// This may be too conservative in some cases
15021502
ast::expr_assign(_, _) { true }
15031503
ast::expr_move(_, _) { true }

src/librustsyntax/rustsyntax.rc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,12 +26,16 @@ mod parse {
2626
export parser;
2727
export lexer;
2828
export comments;
29+
export prec;
2930

3031
mod eval;
3132
mod lexer;
3233
mod parser;
3334
mod token;
3435
mod comments;
36+
37+
#[doc = "Functions dealing with operator precedence"]
38+
mod prec;
3539
}
3640

3741
mod print {

0 commit comments

Comments
 (0)