this repo has no description
at main 941 B view raw
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