Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
int
Rust
提交
756880a5
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,发现更多精彩内容 >>
提交
756880a5
编写于
11月 24, 2010
作者:
P
Patrick Walton
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
rustc: Parse simple patterns
上级
5d72dae1
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
87 addition
and
0 deletion
+87
-0
src/comp/front/ast.rs
src/comp/front/ast.rs
+10
-0
src/comp/front/parser.rs
src/comp/front/parser.rs
+77
-0
未找到文件。
src/comp/front/ast.rs
浏览文件 @
756880a5
...
...
@@ -39,6 +39,15 @@
type
block_
=
rec
(
vec
[
@
stmt
]
stmts
,
hashmap
[
ident
,
uint
]
index
);
type
pat
=
spanned
[
pat_
];
tag
pat_
{
pat_wild
;
pat_bind
(
ident
);
pat_tag
(
ident
,
vec
[
@
pat
]);
}
type
arm
=
rec
(
@
pat
pat
,
block
block
);
tag
binop
{
add
;
sub
;
...
...
@@ -104,6 +113,7 @@
expr_if
(
@
expr
,
block
,
option
.t
[
block
],
ann
);
expr_while
(
@
expr
,
block
,
ann
);
expr_do_while
(
block
,
@
expr
,
ann
);
expr_alt
(
@
expr
,
vec
[
arm
],
ann
);
expr_block
(
block
,
ann
);
expr_assign
(
@
expr
/* TODO: @expr|is_lval */
,
@
expr
,
ann
);
expr_field
(
@
expr
,
ident
,
ann
);
...
...
src/comp/front/parser.rs
浏览文件 @
756880a5
...
...
@@ -745,6 +745,38 @@ fn spanned[T](&span lo, &span hi, &T node) -> ast.spanned[T] {
ret
@
spanned
(
lo
,
hi
,
ast
.expr_do_while
(
body
,
cond
,
ast
.ann_none
));
}
impure
fn
parse_alt_expr
(
parser
p
)
->
@
ast
.expr
{
auto
lo
=
p
.get_span
();
expect
(
p
,
token
.ALT
);
expect
(
p
,
token
.LPAREN
);
auto
discriminant
=
parse_expr
(
p
);
expect
(
p
,
token
.RPAREN
);
expect
(
p
,
token
.LBRACE
);
let
vec
[
ast
.arm
]
arms
=
vec
();
while
(
p
.peek
()
!=
token
.RBRACE
)
{
alt
(
p
.peek
())
{
case
(
token
.CASE
)
{
p
.bump
();
expect
(
p
,
token
.LPAREN
);
auto
pat
=
parse_pat
(
p
);
expect
(
p
,
token
.RPAREN
);
auto
block
=
parse_block
(
p
);
arms
+=
vec
(
rec
(
pat
=
pat
,
block
=
block
));
}
case
(
token
.RBRACE
)
{
/* empty */
}
case
(
?
tok
)
{
p
.err
(
"expected 'case' or '}' when parsing 'alt' statement "
+
"but found "
+
token
.to_str
(
tok
));
}
}
}
auto
expr
=
ast
.expr_alt
(
discriminant
,
arms
,
ast
.ann_none
);
auto
hi
=
p
.get_span
();
ret
@
spanned
(
lo
,
hi
,
expr
);
}
impure
fn
parse_expr
(
parser
p
)
->
@
ast
.expr
{
alt
(
p
.peek
())
{
case
(
token
.LBRACE
)
{
...
...
@@ -761,6 +793,9 @@ fn spanned[T](&span lo, &span hi, &T node) -> ast.spanned[T] {
case
(
token
.DO
)
{
ret
parse_do_while_expr
(
p
);
}
case
(
token
.ALT
)
{
ret
parse_alt_expr
(
p
);
}
case
(
_
)
{
ret
parse_assign_expr
(
p
);
}
...
...
@@ -777,6 +812,48 @@ fn spanned[T](&span lo, &span hi, &T node) -> ast.spanned[T] {
ret
none
[
@
ast
.expr
];
}
impure
fn
parse_pat
(
parser
p
)
->
@
ast
.pat
{
auto
lo
=
p
.get_span
();
auto
pat
=
ast
.pat_wild
;
// FIXME: typestate bug
alt
(
p
.peek
())
{
case
(
token
.UNDERSCORE
)
{
p
.bump
();
pat
=
ast
.pat_wild
;
}
case
(
token
.QUES
)
{
p
.bump
();
alt
(
p
.peek
())
{
case
(
token
.IDENT
(
?
id
))
{
p
.bump
();
pat
=
ast
.pat_bind
(
id
);
}
case
(
?
tok
)
{
p
.err
(
"expected identifier after '?' in pattern but "
+
"found "
+
token
.to_str
(
tok
));
fail
;
}
}
}
case
(
token
.IDENT
(
?
id
))
{
p
.bump
();
let
vec
[
@
ast
.pat
]
args
;
alt
(
p
.peek
())
{
case
(
token
.LPAREN
)
{
auto
f
=
parse_pat
;
args
=
parse_seq
[
@
ast
.pat
](
token
.LPAREN
,
token
.RPAREN
,
some
(
token
.COMMA
),
f
,
p
)
.node
;
}
case
(
_
)
{
args
=
vec
();
}
}
pat
=
ast
.pat_tag
(
id
,
args
);
}
case
(
?
tok
)
{
p
.err
(
"expected pattern but found "
+
token
.to_str
(
tok
));
fail
;
}
}
auto
hi
=
p
.get_span
();
ret
@
spanned
(
lo
,
hi
,
pat
);
}
impure
fn
parse_let
(
parser
p
)
->
@
ast
.decl
{
auto
lo
=
p
.get_span
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录