github.com/mithrandie/csvq@v1.18.1/lib/json/query_parser.y (about) 1 %{ 2 package json 3 4 import "strconv" 5 %} 6 7 %union{ 8 expression QueryExpression 9 element Element 10 field FieldExpr 11 fields []FieldExpr 12 token QueryToken 13 } 14 15 %type<expression> query 16 %type<expression> expression 17 %type<element> element 18 %type<element> single_value_element 19 %type<expression> array_item 20 %type<expression> single_value_array_item 21 %type<expression> row_value 22 %type<expression> table 23 %type<field> field 24 %type<fields> fields 25 26 %token<token> PATH_IDENTIFIER PATH_INDEX 27 %token<token> AS 28 29 %% 30 31 query 32 : 33 { 34 $$ = nil 35 jqlex.(*QueryLexer).query = $$ 36 } 37 | expression 38 { 39 $$ = $1 40 jqlex.(*QueryLexer).query = $$ 41 } 42 43 expression 44 : element 45 { 46 $$ = $1 47 } 48 | array_item 49 { 50 $$ = $1 51 } 52 | row_value 53 { 54 $$ = $1 55 } 56 | table 57 { 58 $$ = $1 59 } 60 61 element 62 : PATH_IDENTIFIER 63 { 64 $$ = Element{Label: $1.Literal} 65 } 66 | PATH_IDENTIFIER '.' element 67 { 68 $$ = Element{Label: $1.Literal, Child: $3} 69 } 70 | PATH_IDENTIFIER array_item 71 { 72 $$ = Element{Label: $1.Literal, Child: $2} 73 } 74 | PATH_IDENTIFIER row_value 75 { 76 $$ = Element{Label: $1.Literal, Child: $2} 77 } 78 | PATH_IDENTIFIER table 79 { 80 $$ = Element{Label: $1.Literal, Child: $2} 81 } 82 83 single_value_element 84 : PATH_IDENTIFIER 85 { 86 $$ = Element{Label: $1.Literal} 87 } 88 | PATH_IDENTIFIER '.' single_value_element 89 { 90 $$ = Element{Label: $1.Literal, Child: $3} 91 } 92 | PATH_IDENTIFIER single_value_array_item 93 { 94 $$ = Element{Label: $1.Literal, Child: $2} 95 } 96 97 array_item 98 : '[' PATH_INDEX ']' 99 { 100 i, _ := strconv.Atoi($2.Literal) 101 $$ = ArrayItem{Index: i} 102 } 103 | '[' PATH_INDEX ']' '.' element 104 { 105 i, _ := strconv.Atoi($2.Literal) 106 $$ = ArrayItem{Index: i, Child: $5} 107 } 108 | '[' PATH_INDEX ']' array_item 109 { 110 i, _ := strconv.Atoi($2.Literal) 111 $$ = ArrayItem{Index: i, Child: $4} 112 } 113 | '[' PATH_INDEX ']' row_value 114 { 115 i, _ := strconv.Atoi($2.Literal) 116 $$ = ArrayItem{Index: i, Child: $4} 117 } 118 | '[' PATH_INDEX ']' table 119 { 120 i, _ := strconv.Atoi($2.Literal) 121 $$ = ArrayItem{Index: i, Child: $4} 122 } 123 124 single_value_array_item 125 : '[' PATH_INDEX ']' 126 { 127 i, _ := strconv.Atoi($2.Literal) 128 $$ = ArrayItem{Index: i} 129 } 130 | '[' PATH_INDEX ']' '.' single_value_element 131 { 132 i, _ := strconv.Atoi($2.Literal) 133 $$ = ArrayItem{Index: i, Child: $5} 134 } 135 | '[' PATH_INDEX ']' single_value_array_item 136 { 137 i, _ := strconv.Atoi($2.Literal) 138 $$ = ArrayItem{Index: i, Child: $4} 139 } 140 141 row_value 142 : '[' ']' 143 { 144 $$ = RowValueExpr{} 145 } 146 | '[' ']' '.' single_value_element 147 { 148 $$ = RowValueExpr{Child: $4} 149 } 150 | '[' ']' single_value_array_item 151 { 152 $$ = RowValueExpr{Child: $3} 153 } 154 155 table 156 : '{' fields '}' 157 { 158 $$ = TableExpr{Fields: $2} 159 } 160 161 field 162 : single_value_element 163 { 164 $$ = FieldExpr{Element: $1} 165 } 166 | single_value_element AS PATH_IDENTIFIER 167 { 168 $$ = FieldExpr{Element: $1, Alias: $3.Literal} 169 } 170 171 fields 172 : 173 { 174 $$ = nil 175 } 176 | field 177 { 178 $$ = []FieldExpr{$1} 179 } 180 | field ',' fields 181 { 182 $$ = append([]FieldExpr{$1}, $3...) 183 } 184 185 %% 186 187 func ParseQuery(src string) (QueryExpression, error) { 188 l := new(QueryLexer) 189 l.Init(src) 190 jqParse(l) 191 return l.query, l.err 192 }