diff options
author | EuAndreh <eu@euandre.org> | 2024-12-10 12:29:03 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2024-12-10 12:29:03 -0300 |
commit | 8359c047aaebe274a2d811d61922b571ca7d10df (patch) | |
tree | 070e0ed93d27a842776ada805eeb4270e7e3c806 /src/urubu/driver/parser/token_stream.go | |
parent | Start building test files (diff) | |
download | cotia-8359c047aaebe274a2d811d61922b571ca7d10df.tar.gz cotia-8359c047aaebe274a2d811d61922b571ca7d10df.tar.xz |
Namespace packages with "urubu/"
Diffstat (limited to 'src/urubu/driver/parser/token_stream.go')
-rw-r--r-- | src/urubu/driver/parser/token_stream.go | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/urubu/driver/parser/token_stream.go b/src/urubu/driver/parser/token_stream.go new file mode 100644 index 0000000..788e521 --- /dev/null +++ b/src/urubu/driver/parser/token_stream.go @@ -0,0 +1,65 @@ +package parser + +import ( + "io" + + "urubu/driver/lexer" + spec "urubu/spec/grammar" +) + +type vToken struct { + terminalID int + tok *lexer.Token +} + +func (t *vToken) TerminalID() int { + return t.terminalID +} + +func (t *vToken) Lexeme() []byte { + return t.tok.Lexeme +} + +func (t *vToken) EOF() bool { + return t.tok.EOF +} + +func (t *vToken) Invalid() bool { + return t.tok.Invalid +} + +func (t *vToken) BytePosition() (int, int) { + return t.tok.BytePos, t.tok.ByteLen +} + +func (t *vToken) Position() (int, int) { + return t.tok.Row, t.tok.Col +} + +type tokenStream struct { + lex *lexer.Lexer + kindToTerminal []int +} + +func NewTokenStream(g *spec.CompiledGrammar, src io.Reader) (TokenStream, error) { + lex, err := lexer.NewLexer(lexer.NewLexSpec(g.Lexical), src) + if err != nil { + return nil, err + } + + return &tokenStream{ + lex: lex, + kindToTerminal: g.Syntactic.KindToTerminal, + }, nil +} + +func (l *tokenStream) Next() (VToken, error) { + tok, err := l.lex.Next() + if err != nil { + return nil, err + } + return &vToken{ + terminalID: l.kindToTerminal[tok.KindID], + tok: tok, + }, nil +} |