summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2009-04-24 12:59:09 -0700
committerRobert Griesemer <gri@golang.org>2009-04-24 12:59:09 -0700
commitcd6b2b55040ee0f195d3d4b473ae528060e76eb2 (patch)
tree25755711a0f1c199a2b622a6f4237c1f73e0824f
parentb270641aeec3dc6aadde1195d31359e3391a2de1 (diff)
downloadgolang-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.go21
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;
}