goscript_parser/
parser.rs

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// Parsing modes for parseSimpleStmt.
12#[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>, //ImportSpec
40
41    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(); // get the first token ready
72        p
73    }
74
75    // ----------------------------------------------------------------------------
76    // Getters
77
78    pub fn get_errors(&self) -> &ErrorList {
79        self.errors
80    }
81
82    // ----------------------------------------------------------------------------
83    // Scoping support
84
85    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        // Go spec: A short variable declaration may redeclare variables
169        // provided they were originally declared in the same block with
170        // the same type, and at least one of the non-blank variables is new.
171        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; // number of new variables
178        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    // If x is an identifier, tryResolve attempts to resolve x by looking up
210    // the object it denotes. If no object is found and collectUnresolved is
211    // set, x is marked as unresolved and collected in the list of unresolved
212    // identifiers.
213    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            // try to resolve the identifier
222            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            // all local scopes are known, so any unresolved identifier
237            // must be found either in the file scope, package scope
238            // (perhaps in another file), or universe scope --- collect
239            // them so that they can be resolved later
240            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    // ----------------------------------------------------------------------------
252    // Parsing support
253
254    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        // Get next token and skip comments
289        loop {
290            let (token, pos) = self.scanner.scan();
291            match token {
292                Token::COMMENT(_) => { // Skip comment
293                    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    // https://github.com/golang/go/issues/3008
340    // Same as expect but with better error message for certain cases
341    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        // semicolon is optional before a closing ')' or '}'
354        match self.token {
355            Token::RPAREN | Token::RBRACE => {},
356            Token::SEMICOLON(_) => { self.next(); },
357            _ => {
358                if let Token::COMMA = self.token {
359                    // permit a ',' instead of a ';' but complain
360                    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    // advance consumes tokens until the current token p.tok
386    // is in the 'to' set, or token.EOF. For error recovery.
387    fn advance(&mut self, to: fn(&Token) -> bool) {
388        while self.token != Token::EOF {
389            self.next();
390            if to(&self.token) {
391                // Return only if parser made some progress since last
392                // sync or if it has not reached 10 advance calls without
393                // progress. Otherwise consume at least one token to
394                // avoid an endless parser loop (it is possible that
395                // both parseOperand and parseStmt call advance and
396                // correctly do not advance, thus the need for the
397                // invocation limit p.syncCnt).
398                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                // Reaching here indicates a parser bug, likely an
408                // incorrect token list in this function, but it only
409                // leads to skipping of possibly correct code if a
410                // previous error is present, and thus is preferred
411                // over a non-terminating parse.
412            }
413        }
414    }
415
416    // safe_pos returns a valid file position for a given position: If pos
417    // is valid to begin with, safe_pos returns pos. If pos is out-of-range,
418    // safe_pos returns the EOF position.
419    //
420    // This is hack to work around "artificial" end positions in the AST which
421    // are computed by adding 1 to (presumably valid) token positions. If the
422    // token positions are invalid due to parse errors, the resulting end position
423    // may be past the file's EOF position, which would lead to panics if used
424    // later on.
425    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    // ----------------------------------------------------------------------------
431    // Identifiers
432
433    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    // ----------------------------------------------------------------------------
460    // Common productions
461    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            // lhs of a short variable declaration
482            // but doesn't enter scope until later:
483            // caller must call self.short_var_decl(list)
484            // at appropriate time.
485            Token::DEFINE => {},
486            // lhs of a label declaration or a communication clause of a select
487            // statement (parse_lhs_list is not called when parsing the case clause
488            // of a switch statement):
489            // - labels are declared by the caller of parse_lhs_list
490            // - for communication clauses, if there is a stand-alone identifier
491            //   followed by a colon, we have a syntax error; there is no need
492            //   to resolve the identifier in that case
493            Token::COLON => {},
494            _ => {
495                // identifiers must be declared elsewhere
496                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    // ----------------------------------------------------------------------------
514    // Types
515    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    // If the result is an identifier, it is not resolved.
533    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        // don't resolve ident yet - it may be a parameter or field name
539        let ret = if let Token::PERIOD = self.token {
540            // ident is a package name
541            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            // always permit ellipsis for more fault-tolerant parsing
560            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                        // only report error if it's a new one
587                        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        // 1st FieldDecl
600	    // A type name used as an anonymous field looks like a field identifier.
601        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            // ["*"] TypeName (AnonymousField)
617            None => { 
618                let first = &list[0]; // we always have at least one element
619                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        // Tag
634        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    // If the result is an identifier, it is not resolved.
693    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        // 1st ParameterDecl
729	    // A list of identifiers looks like a list of type names.
730        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            // IdentifierList Type
745            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            // Go spec: The scope of an identifier denoting a function
750			// parameter or result variable is the function body.
751			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                // warning: copy paste
767                params.push(field);
768                // Go spec: The scope of an identifier denoting a function
769                // parameter or result variable is the function body.
770                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            // Type { "," Type } (anonymous parameters)
782            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    // method spec in interface
844    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            // embedded interface
857            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    // Returns a ident or a type
933    // If the result is an identifier, it is not resolved.
934    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    // ----------------------------------------------------------------------------
972    // Blocks
973
974    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); // open function scope
996        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    // ----------------------------------------------------------------------------
1020    // Expressions
1021
1022    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    // parseOperand may return an expression or a raw type (incl. array
1041    // types of the form [...]T. Callers must verify the result.
1042    // If lhs is set and the result is an identifier, it is not resolved.
1043    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                // types may be parenthesized: (some type)
1063                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                        // unreachable but would work, so don't panic
1074                        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            // type switch: typ == nil, i.e.: x.(type)
1104            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; // change the 3 to 2 to disable 3-index slices
1120        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 { // 3-index slices
1142                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(), // unwrap the first of two Option
1156                high: iter.next().unwrap(),
1157                max: iter.next().unwrap(),
1158                slice3: slice3,
1159                r_brack: rbrack,
1160            }))
1161        } else {
1162            // the logic here differs from the original go code
1163            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            //// builtins may expect a type: make(some_type)
1186            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            // Because the parser doesn't know the composite literal type, it cannot
1211            // know if a key that's an identifier is a struct field name or a name
1212            // denoting a value. The former is not resolved by the parser or the
1213            // resolver.
1214            //
1215            // Instead, _try_ to resolve such a key if possible. If it resolves,
1216            // it a) has correctly resolved, or b) incorrectly resolved because
1217            // the key is a struct field with a name matching another identifier.
1218            // In the former case we are done, and in the latter case we don't
1219            // care because the type checker will do a separate field lookup.
1220            //
1221            // If the key does not resolve, it a) must be defined at the top
1222            // level in another file of the same package, the universe scope, or be
1223            // undeclared; or b) it is a struct field. In the former case, the type
1224            // checker can do a top-level lookup, and in the latter case it will do
1225            // a separate field lookup.
1226            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                    // Try to resolve the key but don't collect it
1231                    // as unresolved identifier if it fails so that
1232                    // we don't get (possibly false) errors about
1233                    // undeclared names.
1234                    self.try_resolve(&x, false)
1235                } else {
1236                    // not a key
1237                    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    // checkExpr checks that x is an expression (and not a type).
1297    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            // If t.Type == nil we have a type assertion of the form
1310            // y.(type), which is only allowed in type switch expressions.
1311            // It's hard to exclude those but for the case where we are in
1312            // a type switch. Instead be lenient and test this in the type
1313            // checker.
1314            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    // isTypeName reports whether x is a (qualified) TypeName.
1329    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    // isLiteralType reports whether x is a legal composite literal type.
1340    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    // checkExprOrType checks that x is an expression or a type
1360    // (and not a raw type such as [...]T).
1361    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; // no need to try to resolve again
1434        }
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                // channel type or receive expression
1453                let mut arrow = self.pos;
1454                self.next();
1455
1456                // If the next token is token.CHAN we still don't know if it
1457                // is a channel type or a receive operation - we only know
1458                // once we have found the end of the unary expression. There
1459                // are two cases:
1460                //
1461                //   <- type  => (<-type) must be channel type
1462                //   <- expr  => <-(expr) is a receive from an expression
1463                //
1464                //   oxfeeefeee: a: [<- chan val_type_of_<-_chan]
1465                //               b: [<- chan val_type_of_chan]
1466                //
1467                // In the first case, the arrow must be re-associated with
1468                // the channel type parsed already:
1469                //
1470                //   <- (chan type)    =>  (<-chan type)
1471                //   <- (chan<- type)  =>  (<-chan (<-type))
1472
1473                let mut x = self.parse_unary_expr(false);
1474                // determine which case we have
1475                if let Expr::Chan(c) = &mut x { // (<-type)
1476                    // re-associate position info and <-
1477                    let mut ctype = Rc::get_mut(c).unwrap(); // c is not shared
1478                    let mut dir = ChanDir::Send;
1479                    while dir == ChanDir::Send {
1480                        if ctype.dir == ChanDir::Recv {
1481                            // error: (<-type) is (<-(<-chan T))
1482                            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(); // c is not shared
1492                        } 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                // pointer type or unary "*" expression
1506                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    // ----------------------------------------------------------------------------
1579    // Statements
1580
1581    // parseSimpleStmt returns true as 2nd result if it parsed the assignment
1582    // of a range clause (with mode == rangeOk). The returned statement is an
1583    // assignment with a right-hand side that is a single unary expression of
1584    // the form "range x". No guarantees are given for the left-hand side.
1585    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                // assignment statement, possibly part of a range clause
1597                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                    // continue with first expression
1618                }
1619                let x0 = x.into_iter().nth(0).unwrap();
1620                ret = match self.token {
1621                    Token::COLON => {
1622                        // labeled statement
1623                        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                                // Go spec: The scope of a label is the body of the 
1635                                // function in which it is declared and excludes the
1636                                // body of any nested function.
1637                                //
1638                                // wuhao todo: this messes up the declaration order! if the next stmt
1639                                // contains an exact same label, the error message would be wrong
1640                                // like this:
1641                                // 
1642                                // L1:
1643                                // L1:
1644                                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(); // could be a conversion: (some type)(x)
1683        if let Expr::Call(_) = x {
1684            Some(x)
1685        } else {
1686            if !x.is_bad() {
1687                // only report error if it's a new one
1688                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) // "go".len() == 2
1705            }
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) // "defer".len() == 5
1722            }
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                // accept potential variable declaration but complain
1802                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                                // permit v = x.(type) but complain
1932                                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                    // A TypeSwitchGuard may declare a variable in addition
1967                    // to the variable declared in the initial SimpleStmt.
1968                    // Introduce extra scope to avoid redeclaration errors:
1969                    //
1970                    //	switch t := 0; t := x.(T) { ... }
1971                    //
1972                    // (this code is not valid Go because the first t
1973                    // cannot be accessed and thus is never used, the extra
1974                    // scope is needed for the correct error message).
1975                    //
1976                    // If we don't have a type switch, s2 must be an expression.
1977                    // Having the extra nested but empty scope won't affect it.
1978                    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                // SendStmt
2022                if lhs.len() > 1 {
2023                    self.error_expected(lhs[0].pos(&self.objects), "1 expression");
2024				    // continue with first expression
2025                }
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                // RecvStmt
2033                if tk == Token::ASSIGN || tk == Token::DEFINE {
2034                    // RecvStmt with assignment
2035                    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                        // continue with first expression
2053                    }
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                    // "for range x" (nil lhs in assignment)
2099                    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                // move AssignStmt out of arena
2136                // and tear it apart for the components
2137                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                // parseSimpleStmt returned a right-hand side that
2153		        // is a single unary expression of the form "range x"
2154                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 | // operands
2193		    Token::LBRACK | Token::STRUCT | 
2194            Token::MAP | Token::CHAN | Token::INTERFACE | // composite types
2195		    Token::ADD | Token::SUB | Token::MUL | Token::AND |
2196            Token::XOR | Token::ARROW | Token::NOT => { // unary operators
2197                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                // Is it ever possible to have an implicit semicolon
2217                // producing an empty statement in a valid program?
2218                // (handle correctly anyway)
2219                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                // a semicolon may be omitted before a closing "}"
2226                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    // ----------------------------------------------------------------------------
2242    // Declarations
2243
2244    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                // use expect() error handling
2283                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        // Go spec: The scope of a constant or variable identifier declared inside
2329	    // a function begins at the end of the ConstSpec or VarSpec and ends at
2330	    // the end of the innermost containing block.
2331	    // (Global identifiers are resolved in a separate phase after parsing.)
2332        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        // Go spec: The scope of a type identifier declared inside a function begins
2352	    // at the identifier in the TypeSpec and ends at the end of the innermost
2353	    // containing block.
2354	    // (Global identifiers are resolved in a separate phase after parsing.)
2355        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            // Go spec: The scope of an identifier denoting a constant, type,
2441            // variable, or function (but not method) declared at top level
2442            // (outside any function) is the package block.
2443            //
2444            // init() functions cannot be referred to and there may
2445            // be more than one - don't put them in the pkgScope
2446            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    // ----------------------------------------------------------------------------
2492    // Source files
2493
2494    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        // Go spec: The package clause is not a declaration;
2500	    // the package name does not appear in any scope.
2501        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        // Don't bother parsing the rest if we had errors parsing the package clause.
2508	    // Likely not a Go source file at all.
2509	    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        // import decls
2518        while self.token == Token::IMPORT {
2519            decls.push(self.parse_gen_decl(
2520                &Token::IMPORT, Parser::parse_import_spec));
2521        }
2522        // rest of package body
2523        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        // resolve global identifiers within the same file
2531        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}