提交 2c0cb901 编写于 作者: B Brian Anderson

syntax: Begin moving functions from mod parser to mod classify

上级 d51973a6
// FIXME: There are a bunch of similar functions in pprust that
// likely belong here
fn expr_requires_semi_to_be_stmt(e: @ast::expr) -> bool {
alt e.node {
ast::expr_if(_, _, _) | ast::expr_if_check(_, _, _)
| ast::expr_alt(_, _, _) | ast::expr_block(_)
| ast::expr_do_while(_, _) | ast::expr_while(_, _)
| ast::expr_loop(_) | ast::expr_call(_, _, true) {
false
}
_ { true }
}
}
fn stmt_ends_with_semi(stmt: ast::stmt) -> bool {
alt stmt.node {
ast::stmt_decl(d, _) {
ret alt d.node {
ast::decl_local(_) { true }
ast::decl_item(_) { false }
}
}
ast::stmt_expr(e, _) {
ret expr_requires_semi_to_be_stmt(e);
}
ast::stmt_semi(e, _) {
ret false;
}
}
}
......@@ -9,7 +9,6 @@
import lexer::reader;
import prec::{op_spec, binop_prec_table, as_prec};
export expr_requires_semi_to_be_stmt;
export file_type;
export mk_item;
export next_node_id;
......@@ -31,7 +30,6 @@
export parse_sess;
export parse_stmt;
export parse_ty;
export stmt_ends_with_semi;
enum restriction {
UNRESTRICTED,
......@@ -1776,38 +1774,9 @@ fn check_expected_item(p: parser, current_attrs: [ast::attribute]) {
fn expr_is_complete(p: parser, e: pexpr) -> bool {
log(debug, ("expr_is_complete", p.restriction,
print::pprust::expr_to_str(*e),
expr_requires_semi_to_be_stmt(*e)));
classify::expr_requires_semi_to_be_stmt(*e)));
ret p.restriction == RESTRICT_STMT_EXPR &&
!expr_requires_semi_to_be_stmt(*e);
}
fn expr_requires_semi_to_be_stmt(e: @ast::expr) -> bool {
alt e.node {
ast::expr_if(_, _, _) | ast::expr_if_check(_, _, _)
| ast::expr_alt(_, _, _) | ast::expr_block(_)
| ast::expr_do_while(_, _) | ast::expr_while(_, _)
| ast::expr_loop(_) | ast::expr_call(_, _, true) {
false
}
_ { true }
}
}
fn stmt_ends_with_semi(stmt: ast::stmt) -> bool {
alt stmt.node {
ast::stmt_decl(d, _) {
ret alt d.node {
ast::decl_local(_) { true }
ast::decl_item(_) { false }
}
}
ast::stmt_expr(e, _) {
ret expr_requires_semi_to_be_stmt(e);
}
ast::stmt_semi(e, _) {
ret false;
}
}
!classify::expr_requires_semi_to_be_stmt(*e);
}
fn parse_block(p: parser) -> ast::blk {
......@@ -1890,7 +1859,7 @@ fn parse_block_tail_(p: parser, lo: uint, s: ast::blk_check_mode,
expr = some(e);
}
t {
if stmt_ends_with_semi(*stmt) {
if classify::stmt_ends_with_semi(*stmt) {
p.fatal("expected ';' or '}' after expression but \
found '" + token_to_str(p.reader, t) +
"'");
......@@ -1903,7 +1872,7 @@ fn parse_block_tail_(p: parser, lo: uint, s: ast::blk_check_mode,
_ { // All other kinds of statements:
stmts += [stmt];
if stmt_ends_with_semi(*stmt) {
if classify::stmt_ends_with_semi(*stmt) {
expect(p, token::SEMI);
}
}
......
......@@ -685,7 +685,7 @@ fn print_stmt(s: ps, st: ast::stmt) {
word(s.s, ";");
}
}
if parse::parser::stmt_ends_with_semi(st) { word(s.s, ";"); }
if parse::classify::stmt_ends_with_semi(st) { word(s.s, ";"); }
maybe_print_trailing_comment(s, st.span, none::<uint>);
}
......@@ -1508,7 +1508,7 @@ fn need_parens(expr: @ast::expr, outer_prec: int) -> bool {
ast::expr_assert(_) { true }
ast::expr_check(_, _) { true }
ast::expr_log(_, _, _) { true }
_ { !parse::parser::expr_requires_semi_to_be_stmt(expr) }
_ { !parse::classify::expr_requires_semi_to_be_stmt(expr) }
}
}
......
......@@ -27,6 +27,7 @@ mod parse {
export lexer;
export comments;
export prec;
export classify;
mod eval;
mod lexer;
......@@ -36,6 +37,9 @@ mod parse {
#[doc = "Functions dealing with operator precedence"]
mod prec;
#[doc = "Routines the parser uses to classify AST nodes"]
mod classify;
}
mod print {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册