1use std::collections::HashMap;
2use super::position;
3use super::token::{Token, LOWEST_PREC};
4use super::scanner;
5use super::errors::{ErrorList, FilePosErrors};
6use super::scope::*;
7use super::ast::*;
8use super::objects::*;
9use std::rc::Rc;
10
11#[derive(PartialEq, Eq)]
13enum ParseSimpleMode {
14 Basic,
15 LabelOk,
16 RangeOk,
17}
18
19pub struct Parser<'a> {
20 objects: &'a mut Objects,
21 scanner: scanner::Scanner<'a>,
22 errors: &'a ErrorList,
23
24 trace: bool,
25 indent: isize,
26
27 pos: position::Pos,
28 token: Token,
29
30 sync_pos: position::Pos,
31 sync_count: isize,
32
33 expr_level: isize,
34 in_rhs: bool,
35
36 pkg_scope: Option<ScopeKey>,
37 top_scope: Option<ScopeKey>,
38 unresolved: Vec<IdentKey>,
39 imports: Vec<SpecKey>, label_scope: Option<ScopeKey>,
42 target_stack: Vec<Vec<IdentKey>>,
43}
44
45impl<'a> Parser<'a> {
46 pub fn new(
47 objs: &'a mut Objects,
48 file: &'a mut position::File,
49 el: &'a ErrorList,
50 src: &'a str, trace: bool) -> Parser<'a> {
51 let s = scanner::Scanner::new(file, src, el);
52 let mut p = Parser{
53 objects: objs,
54 scanner: s,
55 errors: el,
56 trace: trace,
57 indent: 0,
58 pos: 0,
59 token: Token::NONE,
60 sync_pos: 0,
61 sync_count: 0,
62 expr_level: 0,
63 in_rhs: false,
64 pkg_scope: None,
65 top_scope: None,
66 unresolved: vec![],
67 imports: vec![],
68 label_scope:None,
69 target_stack: vec![],
70 };
71 p.next(); p
73 }
74
75 pub fn get_errors(&self) -> &ErrorList {
79 self.errors
80 }
81
82 fn open_scope(&mut self) {
86 self.top_scope = Some(new_scope!(self, self.top_scope));
87 }
88
89 fn close_scope(&mut self) {
90 self.top_scope = scope!(self, self.top_scope.unwrap()).outer;
91 }
92
93 fn open_label_scope(&mut self) {
94 self.label_scope =
95 Some(new_scope!(self, self.label_scope));
96 self.target_stack.push(vec![]);
97 }
98
99 fn close_label_scope(&mut self) {
100 let scope = scope!(self, *self.label_scope.as_ref().unwrap());
101 match self.target_stack.pop() {
102 Some(v) => {
103 for i in v {
104 let ident = ident_mut!(self, i);
105 match scope.look_up(&ident.name) {
106 Some(e) => { ident.entity = IdentEntity::Entity(*e); },
107 None => {
108 let s = format!("label {} undefined", ident.name);
109 self.error(self.pos, s);
110 }
111 }
112 }
113 }
114 _ => panic!("invalid target stack.")
115 }
116 self.label_scope = scope!(self, self.label_scope.unwrap()).outer;
117 }
118
119 fn declare(&mut self, decl: DeclObj, data: EntityData, kind: EntityKind,
120 scope_ind: &ScopeKey) {
121 let mut names: Vec<IdentKey> = vec![];
122 let idents = match decl {
123 DeclObj::Field(id) => &(field!(self, id).names),
124 DeclObj::Spec(id) => {
125 match spec!(self, id) {
126 Spec::Value(vs) => &vs.names,
127 Spec::Type(ts) => {names.push(ts.name); &names},
128 Spec::Import(_) => &names,
129 }},
130 DeclObj::FuncDecl(i) => {
131 let func_decl = fn_decl!(self, i);
132 names.push(func_decl.name);
133 &names
134 }
135 DeclObj::LabeledStmt(i) => {
136 let lab_stmt = lab_stmt!(self, i);
137 names.push(lab_stmt.label);
138 &names
139 }
140 DeclObj::AssignStmt(_) => {
141 unreachable!();
142 }
143 DeclObj::NoDecl => &names,
144 };
145 for id in idents.iter() {
146 let mut_ident = ident_mut!(self, *id);
147 let entity = new_entity!(self, kind.clone(),
148 mut_ident.name.clone(), decl.clone(), data.clone());
149 mut_ident.entity = IdentEntity::Entity(entity);
150 let ident = ident!(self, *id);
151 if ident.name != "_" {
152 let scope = scope_mut!(self, *scope_ind);
153 match scope.insert(ident.name.clone(), entity) {
154 Some(prev_decl) => {
155 let p = entity!(self, prev_decl).pos(&self.objects);
156 self.error(ident.pos, format!(
157 "{} redeclared in this block\n\tprevious declaration at {}",
158 ident.name,
159 self.file().position(p)));
160 },
161 _ => {},
162 }
163 }
164 }
165 }
166
167 fn short_var_decl(&mut self, stmt: &Stmt) {
168 let assign = if let Stmt::Assign(idx) = stmt {
172 *idx
173 } else {
174 unreachable!();
175 };
176 let list = &ass_stmt!(self, assign).lhs;
177 let mut n = 0; for expr in list {
179 match expr {
180 Expr::Ident(id) => {
181 let ident = ident_mut!(self, *id);
182 if ident.name != "_" {
183 let top_scope = scope_mut!(self, self.top_scope.unwrap());
184 match top_scope.look_up(&ident.name) {
185 Some(e) => { ident.entity = IdentEntity::Entity(*e); },
186 None => {
187 let entity = new_entity!(self, EntityKind::Var,
188 ident.name.clone(), DeclObj::AssignStmt(assign),
189 EntityData::NoData);
190 top_scope.insert(ident.name.clone(), entity);
191 ident.entity = IdentEntity::Entity(entity);
192 n += 1;
193 },
194 }
195 }
196 },
197 _ => {
198 self.error_expected(expr.pos(&self.objects),
199 "identifier on left side of :=");
200 },
201 }
202 }
203 if n == 0 {
204 self.error_str(list[0].pos(&self.objects),
205 "no new variables on left side of :=")
206 }
207 }
208
209 fn try_resolve(&mut self, x: &Expr, collect_unresolved: bool) {
214 if let Expr::Ident(i) = x {
215 let ident = ident_mut!(self, *i);
216 assert!(ident.entity.is_none(),
217 "identifier already declared or resolved");
218 if ident.name == "_" {
219 return;
220 }
221 let mut s = self.top_scope;
223 loop {
224 match s {
225 Some(sidx) => {
226 let scope = scope!(self, sidx);
227 if let Some(entity) = scope.look_up(&ident.name) {
228 ident.entity = IdentEntity::Entity(*entity);
229 return;
230 }
231 s = scope.outer;
232 },
233 None => {break;},
234 }
235 }
236 if collect_unresolved {
241 ident.entity = IdentEntity::Sentinel;
242 self.unresolved.push(*i);
243 }
244 }
245 }
246
247 fn resolve(&mut self, x: &Expr) {
248 self.try_resolve(x, true)
249 }
250
251 fn file_mut(&mut self) -> &mut position::File {
255 self.scanner.file_mut()
256 }
257
258 fn file(&self) -> &position::File {
259 self.scanner.file()
260 }
261
262 fn print_trace(&self, pos: position::Pos, msg: &str) {
263 if !self.trace {
264 return;
265 }
266 let f = self.file();
267 let p = f.position(pos);
268 let mut buf = format!("{:5}:{:3}:", p.line, p.column);
269 for _ in 0..self.indent {
270 buf.push_str("..");
271 }
272 print!("{}{}\n", buf, msg);
273 }
274
275 fn trace_begin(&mut self, msg: &str) {
276 let mut trace_str = msg.to_string();
277 trace_str.push('(');
278 self.print_trace(self.pos, &trace_str);
279 self.indent += 1;
280 }
281
282 fn trace_end(&mut self) {
283 self.indent -= 1;
284 self.print_trace(self.pos, ")");
285 }
286
287 fn next(&mut self) {
288 loop {
290 let (token, pos) = self.scanner.scan();
291 match token {
292 Token::COMMENT(_) => { self.print_trace(pos, &format!("{}", token));
294 },
295 _ => {
296 self.print_trace(pos, &format!("next: {}", token));
297 self.token = token;
298 self.pos = pos;
299 break;
300 },
301 }
302 }
303 }
304
305 fn error_str(&self, pos: position::Pos, s: &str) {
306 FilePosErrors::new(self.file(), self.errors).parser_add_str(pos, s);
307 }
308
309 fn error(&self, pos: position::Pos, msg: String) {
310 FilePosErrors::new(self.file(), self.errors).parser_add(pos, msg);
311 }
312
313 fn error_expected(&self, pos: position::Pos, msg: &str) {
314 let mut mstr = "expected ".to_string();
315 mstr.push_str(msg);
316 if pos == self.pos {
317 match &self.token {
318 Token::SEMICOLON(real) => if !*real.as_bool() {
319 mstr.push_str(", found newline");
320 },
321 _ => {
322 mstr.push_str(", found ");
323 mstr.push_str(self.token.text());
324 }
325 }
326 }
327 self.error(pos, mstr);
328 }
329
330 fn expect(&mut self, token: &Token) -> position::Pos {
331 let pos = self.pos;
332 if self.token != *token {
333 self.error_expected(pos, &format!("'{}'", token));
334 }
335 self.next();
336 pos
337 }
338
339 fn expect_closing(&mut self, token: &Token, context: &str) -> position::Pos {
342 if let Token::SEMICOLON(real) = token {
343 if !*real.as_bool() {
344 let msg = format!("missing ',' before newline in {}", context);
345 self.error(self.pos, msg);
346 self.next();
347 }
348 }
349 self.expect(token)
350 }
351
352 fn expect_semi(&mut self) {
353 match self.token {
355 Token::RPAREN | Token::RBRACE => {},
356 Token::SEMICOLON(_) => { self.next(); },
357 _ => {
358 if let Token::COMMA = self.token {
359 self.error_expected(self.pos, "';'");
361 self.next();
362 }
363 self.error_expected(self.pos, "';'");
364 self.advance(Token::is_stmt_start);
365 }
366 }
367 }
368
369 fn at_comma(&self, context: &str, follow: &Token) -> bool {
370 if self.token == Token::COMMA {
371 true
372 } else if self.token != *follow {
373 let mut msg = "missing ','".to_string();
374 if let Token::SEMICOLON(real) = &self.token {
375 if !*real.as_bool() {msg.push_str(" before newline");}
376 }
377 msg = format!("{} in {}", msg, context);
378 self.error(self.pos, msg);
379 true
380 } else {
381 false
382 }
383 }
384
385 fn advance(&mut self, to: fn(&Token) -> bool) {
388 while self.token != Token::EOF {
389 self.next();
390 if to(&self.token) {
391 if self.pos == self.sync_pos && self.sync_count < 10 {
399 self.sync_count += 1;
400 break;
401 }
402 if self.pos > self.sync_pos {
403 self.sync_pos = self.pos;
404 self.sync_count = 0;
405 break;
406 }
407 }
413 }
414 }
415
416 fn safe_pos(&self, pos: position::Pos) -> position::Pos {
426 let max = self.file().base() + self.file().size();
427 if pos > max { max } else { pos }
428 }
429
430 fn parse_ident(&mut self) -> IdentKey {
434 let pos = self.pos;
435 let mut name = "_".to_string();
436 if let Token::IDENT(lit) = &self.token {
437 name = lit.as_str().clone();
438 self.next();
439 } else {
440 self.expect(&Token::IDENT("".to_string().into()));
441 }
442 self.objects.idents.insert(Ident{ pos: pos, name: name,
443 entity: IdentEntity::NoEntity})
444 }
445
446 fn parse_ident_list(&mut self) -> Vec<IdentKey> {
447 self.trace_begin("IdentList");
448
449 let mut list = vec![self.parse_ident()];
450 while self.token == Token::COMMA {
451 self.next();
452 list.push(self.parse_ident());
453 }
454
455 self.trace_end();
456 list
457 }
458
459 fn parse_expr_list(&mut self, lhs: bool) -> Vec<Expr> {
462 self.trace_begin("ExpressionList");
463
464 let expr = self.parse_expr(lhs);
465 let mut list = vec![self.check_expr(expr)];
466 while self.token == Token::COMMA {
467 self.next();
468 let expr = self.parse_expr(lhs);
469 list.push(self.check_expr(expr));
470 }
471
472 self.trace_end();
473 list
474 }
475
476 fn parse_lhs_list(&mut self) -> Vec<Expr> {
477 let bak = self.in_rhs;
478 self.in_rhs = false;
479 let list = self.parse_expr_list(true);
480 match self.token {
481 Token::DEFINE => {},
486 Token::COLON => {},
494 _ => {
495 for x in list.iter() {
497 self.resolve(x);
498 }
499 }
500 }
501 self.in_rhs = bak;
502 list
503 }
504
505 fn parse_rhs_list(&mut self) -> Vec<Expr> {
506 let bak = self.in_rhs;
507 self.in_rhs = true;
508 let list = self.parse_expr_list(false);
509 self.in_rhs = bak;
510 list
511 }
512
513 fn parse_type(&mut self) -> Expr {
516 self.trace_begin("Type");
517
518 let typ = self.try_type();
519 let ret = if typ.is_none() {
520 let pos = self.pos;
521 self.error_expected(pos, "type");
522 self.next();
523 Expr::new_bad(pos, self.pos)
524 } else {
525 typ.unwrap()
526 };
527
528 self.trace_end();
529 ret
530 }
531
532 fn parse_type_name(&mut self) -> Expr {
534 self.trace_begin("TypeName");
535
536 let ident = self.parse_ident();
537 let x_ident = Expr::Ident(ident);
538 let ret = if let Token::PERIOD = self.token {
540 self.next();
542 self.resolve(&x_ident);
543 let sel = self.parse_ident();
544 Expr::new_selector(x_ident, sel)
545 } else {
546 x_ident
547 };
548
549 self.trace_end();
550 ret
551 }
552
553 fn parse_array_type(&mut self) -> Expr {
554 self.trace_begin("ArrayType");
555
556 let lpos = self.expect(&Token::LBRACK);
557 self.expr_level += 1;
558 let len = match self.token {
559 Token::ELLIPSIS => {
561 let ell = Expr::new_ellipsis(self.pos, None);
562 self.next();
563 Some(ell)
564 },
565 _ if self.token != Token::RBRACK => {
566 Some(self.parse_rhs())
567 },
568 _ => None,
569 };
570 self.expr_level -= 1;
571 self.expect(&Token::RBRACK);
572 let elt = self.parse_type();
573
574 self.trace_end();
575 Expr::Array(Rc::new(ArrayType{
576 l_brack: lpos, len: len, elt: elt}))
577 }
578
579 fn make_ident_list(&mut self, exprs: &mut Vec<Expr>) -> Vec<IdentKey> {
580 exprs.iter().map(|x| {
581 match x {
582 Expr::Ident(ident) => *ident,
583 _ => {
584 let pos = x.pos(&self.objects);
585 if let Expr::Bad(_) = x {
586 self.error_expected(pos, "identifier")
588 }
589 new_ident!(self, pos, "_".to_string(), IdentEntity::NoEntity)
590 }
591 }
592 }).collect()
593 }
594
595
596 fn parse_field_decl(&mut self, scope: ScopeKey) -> FieldKey {
597 self.trace_begin("FieldDecl");
598
599 let mut list = vec![];
602 loop {
603 list.push(self.parse_var_type(false));
604 if self.token != Token::COMMA {
605 break;
606 }
607 self.next();
608 }
609
610 let mut idents = vec![];
611 let typ = match self.try_var_type(false) {
612 Some(t) => {
613 idents = self.make_ident_list(&mut list);
614 t
615 }
616 None => {
618 let first = &list[0]; if list.len() > 1 {
620 self.error_expected(self.pos, "type");
621 Expr::new_bad(self.pos, self.pos)
622 } else if !Parser::is_type_name(Parser::deref(first)) {
623 self.error_expected(self.pos, "anonymous field");
624 Expr::new_bad(
625 first.pos(&self.objects),
626 self.safe_pos(first.end(&self.objects)))
627 } else {
628 list.into_iter().nth(0).unwrap()
629 }
630 }
631 };
632
633 let token = self.token.clone();
635 let tag = if let Token::STRING(_) = token {
636 let t = Some(Expr::new_basic_lit(self.pos, self.token.clone()));
637 self.next();
638 t
639 } else {
640 None
641 };
642
643 self.expect_semi();
644
645 let to_resolve = typ.clone_ident();
646 let field = new_field!(self, idents, typ, tag);
647 self.declare(DeclObj::Field(field), EntityData::NoData,
648 EntityKind::Var, &scope);
649 if let Some(ident) = to_resolve {
650 self.resolve(&ident);
651 }
652
653 self.trace_end();
654 field
655 }
656
657 fn parse_struct_type(&mut self) -> Expr {
658 self.trace_begin("FieldDecl");
659
660 let stru = self.expect(&Token::STRUCT);
661 let lbrace = self.expect(&Token::LBRACE);
662 let scope = new_scope!(self, None);
663 let mut list = vec![];
664 loop {
665 match &self.token {
666 Token::IDENT(_) | Token::MUL | Token::LPAREN => {
667 list.push(self.parse_field_decl(scope));
668 }
669 _ => {break;}
670 }
671 }
672 let rbrace = self.expect(&Token::RBRACE);
673
674 self.trace_end();
675 Expr::Struct(Rc::new(StructType{
676 struct_pos: stru,
677 fields: FieldList::new(Some(lbrace), list, Some(rbrace)),
678 incomplete: false,
679 }))
680 }
681
682 fn parse_pointer_type(&mut self) -> Expr {
683 self.trace_begin("PointerType");
684
685 let star = self.expect(&Token::MUL);
686 let base = self.parse_type();
687
688 self.trace_end();
689 Expr::Star(Rc::new(StarExpr{star: star, expr: base}))
690 }
691
692 fn try_var_type(&mut self, is_param: bool) -> Option<Expr> {
694 if is_param {
695 if let Token::ELLIPSIS = self.token {
696 let pos = self.pos;
697 self.next();
698 let typ = if let Some(t) = self.try_ident_or_type() {
699 self.resolve(&t);
700 t
701
702 } else {
703 self.error_str(pos, "'...' parameter is missing type");
704 Expr::new_bad(pos, self.pos)
705 };
706 return Some(Expr::new_ellipsis(pos, Some(typ)));
707 }
708 }
709 self.try_ident_or_type()
710 }
711
712 fn parse_var_type(&mut self, is_param: bool) -> Expr {
713 match self.try_var_type(is_param) {
714 Some(typ) => typ,
715 None => {
716 let pos = self.pos;
717 self.error_expected(pos, "type");
718 self.next();
719 Expr::new_bad(pos, self.pos)
720 },
721 }
722 }
723
724 fn parse_parameter_list(&mut self, scope: ScopeKey,
725 ellipsis_ok: bool) -> Vec<FieldKey> {
726 self.trace_begin("ParameterList");
727
728 let mut list = vec![];
731 loop {
732 list.push(self.parse_var_type(ellipsis_ok));
733 if self.token != Token::COMMA {
734 break;
735 }
736 self.next();
737 if self.token == Token::RPAREN {
738 break;
739 }
740 }
741 let mut params = vec![];
742 let typ = self.try_var_type(ellipsis_ok);
743 if let Some(t) = typ {
744 let idents = self.make_ident_list(&mut list);
746 let to_resolve = t.clone_ident();
747 let field = new_field!(self, idents, t, None);
748 params.push(field);
749 self.declare(DeclObj::Field(field), EntityData::NoData,
752 EntityKind::Var, &scope);
753 if let Some(ident) = to_resolve {
754 self.resolve(&ident);
755 }
756 if !self.at_comma("parameter list", &Token::RPAREN) {
757 self.trace_end();
758 return params;
759 }
760 self.next();
761 while self.token != Token::RPAREN && self.token != Token::EOF {
762 let idents = self.parse_ident_list();
763 let t = self.parse_var_type(ellipsis_ok);
764 let to_resolve = t.clone_ident();
765 let field = new_field!(self, idents, t, None);
766 params.push(field);
768 self.declare(DeclObj::Field(field), EntityData::NoData,
771 EntityKind::Var, &scope);
772 if let Some(ident) = to_resolve {
773 self.resolve(&ident);
774 }
775 if !self.at_comma("parameter list", &Token::RPAREN) {
776 break;
777 }
778 self.next();
779 }
780 } else {
781 for typ in list {
783 self.resolve(&typ);
784 params.push(new_field!(self, vec![], typ, None));
785 }
786 }
787 self.trace_end();
788 params
789 }
790
791 fn parse_parameters(&mut self, scope: ScopeKey,
792 ellipsis_ok: bool) -> FieldList {
793 self.trace_begin("Parameters");
794
795 let mut params = vec![];
796 let lparen = Some(self.expect(&Token::LPAREN));
797 if self.token != Token::RPAREN {
798 params = self.parse_parameter_list(scope, ellipsis_ok);
799 }
800 let rparen = Some(self.expect(&Token::RPAREN));
801
802 self.trace_end();
803 FieldList::new(lparen, params, rparen)
804 }
805
806 fn parse_result(&mut self, scope: ScopeKey) -> Option<FieldList> {
807 self.trace_begin("Result");
808
809 let ret = if self.token == Token::LPAREN {
810 Some(self.parse_parameters(scope, false))
811 } else {
812 self.try_type().map(|t|{
813 let field = new_field!(self, vec![], t, None);
814 FieldList::new(None, vec![field], None)
815 })
816 };
817
818 self.trace_end();
819 ret
820 }
821
822 fn parse_signature(&mut self, scope: ScopeKey) -> (FieldList, Option<FieldList>) {
823 self.trace_begin("Signature");
824
825 let params = self.parse_parameters(scope, true);
826 let results = self.parse_result(scope);
827
828 self.trace_end();
829 (params, results)
830 }
831
832 fn parse_func_type(&mut self) -> (FuncType, ScopeKey) {
833 self.trace_begin("FuncType");
834
835 let pos = self.expect(&Token::FUNC);
836 let scope = new_scope!(self, self.top_scope);
837 let (params, results) = self.parse_signature(scope);
838
839 self.trace_end();
840 (FuncType::new(Some(pos), params, results), scope)
841 }
842
843 fn parse_method_spec(&mut self, scope: ScopeKey) -> FieldKey {
845 self.trace_begin("MethodSpec");
846
847 let mut idents = vec![];
848 let mut typ = self.parse_type_name();
849 let ident = typ.try_as_ident();
850 if ident.is_some() && self.token == Token::LPAREN {
851 idents = vec![*ident.unwrap()];
852 let scope = new_scope!(self, self.top_scope);
853 let (params, results) = self.parse_signature(scope);
854 typ = Expr::box_func_type(FuncType::new(None, params, results), &mut self.objects);
855 } else {
856 self.resolve(&typ);
858 }
859 self.expect_semi();
860 let field = new_field!(self, idents, typ, None);
861 self.declare(DeclObj::Field(field), EntityData::NoData, EntityKind::Fun, &scope);
862
863 self.trace_end();
864 field
865 }
866
867 fn parse_interface_type(&mut self) -> InterfaceType {
868 self.trace_begin("InterfaceType");
869
870 let pos = self.expect(&Token::INTERFACE);
871 let lbrace = self.expect(&Token::LBRACE);
872 let scope = new_scope!(self, None);
873 let mut list = vec![];
874 loop {
875 if let Token::IDENT(_) = self.token {} else {break;}
876 list.push(self.parse_method_spec(scope));
877 }
878 let rbrace = self.expect(&Token::RBRACE);
879
880 self.trace_end();
881 InterfaceType{
882 interface: pos,
883 methods: FieldList{
884 openning: Some(lbrace),
885 list: list,
886 closing: Some(rbrace),
887 },
888 incomplete: false,
889 }
890 }
891
892 fn parse_map_type(&mut self) -> MapType {
893 self.trace_begin("MapType");
894
895 let pos = self.expect(&Token::MAP);
896 self.expect(&Token::LBRACK);
897 let key = self.parse_type();
898 self.expect(&Token::RBRACK);
899 let val = self.parse_type();
900
901 self.trace_end();
902 MapType{map: pos, key: key, val: val}
903 }
904
905 fn parse_chan_type(&mut self) -> ChanType {
906 self.trace_begin("ChanType");
907
908 let pos = self.pos;
909 let arrow_pos: position::Pos;
910 let dir: ChanDir;
911 if let Token::CHAN = self.token {
912 self.next();
913 if let Token::ARROW = self.token {
914 arrow_pos = self.pos;
915 self.next();
916 dir = ChanDir::Send;
917 } else {
918 arrow_pos = 0;
919 dir = ChanDir::SendRecv;
920 }
921 } else {
922 arrow_pos = self.expect(&Token::ARROW);
923 self.expect(&Token::CHAN);
924 dir = ChanDir::Recv;
925 }
926 let val = self.parse_type();
927
928 self.trace_end();
929 ChanType{begin: pos, arrow: arrow_pos, dir: dir, val: val}
930 }
931
932 fn try_ident_or_type(&mut self) -> Option<Expr> {
935 match self.token {
936 Token::IDENT(_) => Some(self.parse_type_name()),
937 Token::LBRACK => Some(self.parse_array_type()),
938 Token::STRUCT => Some(self.parse_struct_type()),
939 Token::MUL => Some(self.parse_pointer_type()),
940 Token::FUNC => {
941 let (typ, _) = self.parse_func_type();
942 Some(Expr::box_func_type(typ, &mut self.objects))
943 },
944 Token::INTERFACE => Some(Expr::Interface(Rc::new(
945 self.parse_interface_type()))),
946 Token::MAP => Some(Expr::Map(Rc::new(
947 self.parse_map_type()))),
948 Token::CHAN | Token::ARROW => Some(Expr::Chan(Rc::new(
949 self.parse_chan_type()))),
950 Token::LPAREN => {
951 let lparen = self.pos;
952 self.next();
953 let typ = self.parse_type();
954 let rparen = self.expect(&Token::RPAREN);
955 Some(Expr::Paren(Rc::new(ParenExpr{
956 l_paren: lparen, expr: typ, r_paren: rparen})))
957 }
958 _ => None
959 }
960 }
961
962 fn try_type(&mut self) -> Option<Expr> {
963 if let Some(typ) = self.try_ident_or_type() {
964 self.resolve(&typ);
965 Some(typ)
966 } else {
967 None
968 }
969 }
970
971 fn parse_stmt_list(&mut self) -> Vec<Stmt> {
975 self.trace_begin("Body");
976
977 let mut list = vec![];
978 loop {
979 match self.token {
980 Token::CASE | Token::DEFAULT | Token::RBRACE |
981 Token::EOF => {break;},
982 _ => {},
983 };
984 list.push(self.parse_stmt());
985 }
986
987 self.trace_end();
988 list
989 }
990
991 fn parse_body(&mut self, scope: ScopeKey) -> BlockStmt {
992 self.trace_begin("Body");
993
994 let lbrace = self.expect(&Token::LBRACE);
995 self.top_scope = Some(scope); self.open_label_scope();
997 let list = self.parse_stmt_list();
998 self.close_label_scope();
999 self.close_scope();
1000 let rbrace = self.expect(&Token::RBRACE);
1001
1002 self.trace_end();
1003 BlockStmt::new(lbrace, list, rbrace)
1004 }
1005
1006 fn parse_block_stmt(&mut self) -> BlockStmt {
1007 self.trace_begin("BlockStmt");
1008
1009 let lbrace = self.expect(&Token::LBRACE);
1010 self.open_scope();
1011 let list = self.parse_stmt_list();
1012 self.close_scope();
1013 let rbrace = self.expect(&Token::RBRACE);
1014
1015 self.trace_end();
1016 BlockStmt::new(lbrace, list, rbrace)
1017 }
1018
1019 fn parse_func_type_or_lit(&mut self) -> Expr {
1023 self.trace_begin("BlockStmt");
1024
1025 let (typ, scope) = self.parse_func_type();
1026 let typ_key = self.objects.ftypes.insert(typ);
1027 let ret = if self.token != Token::LBRACE {
1028 Expr::Func(typ_key)
1029 } else {
1030 self.expr_level += 1;
1031 let body = self.parse_body(scope);
1032 self.expr_level -= 1;
1033 Expr::FuncLit(Rc::new(FuncLit{typ: typ_key, body: Rc::new(body)}))
1034 };
1035
1036 self.trace_end();
1037 ret
1038 }
1039
1040 fn parse_operand(&mut self, lhs: bool) -> Expr {
1044 self.trace_begin("Operand");
1045
1046 let ret = match self.token {
1047 Token::IDENT(_) => {
1048 let x = Expr::Ident(self.parse_ident());
1049 if !lhs {self.resolve(&x);}
1050 x
1051 },
1052 Token::INT(_) | Token::FLOAT(_) | Token::IMAG(_) |
1053 Token::CHAR(_) | Token::STRING(_) => {
1054 let x = Expr::new_basic_lit(self.pos, self.token.clone());
1055 self.next();
1056 x
1057 },
1058 Token::LPAREN => {
1059 let lparen = self.pos;
1060 self.next();
1061 self.expr_level += 1;
1062 let x = self.parse_rhs_or_type();
1064 self.expr_level -= 1;
1065 let rparen = self.expect(&Token::RPAREN);
1066 Expr::Paren(Rc::new(ParenExpr{
1067 l_paren: lparen, expr: x, r_paren: rparen}))
1068 },
1069 Token::FUNC => self.parse_func_type_or_lit(),
1070 _ => {
1071 if let Some(typ) = self.try_ident_or_type() {
1072 if let Expr::Ident(_) = typ {
1073 assert!(false, "should only get idents here");
1075 }
1076 typ
1077 } else {
1078 let pos = self.pos;
1079 self.error_expected(pos, "operand");
1080 self.advance(Token::is_stmt_start);
1081 Expr::new_bad(pos, self.pos)
1082 }
1083 }
1084 };
1085
1086 self.trace_end();
1087 ret
1088 }
1089
1090 fn parse_selector(&mut self, x: Expr) -> Expr {
1091 self.trace_begin("Selector");
1092 let sel = self.parse_ident();
1093 self.trace_end();
1094 Expr::Selector(Rc::new(SelectorExpr{
1095 expr: x, sel: sel}))
1096 }
1097
1098 fn parse_type_assertion(&mut self, x: Expr) -> Expr {
1099 self.trace_begin("TypeAssertion");
1100
1101 let lparen = self.expect(&Token::LPAREN);
1102 let typ = if self.token == Token::TYPE {
1103 self.next();
1105 None
1106 } else {
1107 Some(self.parse_type())
1108 };
1109 let rparen = self.expect(&Token::RPAREN);
1110
1111 self.trace_end();
1112 Expr::TypeAssert(Rc::new(TypeAssertExpr{
1113 expr: x, l_paren: lparen, typ: typ, r_paren: rparen}))
1114 }
1115
1116 fn parse_index_or_slice(&mut self, x: Expr) -> Expr {
1117 self.trace_begin("IndexOrSlice");
1118
1119 const N: usize = 3; let lbrack = self.expect(&Token::LBRACK);
1121 self.expr_level += 1;
1122 let mut indices = vec![None, None, None];
1123 let mut colons = vec![0, 0, 0];
1124 let mut ncolons = 0;
1125 if self.token != Token::COLON {
1126 indices[0] = Some(self.parse_rhs());
1127 }
1128 while self.token == Token::COLON && ncolons < N - 1 {
1129 colons[ncolons] = self.pos;
1130 ncolons += 1;
1131 self.next();
1132 match self.token {
1133 Token::COLON | Token::RBRACK | Token::EOF => {},
1134 _ => {indices[ncolons] = Some(self.parse_rhs())},
1135 }
1136 }
1137 self.expr_level -= 1;
1138 let rbrack = self.expect(&Token::RBRACK);
1139 let ret = if ncolons > 0 {
1140 let slice3 = ncolons == 2;
1141 if slice3 { if indices[1].is_none() {
1143 self.error_str(colons[0], "2nd index required in 3-index slice");
1144 indices[1] = Some(Expr::new_bad(colons[0] + 1, colons[1]))
1145 }
1146 if indices[2].is_none() {
1147 self.error_str(colons[1], "3rd index required in 3-index slice");
1148 indices[2] = Some(Expr::new_bad(colons[1] + 1, colons[2]))
1149 }
1150 }
1151 let mut iter = indices.into_iter();
1152 Expr::Slice(Rc::new(SliceExpr{
1153 expr: x,
1154 l_brack: lbrack,
1155 low: iter.next().unwrap(), high: iter.next().unwrap(),
1157 max: iter.next().unwrap(),
1158 slice3: slice3,
1159 r_brack: rbrack,
1160 }))
1161 } else {
1162 if indices[0].is_none() {
1164 self.error_str(lbrack, "expression for index value required");
1165 indices[0] = Some(Expr::new_bad(lbrack + 1, rbrack));
1166 }
1167 let index = indices.into_iter().nth(0).unwrap().unwrap();
1168 Expr::Index(Rc::new(IndexExpr{
1169 expr: x, l_brack: lbrack, index: index, r_brack: rbrack}))
1170 };
1171
1172 self.trace_end();
1173 ret
1174 }
1175
1176 fn parse_call_or_conversion(&mut self, func: Expr) -> Expr {
1177 self.trace_begin("CallOrConversion");
1178
1179 let lparen = self.expect(&Token::LPAREN);
1180 self.expr_level += 1;
1181 let mut list = vec![];
1182 let mut ellipsis: Option<position::Pos> = None;
1183 while self.token != Token::RPAREN && self.token != Token::EOF &&
1184 ellipsis.is_none() {
1185 list.push(self.parse_rhs_or_type());
1187 if self.token == Token::ELLIPSIS {
1188 ellipsis = Some(self.pos);
1189 self.next();
1190 }
1191 if !self.at_comma("argument list", &Token::RPAREN) {
1192 break;
1193 }
1194 self.next();
1195 }
1196 self.expr_level -= 1;
1197 let rparen = self.expect_closing(&Token::RPAREN, "argument list");
1198
1199 self.trace_end();
1200 Expr::Call(Rc::new(CallExpr{
1201 func: func, l_paren: lparen, args: list, ellipsis: ellipsis, r_paren: rparen}))
1202 }
1203
1204 fn parse_value(&mut self, key_ok: bool) -> Expr {
1205 self.trace_begin("Value");
1206
1207 let ret = if self.token == Token::LBRACE {
1208 self.parse_literal_value(None)
1209 } else {
1210 let x0 = self.parse_expr(key_ok);
1227 let x = self.check_expr(x0);
1228 if key_ok {
1229 if self.token == Token::COLON {
1230 self.try_resolve(&x, false)
1235 } else {
1236 self.resolve(&x)
1238 }
1239 }
1240 x
1241 };
1242
1243 self.trace_end();
1244 ret
1245 }
1246
1247 fn parse_element(&mut self) -> Expr {
1248 self.trace_begin("Element");
1249
1250 let x = self.parse_value(true);
1251 let ret = if self.token == Token::COLON {
1252 let colon = self.pos;
1253 self.next();
1254 Expr::KeyValue(Rc::new(KeyValueExpr{
1255 key: x, colon: colon, val: self.parse_value(false) }))
1256 } else {
1257 x
1258 };
1259
1260 self.trace_end();
1261 ret
1262 }
1263
1264 fn parse_element_list(&mut self) -> Vec<Expr> {
1265 self.trace_begin("ElementList");
1266
1267 let mut list = vec![];
1268 while self.token != Token::RBRACE && self.token != Token::EOF {
1269 list.push(self.parse_element());
1270 if !self.at_comma("composite literal", &Token::RBRACE) {
1271 break;
1272 }
1273 self.next();
1274 }
1275
1276 self.trace_end();
1277 list
1278 }
1279
1280 fn parse_literal_value(&mut self, typ: Option<Expr>) -> Expr {
1281 self.trace_begin("LiteralValue");
1282
1283 let lbrace = self.expect(&Token::LBRACE);
1284 self.expr_level += 1;
1285 let elts = if self.token != Token::RBRACE {
1286 self.parse_element_list()
1287 } else {vec![]};
1288 self.expr_level -= 1;
1289 let rbrace = self.expect_closing(&Token::RBRACE, "composite literal");
1290
1291 self.trace_end();
1292 Expr::CompositeLit(Rc::new(CompositeLit{
1293 typ: typ, l_brace: lbrace, elts: elts, r_brace: rbrace, incomplete: false}))
1294 }
1295
1296 fn check_expr(&self, x: Expr) -> Expr {
1298 let unparenx = Parser::unparen(&x);
1299 match unparenx {
1300 Expr::Bad(_) => x,
1301 Expr::Ident(_) => x,
1302 Expr::BasicLit(_) => x,
1303 Expr::FuncLit(_) => x,
1304 Expr::CompositeLit(_) => x,
1305 Expr::Paren(_) => { unreachable!(); },
1306 Expr::Selector(_) => x,
1307 Expr::Index(_) => x,
1308 Expr::Slice(_) => x,
1309 Expr::TypeAssert(_) => x,
1315 Expr::Call(_) => x,
1316 Expr::Star(_) => x,
1317 Expr::Unary(_) => x,
1318 Expr::Binary(_) => x,
1319 _ => {
1320 self.error_expected(self.pos, "expression");
1321 Expr::new_bad(
1322 x.pos(&self.objects),
1323 self.safe_pos(x.end(&self.objects)))
1324 }
1325 }
1326 }
1327
1328 fn is_type_name(x: &Expr) -> bool {
1330 match x {
1331 Expr::Bad(_) | Expr::Ident(_) => true,
1332 Expr::Selector(s) => {
1333 if let Expr::Ident(_) = s.expr {true} else {false}
1334 },
1335 _ => false
1336 }
1337 }
1338
1339 fn is_literal_type(x: &Expr) -> bool {
1341 match x {
1342 Expr::Bad(_) | Expr::Ident(_) | Expr::Array(_) |
1343 Expr::Struct(_) | Expr::Map(_) => true,
1344 Expr::Selector(s) => {
1345 if let Expr::Ident(_) = s.expr {true} else {false}
1346 },
1347 _ => false
1348 }
1349 }
1350
1351 pub fn deref(x: &Expr) -> &Expr {
1352 if let Expr::Star(s) = x {&s.expr} else {x}
1353 }
1354
1355 pub fn unparen(x: &Expr) -> &Expr {
1356 if let Expr::Paren(p) = x {Parser::unparen(&p.expr)} else {x}
1357 }
1358
1359 fn check_expr_or_type(&self, x: Expr) -> Expr {
1362 let unparenx = Parser::unparen(&x);
1363 match unparenx {
1364 Expr::Paren(_) => {unreachable!()},
1365 Expr::Array(array) => {
1366 if let Some(expr) = &array.len {
1367 if let Expr::Ellipsis(ell) = expr {
1368 self.error_str(ell.pos,
1369 "expected array length, found '...'");
1370 return Expr::new_bad(unparenx.pos(&self.objects),
1371 self.safe_pos(unparenx.end(&self.objects)));
1372 }
1373 }
1374 },
1375 _ => {},
1376 }
1377 return x;
1378 }
1379
1380 fn parse_primary_expr(&mut self, mut lhs: bool) -> Expr {
1381 self.trace_begin("PrimaryExpr");
1382
1383 let mut x = self.parse_operand(lhs);
1384 loop {
1385 match self.token {
1386 Token::PERIOD => {
1387 self.next();
1388 if lhs {
1389 self.resolve(&x);
1390 }
1391 match self.token {
1392 Token::IDENT(_) => {
1393 x = self.parse_selector(self.check_expr_or_type(x));
1394 }
1395 Token::LPAREN => {
1396 x = self.parse_type_assertion(self.check_expr(x));
1397 }
1398 _ => {
1399 let pos = self.pos;
1400 self.error_expected(pos, "selector or type assertion");
1401 self.next();
1402 let sel = new_ident!(
1403 self, pos, "_".to_string(), IdentEntity::NoEntity);
1404 x = Expr::new_selector(x, sel);
1405 }
1406 }
1407 }
1408 Token::LBRACK => {
1409 if lhs {
1410 self.resolve(&x);
1411 }
1412 x = self.parse_index_or_slice(self.check_expr(x));
1413 }
1414 Token::LPAREN => {
1415 if lhs {
1416 self.resolve(&x);
1417 }
1418 x = self.parse_call_or_conversion(self.check_expr_or_type(x));
1419 }
1420 Token::LBRACE => {
1421 if Parser::is_literal_type(&x) &&
1422 (self.expr_level >= 0 || !Parser::is_type_name(&x)) {
1423 if lhs {
1424 self.resolve(&x);
1425 }
1426 x = self.parse_literal_value(Some(x));
1427 } else {
1428 break;
1429 }
1430 }
1431 _ => {break;}
1432 }
1433 lhs = false; }
1435
1436 self.trace_end();
1437 x
1438 }
1439
1440 fn parse_unary_expr(&mut self, lhs: bool) -> Expr {
1441 self.trace_begin("UnaryExpr");
1442
1443 let ret = match self.token {
1444 Token::ADD | Token::SUB | Token::NOT | Token::XOR | Token::AND => {
1445 let pos = self.pos;
1446 let op = self.token.clone();
1447 self.next();
1448 let x = self.parse_unary_expr(false);
1449 Expr::new_unary_expr(pos, op, self.check_expr(x))
1450 },
1451 Token::ARROW => {
1452 let mut arrow = self.pos;
1454 self.next();
1455
1456 let mut x = self.parse_unary_expr(false);
1474 if let Expr::Chan(c) = &mut x { let mut ctype = Rc::get_mut(c).unwrap(); let mut dir = ChanDir::Send;
1479 while dir == ChanDir::Send {
1480 if ctype.dir == ChanDir::Recv {
1481 self.error_expected(ctype.arrow, "'chan'")
1483 }
1484 let new_arrow = ctype.arrow;
1485 ctype.begin = arrow;
1486 ctype.arrow = arrow;
1487 arrow = new_arrow;
1488 dir = ctype.dir.clone();
1489 ctype.dir = ChanDir::Recv;
1490 if let Expr::Chan(c) = &mut ctype.val {
1491 ctype = Rc::get_mut(c).unwrap(); } else {
1493 break;
1494 }
1495 }
1496 if dir == ChanDir::Send {
1497 self.error_expected(arrow, "channel type");
1498 }
1499 x
1500 } else {
1501 Expr::new_unary_expr(arrow, Token::ARROW, self.check_expr(x))
1502 }
1503 },
1504 Token::MUL => {
1505 let pos = self.pos;
1507 self.next();
1508 let x = self.parse_unary_expr(false);
1509 Expr::Star(Rc::new(StarExpr{
1510 star: pos, expr: self.check_expr_or_type(x)}))
1511 }
1512 _ => {
1513 self.parse_primary_expr(lhs)
1514 }
1515 };
1516
1517 self.trace_end();
1518 ret
1519 }
1520
1521 fn token_prec(&self) -> (Token, usize) {
1522 let token = if self.in_rhs && self.token == Token::ASSIGN {
1523 Token::EQL
1524 } else {
1525 self.token.clone()
1526 };
1527 let pre = token.precedence();
1528 (token, pre)
1529 }
1530
1531 fn parse_binary_expr(&mut self, lhs: bool, prec1: usize) -> Expr {
1532 self.trace_begin("BinaryExpr");
1533
1534 let mut x = self.parse_unary_expr(lhs);
1535 loop {
1536 let (op, prec) = self.token_prec();
1537 if prec < prec1 {
1538 break;
1539 }
1540 let pos = self.expect(&op);
1541 if lhs {
1542 self.resolve(&x);
1543 }
1544 let y = self.parse_binary_expr(false, prec+1);
1545 x = Expr::Binary(Rc::new(BinaryExpr{
1546 expr_a: x, op_pos: pos, op: op, expr_b: y}))
1547 }
1548
1549 self.trace_end();
1550 x
1551 }
1552
1553 fn parse_expr(&mut self, lhs: bool) -> Expr {
1554 self.trace_begin("Expression");
1555 let x = self.parse_binary_expr(lhs, LOWEST_PREC+1);
1556 self.trace_end();
1557 x
1558 }
1559
1560 fn parse_rhs(&mut self) -> Expr {
1561 let bak = self.in_rhs;
1562 self.in_rhs = true;
1563 let x0 = self.parse_expr(false);
1564 let x1 = self.check_expr(x0);
1565 self.in_rhs = bak;
1566 x1
1567 }
1568
1569 fn parse_rhs_or_type(&mut self) -> Expr {
1570 let bak = self.in_rhs;
1571 self.in_rhs = true;
1572 let mut x = self.parse_expr(false);
1573 x = self.check_expr_or_type(x);
1574 self.in_rhs = bak;
1575 x
1576 }
1577
1578 fn parse_simple_stmt(&mut self, mode: ParseSimpleMode) -> (Stmt, bool) {
1586 self.trace_begin("SimpleStmt");
1587 let ret: Stmt;
1588 let mut is_range = false;
1589
1590 let x = self.parse_lhs_list();
1591 match self.token {
1592 Token::DEFINE | Token::ASSIGN | Token::ADD_ASSIGN | Token::SUB_ASSIGN |
1593 Token::MUL_ASSIGN | Token::QUO_ASSIGN | Token::REM_ASSIGN |
1594 Token::AND_ASSIGN | Token::OR_ASSIGN | Token::XOR_ASSIGN |
1595 Token::SHL_ASSIGN | Token::SHR_ASSIGN | Token::AND_NOT_ASSIGN => {
1596 let (mut pos, token) = (self.pos, self.token.clone());
1598 self.next();
1599 let y: Vec<Expr>;
1600 if mode == ParseSimpleMode::RangeOk && self.token == Token::RANGE &&
1601 (token == Token::DEFINE || token == Token::ASSIGN) {
1602 pos = self.pos;
1603 self.next();
1604 y = vec![Expr::new_unary_expr(pos, Token::RANGE, self.parse_rhs())];
1605 is_range = true;
1606 } else {
1607 y = self.parse_rhs_list();
1608 }
1609 ret = Stmt::new_assign(&mut self.objects, x, pos, token.clone(), y);
1610 if token == Token::DEFINE {
1611 self.short_var_decl(&ret);
1612 }
1613 }
1614 _ => {
1615 if x.len() > 1 {
1616 self.error_expected(x[0].pos(&self.objects), "1 expression");
1617 }
1619 let x0 = x.into_iter().nth(0).unwrap();
1620 ret = match self.token {
1621 Token::COLON => {
1622 let colon = self.pos;
1624 self.next();
1625 let ident = match mode {
1626 ParseSimpleMode::LabelOk => match x0 {
1627 Expr::Ident(ident) => Some(ident),
1628 _ => None
1629 }
1630 _ => None,
1631 };
1632 match ident {
1633 Some(ident) => {
1634 let s = self.parse_stmt();
1645 let ls = LabeledStmt::arena_new(
1646 &mut self.objects, ident, colon, s);
1647 self.declare(
1648 DeclObj::LabeledStmt(ls), EntityData::NoData,
1649 EntityKind::Lbl, &self.label_scope.unwrap());
1650 Stmt::Labeled(ls)
1651 }
1652 None => {
1653 self.error_str(colon, "illegal label declaration");
1654 Stmt::new_bad(x0.pos(&self.objects), colon + 1)
1655 }
1656 }
1657 },
1658 Token::ARROW => {
1659 let arrow = self.pos;
1660 self.next();
1661 let y = self.parse_rhs();
1662 Stmt::Send(Rc::new(SendStmt{chan: x0, arrow: arrow, val: y}))
1663 },
1664 Token::INC | Token::DEC => {
1665 let s = Stmt::IncDec(Rc::new(IncDecStmt{
1666 expr: x0, token_pos: self.pos, token: self.token.clone()}));
1667 self.next();
1668 s
1669 },
1670 _ => {
1671 Stmt::Expr(Box::new(x0))
1672 }
1673 }
1674 }
1675 }
1676
1677 self.trace_end();
1678 (ret, is_range)
1679 }
1680
1681 fn parse_call_expr(&mut self, call_type: &str) -> Option<Expr> {
1682 let x = self.parse_rhs_or_type(); if let Expr::Call(_) = x {
1684 Some(x)
1685 } else {
1686 if !x.is_bad() {
1687 self.error(self.safe_pos(x.end(&self.objects)),
1689 format!("function must be invoked in {} statement", call_type))
1690 }
1691 None
1692 }
1693 }
1694
1695 fn parse_go_stmt(&mut self) -> Stmt {
1696 self.trace_begin("GoStmt");
1697
1698 let pos = self.expect(&Token::GO);
1699 let call = self.parse_call_expr("go");
1700 self.expect_semi();
1701 let ret = match call {
1702 Some(c) => Stmt::Go(Rc::new(GoStmt{go: pos, call: c})),
1703 None => {
1704 Stmt::new_bad(pos, pos + 2) }
1706 };
1707
1708 self.trace_end();
1709 ret
1710 }
1711
1712 fn parse_defer_stmt(&mut self) -> Stmt {
1713 self.trace_begin("DeferStmt");
1714
1715 let pos = self.expect(&Token::DEFER);
1716 let call = self.parse_call_expr("defer");
1717 self.expect_semi();
1718 let ret = match call {
1719 Some(c) => Stmt::Defer(Rc::new(DeferStmt{defer: pos, call: c})),
1720 None => {
1721 Stmt::new_bad(pos, pos + 5) }
1723 };
1724
1725 self.trace_end();
1726 ret
1727 }
1728
1729 fn parse_return_stmt(&mut self) -> Stmt {
1730 self.trace_begin("ReturnStmt");
1731
1732 let pos = self.pos;
1733 self.expect(&Token::RETURN);
1734 let x = match self.token {
1735 Token::SEMICOLON(_) | Token::RBRACE => vec![],
1736 _ => self.parse_rhs_list(),
1737 };
1738
1739 self.trace_end();
1740 Stmt::Return(Rc::new(ReturnStmt{ret: pos, results: x}))
1741 }
1742
1743 fn parse_branch_stmt(&mut self, token: Token) -> Stmt {
1744 self.trace_begin("BranchStmt");
1745
1746 let pos = self.expect(&token);
1747 let mut label = None;
1748 if let Token::IDENT(_) = self.token {
1749 if token != Token::FALLTHROUGH {
1750 let ident = self.parse_ident();
1751 label = Some(ident.clone());
1752 self.target_stack.last_mut().unwrap().push(ident);
1753 }
1754 }
1755 self.expect_semi();
1756
1757 self.trace_end();
1758 Stmt::Branch(Rc::new(BranchStmt{
1759 token_pos: pos, token: token, label: label}))
1760 }
1761
1762 fn make_expr(&self, s: Option<Stmt>, want: &str) -> Option<Expr> {
1763 match s {
1764 Some(stmt) => {
1765 match stmt {
1766 Stmt::Expr(x) => {
1767 Some(self.check_expr(*x))
1768 }
1769 _ => {
1770 let found = if let Stmt::Assign(_) = stmt {
1771 "assignment"
1772 } else {
1773 "simple statement"
1774 };
1775 let extra = "(missing parentheses around composite literal?)";
1776 let stri = format!(
1777 "expected {}, found {} {}", want, found, extra);
1778 let pos = stmt.pos(&self.objects);
1779 self.error(pos, stri);
1780 Some(Expr::new_bad(
1781 pos, self.safe_pos(stmt.end(&self.objects))))
1782 }
1783 }
1784 }
1785 None => None,
1786 }
1787 }
1788
1789 fn parse_if_header(&mut self) -> (Option<Stmt>, Expr) {
1790 if self.token == Token::LBRACE {
1791 self.error_str(self.pos, "missing condition in if statement");
1792 return (None, Expr::new_bad(self.pos, self.pos))
1793 }
1794
1795 let outer = self.expr_level;
1796 self.expr_level = -1;
1797
1798 let mut init = match self.token {
1799 Token::SEMICOLON(_) => None,
1800 _ => {
1801 if self.token == Token::VAR {
1803 self.next();
1804 self.error_str(self.pos,
1805 "var declaration not allowed in 'IF' initializer");
1806 }
1807 Some(self.parse_simple_stmt(ParseSimpleMode::Basic).0)
1808 }
1809 };
1810
1811 let mut semi_real = false;
1812 let mut semi_pos = None;
1813 let cond_stmt = if self.token != Token::LBRACE {
1814 if let Token::SEMICOLON(real) = &self.token {
1815 semi_real = *real.as_ref();
1816 semi_pos = Some(self.pos);
1817 self.next();
1818 } else {
1819 self.expect(&Token::SEMICOLON(true.into()));
1820 }
1821 if self.token != Token::LBRACE {
1822 Some(self.parse_simple_stmt(ParseSimpleMode::Basic).0)
1823 } else {
1824 None
1825 }
1826 } else {
1827 init.take()
1828 };
1829
1830 let cond = if let Some(_) = &cond_stmt {
1831 self.make_expr(cond_stmt, "boolean expression").unwrap()
1832 } else {
1833 if let Some(pos) = semi_pos {
1834 let msg = if semi_real {
1835 "missing condition in if statement"
1836 } else {
1837 "unexpected newline, expecting { after if clause"
1838 };
1839 self.error_str(pos, msg);
1840 }
1841 Expr::new_bad(self.pos, self.pos)
1842 };
1843
1844 self.expr_level = outer;
1845 return (init, cond)
1846 }
1847
1848 fn parse_if_stmt(&mut self) -> Stmt {
1849 self.trace_begin("IfStmt");
1850
1851 let pos = self.expect(&Token::IF);
1852 self.open_scope();
1853 let (init, cond) = self.parse_if_header();
1854 let body = self.parse_block_stmt();
1855 let els = if self.token == Token::ELSE {
1856 self.next();
1857 match self.token {
1858 Token::IF => Some(self.parse_if_stmt()),
1859 Token::LBRACE => {
1860 let block = self.parse_block_stmt();
1861 self.expect_semi();
1862 Some(Stmt::box_block(block))
1863 }
1864 _ => {
1865 self.error_expected(self.pos, "if statement or block");
1866 Some(Stmt::new_bad(self.pos, self.pos))
1867 }
1868 }
1869 } else {
1870 self.expect_semi();
1871 None
1872 };
1873
1874 self.close_scope();
1875 self.trace_end();
1876 Stmt::If(Rc::new(IfStmt{
1877 if_pos: pos, init: init, cond: cond, body: Rc::new(body), els: els}))
1878 }
1879
1880 fn parse_type_list(&mut self) -> Vec<Expr> {
1881 self.trace_begin("TypeList");
1882
1883 let mut list = vec![self.parse_type()];
1884 while self.token == Token::COMMA {
1885 self.next();
1886 list.push(self.parse_type());
1887 }
1888
1889 self.trace_end();
1890 list
1891 }
1892
1893 fn parse_case_clause(&mut self, type_switch: bool) -> CaseClause {
1894 self.trace_begin("CaseClause");
1895
1896 let pos = self.pos;
1897 let list = match self.token {
1898 Token::CASE => {
1899 self.next();
1900 if type_switch {
1901 Some(self.parse_type_list())
1902 } else {
1903 Some(self.parse_rhs_list())
1904 }
1905 }
1906 _ => {
1907 self.expect(&Token::DEFAULT);
1908 None
1909 }
1910 };
1911
1912 let colon = self.expect(&Token::COLON);
1913 self.open_scope();
1914 let body = self.parse_stmt_list();
1915 self.close_scope();
1916
1917 self.trace_end();
1918 CaseClause{case: pos, list: list, colon: colon, body: body}
1919 }
1920
1921 fn is_type_switch_guard(&self, s: &Option<Stmt>) -> bool {
1922 match s {
1923 Some(stmt) => match stmt {
1924 Stmt::Expr(x) => x.is_type_switch_assert(),
1925 Stmt::Assign(idx) => {
1926 let ass = &ass_stmt!(self, *idx);
1927 if ass.lhs.len() == 1 && ass.rhs.len() == 1 &&
1928 ass.rhs[0].is_type_switch_assert() {
1929 match ass.token {
1930 Token::ASSIGN => {
1931 let s = "expected ':=', found '='";
1933 self.error_str(ass.token_pos, s);
1934 true
1935 },
1936 Token::DEFINE => true,
1937 _ => false,
1938 }
1939 } else {
1940 false
1941 }
1942 }
1943 _ => false
1944 }
1945 None => false
1946 }
1947 }
1948
1949 fn parse_switch_stmt(&mut self) -> Stmt {
1950 self.trace_begin("SwitchStmt");
1951
1952 let pos = self.expect(&Token::SWITCH);
1953 self.open_scope();
1954
1955 let (mut s1, mut s2) = (None, None);
1956 if self.token != Token::LBRACE {
1957 let bak_lev = self.expr_level;
1958 self.expr_level = -1;
1959 if let Token::SEMICOLON(_) = self.token {} else {
1960 s2 = Some(self.parse_simple_stmt(ParseSimpleMode::Basic).0);
1961 }
1962 if let Token::SEMICOLON(_) = self.token {
1963 self.next();
1964 s1 = s2.take();
1965 if self.token != Token::LBRACE {
1966 self.open_scope();
1979 s2 = Some(self.parse_simple_stmt(ParseSimpleMode::Basic).0);
1980 self.close_scope();
1981 }
1982 }
1983 self.expr_level = bak_lev;
1984 }
1985
1986 let type_switch = self.is_type_switch_guard(&s2);
1987 let lbrace = self.expect(&Token::LBRACE);
1988 let mut list = vec![];
1989 while self.token == Token::CASE || self.token == Token::DEFAULT {
1990 let clause = self.parse_case_clause(type_switch);
1991 list.push(Stmt::Case(Rc::new(clause)));
1992 }
1993 let rbrace = self.expect(&Token::RBRACE);
1994 self.expect_semi();
1995 let body = BlockStmt{l_brace: lbrace, list: list, r_brace: rbrace};
1996 let ret = if type_switch {
1997 Stmt::TypeSwitch(Rc::new(TypeSwitchStmt{
1998 switch: pos, init: s1, assign: s2.unwrap(), body: Rc::new(body)}))
1999 } else {
2000 Stmt::Switch(Rc::new(SwitchStmt{
2001 switch: pos, init: s1,
2002 tag: self.make_expr(s2, "switch expression"),
2003 body: Rc::new(body)}))
2004 };
2005
2006 self.close_scope();
2007 self.trace_end();
2008 ret
2009 }
2010
2011 fn parse_comm_clause(&mut self) -> CommClause {
2012 self.trace_begin("CommClause");
2013 self.open_scope();
2014
2015 let pos = self.pos;
2016 let comm = if self.token == Token::CASE {
2017 self.next();
2018 let mut lhs = self.parse_lhs_list();
2019 let tk = self.token.clone();
2020 if self.token == Token::ARROW {
2021 if lhs.len() > 1 {
2023 self.error_expected(lhs[0].pos(&self.objects), "1 expression");
2024 }
2026 let arrow = self.pos;
2027 self.next();
2028 let rhs = self.parse_rhs();
2029 Some(Stmt::Send(Rc::new(SendStmt{
2030 chan: lhs.into_iter().nth(0).unwrap(), arrow: arrow, val: rhs})))
2031 } else {
2032 if tk == Token::ASSIGN || tk == Token::DEFINE {
2034 if lhs.len() > 2 {
2036 self.error_expected(lhs[0].pos(&self.objects),
2037 "1 or 2 expressions");
2038 lhs.truncate(2);
2039 }
2040 let pos = self.pos;
2041 self.next();
2042 let rhs = self.parse_rhs();
2043 let ass = Stmt::new_assign(
2044 &mut self.objects, lhs, pos, tk.clone(), vec![rhs]);
2045 if tk == Token::DEFINE {
2046 self.short_var_decl(&ass);
2047 }
2048 Some(ass)
2049 } else {
2050 if lhs.len() > 1 {
2051 self.error_expected(lhs[0].pos(&self.objects), "1 expression");
2052 }
2054 Some(Stmt::Expr(Box::new(lhs.into_iter().nth(0).unwrap())))
2055 }
2056 }
2057 } else {
2058 self.expect(&Token::DEFAULT);
2059 None
2060 };
2061 let colon = self.expect(&Token::COLON);
2062 let body = self.parse_stmt_list();
2063
2064 self.close_scope();
2065 self.trace_end();
2066 CommClause{case: pos, comm: comm, colon: colon, body: body}
2067 }
2068
2069 fn parse_select_stmt(&mut self) -> Stmt {
2070 self.trace_begin("SelectStmt");
2071
2072 let pos = self.expect(&Token::SELECT);
2073 let lbrace = self.expect(&Token::LBRACE);
2074 let mut list = vec![];
2075 while self.token == Token::CASE || self.token == Token::DEFAULT {
2076 list.push(Stmt::Comm(Rc::new(self.parse_comm_clause())));
2077 }
2078 let rbrace = self.expect(&Token::RBRACE);
2079 self.expect_semi();
2080 let body = BlockStmt{l_brace: lbrace, list: list, r_brace: rbrace};
2081
2082 self.trace_end();
2083 Stmt::Select(Rc::new(SelectStmt{select: pos, body: Rc::new(body)}))
2084 }
2085
2086 fn parse_for_stmt(&mut self) -> Stmt {
2087 self.trace_begin("ForStmt");
2088 let pos = self.expect(&Token::FOR);
2089 self.open_scope();
2090
2091 let (mut s1, mut s2, mut s3) = (None, None, None);
2092 let mut is_range = false;
2093 if self.token != Token::LBRACE {
2094 let bak_lev = self.expr_level;
2095 self.expr_level = -1;
2096 match self.token {
2097 Token::RANGE => {
2098 let pos = self.pos;
2100 self.next();
2101 let unary = Expr::new_unary_expr(
2102 pos, Token::RANGE, self.parse_rhs());
2103 s2 = Some(Stmt::new_assign(
2104 &mut self.objects, vec![], 0, Token::NONE, vec![unary]));
2105 is_range = true;
2106 },
2107 Token::SEMICOLON(_) => {},
2108 _ => {
2109 let ss = self.parse_simple_stmt(ParseSimpleMode::RangeOk);
2110 s2 = Some(ss.0);
2111 is_range = ss.1;
2112 }
2113 }
2114 if !is_range {
2115 if let Token::SEMICOLON(_) = self.token {
2116 self.next();
2117 s1 = s2.take();
2118 if let Token::SEMICOLON(_) = self.token {} else {
2119 s2 = Some(self.parse_simple_stmt(ParseSimpleMode::Basic).0);
2120 }
2121 self.expect_semi();
2122 if self.token != Token::LBRACE {
2123 s3 = Some(self.parse_simple_stmt(ParseSimpleMode::Basic).0);
2124 }
2125 }
2126 }
2127 self.expr_level = bak_lev;
2128 }
2129
2130 let body = self.parse_block_stmt();
2131 self.expect_semi();
2132
2133 let ret = if is_range {
2134 if let Stmt::Assign(idx) = s2.unwrap() {
2135 let mut ass = self.objects.a_stmts.remove(idx).unwrap();
2138 let (key, val) = match ass.lhs.len() {
2139 0 => (None, None),
2140 1 => (Some(ass.lhs.remove(0)), None),
2141 2 => {
2142 let lhs1 = ass.lhs.remove(1);
2143 let lhs0 = ass.lhs.remove(0);
2144 (Some(lhs0), Some(lhs1))
2145 },
2146 _ => {
2147 let pos = ass.lhs.remove(0).pos(&self.objects);
2148 self.error_expected(pos, "at most 2 expressions");
2149 (None, None)
2150 }
2151 };
2152 if let Expr::Unary(unary) = ass.rhs.remove(0) {
2155 Stmt::Range(Rc::new(RangeStmt{
2156 for_pos: pos,
2157 key: key,
2158 val: val,
2159 token_pos: ass.token_pos,
2160 token: ass.token,
2161 expr: unary.expr.clone(),
2162 body: Rc::new(body),
2163 }))
2164 } else {
2165 unreachable!();
2166 }
2167 } else {
2168 unreachable!();
2169 }
2170 } else {
2171 Stmt::For(Rc::new(ForStmt{
2172 for_pos: pos,
2173 init: s1,
2174 cond: self.make_expr(s2, "boolean or range expression"),
2175 post: s3,
2176 body: Rc::new(body),
2177 }))
2178 };
2179
2180 self.close_scope();
2181 self.trace_end();
2182 ret
2183 }
2184
2185 fn parse_stmt(&mut self) -> Stmt {
2186 self.trace_begin("Statement");
2187
2188 let ret = match &self.token {
2189 Token::CONST | Token::TYPE | Token::VAR =>
2190 Stmt::Decl(Rc::new(self.parse_decl(Token::is_stmt_start))),
2191 Token::IDENT(_) | Token::INT(_) | Token::FLOAT(_) | Token::IMAG(_) |
2192 Token::CHAR(_) | Token::STRING(_) | Token::FUNC | Token::LPAREN | Token::LBRACK | Token::STRUCT |
2194 Token::MAP | Token::CHAN | Token::INTERFACE | Token::ADD | Token::SUB | Token::MUL | Token::AND |
2196 Token::XOR | Token::ARROW | Token::NOT => { let s = self.parse_simple_stmt(ParseSimpleMode::LabelOk).0;
2198 if let Stmt::Labeled(_) = s {} else {self.expect_semi();}
2199 s
2200 },
2201 Token::GO => self.parse_go_stmt(),
2202 Token::DEFER => self.parse_defer_stmt(),
2203 Token::RETURN => self.parse_return_stmt(),
2204 Token::BREAK | Token::CONTINUE | Token::GOTO | Token::FALLTHROUGH =>
2205 self.parse_branch_stmt(self.token.clone()),
2206 Token::LBRACE => {
2207 let s = self.parse_block_stmt();
2208 self.expect_semi();
2209 Stmt::Block(Rc::new(s))
2210 },
2211 Token::IF => self.parse_if_stmt(),
2212 Token::SWITCH => self.parse_switch_stmt(),
2213 Token::SELECT => self.parse_select_stmt(),
2214 Token::FOR => self.parse_for_stmt(),
2215 Token::SEMICOLON(real) => {
2216 let s = Stmt::Empty(Rc::new(
2220 EmptyStmt{semi: self.pos, implicit: !*real.as_bool()}));
2221 self.next();
2222 s
2223 }
2224 Token::RBRACE => {
2225 Stmt::Empty(Rc::new(EmptyStmt{
2227 semi: self.pos, implicit: false}))
2228 }
2229 _ => {
2230 let pos = self.pos;
2231 self.error_expected(pos, "statement");
2232 self.advance(Token::is_stmt_start);
2233 Stmt::new_bad(pos, self.pos)
2234 }
2235 };
2236
2237 self.trace_end();
2238 ret
2239 }
2240
2241 fn is_valid_import(path: &str) -> bool {
2245 if path.len() < 3 || (!path.starts_with('"') || !path.ends_with('"')) {
2246 return false
2247 }
2248 let result = &path[1..path.len() - 1];
2249 let mut illegal_chars: Vec<char> = r##"!"#$%&'()*,:;<=>?[\]^{|}`"##.chars().collect();
2250 illegal_chars.push('\u{FFFD}');
2251 result
2252 .chars()
2253 .find(|&x| !x.is_ascii_graphic() || x.is_whitespace() || illegal_chars.contains(&x)).is_none()
2254 }
2255
2256 fn parse_import_spec(&mut self, _: &Token, _: isize) -> SpecKey {
2257 self.trace_begin("ImportSpec");
2258
2259 let ident = match self.token {
2260 Token::PERIOD => {
2261 let i = new_ident!(self, self.pos, ".".to_string(),
2262 IdentEntity::NoEntity);
2263 self.next();
2264 Some(i)
2265 },
2266 Token::IDENT(_) => Some(self.parse_ident()),
2267 _ => None,
2268 };
2269 let pos = self.pos;
2270 let path_token = match &self.token {
2271 Token::STRING(lit) => {
2272 let litstr: &String = lit.as_ref();
2273 if !Parser::is_valid_import(litstr) {
2274 let msg = format!("{}{}", "invalid import path: ", litstr);
2275 self.error(pos, msg);
2276 }
2277 let token = self.token.clone();
2278 self.next();
2279 token
2280 }
2281 _ => {
2282 let token = Token::STRING("_".to_string().into());
2284 self.expect(&token);
2285 token
2286 }
2287 };
2288 self.expect_semi();
2289 let index = specs_mut!(self).insert(Spec::Import(Rc::new(ImportSpec{
2290 name: ident,
2291 path: BasicLit{pos: pos, token: path_token},
2292 end_pos: None})));
2293 self.imports.push(index);
2294
2295 self.trace_end();
2296 index
2297 }
2298
2299 fn parse_value_spec<'p, 'k>(self_: &'p mut Parser<'a>, keyword: &'k Token, iota: isize) -> SpecKey {
2300 self_.trace_begin(&format!("{}{}", keyword.text(), "Spec"));
2301
2302 let pos = self_.pos;
2303 let idents = self_.parse_ident_list();
2304 let typ = self_.try_type();
2305 let values = match self_.token {
2306 Token::ASSIGN => {
2307 self_.next();
2308 self_.parse_rhs_list()
2309 }
2310 _ => vec![],
2311 };
2312 self_.expect_semi();
2313
2314 match keyword {
2315 Token::VAR => {
2316 if typ.is_none() && values.len() == 0 {
2317 self_.error_str(pos, "missing variable type or initialization");
2318 }
2319 },
2320 Token::CONST => {
2321 if values.len() == 0 && (iota == 0 || typ.is_some()) {
2322 self_.error_str(pos, "missing constant value");
2323 }
2324 }
2325 _ => {}
2326 }
2327
2328 let spec = specs_mut!(self_).insert(Spec::Value(Rc::new(ValueSpec{
2333 names: idents, typ: typ, values: values})));
2334 let kind = if let Token::VAR = keyword {
2335 EntityKind::Var
2336 } else {EntityKind::Con};
2337 self_.declare(
2338 DeclObj::Spec(spec),
2339 EntityData::ConIota(iota),
2340 kind,
2341 &self_.top_scope.unwrap());
2342
2343 self_.trace_end();
2344 spec
2345 }
2346
2347 fn parse_type_spec(&mut self, _: &Token, _: isize) -> SpecKey {
2348 self.trace_begin("TypeSpec");
2349
2350 let ident = self.parse_ident();
2351 let placeholder = Expr::new_bad(0, 0);
2356 let spec_val = Spec::Type(Rc::new(TypeSpec{
2357 name: ident, assign: 0, typ: placeholder
2358 }));
2359 let index = specs_mut!(self).insert(spec_val);
2360 let scope = self.top_scope.unwrap();
2361 self.declare(DeclObj::Spec(index), EntityData::NoData, EntityKind::Typ, &scope);
2362 let assign = if self.token == Token::ASSIGN {
2363 self.next();
2364 self.pos
2365 } else {0};
2366 let typ = self.parse_type();
2367 let spec = if let Spec::Type(boxts) = spec_mut!(self, index) {
2368 Rc::get_mut(boxts).unwrap()} else {unreachable!()};
2369 spec.assign = assign;
2370 spec.typ = typ;
2371 self.expect_semi();
2372
2373 self.trace_end();
2374 index
2375 }
2376
2377 fn parse_gen_decl(&mut self, keyword: &Token,
2378 f: fn (&mut Parser<'a>, &Token, isize) -> SpecKey) -> Decl {
2379 self.trace_begin(&format!("GenDecl({})", keyword.text()));
2380
2381 let pos = self.expect(keyword);
2382 let (lparen, rparen, list) = if self.token == Token::LPAREN {
2383 let lp = self.pos;
2384 self.next();
2385 let mut list = vec![];
2386 let mut iota = 0;
2387 while self.token != Token::RPAREN && self.token != Token::EOF {
2388 list.push(f(self, keyword, iota));
2389 iota += 1;
2390 }
2391 let rp = self.expect(&Token::RPAREN);
2392 self.expect_semi();
2393 (Some(lp), Some(rp), list)
2394 } else {
2395 (None, None, vec![f(self, keyword, 0)])
2396 };
2397
2398 self.trace_end();
2399 Decl::Gen(Rc::new(GenDecl{
2400 token_pos: pos,
2401 token: keyword.clone(),
2402 l_paran: lparen,
2403 specs: list,
2404 r_paren: rparen
2405 }))
2406 }
2407
2408 fn parse_func_decl(&mut self) -> Decl {
2409 self.trace_begin("FunctionDecl");
2410
2411 let pos = self.expect(&Token::FUNC);
2412 let scope = new_scope!(self, self.top_scope);
2413 let recv = if self.token == Token::LPAREN {
2414 Some(self.parse_parameters(scope, false))
2415 } else {
2416 None
2417 };
2418 let ident = self.parse_ident();
2419 let (params, results) = self.parse_signature(scope);
2420 let body = if self.token == Token::LBRACE {
2421 Some(Rc::new(self.parse_body(scope)))
2422 } else {
2423 None
2424 };
2425 self.expect_semi();
2426
2427 let recv_is_none = recv.is_none();
2428 let typ = self.objects.ftypes.insert(FuncType{
2429 func: Some(pos),
2430 params: params,
2431 results: results,
2432 });
2433 let decl = self.objects.fdecls.insert(FuncDecl{
2434 recv: recv,
2435 name: ident,
2436 typ: typ,
2437 body: body,
2438 });
2439 if recv_is_none {
2440 if ident!(self, ident).name != "init" {
2447 self.declare(
2448 DeclObj::FuncDecl(decl),
2449 EntityData::NoData,
2450 EntityKind::Fun,
2451 &self.pkg_scope.unwrap(),
2452 );
2453 }
2454 }
2455
2456 self.trace_end();
2457 Decl::Func(decl)
2458 }
2459
2460 fn parse_decl(&mut self, sync: fn(&Token) -> bool) -> Decl {
2461 self.trace_begin("Declaration");
2462
2463 let decl = match self.token {
2464 Token::CONST | Token::VAR | Token::TYPE => {
2465 let token = self.token.clone();
2466 match token {
2467 Token::CONST | Token::VAR => {
2468 self.parse_gen_decl(&token, Parser::parse_value_spec)
2469 }
2470 Token::TYPE => {
2471 self.parse_gen_decl(&token, Parser::parse_type_spec)
2472 }
2473 _ => {unreachable!();}
2474 }
2475 }
2476 Token::FUNC => {
2477 self.parse_func_decl()
2478 }
2479 _ => {
2480 let pos = self.pos;
2481 self.error_expected(pos, "declaration");
2482 self.advance(sync);
2483 Decl::Bad(Rc::new(BadDecl{from: pos, to: self.pos}))
2484 }
2485 };
2486
2487 self.trace_end();
2488 decl
2489 }
2490
2491 pub fn parse_file(&mut self) -> Option<File> {
2495 self.trace_begin("File");
2496
2497 let err_count = self.errors.len();
2498 let pos = self.expect(&Token::PACKAGE);
2499 let ident = self.parse_ident();
2502 if ident!(self, ident).name == "_" {
2503 self.error_str(self.pos, "invalid package name _");
2504 }
2505 self.expect_semi();
2506
2507 if self.errors.len() > err_count {
2510 self.trace_end();
2511 return None
2512 }
2513
2514 self.open_scope();
2515 self.pkg_scope = self.top_scope;
2516 let mut decls = vec![];
2517 while self.token == Token::IMPORT {
2519 decls.push(self.parse_gen_decl(
2520 &Token::IMPORT, Parser::parse_import_spec));
2521 }
2522 while self.token != Token::EOF {
2524 decls.push(self.parse_decl(Token::is_decl_start))
2525 }
2526 self.close_scope();
2527 assert!(self.top_scope.is_none(), "unbalanced scopes");
2528 assert!(self.label_scope.is_none(), "unbalanced label scopes");
2529
2530 self.unresolved = self.unresolved.to_owned().into_iter().
2532 filter_map(|x| {
2533 let ident = ident_mut!(self, x) ;
2534 let scope = scope!(self, self.pkg_scope.unwrap());
2535 let entity = scope.look_up(&ident.name);
2536 if let Some(en) = entity {
2537 ident.entity = IdentEntity::Entity(*en);
2538 Some(x)
2539 } else {
2540 None
2541 }}).collect();
2542
2543 self.trace_end();
2544 Some(File{
2545 package: pos,
2546 name: ident,
2547 decls: decls,
2548 scope: self.pkg_scope.unwrap(),
2549 imports: self.imports.clone(),
2550 unresolved: self.unresolved.clone(),
2551 })
2552 }
2553}
2554
2555
2556#[cfg(test)]
2557mod test {
2558 use super::*;
2559
2560 #[test]
2561 fn test_parser () {
2562 let mut fs = position::FileSet::new();
2563 let f = fs.add_file("testfile1.gs".to_string(), None, 1000);
2564
2565 let s1 = r###"
2566 func (p *someobj) testFunc(a, b *int) (i int) {
2567 for 我 := range iii {
2568 a = 1;
2569 }
2570 }
2571 "###;
2572 let o = &mut Objects::new();
2573 let el = &mut ErrorList::new();
2574 let mut p = Parser::new(o, f, el, s1, true);
2575 p.open_scope();
2576 p.pkg_scope = p.top_scope;
2577 p.parse_decl(Token::is_decl_start);
2578 }
2579}