package parser import "asciigoat.org/core/lexer" // Run parses the source func (p *Parser) Run() error { p.setDefaults() p.pos.Reset() return lexer.Run(p.lexStart) } func (p *Parser) lexStart() (lexer.StateFn, error) { for { r, _, err := p.src.ReadRune() switch { case err != nil: return p.emitError("", err) case r == '\n': // new line r2, _, err := p.src.ReadRune() switch { case err == nil && r2 == '\r': // MAC new line case err == nil: // UNIX new line p.src.UnreadRune() } p.src.Discard() p.pos.StepLine() case r == '\r': // new line r2, _, err := p.src.ReadRune() switch { case err == nil && r2 == '\n': // DOS new line case err == nil: // incomplete CRLN p.src.UnreadRune() return p.emitInvalidRune(r2) } p.src.Discard() p.pos.StepLine() case p.IsSpace(r): // whitespace p.src.Discard() p.pos.Step() case p.IsCommentStart(r): // switch to comment lexer p.src.UnreadRune() return p.lexComment, nil } } } func (p *Parser) lexComment() (lexer.StateFn, error)