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')*