Skip to content

Commit 4538420

Browse files
committed
---
yaml --- r: 15658 b: refs/heads/try c: 8e15640 h: refs/heads/master v: v3
1 parent 0b4cd38 commit 4538420

File tree

7 files changed

+75
-56
lines changed

7 files changed

+75
-56
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
refs/heads/master: 61b1875c16de39c166b0f4d54bba19f9c6777d1a
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
5-
refs/heads/try: 1f92538e38490725ce7fda7f2b6c4b1f4e9ecea8
5+
refs/heads/try: 8e15640adacd1f0cab8617d62f445024915e5214
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

branches/try/src/librustsyntax/ast_util.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,23 @@ fn is_self(d: ast::def) -> bool {
344344
_ { false }
345345
}
346346
}
347+
348+
#[doc = "Maps a binary operator to its precedence"]
349+
fn operator_prec(op: ast::binop) -> uint {
350+
alt op {
351+
mul | div | rem { 12u }
352+
// 'as' sits between here with 11
353+
add | subtract { 10u }
354+
lsl | lsr | asr { 9u }
355+
bitand { 8u }
356+
bitxor { 7u }
357+
bitor { 6u }
358+
lt | le | ge | gt { 4u }
359+
eq | ne { 3u }
360+
and { 2u }
361+
or { 1u }
362+
}
363+
}
347364
// Local Variables:
348365
// mode: rust
349366
// fill-column: 78;

branches/try/src/librustsyntax/parse.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,6 @@ fn new_parser(sess: parse_sess, cfg: ast::crate_cfg, rdr: lexer::reader,
130130
mut buffer: [],
131131
mut restriction: parser::UNRESTRICTED,
132132
reader: rdr,
133-
binop_precs: prec::binop_prec_table(),
134133
keywords: token::keyword_table(),
135134
restricted_keywords: token::restricted_keyword_table()}
136135
}

branches/try/src/librustsyntax/parse/classify.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*
22
Predicates on exprs and stmts that the pretty-printer and parser use
33
*/
4+
import ast_util::*;
45

56
fn expr_requires_semi_to_be_stmt(e: @ast::expr) -> bool {
67
alt e.node {
@@ -31,14 +32,7 @@ fn stmt_ends_with_semi(stmt: ast::stmt) -> bool {
3132
}
3233
}
3334

34-
fn operator_prec(op: ast::binop) -> int {
35-
for vec::each(*parse::prec::binop_prec_table()) {|spec|
36-
if spec.op == op { ret spec.prec; }
37-
}
38-
core::unreachable();
39-
}
40-
41-
fn need_parens(expr: @ast::expr, outer_prec: int) -> bool {
35+
fn need_parens(expr: @ast::expr, outer_prec: uint) -> bool {
4236
alt expr.node {
4337
ast::expr_binary(op, _, _) { operator_prec(op) < outer_prec }
4438
ast::expr_cast(_, _) { parse::prec::as_prec < outer_prec }

branches/try/src/librustsyntax/parse/parser.rs

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import std::map::{hashmap, str_hash};
44
import token::{can_begin_expr, is_ident, is_plain_ident};
55
import codemap::{span,fss_none};
66
import util::interner;
7-
import ast_util::{spanned, mk_sp, ident_to_path};
7+
import ast_util::{spanned, mk_sp, ident_to_path, operator_prec};
88
import ast::{node_id};
99
import lexer::reader;
10-
import prec::{op_spec, as_prec};
10+
import prec::{as_prec, token_to_binop};
1111
import attr::{parse_outer_attrs_or_ext,
1212
parse_inner_attrs_and_next,
1313
parse_outer_attributes,
@@ -57,7 +57,6 @@ type parser = @{
5757
mut buffer: [{tok: token::token, span: span}],
5858
mut restriction: restriction,
5959
reader: reader,
60-
binop_precs: @[op_spec],
6160
keywords: hashmap<str, ()>,
6261
restricted_keywords: hashmap<str, ()>
6362
};
@@ -1040,26 +1039,31 @@ fn parse_prefix_expr(p: parser) -> pexpr {
10401039

10411040

10421041
fn parse_binops(p: parser) -> @ast::expr {
1043-
ret parse_more_binops(p, parse_prefix_expr(p), 0);
1042+
ret parse_more_binops(p, parse_prefix_expr(p), 0u);
10441043
}
10451044

1046-
fn parse_more_binops(p: parser, plhs: pexpr, min_prec: int) ->
1045+
fn parse_more_binops(p: parser, plhs: pexpr, min_prec: uint) ->
10471046
@ast::expr {
10481047
let lhs = to_expr(plhs);
10491048
if expr_is_complete(p, plhs) { ret lhs; }
10501049
let peeked = p.token;
10511050
if peeked == token::BINOP(token::OR) &&
10521051
p.restriction == RESTRICT_NO_BAR_OP { ret lhs; }
1053-
for vec::each(*p.binop_precs) {|cur|
1054-
if cur.prec > min_prec && cur.tok == peeked {
1055-
p.bump();
1056-
let expr = parse_prefix_expr(p);
1057-
let rhs = parse_more_binops(p, expr, cur.prec);
1058-
p.get_id(); // see ast_util::op_expr_callee_id
1059-
let bin = mk_pexpr(p, lhs.span.lo, rhs.span.hi,
1060-
ast::expr_binary(cur.op, lhs, rhs));
1061-
ret parse_more_binops(p, bin, min_prec);
1062-
}
1052+
let cur_opt = token_to_binop(peeked);
1053+
alt cur_opt {
1054+
some(cur_op) {
1055+
let cur_prec = operator_prec(cur_op);
1056+
if cur_prec > min_prec {
1057+
p.bump();
1058+
let expr = parse_prefix_expr(p);
1059+
let rhs = parse_more_binops(p, expr, cur_prec);
1060+
p.get_id(); // see ast_util::op_expr_callee_id
1061+
let bin = mk_pexpr(p, lhs.span.lo, rhs.span.hi,
1062+
ast::expr_binary(cur_op, lhs, rhs));
1063+
ret parse_more_binops(p, bin, min_prec);
1064+
}
1065+
}
1066+
_ {}
10631067
}
10641068
if as_prec > min_prec && eat_keyword(p, "as") {
10651069
let rhs = parse_ty(p, true);
Lines changed: 33 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,44 @@
11
export as_prec;
22
export unop_prec;
3-
export binop_prec_table;
4-
export op_spec;
3+
export token_to_binop;
4+
5+
import token::*;
6+
import token::token;
7+
import ast::*;
58

69
#[doc = "Unary operators have higher precedence than binary"]
7-
const unop_prec: int = 100;
10+
const unop_prec: uint = 100u;
811

912
#[doc = "
1013
Precedence of the `as` operator, which is a binary operator
1114
but is not represented in the precedence table.
1215
"]
13-
const as_prec: int = 11;
14-
15-
type op_spec = {tok: token::token, op: ast::binop, prec: int};
16+
const as_prec: uint = 11u;
1617

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}];
18+
#[doc = "Maps a token to a record specifying the corresponding binary
19+
operator and its precedence"]
20+
fn token_to_binop(tok: token) -> option<ast::binop> {
21+
alt tok {
22+
BINOP(STAR) { some(mul) }
23+
BINOP(SLASH) { some(div) }
24+
BINOP(PERCENT) { some(rem) }
25+
// 'as' sits between here with 11
26+
BINOP(PLUS) { some(add) }
27+
BINOP(MINUS) { some(subtract) }
28+
BINOP(LSL) { some(lsl) }
29+
BINOP(LSR) { some(lsr) }
30+
BINOP(ASR) { some(asr) }
31+
BINOP(AND) { some(bitand) }
32+
BINOP(CARET) { some(bitxor) }
33+
BINOP(OR) { some(bitor) }
34+
LT { some(lt) }
35+
LE { some(le) }
36+
GE { some(ge) }
37+
GT { some(gt) }
38+
EQEQ { some(eq) }
39+
NE { some(ne) }
40+
ANDAND { some(and) }
41+
OROR { some(or) }
42+
_ { none }
43+
}
4044
}

branches/try/src/librustsyntax/print/pprust.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import pp::{break_offset, word, printer,
66
space, zerobreak, hardbreak, breaks, consistent,
77
inconsistent, eof};
88
import diagnostic;
9+
import ast_util::operator_prec;
910

1011
// The ps is stored here to prevent recursive type.
1112
enum ann_node {
@@ -936,7 +937,7 @@ fn print_expr(s: ps, &&expr: @ast::expr) {
936937
print_op_maybe_parens(s, lhs, prec);
937938
space(s.s);
938939
word_space(s, ast_util::binop_to_str(op));
939-
print_op_maybe_parens(s, rhs, prec + 1);
940+
print_op_maybe_parens(s, rhs, prec + 1u);
940941
}
941942
ast::expr_unary(op, expr) {
942943
word(s.s, ast_util::unop_to_str(op));
@@ -1517,7 +1518,7 @@ fn print_view_item(s: ps, item: @ast::view_item) {
15171518
end(s); // end outer head-block
15181519
}
15191520

1520-
fn print_op_maybe_parens(s: ps, expr: @ast::expr, outer_prec: int) {
1521+
fn print_op_maybe_parens(s: ps, expr: @ast::expr, outer_prec: uint) {
15211522
let add_them = need_parens(expr, outer_prec);
15221523
if add_them { popen(s); }
15231524
print_expr(s, expr);

0 commit comments

Comments
 (0)