github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/event/query/query.peg (about)

     1  package query
     2  
     3  # We specify the name of the generated parse to be QueryParser then Expression is a struct type that we are expected
     4  # to define to provide parse internal state when we run parser.Execute()
     5  
     6  type QueryParser Peg {
     7      Expression
     8  }
     9  
    10  # By recursing through OR then AND AND gets stronger precedent. PEG goes depth first so the hooks that are deeper
    11  # in the AST get run first - this allows us to naturally form code for a stack machine (implemented in Expression)
    12  
    13  e <- eor !.
    14  
    15  eor <- eand ( or eand { p.Operator(OpOr) })*
    16  
    17  eand <- enot ( and enot { p.Operator(OpAnd) })*
    18  
    19  enot <- not condition { p.Operator(OpNot) } / condition
    20  
    21  condition <- tag sp (le (number / time / date) { p.Operator(OpLessEqual) }
    22                        / ge (number / time / date) { p.Operator(OpGreaterEqual) }
    23                        / l (number / time / date) { p.Operator(OpLess) }
    24                        / g (number / time / date) { p.Operator(OpGreater) }
    25                        / equal (number / time / date / qvalue) { p.Operator(OpEqual) }
    26                        / ne (number / time / date / qvalue) { p.Operator(OpNotEqual) }
    27                        / contains qvalue { p.Operator(OpContains) }
    28                        ) sp / open eor close
    29  
    30  ## Terminals
    31  
    32  tag <- < (![ \t\n\r\\()"'=><] .)+ > sp { p.Tag(buffer[begin:end]) }
    33  
    34  qvalue <- '\'' value '\'' sp
    35  value <- < (!["'] .)* > { p.Value(buffer[begin:end]) }
    36  
    37  number <- < ('0' / [1-9] digit* ('.' digit*)?) > { p.Number(buffer[begin:end]) }
    38  digit <- [0-9]
    39  
    40  time <- "TIME " < year '-' month '-' day 'T' digit digit ':' digit digit ':' digit digit (('-' / '+') digit digit ':' digit digit / 'Z') > { p.Time(buffer[begin:end]) }
    41  
    42  date <- "DATE " < year '-' month '-' day > { p.Date(buffer[begin:end]) }
    43  year <- ('1' / '2') digit digit digit
    44  month <- ('0' / '1') digit
    45  day <- ('0' / '1' / '2' / '3') digit
    46  
    47  ## Operators
    48  
    49  and <- "AND" sp
    50  or <- "OR" sp
    51  not <- "NOT" sp
    52  equal <- "=" sp
    53  ne <- "!=" sp
    54  contains <- "CONTAINS" sp
    55  le <- "<=" sp
    56  ge <- ">=" sp
    57  l <- "<" sp
    58  g <- ">" sp
    59  
    60  # Whitespace and grouping
    61  open <- '(' sp
    62  close <- ')' sp
    63  sp <- (' ' / '\t')*