package shell import ( "fmt" "io" ) type LineParameters struct{} func (p *LineParameters) SubParsers() []Parser { return []Parser{ &BaseParser{ parameters: &StatementParameters{}, }, } } func (p *LineParameters) Supports(charsBefore []rune, r rune) bool { return true } func (p *LineParameters) ShouldLeave(charsBefore []rune, r rune) bool { if r == '\n' { return countBackslashSuffixes(charsBefore)%2 == 0 } return false } func (p *LineParameters) MakeToken() Token { return &Line{} } type Line struct { BaseToken } func (l *Line) Evaluate(state State, stdin io.Reader, stdout io.Writer, stderr io.Writer) uint8 { var retval uint8 = 0 for _, token := range l.Tokens() { if eval, ok := token.(Evalable); ok { retval = eval.Evaluate(state, stdin, stdout, stderr) } else { stderr.Write([]byte( fmt.Sprintf( "shell: Syntax error near unexpected token: %s", token.String(), ), )) } } return retval }