summaryrefslogtreecommitdiff
path: root/src/pkg/exp/parser/parser.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/exp/parser/parser.go')
-rw-r--r--src/pkg/exp/parser/parser.go63
1 files changed, 7 insertions, 56 deletions
diff --git a/src/pkg/exp/parser/parser.go b/src/pkg/exp/parser/parser.go
index 70dbb6921..199ce172d 100644
--- a/src/pkg/exp/parser/parser.go
+++ b/src/pkg/exp/parser/parser.go
@@ -268,43 +268,17 @@ func (p *parser) expect(tok token.Token) token.Position {
// ----------------------------------------------------------------------------
-// Scope support
-
-func openScope(p *parser) *parser {
- p.topScope = ast.NewScope(p.topScope)
- return p
-}
-
-
-// Usage pattern: defer close(openScope(p));
-func close(p *parser) { p.topScope = p.topScope.Outer }
-
-
-func (p *parser) declare(ident *ast.Ident) {
- if !p.topScope.Declare(ident) {
- p.Error(p.pos, "'"+ident.Value+"' declared already")
- }
-}
-
-
-func (p *parser) declareList(idents []*ast.Ident) {
- for _, ident := range idents {
- p.declare(ident)
- }
-}
-
-
-// ----------------------------------------------------------------------------
// Common productions
func (p *parser) parseIdent() *ast.Ident {
+ obj := ast.NewObj(ast.Err, p.pos, "")
if p.tok == token.IDENT {
- x := &ast.Ident{p.pos, string(p.lit)}
+ obj.Name = string(p.lit)
p.next()
- return x
+ } else {
+ p.expect(token.IDENT) // use expect() error handling
}
- p.expect(token.IDENT) // use expect() error handling
- return &ast.Ident{p.pos, ""}
+ return &ast.Ident{obj.Pos, obj}
}
@@ -424,7 +398,7 @@ func (p *parser) makeIdentList(list *vector.Vector) []*ast.Ident {
if !isIdent {
pos := list.At(i).(ast.Expr).Pos()
p.errorExpected(pos, "identifier")
- idents[i] = &ast.Ident{pos, ""}
+ idents[i] = &ast.Ident{pos, ast.NewObj(ast.Err, pos, "")}
}
idents[i] = ident
}
@@ -835,8 +809,6 @@ func (p *parser) parseBlockStmt(idents []*ast.Ident) *ast.BlockStmt {
defer un(trace(p, "BlockStmt"))
}
- defer close(openScope(p))
-
lbrace := p.expect(token.LBRACE)
list := p.parseStmtList()
rbrace := p.expect(token.RBRACE)
@@ -1421,9 +1393,6 @@ func (p *parser) parseIfStmt() *ast.IfStmt {
defer un(trace(p, "IfStmt"))
}
- // IfStmt block
- defer close(openScope(p))
-
pos := p.expect(token.IF)
s1, s2, _ := p.parseControlClause(false)
body := p.parseBlockStmt(nil)
@@ -1442,9 +1411,6 @@ func (p *parser) parseCaseClause() *ast.CaseClause {
defer un(trace(p, "CaseClause"))
}
- // CaseClause block
- defer close(openScope(p))
-
// SwitchCase
pos := p.pos
var x []ast.Expr
@@ -1489,9 +1455,6 @@ func (p *parser) parseTypeCaseClause() *ast.TypeCaseClause {
defer un(trace(p, "TypeCaseClause"))
}
- // TypeCaseClause block
- defer close(openScope(p))
-
// TypeSwitchCase
pos := p.pos
var types []ast.Expr
@@ -1528,9 +1491,6 @@ func (p *parser) parseSwitchStmt() ast.Stmt {
defer un(trace(p, "SwitchStmt"))
}
- // SwitchStmt block
- defer close(openScope(p))
-
pos := p.expect(token.SWITCH)
s1, s2, _ := p.parseControlClause(false)
@@ -1565,9 +1525,6 @@ func (p *parser) parseCommClause() *ast.CommClause {
defer un(trace(p, "CommClause"))
}
- // CommClause block
- defer close(openScope(p))
-
// CommCase
pos := p.pos
var tok token.Token
@@ -1628,9 +1585,6 @@ func (p *parser) parseForStmt() ast.Stmt {
defer un(trace(p, "ForStmt"))
}
- // ForStmt block
- defer close(openScope(p))
-
pos := p.expect(token.FOR)
s1, s2, s3 := p.parseControlClause(true)
body := p.parseBlockStmt(nil)
@@ -1745,7 +1699,7 @@ func parseImportSpec(p *parser, doc *ast.CommentGroup, getSemi bool) (spec ast.S
var ident *ast.Ident
if p.tok == token.PERIOD {
- ident = &ast.Ident{p.pos, "."}
+ ident = &ast.Ident{p.pos, ast.NewObj(ast.Err, p.pos, ".")}
p.next()
} else if p.tok == token.IDENT {
ident = p.parseIdent()
@@ -1974,9 +1928,6 @@ func (p *parser) parseFile() *ast.File {
defer un(trace(p, "File"))
}
- // file block
- defer close(openScope(p))
-
// package clause
doc := p.leadComment
pos := p.expect(token.PACKAGE)