Ejemplo n.º 1
0
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)
	}
}
Ejemplo n.º 2
0
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:])
		}
	}
}