3 Commits

Author SHA1 Message Date
amery 7672acae5a build-sys: import build system from darvaza.org/core
Signed-off-by: Alejandro Mery <amery@jpi.io>
2023-08-29 13:55:38 +00:00
amery d5ad69c7e3 Merge branch 'pr-amery-lexer-error' into next-amery 2023-08-29 13:55:30 +00:00
amery 15938090f6 lexer: introduce StateFn and the basic state machine loop
Signed-off-by: Alejandro Mery <amery@jpi.io>
2023-08-29 13:26:49 +00:00
2 changed files with 3 additions and 83 deletions
+3 -17
View File
@@ -1,31 +1,17 @@
// Package lexer provides basic helpers to implement parsers
package lexer
import (
"errors"
"io"
)
// StateFn is a State Function of the parser
type StateFn func() (StateFn, error)
// Run runs a state machine until the state function either
// returns nil or an error
func Run(fn StateFn) error {
for fn != nil {
var err error
var err error
for fn != nil && err == nil {
fn, err = fn()
switch {
case errors.Is(err, io.EOF):
// EOF
return nil
case err != nil:
// failed
return err
}
}
// ended
return nil
return err
}
-66
View File
@@ -1,66 +0,0 @@
package lexer
import "fmt"
// Position indicates a line and column pair on a file.
// Counting starts at 1.
type Position struct {
Line int
Column int
}
// String generates a pretty "(Line, Column)"" representation of the Position
func (p Position) String() string {
if p.Line == 0 {
p.Reset()
}
return fmt.Sprintf("(%v, %v)", p.Line, p.Column)
}
// GoString generates a string representation of the Position for %#v usage
func (p Position) GoString() string {
if p.Line == 0 {
p.Reset()
}
return fmt.Sprintf("lexer.Position{%v, %v}", p.Line, p.Column)
}
// Reset places a position at (1,1)
func (p *Position) Reset() {
p.Line, p.Column = 1, 1
}
// Step moves the column one place
func (p *Position) Step() {
if p.Line == 0 {
p.Reset()
}
p.Column++
}
// StepN moves the column N places forward
func (p *Position) StepN(n int) {
if p.Line == 0 {
p.Reset()
}
switch {
case n > 0:
p.Column += n
default:
panic(fmt.Errorf("invalid %v increment", n))
}
}
// StepLine moves position to the start of the next line
func (p *Position) StepLine() {
if p.Line == 0 {
p.Reset()
}
p.Line++
p.Column = 1
}