aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/syntax
diff options
context:
space:
mode:
authorRobert Griesemer <gri@golang.org>2022-08-31 12:14:58 -0700
committerGopher Robot <gobot@golang.org>2022-09-02 02:09:04 +0000
commita330ca5c541e99e4561420c852b14df63574a065 (patch)
tree793e276f2323342d3a0a62a8a4a19c404685a974 /src/cmd/compile/internal/syntax
parenta31c062c9fbf212b244fbece6295a2a4279459e0 (diff)
downloadgo-a330ca5c541e99e4561420c852b14df63574a065.tar.xz
cmd/compile/internal/syntax: more tolerant parsing of import declarations
Change-Id: I114548640d51bf69833259578609901fa1602510 Reviewed-on: https://go-review.googlesource.com/c/go/+/427156 TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Robert Griesemer <gri@google.com> Reviewed-by: Robert Griesemer <gri@google.com> Reviewed-by: Robert Findley <rfindley@google.com> Run-TryBot: Robert Griesemer <gri@google.com>
Diffstat (limited to 'src/cmd/compile/internal/syntax')
-rw-r--r--src/cmd/compile/internal/syntax/parser.go25
1 files changed, 15 insertions, 10 deletions
diff --git a/src/cmd/compile/internal/syntax/parser.go b/src/cmd/compile/internal/syntax/parser.go
index e2298852b8..b956028404 100644
--- a/src/cmd/compile/internal/syntax/parser.go
+++ b/src/cmd/compile/internal/syntax/parser.go
@@ -401,15 +401,20 @@ func (p *parser) fileOrNil() *File {
return nil
}
- // { ImportDecl ";" }
- for p.got(_Import) {
- f.DeclList = p.appendGroup(f.DeclList, p.importDecl)
- p.want(_Semi)
- }
-
- // { TopLevelDecl ";" }
+ // Accept import declarations anywhere for error tolerance, but complain.
+ // { ( ImportDecl | TopLevelDecl ) ";" }
+ prev := _Import
for p.tok != _EOF {
+ if p.tok == _Import && prev != _Import {
+ p.syntaxError("imports must appear before other declarations")
+ }
+ prev = p.tok
+
switch p.tok {
+ case _Import:
+ p.next()
+ f.DeclList = p.appendGroup(f.DeclList, p.importDecl)
+
case _Const:
p.next()
f.DeclList = p.appendGroup(f.DeclList, p.constDecl)
@@ -435,7 +440,7 @@ func (p *parser) fileOrNil() *File {
} else {
p.syntaxError("non-declaration statement outside function body")
}
- p.advance(_Const, _Type, _Var, _Func)
+ p.advance(_Import, _Const, _Type, _Var, _Func)
continue
}
@@ -445,7 +450,7 @@ func (p *parser) fileOrNil() *File {
if p.tok != _EOF && !p.got(_Semi) {
p.syntaxError("after top level declaration")
- p.advance(_Const, _Type, _Var, _Func)
+ p.advance(_Import, _Const, _Type, _Var, _Func)
}
}
// p.tok == _EOF
@@ -543,7 +548,7 @@ func (p *parser) importDecl(group *Group) Decl {
return d
}
if !d.Path.Bad && d.Path.Kind != StringLit {
- p.syntaxError("import path must be a string")
+ p.syntaxErrorAt(d.Path.Pos(), "import path must be a string")
d.Path.Bad = true
}
// d.Path.Bad || d.Path.Kind == StringLit