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  }