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