Go lendo arquivo com bufio

A primeira parte do meu lexer, ler o arquivo de uma forma eficiente, a solução que encontrei foi usar bufio e receber um reader, dessa forma fica genérico e rápido.

Lexer, tokenizer, scanner…

Tenho vários projetos que poderiam se beneficiar de um lexer genérico e escrito em Go, então resolvi brincar com a ideia de escrever o meu próprio. Eu sei, eu poderia ter usado text/scanner mas depois de alguns testes achei ele difícil de expandir, também poderia ter usado um dos muitos que estão prontos por ai, mas não encontrei nada que eu não precisasse aprender uma nova ferramenta alem da linguagem ou mergulhar na mente do criador original para entender o que ele queria fazer. Quero algo realmente genérico que eu consiga expandir muito facilmente.

Alem da flexibilidade precisa ser rápido e suportar UTF-8 por padrão.

Lendo o arquivo

Então estou juntando algumas ideias e começando a escrever código, a primeira parte obviamente é ler do arquivo ou de uma string na memória.

É isso que o código abaixo faz.

var tok rune
var size int

r := bufio.NewReader(reader)
for {
	tok, size, err = r.ReadRune()
	if err != nil {
		if err == io.EOF {
			break
		}
		return
	}
	fmt.Printf("%q %v\n", tok, size)
}

A ideia é simples, receber um reader e ler runa a runa usando bufio.

Fiz um vídeo demonstrando como estou fazendo:

Você pode ler o código fonte do sistema no Github, ainda não esta pronto mas pretendo continuar trabalhando nele. Criar um lexer é divertido. :D

comments powered by Disqus