aboutsummaryrefslogtreecommitdiff
path: root/driver
diff options
context:
space:
mode:
authorRyo Nihei <nihei.dev@gmail.com>2022-11-05 20:32:53 +0900
committerRyo Nihei <nihei.dev@gmail.com>2022-11-06 02:18:35 +0900
commita0aa647770ac6458e9b4749c3efa38d56e2fe4fe (patch)
tree117c30b994b1624b19a9fae485c9802f2a8bcc72 /driver
parentRemove anonymous symbol system (diff)
downloadcotia-a0aa647770ac6458e9b4749c3efa38d56e2fe4fe.tar.gz
cotia-a0aa647770ac6458e9b4749c3efa38d56e2fe4fe.tar.xz
Move the skip table from lexer-related data to parser-related data
Diffstat (limited to 'driver')
-rw-r--r--driver/parser.go8
-rw-r--r--driver/spec.go4
-rw-r--r--driver/template.go53
-rw-r--r--driver/token_stream.go8
4 files changed, 33 insertions, 40 deletions
diff --git a/driver/parser.go b/driver/parser.go
index b7f12ff..a152c3d 100644
--- a/driver/parser.go
+++ b/driver/parser.go
@@ -35,6 +35,9 @@ type Grammar interface {
// TerminalCount returns a terminal symbol count of grammar.
TerminalCount() int
+ // SkipTerminal returns true when a terminal symbol must be skipped on syntax analysis.
+ SkipTerminal(terminal int) bool
+
// EOF returns the EOF symbol.
EOF() int
@@ -63,9 +66,6 @@ type VToken interface {
// Position returns (row, column) pair.
Position() (int, int)
-
- // Skip returns true when a token must be skipped on syntax analysis.
- Skip() bool
}
type TokenStream interface {
@@ -275,7 +275,7 @@ func (p *Parser) nextToken() (VToken, error) {
return nil, err
}
- if tok.Skip() {
+ if p.gram.SkipTerminal(tok.TerminalID()) {
continue
}
diff --git a/driver/spec.go b/driver/spec.go
index e694d0b..cf3c7b0 100644
--- a/driver/spec.go
+++ b/driver/spec.go
@@ -40,6 +40,10 @@ func (g *grammarImpl) TerminalCount() int {
return g.g.ParsingTable.TerminalCount
}
+func (g *grammarImpl) SkipTerminal(terminal int) bool {
+ return g.g.ParsingTable.TerminalSkip[terminal] == 1
+}
+
func (g *grammarImpl) ErrorTrapperState(state int) bool {
return g.g.ParsingTable.ErrorTrapperStates[state] != 0
}
diff --git a/driver/template.go b/driver/template.go
index 87c74f6..321b2dd 100644
--- a/driver/template.go
+++ b/driver/template.go
@@ -147,6 +147,7 @@ type grammarImpl struct {
nonTerminals []string
lhsSymbols []int
terminals []string
+ terminalSkip []int
astActions [][]int
}
@@ -160,6 +161,7 @@ func NewGrammar() *grammarImpl {
nonTerminals: {{ genNonTerminals }},
lhsSymbols: {{ genLHSSymbols }},
terminals: {{ genTerminals }},
+ terminalSkip: {{ genTerminalSkip }},
astActions: {{ genASTActions }},
}
}
@@ -192,6 +194,10 @@ func (g *grammarImpl) TerminalCount() int {
return {{ .terminalCount }}
}
+func (g *grammarImpl) SkipTerminal(terminal int) bool {
+ return g.terminalSkip[terminal] == 1
+}
+
func (g *grammarImpl) ErrorTrapperState(state int) bool {
return g.errorTrapperStates[state] != 0
}
@@ -355,6 +361,25 @@ func genGrammarTemplateFuncs(cgram *spec.CompiledGrammar) template.FuncMap {
fmt.Fprintf(&b, "}")
return b.String()
},
+ "genTerminalSkip": func() string {
+ var b strings.Builder
+ fmt.Fprintf(&b, "[]int{\n")
+ c := 1
+ for _, v := range cgram.ParsingTable.TerminalSkip {
+ fmt.Fprintf(&b, "%v, ", v)
+ if c == 20 {
+ fmt.Fprintf(&b, "\n")
+ c = 1
+ } else {
+ c++
+ }
+ }
+ if c > 1 {
+ fmt.Fprintf(&b, "\n")
+ }
+ fmt.Fprintf(&b, "}")
+ return b.String()
+ },
"genASTActions": func() string {
var b strings.Builder
fmt.Fprintf(&b, "[][]int{\n")
@@ -389,7 +414,6 @@ func genGrammarTemplateFuncs(cgram *spec.CompiledGrammar) template.FuncMap {
const lexerSrcTmplate = `
type vToken struct {
terminalID int
- skip bool
tok *Token
}
@@ -409,22 +433,15 @@ func (t *vToken) Invalid() bool {
return t.tok.Invalid
}
-func (t *vToken) Skip() bool {
- return t.skip
-}
-
func (t *vToken) Position() (int, int) {
return t.tok.Row, t.tok.Col
}
var kindToTerminal = {{ genKindToTerminal }}
-var skip = {{ genSkip }}
-
type tokenStream struct {
lex *Lexer
kindToTerminal []int
- skip []int
}
func NewTokenStream(src io.Reader) (*tokenStream, error) {
@@ -445,7 +462,6 @@ func (t *tokenStream) Next() (VToken, error) {
}
return &vToken{
terminalID: kindToTerminal[tok.KindID],
- skip: skip[tok.KindID] > 0,
tok: tok,
}, nil
}
@@ -472,25 +488,6 @@ func genLexerTemplateFuncs(cgram *spec.CompiledGrammar) template.FuncMap {
fmt.Fprintf(&b, "}")
return b.String()
},
- "genSkip": func() string {
- var b strings.Builder
- fmt.Fprintf(&b, "[]int{\n")
- c := 1
- for _, v := range cgram.LexicalSpecification.Maleeni.Skip {
- fmt.Fprintf(&b, "%v, ", v)
- if c == 20 {
- fmt.Fprintf(&b, "\n")
- c = 1
- } else {
- c++
- }
- }
- if c > 1 {
- fmt.Fprintf(&b, "\n")
- }
- fmt.Fprintf(&b, "}")
- return b.String()
- },
}
}
diff --git a/driver/token_stream.go b/driver/token_stream.go
index dd2c482..eaf56c6 100644
--- a/driver/token_stream.go
+++ b/driver/token_stream.go
@@ -9,7 +9,6 @@ import (
type vToken struct {
terminalID int
- skip bool
tok *mldriver.Token
}
@@ -29,10 +28,6 @@ func (t *vToken) Invalid() bool {
return t.tok.Invalid
}
-func (t *vToken) Skip() bool {
- return t.skip
-}
-
func (t *vToken) Position() (int, int) {
return t.tok.Row, t.tok.Col
}
@@ -40,7 +35,6 @@ func (t *vToken) Position() (int, int) {
type tokenStream struct {
lex *mldriver.Lexer
kindToTerminal []int
- skip []int
}
func NewTokenStream(g *spec.CompiledGrammar, src io.Reader) (TokenStream, error) {
@@ -52,7 +46,6 @@ func NewTokenStream(g *spec.CompiledGrammar, src io.Reader) (TokenStream, error)
return &tokenStream{
lex: lex,
kindToTerminal: g.LexicalSpecification.Maleeni.KindToTerminal,
- skip: g.LexicalSpecification.Maleeni.Skip,
}, nil
}
@@ -63,7 +56,6 @@ func (l *tokenStream) Next() (VToken, error) {
}
return &vToken{
terminalID: l.kindToTerminal[tok.KindID],
- skip: l.skip[tok.KindID] > 0,
tok: tok,
}, nil
}