asciigoat's core library
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.9 KiB

asciigoat's core library

Go Reference Go Report Card

This package contains the basics for writing simple parsers of text languages heavily inspired by Rob Pike's talk on Lexical Scanning in Go in 2011 which you can watch online to get better understanding of the ideas behind asciigoat.

asciigoat is MIT licensed.



The lexer package provides lexer.Reader which is actually an io.RuneScanner that buffers accepted runes until you are ready to emit or discard.


lexer.Position is a (Line, Column) pair with methods to facilitate tracking your position on the source Reader.


lexer.Error is an unwrappable error with a token position and hint attached.


At the heart of asciigoat we have state functions as proposed on Rob Pike's famous talk which return the next state function parsing is done. Additionally there is a Run() helper that implements the loop.

rune checkers

Rune checkers are simple functions that tell if a rune is of a class or it's not. Fundamental checkers are provided by the unicode package.

Our lexer.Reader uses them on its Accept() and AcceptAll() methods to make it easier to consume the source document.

To facilitate the declaration of rune classes in the context of asciigoat powered parsers we include a series of rune checker factories.

  • NewIsIn(string)
  • NewIsInRunes(...rune)
  • NewIsNot(checker)
  • NewIsOneOf(...checker)



ReadCloser assists in providing a io.Closer to Readers or buffers without on, or unearthing one if available so io.ReadCloser can be fulfilled.

See also