mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile/internal/syntax: remove need for missing_statement (fixed TODO)
Now that we have consistent use of xOrNil parse methods, we don't need a special missing_statement singleton to distinguish between missing actually statements and other errors (which have returned nil before). For #19663. Change-Id: I8364f1441bdf8dd966bcd6d8219b2a42d6b88abd Reviewed-on: https://go-review.googlesource.com/38656 Run-TryBot: Robert Griesemer <gri@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
d1f5e5f482
commit
783f166e65
1 changed files with 23 additions and 22 deletions
|
|
@ -1494,8 +1494,6 @@ func (p *parser) bad() *BadExpr {
|
|||
var ImplicitOne = &BasicLit{Value: "1"}
|
||||
|
||||
// SimpleStmt = EmptyStmt | ExpressionStmt | SendStmt | IncDecStmt | Assignment | ShortVarDecl .
|
||||
//
|
||||
// simpleStmt may return missing_stmt if labelOk is set.
|
||||
func (p *parser) simpleStmt(lhs Expr, rangeOk bool) SimpleStmt {
|
||||
if trace {
|
||||
defer p.trace("simpleStmt")()
|
||||
|
|
@ -1627,7 +1625,7 @@ func (p *parser) newAssignStmt(pos src.Pos, op Operator, lhs, rhs Expr) *AssignS
|
|||
return a
|
||||
}
|
||||
|
||||
func (p *parser) labeledStmt(label *Name) Stmt {
|
||||
func (p *parser) labeledStmtOrNil(label *Name) Stmt {
|
||||
if trace {
|
||||
defer p.trace("labeledStmt")()
|
||||
}
|
||||
|
|
@ -1638,17 +1636,25 @@ func (p *parser) labeledStmt(label *Name) Stmt {
|
|||
|
||||
p.want(_Colon)
|
||||
|
||||
if p.tok != _Rbrace && p.tok != _EOF {
|
||||
s.Stmt = p.stmt()
|
||||
if s.Stmt == missing_stmt {
|
||||
// report error at line of ':' token
|
||||
p.syntax_error_at(label.Pos(), "missing statement after label")
|
||||
// we are already at the end of the labeled statement - no need to advance
|
||||
return missing_stmt
|
||||
}
|
||||
if p.tok == _Rbrace {
|
||||
// We expect a statement (incl. an empty statement), which must be
|
||||
// terminated by a semicolon. Because semicolons may be omitted before
|
||||
// an _Rbrace, seeing an _Rbrace implies an empty statement.
|
||||
e := new(EmptyStmt)
|
||||
e.pos = p.pos()
|
||||
s.Stmt = e
|
||||
return s
|
||||
}
|
||||
|
||||
s.Stmt = p.stmtOrNil()
|
||||
if s.Stmt != nil {
|
||||
return s
|
||||
}
|
||||
|
||||
// report error at line of ':' token
|
||||
p.syntax_error_at(s.pos, "missing statement after label")
|
||||
// we are already at the end of the labeled statement - no need to advance
|
||||
return nil // avoids follow-on errors (see e.g., fixedbugs/bug274.go)
|
||||
}
|
||||
|
||||
func (p *parser) blockStmt(context string) *BlockStmt {
|
||||
|
|
@ -1922,17 +1928,12 @@ func (p *parser) commClause() *CommClause {
|
|||
return c
|
||||
}
|
||||
|
||||
// TODO(gri) find a better solution
|
||||
var missing_stmt Stmt = new(EmptyStmt) // = nod(OXXX, nil, nil)
|
||||
|
||||
// Statement =
|
||||
// Declaration | LabeledStmt | SimpleStmt |
|
||||
// GoStmt | ReturnStmt | BreakStmt | ContinueStmt | GotoStmt |
|
||||
// FallthroughStmt | Block | IfStmt | SwitchStmt | SelectStmt | ForStmt |
|
||||
// DeferStmt .
|
||||
//
|
||||
// stmt may return missing_stmt.
|
||||
func (p *parser) stmt() Stmt {
|
||||
func (p *parser) stmtOrNil() Stmt {
|
||||
if trace {
|
||||
defer p.trace("stmt " + p.tok.String())()
|
||||
}
|
||||
|
|
@ -1942,7 +1943,7 @@ func (p *parser) stmt() Stmt {
|
|||
if p.tok == _Name {
|
||||
lhs := p.exprList()
|
||||
if label, ok := lhs.(*Name); ok && p.tok == _Colon {
|
||||
return p.labeledStmt(label)
|
||||
return p.labeledStmtOrNil(label)
|
||||
}
|
||||
return p.simpleStmt(lhs, false)
|
||||
}
|
||||
|
|
@ -2026,7 +2027,7 @@ func (p *parser) stmt() Stmt {
|
|||
return s
|
||||
}
|
||||
|
||||
return missing_stmt
|
||||
return nil
|
||||
}
|
||||
|
||||
// StatementList = { Statement ";" } .
|
||||
|
|
@ -2036,8 +2037,8 @@ func (p *parser) stmtList() (l []Stmt) {
|
|||
}
|
||||
|
||||
for p.tok != _EOF && p.tok != _Rbrace && p.tok != _Case && p.tok != _Default {
|
||||
s := p.stmt()
|
||||
if s == missing_stmt {
|
||||
s := p.stmtOrNil()
|
||||
if s == nil {
|
||||
break
|
||||
}
|
||||
l = append(l, s)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue