Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
d3e75ea3
R
Rust
项目概览
int
/
Rust
接近 1 年 前同步成功
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rust
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d3e75ea3
编写于
9月 04, 2012
作者:
B
Brian Anderson
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Parse 'loop' and 'again' the same
上级
443f7992
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
41 addition
and
22 deletion
+41
-22
src/libsyntax/parse/parser.rs
src/libsyntax/parse/parser.rs
+35
-18
src/libsyntax/print/pprust.rs
src/libsyntax/print/pprust.rs
+3
-1
src/test/run-pass/loop-break-cont.rs
src/test/run-pass/loop-break-cont.rs
+2
-2
src/test/run-pass/weird-exprs.rs
src/test/run-pass/weird-exprs.rs
+1
-1
未找到文件。
src/libsyntax/parse/parser.rs
浏览文件 @
d3e75ea3
...
...
@@ -883,7 +883,7 @@ fn parse_bottom_expr() -> pexpr {
return
pexpr
(
self
.parse_sugary_call_expr
(
~
"do"
,
expr_do_body
));
}
else
if
self
.eat_keyword
(
~
"while"
)
{
return
pexpr
(
self
.parse_while_expr
());
}
else
if
self
.eat_keyword
(
~
"loop"
)
{
}
else
if
self
.eat_keyword
(
~
"
again"
)
||
self
.eat_keyword
(
~
"
loop"
)
{
return
pexpr
(
self
.parse_loop_expr
());
}
else
if
self
.eat_keyword
(
~
"match"
)
{
return
pexpr
(
self
.parse_alt_expr
());
...
...
@@ -969,13 +969,6 @@ fn parse_bottom_expr() -> pexpr {
ex
=
expr_break
(
None
);
}
hi
=
self
.span.hi
;
}
else
if
self
.eat_keyword
(
~
"again"
)
{
if
is_ident
(
self
.token
)
{
ex
=
expr_again
(
Some
(
self
.parse_ident
()));
}
else
{
ex
=
expr_again
(
None
);
}
hi
=
self
.span.hi
;
}
else
if
self
.eat_keyword
(
~
"copy"
)
{
let
e
=
self
.parse_expr
();
ex
=
expr_copy
(
e
);
...
...
@@ -1609,18 +1602,42 @@ fn parse_while_expr() -> @expr {
}
fn
parse_loop_expr
()
->
@
expr
{
let
opt_ident
;
if
is_ident
(
self
.token
)
&&
!
self
.is_any_keyword
(
copy
self
.token
)
{
opt_ident
=
Some
(
self
.parse_ident
());
self
.expect
(
token
::
COLON
);
// loop headers look like 'loop {' or 'loop unsafe {'
let
is_loop_header
=
self
.token
==
token
::
LBRACE
||
(
is_ident
(
copy
self
.token
)
&&
self
.look_ahead
(
1
)
==
token
::
LBRACE
);
// labeled loop headers look like 'loop foo: {'
let
is_labeled_loop_header
=
is_ident
(
self
.token
)
&&
!
self
.is_any_keyword
(
copy
self
.token
)
&&
self
.look_ahead
(
1
)
==
token
::
COLON
;
if
is_loop_header
||
is_labeled_loop_header
{
// This is a loop body
let
opt_ident
;
if
is_labeled_loop_header
{
opt_ident
=
Some
(
self
.parse_ident
());
self
.expect
(
token
::
COLON
);
}
else
{
opt_ident
=
None
;
}
let
lo
=
self
.last_span.lo
;
let
body
=
self
.parse_block_no_value
();
let
mut
hi
=
body
.span.hi
;
return
self
.mk_expr
(
lo
,
hi
,
expr_loop
(
body
,
opt_ident
));
}
else
{
opt_ident
=
None
;
// This is a 'continue' expression
let
lo
=
self
.span.lo
;
let
ex
=
if
is_ident
(
self
.token
)
{
expr_again
(
Some
(
self
.parse_ident
()))
}
else
{
expr_again
(
None
)
};
let
hi
=
self
.span.hi
;
return
self
.mk_expr
(
lo
,
hi
,
ex
);
}
let
lo
=
self
.last_span.lo
;
let
body
=
self
.parse_block_no_value
();
let
mut
hi
=
body
.span.hi
;
return
self
.mk_expr
(
lo
,
hi
,
expr_loop
(
body
,
opt_ident
));
}
// For distingishing between record literals and blocks
...
...
src/libsyntax/print/pprust.rs
浏览文件 @
d3e75ea3
...
...
@@ -883,7 +883,9 @@ fn print_possibly_embedded_block_(s: ps, blk: ast::blk, embedded: embed_type,
// alt, do, & while unambiguously without being parenthesized
fn
print_maybe_parens_discrim
(
s
:
ps
,
e
:
@
ast
::
expr
)
{
let
disambig
=
match
e
.node
{
ast
::
expr_ret
(
None
)
|
ast
::
expr_fail
(
None
)
=>
true
,
ast
::
expr_ret
(
None
)
|
ast
::
expr_fail
(
None
)
|
ast
::
expr_again
(
*
)
=>
true
,
_
=>
false
};
if
disambig
{
popen
(
s
);
}
...
...
src/test/run-pass/loop-break-cont.rs
浏览文件 @
d3e75ea3
...
...
@@ -17,7 +17,7 @@ fn main() {
is_even
=
false
;
i
+=
1u
;
if
i
%
2u
!=
0u
{
again
;
loop
;
}
is_even
=
true
;
}
...
...
@@ -30,7 +30,7 @@ fn main() {
is_even
=
false
;
i
+=
1u
;
if
i
%
2u
!=
0u
{
again
;
loop
;
}
is_even
=
true
;
}
...
...
src/test/run-pass/weird-exprs.rs
浏览文件 @
d3e75ea3
...
...
@@ -59,7 +59,7 @@ fn canttouchthis() -> uint {
fn
angrydome
()
{
loop
{
if
break
{
}
}
let
mut
i
=
0
;
loop
{
i
+=
1
;
if
i
==
1
{
match
again
{
1
=>
{
},
_
=>
fail
~
"wat"
}
}
loop
{
i
+=
1
;
if
i
==
1
{
match
(
again
)
{
1
=>
{
},
_
=>
fail
~
"wat"
}
}
break
;
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录