diff options
Diffstat (limited to 'driver')
-rw-r--r-- | driver/parser.go | 8 | ||||
-rw-r--r-- | driver/spec.go | 4 | ||||
-rw-r--r-- | driver/template.go | 53 | ||||
-rw-r--r-- | driver/token_stream.go | 8 |
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 } |