summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lang/golang/go.go10
-rw-r--r--lang/spec.go16
-rw-r--r--parser/parse.go2
3 files changed, 10 insertions, 18 deletions
diff --git a/lang/golang/go.go b/lang/golang/go.go
index 603b256..2085c3b 100644
--- a/lang/golang/go.go
+++ b/lang/golang/go.go
@@ -141,25 +141,25 @@ var GoSpec = &lang.Spec{
lang.Colon: {Precedence: 7},
lang.Inc: {SkipSemi: true},
lang.Dec: {SkipSemi: true},
- lang.Case: {SkipSemi: true},
+ lang.Case: {SkipSemi: true, HasInit: true},
lang.Chan: {SkipSemi: true},
lang.Const: {SkipSemi: true},
lang.Default: {SkipSemi: true},
lang.Defer: {SkipSemi: true},
lang.Else: {SkipSemi: true},
- lang.For: {SkipSemi: true},
+ lang.For: {SkipSemi: true, HasInit: true},
lang.Func: {SkipSemi: true},
lang.Go: {SkipSemi: true},
lang.Goto: {SkipSemi: true},
- lang.If: {SkipSemi: true},
+ lang.If: {SkipSemi: true, HasInit: true},
lang.Import: {SkipSemi: true},
lang.Interface: {SkipSemi: true},
lang.Map: {SkipSemi: true},
lang.Package: {SkipSemi: true},
lang.Range: {SkipSemi: true},
- lang.Select: {SkipSemi: true},
+ lang.Select: {SkipSemi: true, HasInit: true},
lang.Struct: {SkipSemi: true},
- lang.Switch: {SkipSemi: true},
+ lang.Switch: {SkipSemi: true, HasInit: true},
lang.Type: {SkipSemi: true},
lang.Var: {SkipSemi: true},
lang.MaxTok: {}, // To ensure that all Tokens have a TokenProp.
diff --git a/lang/spec.go b/lang/spec.go
index 37017e7..b8539e3 100644
--- a/lang/spec.go
+++ b/lang/spec.go
@@ -35,9 +35,10 @@ const (
// TokenProp represent token properties for parsing.
type TokenProp struct {
Token
- SkipSemi bool // automatic semicolon insertion after newline
- Precedence int // operator precedence
- Associativity
+ SkipSemi bool // automatic semicolon insertion after newline
+ Precedence int // operator precedence
+ Associativity //
+ HasInit bool // true if may have an init clause
}
// Spec represents the language specification for scanning.
@@ -52,12 +53,3 @@ type Spec struct {
NumUnder bool // true if a number can contain _ character
// TokenProps map[string]TokenProp // token properties
}
-
-// HasInit stores if a statement may contain a simple init statement.
-var HasInit = map[Token]bool{
- Case: true,
- For: true,
- If: true,
- Select: true,
- Switch: true,
-}
diff --git a/parser/parse.go b/parser/parse.go
index 60311dc..c049b87 100644
--- a/parser/parse.go
+++ b/parser/parse.go
@@ -76,7 +76,7 @@ func (p *Parser) parseStmts(in Tokens) (out Tokens, err error) {
return out, scanner.ErrBlock
}
// Skip over simple init statements for some tokens (if, for, ...)
- if lang.HasInit[in[0].Tok] {
+ if p.TokenProps[in[0].Tok].HasInit {
for in[endstmt-1].Tok != lang.BraceBlock {
e2 := in[endstmt+1:].Index(lang.Semicolon)
if e2 == -1 {