Skip to content

Commit e7337e3

Browse files
committed
---
yaml --- r: 1149 b: refs/heads/master c: 09ef31c h: refs/heads/master i: 1147: 962dc93 v: v3
1 parent 2a15682 commit e7337e3

File tree

3 files changed

+60
-22
lines changed

3 files changed

+60
-22
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: ad19961c471ebf78f54879e0dace21252aba72d7
2+
refs/heads/master: 09ef31caa0c2eafb113198ad60445e8aebddbf2e

trunk/src/comp/front/ast.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,20 @@ tag def {
3939
type crate = spanned[crate_];
4040
type crate_ = rec(_mod module);
4141

42+
type use_node = spanned[use_node_];
43+
type use_node_ = rec(ident name, vec[@meta_item] metadata);
44+
45+
type import_node = spanned[import_node_];
46+
type import_node_ = rec(vec[ident] identifiers);
47+
48+
tag use_or_import {
49+
use_or_import_use(@use_node);
50+
use_or_import_import(@import_node);
51+
}
52+
53+
type meta_item = spanned[meta_item_];
54+
type meta_item_ = rec(ident name, str value);
55+
4256
type block = spanned[block_];
4357
type block_ = rec(vec[@stmt] stmts,
4458
option.t[@expr] expr,

trunk/src/comp/front/parser.rs

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1533,90 +1533,114 @@ impure fn parse_item(parser p) -> @ast.item {
15331533
fail;
15341534
}
15351535

1536-
impure fn parse_meta_item(parser p) {
1536+
impure fn parse_meta_item(parser p) -> @ast.meta_item {
1537+
auto lo = p.get_span();
1538+
auto hi = lo;
15371539
auto ident = parse_ident(p);
15381540
expect(p, token.EQ);
15391541
alt (p.peek()) {
15401542
case (token.LIT_STR(?s)) {
15411543
p.bump();
1544+
ret @spanned(lo, hi, rec(name = ident, value = s));
15421545
}
15431546
case (_) {
15441547
p.err("Metadata items must be string literals");
15451548
}
15461549
}
1550+
fail;
15471551
}
15481552

1549-
impure fn parse_meta(parser p) {
1553+
impure fn parse_meta(parser p) -> vec[@ast.meta_item] {
15501554
auto pf = parse_meta_item;
1551-
parse_seq[()](token.LPAREN, token.RPAREN, some(token.COMMA), pf, p);
1555+
ret parse_seq[@ast.meta_item](token.LPAREN, token.RPAREN,
1556+
some(token.COMMA), pf, p).node;
15521557
}
15531558

1554-
impure fn parse_optional_meta(parser p) {
1559+
impure fn parse_optional_meta(parser p) -> vec[@ast.meta_item] {
1560+
auto lo = p.get_span();
1561+
auto hi = lo;
15551562
alt (p.peek()) {
15561563
case (token.LPAREN) {
15571564
ret parse_meta(p);
15581565
}
15591566
case (_) {
1560-
ret;
1567+
let vec[@ast.meta_item] v = vec();
1568+
ret v;
15611569
}
15621570
}
15631571
}
15641572

1565-
impure fn parse_rest_import_name(parser p, ast.ident id) {
1573+
impure fn parse_use(parser p) -> @ast.use_node {
1574+
auto lo = p.get_span();
1575+
auto hi = lo;
1576+
expect(p, token.USE);
1577+
auto ident = parse_ident(p);
1578+
auto metadata = parse_optional_meta(p);
1579+
expect(p, token.SEMI);
1580+
ret @spanned(lo, hi, rec(name = ident, metadata = metadata));
1581+
}
1582+
1583+
impure fn parse_rest_import_name(parser p, ast.ident id) -> @ast.import_node {
1584+
auto lo = p.get_span();
1585+
auto hi = lo;
1586+
let vec[ast.ident] identifiers = vec();
1587+
identifiers += id;
15661588
while (p.peek() != token.SEMI) {
15671589
expect(p, token.DOT);
1568-
parse_ident(p);
1590+
auto i = parse_ident(p);
1591+
identifiers += i;
15691592
}
1593+
p.bump();
1594+
ret @spanned(lo, hi, rec(identifiers = identifiers));
15701595
}
15711596

1572-
impure fn parse_full_import_name(parser p) {
1597+
impure fn parse_full_import_name(parser p) -> @ast.import_node {
15731598
alt (p.peek()) {
15741599
case (token.IDENT(?ident)) {
15751600
p.bump();
1576-
parse_rest_import_name(p, ident);
1601+
ret parse_rest_import_name(p, ident);
15771602
}
15781603
case (_) {
15791604
p.err("expecting an identifier");
15801605
}
15811606
}
1607+
fail;
15821608
}
15831609

1584-
impure fn parse_import(parser p) {
1610+
impure fn parse_import(parser p) -> @ast.import_node {
1611+
expect(p, token.IMPORT);
15851612
alt (p.peek()) {
15861613
case (token.IDENT(?ident)) {
15871614
p.bump();
15881615
alt (p.peek()) {
15891616
case (token.EQ) {
15901617
p.bump();
1591-
parse_full_import_name(p);
1618+
ret parse_full_import_name(p);
15921619
}
15931620
case (_) {
1594-
parse_rest_import_name(p, ident);
1621+
ret parse_rest_import_name(p, ident);
15951622
}
15961623
}
15971624
}
15981625
case (_) {
15991626
p.err("expecting an identifier");
16001627
}
16011628
}
1629+
fail;
16021630
}
16031631

1604-
impure fn parse_use_and_imports(parser p) {
1632+
impure fn parse_use_and_imports(parser p) -> vec[ast.use_or_import] {
1633+
let vec[ast.use_or_import] items = vec();
16051634
while (true) {
16061635
alt (p.peek()) {
16071636
case (token.USE) {
1608-
p.bump();
1609-
auto ident = parse_ident(p);
1610-
parse_optional_meta(p);
1611-
expect(p, token.SEMI);
1637+
items += vec(ast.use_or_import_use(parse_use(p)));
16121638
}
16131639
case (token.IMPORT) {
1614-
p.bump();
1615-
parse_import(p);
1616-
expect(p, token.SEMI);
1640+
items += vec(ast.use_or_import_import(parse_import(p)));
16171641
}
16181642
case (_) {
1619-
ret;
1643+
ret items;
16201644
}
16211645
}
16221646
}

0 commit comments

Comments
 (0)