Skip to content

Commit bcbcbad

Browse files
committed
syntax: Extract some functions into mod common
1 parent 628e80d commit bcbcbad

File tree

4 files changed

+208
-206
lines changed

4 files changed

+208
-206
lines changed

src/librustsyntax/parse/attr.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
import either::{either, left, right};
2-
import parser::{parse_seq,
2+
import common::{parse_seq,
33
seq_sep,
44
expect,
5-
parse_lit,
65
parse_ident,
7-
parse_syntax_ext_naked,
86
spanned};
7+
import parser::{parse_lit,
8+
parse_syntax_ext_naked};
99

1010
export attr_or_ext;
1111
export parse_outer_attributes;

src/librustsyntax/parse/common.rs

Lines changed: 201 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,201 @@
1+
import std::map::{hashmap};
2+
import ast::spanned;
3+
import parser::parser;
4+
5+
fn token_to_str(reader: reader, token: token::token) -> str {
6+
token::to_str(*reader.interner, token)
7+
}
8+
9+
fn unexpected_last(p: parser, t: token::token) -> ! {
10+
p.span_fatal(p.last_span,
11+
"unexpected token: '" + token_to_str(p.reader, t) + "'");
12+
}
13+
14+
fn unexpected(p: parser) -> ! {
15+
p.fatal("unexpected token: '" + token_to_str(p.reader, p.token) + "'");
16+
}
17+
18+
fn expect(p: parser, t: token::token) {
19+
if p.token == t {
20+
p.bump();
21+
} else {
22+
let mut s: str = "expecting '";
23+
s += token_to_str(p.reader, t);
24+
s += "' but found '";
25+
s += token_to_str(p.reader, p.token);
26+
p.fatal(s + "'");
27+
}
28+
}
29+
30+
fn spanned<T: copy>(lo: uint, hi: uint, node: T) -> spanned<T> {
31+
ret {node: node, span: ast_util::mk_sp(lo, hi)};
32+
}
33+
34+
fn parse_ident(p: parser) -> ast::ident {
35+
alt p.token {
36+
token::IDENT(i, _) { p.bump(); ret p.get_str(i); }
37+
_ { p.fatal("expecting ident, found "
38+
+ token_to_str(p.reader, p.token)); }
39+
}
40+
}
41+
42+
fn parse_path_list_ident(p: parser) -> ast::path_list_ident {
43+
let lo = p.span.lo;
44+
let ident = parse_ident(p);
45+
let hi = p.span.hi;
46+
ret spanned(lo, hi, {name: ident, id: p.get_id()});
47+
}
48+
49+
fn parse_value_ident(p: parser) -> ast::ident {
50+
check_bad_word(p);
51+
ret parse_ident(p);
52+
}
53+
54+
fn eat(p: parser, tok: token::token) -> bool {
55+
ret if p.token == tok { p.bump(); true } else { false };
56+
}
57+
58+
// A sanity check that the word we are asking for is a known keyword
59+
fn require_keyword(p: parser, word: str) {
60+
if !p.keywords.contains_key(word) {
61+
p.bug(#fmt("unknown keyword: %s", word));
62+
}
63+
}
64+
65+
fn is_word(p: parser, word: str) -> bool {
66+
require_keyword(p, word);
67+
ret alt p.token {
68+
token::IDENT(sid, false) { str::eq(word, p.get_str(sid)) }
69+
_ { false }
70+
};
71+
}
72+
73+
fn eat_word(p: parser, word: str) -> bool {
74+
require_keyword(p, word);
75+
alt p.token {
76+
token::IDENT(sid, false) {
77+
if str::eq(word, p.get_str(sid)) {
78+
p.bump();
79+
ret true;
80+
} else { ret false; }
81+
}
82+
_ { ret false; }
83+
}
84+
}
85+
86+
fn expect_word(p: parser, word: str) {
87+
require_keyword(p, word);
88+
if !eat_word(p, word) {
89+
p.fatal("expecting " + word + ", found " +
90+
token_to_str(p.reader, p.token));
91+
}
92+
}
93+
94+
fn check_bad_word(p: parser) {
95+
if token::is_bad_expr_word(p.token, p.bad_expr_words,
96+
*p.reader.interner) {
97+
let w = token_to_str(p.reader, p.token);
98+
p.fatal("found " + w + " in expression position");
99+
}
100+
}
101+
102+
fn expect_gt(p: parser) {
103+
if p.token == token::GT {
104+
p.bump();
105+
} else if p.token == token::BINOP(token::LSR) {
106+
p.swap(token::GT, p.span.lo + 1u, p.span.hi);
107+
} else if p.token == token::BINOP(token::ASR) {
108+
p.swap(token::BINOP(token::LSR), p.span.lo + 1u, p.span.hi);
109+
} else {
110+
let mut s: str = "expecting ";
111+
s += token_to_str(p.reader, token::GT);
112+
s += ", found ";
113+
s += token_to_str(p.reader, p.token);
114+
p.fatal(s);
115+
}
116+
}
117+
118+
fn parse_seq_to_before_gt<T: copy>(sep: option<token::token>,
119+
f: fn(parser) -> T,
120+
p: parser) -> [T] {
121+
let mut first = true;
122+
let mut v = [];
123+
while p.token != token::GT && p.token != token::BINOP(token::LSR) &&
124+
p.token != token::BINOP(token::ASR) {
125+
alt sep {
126+
some(t) { if first { first = false; } else { expect(p, t); } }
127+
_ { }
128+
}
129+
v += [f(p)];
130+
}
131+
132+
ret v;
133+
}
134+
135+
fn parse_seq_to_gt<T: copy>(sep: option<token::token>,
136+
f: fn(parser) -> T, p: parser) -> [T] {
137+
let v = parse_seq_to_before_gt(sep, f, p);
138+
expect_gt(p);
139+
140+
ret v;
141+
}
142+
143+
fn parse_seq_lt_gt<T: copy>(sep: option<token::token>,
144+
f: fn(parser) -> T,
145+
p: parser) -> spanned<[T]> {
146+
let lo = p.span.lo;
147+
expect(p, token::LT);
148+
let result = parse_seq_to_before_gt::<T>(sep, f, p);
149+
let hi = p.span.hi;
150+
expect_gt(p);
151+
ret spanned(lo, hi, result);
152+
}
153+
154+
fn parse_seq_to_end<T: copy>(ket: token::token, sep: seq_sep,
155+
f: fn(parser) -> T, p: parser) -> [T] {
156+
let val = parse_seq_to_before_end(ket, sep, f, p);
157+
p.bump();
158+
ret val;
159+
}
160+
161+
type seq_sep = {
162+
sep: option<token::token>,
163+
trailing_opt: bool // is trailing separator optional?
164+
};
165+
166+
fn seq_sep(t: token::token) -> seq_sep {
167+
ret {sep: option::some(t), trailing_opt: false};
168+
}
169+
fn seq_sep_opt(t: token::token) -> seq_sep {
170+
ret {sep: option::some(t), trailing_opt: true};
171+
}
172+
fn seq_sep_none() -> seq_sep {
173+
ret {sep: option::none, trailing_opt: false};
174+
}
175+
176+
fn parse_seq_to_before_end<T: copy>(ket: token::token,
177+
sep: seq_sep,
178+
f: fn(parser) -> T, p: parser) -> [T] {
179+
let mut first: bool = true;
180+
let mut v: [T] = [];
181+
while p.token != ket {
182+
alt sep.sep {
183+
some(t) { if first { first = false; } else { expect(p, t); } }
184+
_ { }
185+
}
186+
if sep.trailing_opt && p.token == ket { break; }
187+
v += [f(p)];
188+
}
189+
ret v;
190+
}
191+
192+
fn parse_seq<T: copy>(bra: token::token, ket: token::token,
193+
sep: seq_sep, f: fn(parser) -> T,
194+
p: parser) -> spanned<[T]> {
195+
let lo = p.span.lo;
196+
expect(p, bra);
197+
let result = parse_seq_to_before_end::<T>(ket, sep, f, p);
198+
let hi = p.span.hi;
199+
p.bump();
200+
ret spanned(lo, hi, result);
201+
}

0 commit comments

Comments
 (0)