1{
2package parser
3
4type IdFilter struct {
5 Ids []int
6}
7}
8
9Filter <- first:(IdRange / SingleId) rest:(',' (IdRange / SingleId))* {
10 var ids []int
11 first := toIntSlice(first)
12 ids = append(ids, first...)
13
14 if rest != nil {
15 for _, r := range rest.([]interface{}) {
16 restIds := toIntSlice(r.([]interface{})[1])
17 ids = append(ids, restIds...)
18 }
19 }
20
21 return &IdFilter{Ids: ids}, nil
22}
23
24IdRange <- start:Integer '-' end:Integer {
25 start := start.(int)
26 end := end.(int)
27 var ids []int
28 for i := start; i <= end; i++ {
29 ids = append(ids, i)
30 }
31 return ids, nil
32}
33
34SingleId <- id:Integer {
35 return []int{id.(int)}, nil
36}
37
38Integer <- [0-9]+ {
39 val := string(c.text)
40 n, _ := strconv.Atoi(val)
41 return n, nil
42}
43
44_ <- [ \t]*
45
46{
47func toIntSlice(v interface{}) []int {
48 if slice, ok := v.([]int); ok {
49 return slice
50 }
51 return nil
52}
53}
54