diff options
author | Robert Griesemer <gri@golang.org> | 2009-04-24 12:59:09 -0700 |
---|---|---|
committer | Robert Griesemer <gri@golang.org> | 2009-04-24 12:59:09 -0700 |
commit | cd6b2b55040ee0f195d3d4b473ae528060e76eb2 (patch) | |
tree | 25755711a0f1c199a2b622a6f4237c1f73e0824f | |
parent | b270641aeec3dc6aadde1195d31359e3391a2de1 (diff) | |
download | golang-cd6b2b55040ee0f195d3d4b473ae528060e76eb2.tar.gz |
- fixed a couple of potential end-less loops
(no progress in presence of syntax errors)
- end parsing early if source doesn't start
proper package clause
R=iant
DELTA=18 (7 added, 6 deleted, 5 changed)
OCL=27840
CL=27842
-rw-r--r-- | src/lib/go/parser.go | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/src/lib/go/parser.go b/src/lib/go/parser.go index f3a5d1233..a1effa6d9 100644 --- a/src/lib/go/parser.go +++ b/src/lib/go/parser.go @@ -38,7 +38,7 @@ type interval struct { type parser struct { scanner scanner.Scanner; err ErrorHandler; // nil if no handler installed - errorCount int; + hasErrors bool; // Tracing/debugging mode uint; // parsing mode @@ -189,7 +189,7 @@ func (p *parser) error(pos token.Position, msg string) { if p.err != nil { p.err.Error(pos, msg); } - p.errorCount++; + p.hasErrors = true; } @@ -297,6 +297,7 @@ func (p *parser) parseType() ast.Expr { if typ == nil { p.error_expected(p.pos, "type"); + p.next(); // make progress return &ast.BadExpr{p.pos}; } @@ -485,6 +486,7 @@ func (p *parser) parseParameterType(ellipsis_ok bool) ast.Expr { typ := p.tryParameterType(ellipsis_ok); if typ == nil { p.error_expected(p.pos, "type"); + p.next(); // make progress typ = &ast.BadExpr{p.pos}; } return typ; @@ -1639,6 +1641,7 @@ func (p *parser) parseStatement() ast.Stmt { // no statement found p.error_expected(p.pos, "statement"); + p.next(); // make progress return &ast.BadStmt{p.pos}; } @@ -1853,14 +1856,12 @@ func (p *parser) parsePackage() *ast.Program { comment := p.getDoc(); pos := p.expect(token.PACKAGE); ident := p.parseIdent(); - if p.tok == token.SEMICOLON { - // common error - p.error(p.pos, "extra semicolon"); - p.next(); - } - var decls []ast.Decl; - if p.mode & PackageClauseOnly == 0 { + + // Don't bother parsing the rest if we had errors already. + // Likely not a Go source file at all. + + if !p.hasErrors && p.mode & PackageClauseOnly == 0 { // import decls list := vector.New(0); for p.tok == token.IMPORT { @@ -1960,5 +1961,5 @@ func Parse(src interface{}, err ErrorHandler, mode uint) (*ast.Program, bool) { // parse program prog := p.parsePackage(); - return prog, p.scanner.ErrorCount == 0 && p.errorCount == 0; + return prog, p.scanner.ErrorCount == 0 && !p.hasErrors; } |