func main() { flag.Parse() input := os.Stdin if len(flag.Args()) == 1 { s, err := os.Open(flag.Arg(0)) if err != nil { log.Fatal(err) } defer input.Close() input = s } else if len(flag.Args()) != 0 { log.Fatalf("Usage: %s [<filename>]", os.Args[0]) } buf, err := ioutil.ReadAll(input) if err != nil { log.Fatal(err) } l := lexer.Lexer{ Input: buf, } nodes := []lexer.Node{} for { n, err := l.Get() if err != nil { log.Fatal(err) } if n == nil { break } nodes = append(nodes, n) } if *useJSON { err = json.NewEncoder(os.Stdout).Encode(nodes) if err != nil { log.Fatal(err) } } else { e := &encoder{writer: os.Stdout} e.Encode(nodes) } }
func TestLexer(t *testing.T) { for _, test := range lexerTests { l := lexer.Lexer{ Input: []byte(test.Input), } pos := 0 for _, lexeme := range test.Output { node, err := l.Get() if err != nil { t.Errorf("%q: lexeme %q: %s", test.Input, lexeme, err) break } if node == nil { t.Errorf("%q: got EOF, await %q", test.Input, lexeme) break } if p := node.Pos(); int(p) != pos { t.Errorf("%q: lexeme %q: got position %d, await %d", test.Input, lexeme, p, pos) } text, err := node.MarshalText() if err != nil { t.Fatal(err) } if string(text) != lexeme { t.Errorf("%q: lexeme %q: got %q, await %q", test.Input, lexeme, text, lexeme) } pos += len(text) } if pos != len(test.Input) { t.Errorf("%q: unconsumed: %q", test.Input, test.Input[pos:]) } } }