From 3cb3a065dd6230deed03d376cfa653e33d424702 Mon Sep 17 00:00:00 2001 From: Yuce Tekol Date: Thu, 1 Nov 2018 21:56:34 +0300 Subject: [PATCH 1/4] allow backlash, carriage return in pql strings --- pql/parser_test.go | 15 +- pql/pql.peg | 4 +- pql/pql.peg.go | 620 +++++++++++++++++++++------------------------ 3 files changed, 302 insertions(+), 337 deletions(-) diff --git a/pql/parser_test.go b/pql/parser_test.go index b5d98fb13..0d29eea4f 100644 --- a/pql/parser_test.go +++ b/pql/parser_test.go @@ -75,19 +75,20 @@ func TestParser_Parse(t *testing.T) { // Parse with only arguments. t.Run("ArgumentsOnly", func(t *testing.T) { - q, err := pql.ParseString(`MyCall( key= value, foo="bar", age = 12 , bool0=true, bool1=false, x=null )`) + q, err := pql.ParseString("MyCall( key= value, foo='bar', age = 12 , bool0=true, bool1=false, x=null, escape='\\escape\n' )") if err != nil { t.Fatal(err) } else if !reflect.DeepEqual(q.Calls[0], &pql.Call{ Name: "MyCall", Args: map[string]interface{}{ - "key": "value", - "foo": "bar", - "age": int64(12), - "bool0": true, - "bool1": false, - "x": nil, + "key": "value", + "foo": "bar", + "age": int64(12), + "bool0": true, + "bool1": false, + "x": nil, + "escape": "\\escape\n", }, }, ) { diff --git a/pql/pql.peg b/pql/pql.peg index 9e0087046..4db0b1c97 100644 --- a/pql/pql.peg +++ b/pql/pql.peg @@ -49,8 +49,8 @@ item <- ( 'null' &(comma / sp close) { p.addVal(nil) } / '\'' < singlequotedstring > '\'' { p.addVal(buffer[begin:end]) } ) -doublequotedstring <- ( [^"\\\n] / '\\n' / '\\\"' / '\\\'' / '\\\\' )* -singlequotedstring <- ( [^'\\\n] / '\\n' / '\\\"' / '\\\'' / '\\\\' )* +doublequotedstring <- ( [^"] / '\\n' / '\\\"' / '\\\'' / '\\\\' )* +singlequotedstring <- ( [^'] / '\\n' / '\\\"' / '\\\'' / '\\\\' )* fieldExpr <- [[A-Z]] ( [[A-Z]] / [0-9] / '_' / '-' )* field <- { p.addField(buffer[begin:end]) } diff --git a/pql/pql.peg.go b/pql/pql.peg.go index 2d5877fbb..eb40c5a21 100644 --- a/pql/pql.peg.go +++ b/pql/pql.peg.go @@ -2107,7 +2107,7 @@ func (p *PQL) Init() { position, tokenIndex = position140, tokenIndex140 return false }, - /* 14 doublequotedstring <- <((!('"' / '\\' / '\n') .) / ('\\' 'n') / ('\\' '"') / ('\\' '\'') / ('\\' '\\'))*> */ + /* 14 doublequotedstring <- <((!'"' .) / ('\\' 'n') / ('\\' '"') / ('\\' '\'') / ('\\' '\\'))*> */ func() bool { { position199 := position @@ -2118,28 +2118,10 @@ func (p *PQL) Init() { position202, tokenIndex202 := position, tokenIndex { position204, tokenIndex204 := position, tokenIndex - { - position205, tokenIndex205 := position, tokenIndex - if buffer[position] != rune('"') { - goto l206 - } - position++ - goto l205 - l206: - position, tokenIndex = position205, tokenIndex205 - if buffer[position] != rune('\\') { - goto l207 - } - position++ - goto l205 - l207: - position, tokenIndex = position205, tokenIndex205 - if buffer[position] != rune('\n') { - goto l204 - } - position++ + if buffer[position] != rune('"') { + goto l204 } - l205: + position++ goto l203 l204: position, tokenIndex = position204, tokenIndex204 @@ -2151,37 +2133,37 @@ func (p *PQL) Init() { l203: position, tokenIndex = position202, tokenIndex202 if buffer[position] != rune('\\') { - goto l208 + goto l205 } position++ if buffer[position] != rune('n') { - goto l208 + goto l205 } position++ goto l202 - l208: + l205: position, tokenIndex = position202, tokenIndex202 if buffer[position] != rune('\\') { - goto l209 + goto l206 } position++ if buffer[position] != rune('"') { - goto l209 + goto l206 } position++ goto l202 - l209: + l206: position, tokenIndex = position202, tokenIndex202 if buffer[position] != rune('\\') { - goto l210 + goto l207 } position++ if buffer[position] != rune('\'') { - goto l210 + goto l207 } position++ goto l202 - l210: + l207: position, tokenIndex = position202, tokenIndex202 if buffer[position] != rune('\\') { goto l201 @@ -2201,587 +2183,569 @@ func (p *PQL) Init() { } return true }, - /* 15 singlequotedstring <- <((!('\'' / '\\' / '\n') .) / ('\\' 'n') / ('\\' '"') / ('\\' '\'') / ('\\' '\\'))*> */ + /* 15 singlequotedstring <- <((!'\'' .) / ('\\' 'n') / ('\\' '"') / ('\\' '\'') / ('\\' '\\'))*> */ func() bool { { - position212 := position - l213: + position209 := position + l210: { - position214, tokenIndex214 := position, tokenIndex + position211, tokenIndex211 := position, tokenIndex { - position215, tokenIndex215 := position, tokenIndex + position212, tokenIndex212 := position, tokenIndex { - position217, tokenIndex217 := position, tokenIndex - { - position218, tokenIndex218 := position, tokenIndex - if buffer[position] != rune('\'') { - goto l219 - } - position++ - goto l218 - l219: - position, tokenIndex = position218, tokenIndex218 - if buffer[position] != rune('\\') { - goto l220 - } - position++ - goto l218 - l220: - position, tokenIndex = position218, tokenIndex218 - if buffer[position] != rune('\n') { - goto l217 - } - position++ + position214, tokenIndex214 := position, tokenIndex + if buffer[position] != rune('\'') { + goto l214 } - l218: - goto l216 - l217: - position, tokenIndex = position217, tokenIndex217 + position++ + goto l213 + l214: + position, tokenIndex = position214, tokenIndex214 } if !matchDot() { - goto l216 + goto l213 } - goto l215 - l216: - position, tokenIndex = position215, tokenIndex215 + goto l212 + l213: + position, tokenIndex = position212, tokenIndex212 if buffer[position] != rune('\\') { - goto l221 + goto l215 } position++ if buffer[position] != rune('n') { - goto l221 + goto l215 } position++ - goto l215 - l221: - position, tokenIndex = position215, tokenIndex215 + goto l212 + l215: + position, tokenIndex = position212, tokenIndex212 if buffer[position] != rune('\\') { - goto l222 + goto l216 } position++ if buffer[position] != rune('"') { - goto l222 + goto l216 } position++ - goto l215 - l222: - position, tokenIndex = position215, tokenIndex215 + goto l212 + l216: + position, tokenIndex = position212, tokenIndex212 if buffer[position] != rune('\\') { - goto l223 + goto l217 } position++ if buffer[position] != rune('\'') { - goto l223 + goto l217 } position++ - goto l215 - l223: - position, tokenIndex = position215, tokenIndex215 + goto l212 + l217: + position, tokenIndex = position212, tokenIndex212 if buffer[position] != rune('\\') { - goto l214 + goto l211 } position++ if buffer[position] != rune('\\') { - goto l214 + goto l211 } position++ } - l215: - goto l213 - l214: - position, tokenIndex = position214, tokenIndex214 + l212: + goto l210 + l211: + position, tokenIndex = position211, tokenIndex211 } - add(rulesinglequotedstring, position212) + add(rulesinglequotedstring, position209) } return true }, /* 16 fieldExpr <- <(([a-z] / [A-Z]) ([a-z] / [A-Z] / [0-9] / '_' / '-')*)> */ func() bool { - position224, tokenIndex224 := position, tokenIndex + position218, tokenIndex218 := position, tokenIndex { - position225 := position + position219 := position { - position226, tokenIndex226 := position, tokenIndex + position220, tokenIndex220 := position, tokenIndex if c := buffer[position]; c < rune('a') || c > rune('z') { - goto l227 + goto l221 } position++ - goto l226 - l227: - position, tokenIndex = position226, tokenIndex226 + goto l220 + l221: + position, tokenIndex = position220, tokenIndex220 if c := buffer[position]; c < rune('A') || c > rune('Z') { - goto l224 + goto l218 } position++ } - l226: - l228: + l220: + l222: { - position229, tokenIndex229 := position, tokenIndex + position223, tokenIndex223 := position, tokenIndex { - position230, tokenIndex230 := position, tokenIndex + position224, tokenIndex224 := position, tokenIndex if c := buffer[position]; c < rune('a') || c > rune('z') { - goto l231 + goto l225 } position++ - goto l230 - l231: - position, tokenIndex = position230, tokenIndex230 + goto l224 + l225: + position, tokenIndex = position224, tokenIndex224 if c := buffer[position]; c < rune('A') || c > rune('Z') { - goto l232 + goto l226 } position++ - goto l230 - l232: - position, tokenIndex = position230, tokenIndex230 + goto l224 + l226: + position, tokenIndex = position224, tokenIndex224 if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l233 + goto l227 } position++ - goto l230 - l233: - position, tokenIndex = position230, tokenIndex230 + goto l224 + l227: + position, tokenIndex = position224, tokenIndex224 if buffer[position] != rune('_') { - goto l234 + goto l228 } position++ - goto l230 - l234: - position, tokenIndex = position230, tokenIndex230 + goto l224 + l228: + position, tokenIndex = position224, tokenIndex224 if buffer[position] != rune('-') { - goto l229 + goto l223 } position++ } - l230: - goto l228 - l229: - position, tokenIndex = position229, tokenIndex229 + l224: + goto l222 + l223: + position, tokenIndex = position223, tokenIndex223 } - add(rulefieldExpr, position225) + add(rulefieldExpr, position219) } return true - l224: - position, tokenIndex = position224, tokenIndex224 + l218: + position, tokenIndex = position218, tokenIndex218 return false }, /* 17 field <- <(<(fieldExpr / reserved)> Action42)> */ func() bool { - position235, tokenIndex235 := position, tokenIndex + position229, tokenIndex229 := position, tokenIndex { - position236 := position + position230 := position { - position237 := position + position231 := position { - position238, tokenIndex238 := position, tokenIndex + position232, tokenIndex232 := position, tokenIndex if !_rules[rulefieldExpr]() { - goto l239 + goto l233 } - goto l238 - l239: - position, tokenIndex = position238, tokenIndex238 + goto l232 + l233: + position, tokenIndex = position232, tokenIndex232 { - position240 := position + position234 := position { - position241, tokenIndex241 := position, tokenIndex + position235, tokenIndex235 := position, tokenIndex if buffer[position] != rune('_') { - goto l242 + goto l236 } position++ if buffer[position] != rune('r') { - goto l242 + goto l236 } position++ if buffer[position] != rune('o') { - goto l242 + goto l236 } position++ if buffer[position] != rune('w') { - goto l242 + goto l236 } position++ - goto l241 - l242: - position, tokenIndex = position241, tokenIndex241 + goto l235 + l236: + position, tokenIndex = position235, tokenIndex235 if buffer[position] != rune('_') { - goto l243 + goto l237 } position++ if buffer[position] != rune('c') { - goto l243 + goto l237 } position++ if buffer[position] != rune('o') { - goto l243 + goto l237 } position++ if buffer[position] != rune('l') { - goto l243 + goto l237 } position++ - goto l241 - l243: - position, tokenIndex = position241, tokenIndex241 + goto l235 + l237: + position, tokenIndex = position235, tokenIndex235 if buffer[position] != rune('_') { - goto l244 + goto l238 } position++ if buffer[position] != rune('s') { - goto l244 + goto l238 } position++ if buffer[position] != rune('t') { - goto l244 + goto l238 } position++ if buffer[position] != rune('a') { - goto l244 + goto l238 } position++ if buffer[position] != rune('r') { - goto l244 + goto l238 } position++ if buffer[position] != rune('t') { - goto l244 + goto l238 } position++ - goto l241 - l244: - position, tokenIndex = position241, tokenIndex241 + goto l235 + l238: + position, tokenIndex = position235, tokenIndex235 if buffer[position] != rune('_') { - goto l245 + goto l239 } position++ if buffer[position] != rune('e') { - goto l245 + goto l239 } position++ if buffer[position] != rune('n') { - goto l245 + goto l239 } position++ if buffer[position] != rune('d') { - goto l245 + goto l239 } position++ - goto l241 - l245: - position, tokenIndex = position241, tokenIndex241 + goto l235 + l239: + position, tokenIndex = position235, tokenIndex235 if buffer[position] != rune('_') { - goto l246 + goto l240 } position++ if buffer[position] != rune('t') { - goto l246 + goto l240 } position++ if buffer[position] != rune('i') { - goto l246 + goto l240 } position++ if buffer[position] != rune('m') { - goto l246 + goto l240 } position++ if buffer[position] != rune('e') { - goto l246 + goto l240 } position++ if buffer[position] != rune('s') { - goto l246 + goto l240 } position++ if buffer[position] != rune('t') { - goto l246 + goto l240 } position++ if buffer[position] != rune('a') { - goto l246 + goto l240 } position++ if buffer[position] != rune('m') { - goto l246 + goto l240 } position++ if buffer[position] != rune('p') { - goto l246 + goto l240 } position++ - goto l241 - l246: - position, tokenIndex = position241, tokenIndex241 + goto l235 + l240: + position, tokenIndex = position235, tokenIndex235 if buffer[position] != rune('_') { - goto l235 + goto l229 } position++ if buffer[position] != rune('f') { - goto l235 + goto l229 } position++ if buffer[position] != rune('i') { - goto l235 + goto l229 } position++ if buffer[position] != rune('e') { - goto l235 + goto l229 } position++ if buffer[position] != rune('l') { - goto l235 + goto l229 } position++ if buffer[position] != rune('d') { - goto l235 + goto l229 } position++ } - l241: - add(rulereserved, position240) + l235: + add(rulereserved, position234) } } - l238: - add(rulePegText, position237) + l232: + add(rulePegText, position231) } { add(ruleAction42, position) } - add(rulefield, position236) + add(rulefield, position230) } return true - l235: - position, tokenIndex = position235, tokenIndex235 + l229: + position, tokenIndex = position229, tokenIndex229 return false }, /* 18 reserved <- <(('_' 'r' 'o' 'w') / ('_' 'c' 'o' 'l') / ('_' 's' 't' 'a' 'r' 't') / ('_' 'e' 'n' 'd') / ('_' 't' 'i' 'm' 'e' 's' 't' 'a' 'm' 'p') / ('_' 'f' 'i' 'e' 'l' 'd'))> */ nil, /* 19 posfield <- <( Action43)> */ func() bool { - position249, tokenIndex249 := position, tokenIndex + position243, tokenIndex243 := position, tokenIndex { - position250 := position + position244 := position { - position251 := position + position245 := position if !_rules[rulefieldExpr]() { - goto l249 + goto l243 } - add(rulePegText, position251) + add(rulePegText, position245) } { add(ruleAction43, position) } - add(ruleposfield, position250) + add(ruleposfield, position244) } return true - l249: - position, tokenIndex = position249, tokenIndex249 + l243: + position, tokenIndex = position243, tokenIndex243 return false }, /* 20 uint <- <(([1-9] [0-9]*) / '0')> */ func() bool { - position253, tokenIndex253 := position, tokenIndex + position247, tokenIndex247 := position, tokenIndex { - position254 := position + position248 := position { - position255, tokenIndex255 := position, tokenIndex + position249, tokenIndex249 := position, tokenIndex if c := buffer[position]; c < rune('1') || c > rune('9') { - goto l256 + goto l250 } position++ - l257: + l251: { - position258, tokenIndex258 := position, tokenIndex + position252, tokenIndex252 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l258 + goto l252 } position++ - goto l257 - l258: - position, tokenIndex = position258, tokenIndex258 + goto l251 + l252: + position, tokenIndex = position252, tokenIndex252 } - goto l255 - l256: - position, tokenIndex = position255, tokenIndex255 + goto l249 + l250: + position, tokenIndex = position249, tokenIndex249 if buffer[position] != rune('0') { - goto l253 + goto l247 } position++ } - l255: - add(ruleuint, position254) + l249: + add(ruleuint, position248) } return true - l253: - position, tokenIndex = position253, tokenIndex253 + l247: + position, tokenIndex = position247, tokenIndex247 return false }, /* 21 uintrow <- <( Action44)> */ nil, /* 22 col <- <(( Action45) / ('\'' '\'' Action46) / ('"' '"' Action47))> */ func() bool { - position260, tokenIndex260 := position, tokenIndex + position254, tokenIndex254 := position, tokenIndex { - position261 := position + position255 := position { - position262, tokenIndex262 := position, tokenIndex + position256, tokenIndex256 := position, tokenIndex { - position264 := position + position258 := position if !_rules[ruleuint]() { - goto l263 + goto l257 } - add(rulePegText, position264) + add(rulePegText, position258) } { add(ruleAction45, position) } - goto l262 - l263: - position, tokenIndex = position262, tokenIndex262 + goto l256 + l257: + position, tokenIndex = position256, tokenIndex256 if buffer[position] != rune('\'') { - goto l266 + goto l260 } position++ { - position267 := position + position261 := position if !_rules[rulesinglequotedstring]() { - goto l266 + goto l260 } - add(rulePegText, position267) + add(rulePegText, position261) } if buffer[position] != rune('\'') { - goto l266 + goto l260 } position++ { add(ruleAction46, position) } - goto l262 - l266: - position, tokenIndex = position262, tokenIndex262 + goto l256 + l260: + position, tokenIndex = position256, tokenIndex256 if buffer[position] != rune('"') { - goto l260 + goto l254 } position++ { - position269 := position + position263 := position if !_rules[ruledoublequotedstring]() { - goto l260 + goto l254 } - add(rulePegText, position269) + add(rulePegText, position263) } if buffer[position] != rune('"') { - goto l260 + goto l254 } position++ { add(ruleAction47, position) } } - l262: - add(rulecol, position261) + l256: + add(rulecol, position255) } return true - l260: - position, tokenIndex = position260, tokenIndex260 + l254: + position, tokenIndex = position254, tokenIndex254 return false }, /* 23 row <- <(( Action48) / ('\'' '\'' Action49) / ('"' '"' Action50))> */ nil, /* 24 open <- <('(' sp)> */ func() bool { - position272, tokenIndex272 := position, tokenIndex + position266, tokenIndex266 := position, tokenIndex { - position273 := position + position267 := position if buffer[position] != rune('(') { - goto l272 + goto l266 } position++ if !_rules[rulesp]() { - goto l272 + goto l266 } - add(ruleopen, position273) + add(ruleopen, position267) } return true - l272: - position, tokenIndex = position272, tokenIndex272 + l266: + position, tokenIndex = position266, tokenIndex266 return false }, /* 25 close <- <(')' sp)> */ func() bool { - position274, tokenIndex274 := position, tokenIndex + position268, tokenIndex268 := position, tokenIndex { - position275 := position + position269 := position if buffer[position] != rune(')') { - goto l274 + goto l268 } position++ if !_rules[rulesp]() { - goto l274 + goto l268 } - add(ruleclose, position275) + add(ruleclose, position269) } return true - l274: - position, tokenIndex = position274, tokenIndex274 + l268: + position, tokenIndex = position268, tokenIndex268 return false }, /* 26 sp <- <(' ' / '\t' / '\n')*> */ func() bool { { - position277 := position - l278: + position271 := position + l272: { - position279, tokenIndex279 := position, tokenIndex + position273, tokenIndex273 := position, tokenIndex { - position280, tokenIndex280 := position, tokenIndex + position274, tokenIndex274 := position, tokenIndex if buffer[position] != rune(' ') { - goto l281 + goto l275 } position++ - goto l280 - l281: - position, tokenIndex = position280, tokenIndex280 + goto l274 + l275: + position, tokenIndex = position274, tokenIndex274 if buffer[position] != rune('\t') { - goto l282 + goto l276 } position++ - goto l280 - l282: - position, tokenIndex = position280, tokenIndex280 + goto l274 + l276: + position, tokenIndex = position274, tokenIndex274 if buffer[position] != rune('\n') { - goto l279 + goto l273 } position++ } - l280: - goto l278 - l279: - position, tokenIndex = position279, tokenIndex279 + l274: + goto l272 + l273: + position, tokenIndex = position273, tokenIndex273 } - add(rulesp, position277) + add(rulesp, position271) } return true }, /* 27 comma <- <(sp ',' sp)> */ func() bool { - position283, tokenIndex283 := position, tokenIndex + position277, tokenIndex277 := position, tokenIndex { - position284 := position + position278 := position if !_rules[rulesp]() { - goto l283 + goto l277 } if buffer[position] != rune(',') { - goto l283 + goto l277 } position++ if !_rules[rulesp]() { - goto l283 + goto l277 } - add(rulecomma, position284) + add(rulecomma, position278) } return true - l283: - position, tokenIndex = position283, tokenIndex283 + l277: + position, tokenIndex = position277, tokenIndex277 return false }, /* 28 lbrack <- <('[' sp)> */ @@ -2792,136 +2756,136 @@ func (p *PQL) Init() { nil, /* 31 timestampbasicfmt <- <([0-9] [0-9] [0-9] [0-9] '-' ('0' / '1') [0-9] '-' [0-3] [0-9] 'T' [0-9] [0-9] ':' [0-9] [0-9])> */ func() bool { - position288, tokenIndex288 := position, tokenIndex + position282, tokenIndex282 := position, tokenIndex { - position289 := position + position283 := position if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l288 + goto l282 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l288 + goto l282 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l288 + goto l282 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l288 + goto l282 } position++ if buffer[position] != rune('-') { - goto l288 + goto l282 } position++ { - position290, tokenIndex290 := position, tokenIndex + position284, tokenIndex284 := position, tokenIndex if buffer[position] != rune('0') { - goto l291 + goto l285 } position++ - goto l290 - l291: - position, tokenIndex = position290, tokenIndex290 + goto l284 + l285: + position, tokenIndex = position284, tokenIndex284 if buffer[position] != rune('1') { - goto l288 + goto l282 } position++ } - l290: + l284: if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l288 + goto l282 } position++ if buffer[position] != rune('-') { - goto l288 + goto l282 } position++ if c := buffer[position]; c < rune('0') || c > rune('3') { - goto l288 + goto l282 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l288 + goto l282 } position++ if buffer[position] != rune('T') { - goto l288 + goto l282 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l288 + goto l282 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l288 + goto l282 } position++ if buffer[position] != rune(':') { - goto l288 + goto l282 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l288 + goto l282 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l288 + goto l282 } position++ - add(ruletimestampbasicfmt, position289) + add(ruletimestampbasicfmt, position283) } return true - l288: - position, tokenIndex = position288, tokenIndex288 + l282: + position, tokenIndex = position282, tokenIndex282 return false }, /* 32 timestampfmt <- <(('"' timestampbasicfmt '"') / ('\'' timestampbasicfmt '\'') / timestampbasicfmt)> */ func() bool { - position292, tokenIndex292 := position, tokenIndex + position286, tokenIndex286 := position, tokenIndex { - position293 := position + position287 := position { - position294, tokenIndex294 := position, tokenIndex + position288, tokenIndex288 := position, tokenIndex if buffer[position] != rune('"') { - goto l295 + goto l289 } position++ if !_rules[ruletimestampbasicfmt]() { - goto l295 + goto l289 } if buffer[position] != rune('"') { - goto l295 + goto l289 } position++ - goto l294 - l295: - position, tokenIndex = position294, tokenIndex294 + goto l288 + l289: + position, tokenIndex = position288, tokenIndex288 if buffer[position] != rune('\'') { - goto l296 + goto l290 } position++ if !_rules[ruletimestampbasicfmt]() { - goto l296 + goto l290 } if buffer[position] != rune('\'') { - goto l296 + goto l290 } position++ - goto l294 - l296: - position, tokenIndex = position294, tokenIndex294 + goto l288 + l290: + position, tokenIndex = position288, tokenIndex288 if !_rules[ruletimestampbasicfmt]() { - goto l292 + goto l286 } } - l294: - add(ruletimestampfmt, position293) + l288: + add(ruletimestampfmt, position287) } return true - l292: - position, tokenIndex = position292, tokenIndex292 + l286: + position, tokenIndex = position286, tokenIndex286 return false }, /* 33 timestamp <- <( Action51)> */ From 2a8f2c2026946fcd1f7dbc2d36fbd830ba55929e Mon Sep 17 00:00:00 2001 From: Yuce Tekol Date: Tue, 6 Nov 2018 14:09:32 +0300 Subject: [PATCH 2/4] minor grammar fix --- pql/parser_test.go | 4 +- pql/pql.peg | 4 +- pql/pql.peg.go | 626 ++++++++++++++++++++------------------------- 3 files changed, 284 insertions(+), 350 deletions(-) diff --git a/pql/parser_test.go b/pql/parser_test.go index 0d29eea4f..f63bc3763 100644 --- a/pql/parser_test.go +++ b/pql/parser_test.go @@ -75,7 +75,7 @@ func TestParser_Parse(t *testing.T) { // Parse with only arguments. t.Run("ArgumentsOnly", func(t *testing.T) { - q, err := pql.ParseString("MyCall( key= value, foo='bar', age = 12 , bool0=true, bool1=false, x=null, escape='\\escape\n' )") + q, err := pql.ParseString(`MyCall( key= value, foo='bar', age = 12 , bool0=true, bool1=false, x=null, escape="\" \\escape\n" )`) if err != nil { t.Fatal(err) } else if !reflect.DeepEqual(q.Calls[0], @@ -88,7 +88,7 @@ func TestParser_Parse(t *testing.T) { "bool0": true, "bool1": false, "x": nil, - "escape": "\\escape\n", + "escape": `\" \\escape\n`, }, }, ) { diff --git a/pql/pql.peg b/pql/pql.peg index 4db0b1c97..2a6620960 100644 --- a/pql/pql.peg +++ b/pql/pql.peg @@ -49,8 +49,8 @@ item <- ( 'null' &(comma / sp close) { p.addVal(nil) } / '\'' < singlequotedstring > '\'' { p.addVal(buffer[begin:end]) } ) -doublequotedstring <- ( [^"] / '\\n' / '\\\"' / '\\\'' / '\\\\' )* -singlequotedstring <- ( [^'] / '\\n' / '\\\"' / '\\\'' / '\\\\' )* +doublequotedstring <- ( '\\\"' / [^"] )* +singlequotedstring <- ( '\\\'' / [^'] )* fieldExpr <- [[A-Z]] ( [[A-Z]] / [0-9] / '_' / '-' )* field <- { p.addField(buffer[begin:end]) } diff --git a/pql/pql.peg.go b/pql/pql.peg.go index eb40c5a21..e98ed9ce9 100644 --- a/pql/pql.peg.go +++ b/pql/pql.peg.go @@ -2107,7 +2107,7 @@ func (p *PQL) Init() { position, tokenIndex = position140, tokenIndex140 return false }, - /* 14 doublequotedstring <- <((!'"' .) / ('\\' 'n') / ('\\' '"') / ('\\' '\'') / ('\\' '\\'))*> */ + /* 14 doublequotedstring <- <(('\\' '"') / (!'"' .))*> */ func() bool { { position199 := position @@ -2116,63 +2116,30 @@ func (p *PQL) Init() { position201, tokenIndex201 := position, tokenIndex { position202, tokenIndex202 := position, tokenIndex + if buffer[position] != rune('\\') { + goto l203 + } + position++ + if buffer[position] != rune('"') { + goto l203 + } + position++ + goto l202 + l203: + position, tokenIndex = position202, tokenIndex202 { position204, tokenIndex204 := position, tokenIndex if buffer[position] != rune('"') { goto l204 } position++ - goto l203 + goto l201 l204: position, tokenIndex = position204, tokenIndex204 } if !matchDot() { - goto l203 - } - goto l202 - l203: - position, tokenIndex = position202, tokenIndex202 - if buffer[position] != rune('\\') { - goto l205 - } - position++ - if buffer[position] != rune('n') { - goto l205 - } - position++ - goto l202 - l205: - position, tokenIndex = position202, tokenIndex202 - if buffer[position] != rune('\\') { - goto l206 - } - position++ - if buffer[position] != rune('"') { - goto l206 - } - position++ - goto l202 - l206: - position, tokenIndex = position202, tokenIndex202 - if buffer[position] != rune('\\') { - goto l207 - } - position++ - if buffer[position] != rune('\'') { - goto l207 - } - position++ - goto l202 - l207: - position, tokenIndex = position202, tokenIndex202 - if buffer[position] != rune('\\') { goto l201 } - position++ - if buffer[position] != rune('\\') { - goto l201 - } - position++ } l202: goto l200 @@ -2183,569 +2150,536 @@ func (p *PQL) Init() { } return true }, - /* 15 singlequotedstring <- <((!'\'' .) / ('\\' 'n') / ('\\' '"') / ('\\' '\'') / ('\\' '\\'))*> */ + /* 15 singlequotedstring <- <(('\\' '\'') / (!'\'' .))*> */ func() bool { { - position209 := position - l210: + position206 := position + l207: { - position211, tokenIndex211 := position, tokenIndex + position208, tokenIndex208 := position, tokenIndex { - position212, tokenIndex212 := position, tokenIndex - { - position214, tokenIndex214 := position, tokenIndex - if buffer[position] != rune('\'') { - goto l214 - } - position++ - goto l213 - l214: - position, tokenIndex = position214, tokenIndex214 - } - if !matchDot() { - goto l213 - } - goto l212 - l213: - position, tokenIndex = position212, tokenIndex212 + position209, tokenIndex209 := position, tokenIndex if buffer[position] != rune('\\') { - goto l215 - } - position++ - if buffer[position] != rune('n') { - goto l215 - } - position++ - goto l212 - l215: - position, tokenIndex = position212, tokenIndex212 - if buffer[position] != rune('\\') { - goto l216 - } - position++ - if buffer[position] != rune('"') { - goto l216 - } - position++ - goto l212 - l216: - position, tokenIndex = position212, tokenIndex212 - if buffer[position] != rune('\\') { - goto l217 + goto l210 } position++ if buffer[position] != rune('\'') { - goto l217 + goto l210 } position++ - goto l212 - l217: - position, tokenIndex = position212, tokenIndex212 - if buffer[position] != rune('\\') { - goto l211 + goto l209 + l210: + position, tokenIndex = position209, tokenIndex209 + { + position211, tokenIndex211 := position, tokenIndex + if buffer[position] != rune('\'') { + goto l211 + } + position++ + goto l208 + l211: + position, tokenIndex = position211, tokenIndex211 } - position++ - if buffer[position] != rune('\\') { - goto l211 + if !matchDot() { + goto l208 } - position++ } - l212: - goto l210 - l211: - position, tokenIndex = position211, tokenIndex211 + l209: + goto l207 + l208: + position, tokenIndex = position208, tokenIndex208 } - add(rulesinglequotedstring, position209) + add(rulesinglequotedstring, position206) } return true }, /* 16 fieldExpr <- <(([a-z] / [A-Z]) ([a-z] / [A-Z] / [0-9] / '_' / '-')*)> */ func() bool { - position218, tokenIndex218 := position, tokenIndex + position212, tokenIndex212 := position, tokenIndex { - position219 := position + position213 := position { - position220, tokenIndex220 := position, tokenIndex + position214, tokenIndex214 := position, tokenIndex if c := buffer[position]; c < rune('a') || c > rune('z') { - goto l221 + goto l215 } position++ - goto l220 - l221: - position, tokenIndex = position220, tokenIndex220 + goto l214 + l215: + position, tokenIndex = position214, tokenIndex214 if c := buffer[position]; c < rune('A') || c > rune('Z') { - goto l218 + goto l212 } position++ } - l220: - l222: + l214: + l216: { - position223, tokenIndex223 := position, tokenIndex + position217, tokenIndex217 := position, tokenIndex { - position224, tokenIndex224 := position, tokenIndex + position218, tokenIndex218 := position, tokenIndex if c := buffer[position]; c < rune('a') || c > rune('z') { - goto l225 + goto l219 } position++ - goto l224 - l225: - position, tokenIndex = position224, tokenIndex224 + goto l218 + l219: + position, tokenIndex = position218, tokenIndex218 if c := buffer[position]; c < rune('A') || c > rune('Z') { - goto l226 + goto l220 } position++ - goto l224 - l226: - position, tokenIndex = position224, tokenIndex224 + goto l218 + l220: + position, tokenIndex = position218, tokenIndex218 if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l227 + goto l221 } position++ - goto l224 - l227: - position, tokenIndex = position224, tokenIndex224 + goto l218 + l221: + position, tokenIndex = position218, tokenIndex218 if buffer[position] != rune('_') { - goto l228 + goto l222 } position++ - goto l224 - l228: - position, tokenIndex = position224, tokenIndex224 + goto l218 + l222: + position, tokenIndex = position218, tokenIndex218 if buffer[position] != rune('-') { - goto l223 + goto l217 } position++ } - l224: - goto l222 - l223: - position, tokenIndex = position223, tokenIndex223 + l218: + goto l216 + l217: + position, tokenIndex = position217, tokenIndex217 } - add(rulefieldExpr, position219) + add(rulefieldExpr, position213) } return true - l218: - position, tokenIndex = position218, tokenIndex218 + l212: + position, tokenIndex = position212, tokenIndex212 return false }, /* 17 field <- <(<(fieldExpr / reserved)> Action42)> */ func() bool { - position229, tokenIndex229 := position, tokenIndex + position223, tokenIndex223 := position, tokenIndex { - position230 := position + position224 := position { - position231 := position + position225 := position { - position232, tokenIndex232 := position, tokenIndex + position226, tokenIndex226 := position, tokenIndex if !_rules[rulefieldExpr]() { - goto l233 + goto l227 } - goto l232 - l233: - position, tokenIndex = position232, tokenIndex232 + goto l226 + l227: + position, tokenIndex = position226, tokenIndex226 { - position234 := position + position228 := position { - position235, tokenIndex235 := position, tokenIndex + position229, tokenIndex229 := position, tokenIndex if buffer[position] != rune('_') { - goto l236 + goto l230 } position++ if buffer[position] != rune('r') { - goto l236 + goto l230 } position++ if buffer[position] != rune('o') { - goto l236 + goto l230 } position++ if buffer[position] != rune('w') { - goto l236 + goto l230 } position++ - goto l235 - l236: - position, tokenIndex = position235, tokenIndex235 + goto l229 + l230: + position, tokenIndex = position229, tokenIndex229 if buffer[position] != rune('_') { - goto l237 + goto l231 } position++ if buffer[position] != rune('c') { - goto l237 + goto l231 } position++ if buffer[position] != rune('o') { - goto l237 + goto l231 } position++ if buffer[position] != rune('l') { - goto l237 + goto l231 } position++ - goto l235 - l237: - position, tokenIndex = position235, tokenIndex235 + goto l229 + l231: + position, tokenIndex = position229, tokenIndex229 if buffer[position] != rune('_') { - goto l238 + goto l232 } position++ if buffer[position] != rune('s') { - goto l238 + goto l232 } position++ if buffer[position] != rune('t') { - goto l238 + goto l232 } position++ if buffer[position] != rune('a') { - goto l238 + goto l232 } position++ if buffer[position] != rune('r') { - goto l238 + goto l232 } position++ if buffer[position] != rune('t') { - goto l238 + goto l232 } position++ - goto l235 - l238: - position, tokenIndex = position235, tokenIndex235 + goto l229 + l232: + position, tokenIndex = position229, tokenIndex229 if buffer[position] != rune('_') { - goto l239 + goto l233 } position++ if buffer[position] != rune('e') { - goto l239 + goto l233 } position++ if buffer[position] != rune('n') { - goto l239 + goto l233 } position++ if buffer[position] != rune('d') { - goto l239 + goto l233 } position++ - goto l235 - l239: - position, tokenIndex = position235, tokenIndex235 + goto l229 + l233: + position, tokenIndex = position229, tokenIndex229 if buffer[position] != rune('_') { - goto l240 + goto l234 } position++ if buffer[position] != rune('t') { - goto l240 + goto l234 } position++ if buffer[position] != rune('i') { - goto l240 + goto l234 } position++ if buffer[position] != rune('m') { - goto l240 + goto l234 } position++ if buffer[position] != rune('e') { - goto l240 + goto l234 } position++ if buffer[position] != rune('s') { - goto l240 + goto l234 } position++ if buffer[position] != rune('t') { - goto l240 + goto l234 } position++ if buffer[position] != rune('a') { - goto l240 + goto l234 } position++ if buffer[position] != rune('m') { - goto l240 + goto l234 } position++ if buffer[position] != rune('p') { - goto l240 + goto l234 } position++ - goto l235 - l240: - position, tokenIndex = position235, tokenIndex235 + goto l229 + l234: + position, tokenIndex = position229, tokenIndex229 if buffer[position] != rune('_') { - goto l229 + goto l223 } position++ if buffer[position] != rune('f') { - goto l229 + goto l223 } position++ if buffer[position] != rune('i') { - goto l229 + goto l223 } position++ if buffer[position] != rune('e') { - goto l229 + goto l223 } position++ if buffer[position] != rune('l') { - goto l229 + goto l223 } position++ if buffer[position] != rune('d') { - goto l229 + goto l223 } position++ } - l235: - add(rulereserved, position234) + l229: + add(rulereserved, position228) } } - l232: - add(rulePegText, position231) + l226: + add(rulePegText, position225) } { add(ruleAction42, position) } - add(rulefield, position230) + add(rulefield, position224) } return true - l229: - position, tokenIndex = position229, tokenIndex229 + l223: + position, tokenIndex = position223, tokenIndex223 return false }, /* 18 reserved <- <(('_' 'r' 'o' 'w') / ('_' 'c' 'o' 'l') / ('_' 's' 't' 'a' 'r' 't') / ('_' 'e' 'n' 'd') / ('_' 't' 'i' 'm' 'e' 's' 't' 'a' 'm' 'p') / ('_' 'f' 'i' 'e' 'l' 'd'))> */ nil, /* 19 posfield <- <( Action43)> */ func() bool { - position243, tokenIndex243 := position, tokenIndex + position237, tokenIndex237 := position, tokenIndex { - position244 := position + position238 := position { - position245 := position + position239 := position if !_rules[rulefieldExpr]() { - goto l243 + goto l237 } - add(rulePegText, position245) + add(rulePegText, position239) } { add(ruleAction43, position) } - add(ruleposfield, position244) + add(ruleposfield, position238) } return true - l243: - position, tokenIndex = position243, tokenIndex243 + l237: + position, tokenIndex = position237, tokenIndex237 return false }, /* 20 uint <- <(([1-9] [0-9]*) / '0')> */ func() bool { - position247, tokenIndex247 := position, tokenIndex + position241, tokenIndex241 := position, tokenIndex { - position248 := position + position242 := position { - position249, tokenIndex249 := position, tokenIndex + position243, tokenIndex243 := position, tokenIndex if c := buffer[position]; c < rune('1') || c > rune('9') { - goto l250 + goto l244 } position++ - l251: + l245: { - position252, tokenIndex252 := position, tokenIndex + position246, tokenIndex246 := position, tokenIndex if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l252 + goto l246 } position++ - goto l251 - l252: - position, tokenIndex = position252, tokenIndex252 + goto l245 + l246: + position, tokenIndex = position246, tokenIndex246 } - goto l249 - l250: - position, tokenIndex = position249, tokenIndex249 + goto l243 + l244: + position, tokenIndex = position243, tokenIndex243 if buffer[position] != rune('0') { - goto l247 + goto l241 } position++ } - l249: - add(ruleuint, position248) + l243: + add(ruleuint, position242) } return true - l247: - position, tokenIndex = position247, tokenIndex247 + l241: + position, tokenIndex = position241, tokenIndex241 return false }, /* 21 uintrow <- <( Action44)> */ nil, /* 22 col <- <(( Action45) / ('\'' '\'' Action46) / ('"' '"' Action47))> */ func() bool { - position254, tokenIndex254 := position, tokenIndex + position248, tokenIndex248 := position, tokenIndex { - position255 := position + position249 := position { - position256, tokenIndex256 := position, tokenIndex + position250, tokenIndex250 := position, tokenIndex { - position258 := position + position252 := position if !_rules[ruleuint]() { - goto l257 + goto l251 } - add(rulePegText, position258) + add(rulePegText, position252) } { add(ruleAction45, position) } - goto l256 - l257: - position, tokenIndex = position256, tokenIndex256 + goto l250 + l251: + position, tokenIndex = position250, tokenIndex250 if buffer[position] != rune('\'') { - goto l260 + goto l254 } position++ { - position261 := position + position255 := position if !_rules[rulesinglequotedstring]() { - goto l260 + goto l254 } - add(rulePegText, position261) + add(rulePegText, position255) } if buffer[position] != rune('\'') { - goto l260 + goto l254 } position++ { add(ruleAction46, position) } - goto l256 - l260: - position, tokenIndex = position256, tokenIndex256 + goto l250 + l254: + position, tokenIndex = position250, tokenIndex250 if buffer[position] != rune('"') { - goto l254 + goto l248 } position++ { - position263 := position + position257 := position if !_rules[ruledoublequotedstring]() { - goto l254 + goto l248 } - add(rulePegText, position263) + add(rulePegText, position257) } if buffer[position] != rune('"') { - goto l254 + goto l248 } position++ { add(ruleAction47, position) } } - l256: - add(rulecol, position255) + l250: + add(rulecol, position249) } return true - l254: - position, tokenIndex = position254, tokenIndex254 + l248: + position, tokenIndex = position248, tokenIndex248 return false }, /* 23 row <- <(( Action48) / ('\'' '\'' Action49) / ('"' '"' Action50))> */ nil, /* 24 open <- <('(' sp)> */ func() bool { - position266, tokenIndex266 := position, tokenIndex + position260, tokenIndex260 := position, tokenIndex { - position267 := position + position261 := position if buffer[position] != rune('(') { - goto l266 + goto l260 } position++ if !_rules[rulesp]() { - goto l266 + goto l260 } - add(ruleopen, position267) + add(ruleopen, position261) } return true - l266: - position, tokenIndex = position266, tokenIndex266 + l260: + position, tokenIndex = position260, tokenIndex260 return false }, /* 25 close <- <(')' sp)> */ func() bool { - position268, tokenIndex268 := position, tokenIndex + position262, tokenIndex262 := position, tokenIndex { - position269 := position + position263 := position if buffer[position] != rune(')') { - goto l268 + goto l262 } position++ if !_rules[rulesp]() { - goto l268 + goto l262 } - add(ruleclose, position269) + add(ruleclose, position263) } return true - l268: - position, tokenIndex = position268, tokenIndex268 + l262: + position, tokenIndex = position262, tokenIndex262 return false }, /* 26 sp <- <(' ' / '\t' / '\n')*> */ func() bool { { - position271 := position - l272: + position265 := position + l266: { - position273, tokenIndex273 := position, tokenIndex + position267, tokenIndex267 := position, tokenIndex { - position274, tokenIndex274 := position, tokenIndex + position268, tokenIndex268 := position, tokenIndex if buffer[position] != rune(' ') { - goto l275 + goto l269 } position++ - goto l274 - l275: - position, tokenIndex = position274, tokenIndex274 + goto l268 + l269: + position, tokenIndex = position268, tokenIndex268 if buffer[position] != rune('\t') { - goto l276 + goto l270 } position++ - goto l274 - l276: - position, tokenIndex = position274, tokenIndex274 + goto l268 + l270: + position, tokenIndex = position268, tokenIndex268 if buffer[position] != rune('\n') { - goto l273 + goto l267 } position++ } - l274: - goto l272 - l273: - position, tokenIndex = position273, tokenIndex273 + l268: + goto l266 + l267: + position, tokenIndex = position267, tokenIndex267 } - add(rulesp, position271) + add(rulesp, position265) } return true }, /* 27 comma <- <(sp ',' sp)> */ func() bool { - position277, tokenIndex277 := position, tokenIndex + position271, tokenIndex271 := position, tokenIndex { - position278 := position + position272 := position if !_rules[rulesp]() { - goto l277 + goto l271 } if buffer[position] != rune(',') { - goto l277 + goto l271 } position++ if !_rules[rulesp]() { - goto l277 + goto l271 } - add(rulecomma, position278) + add(rulecomma, position272) } return true - l277: - position, tokenIndex = position277, tokenIndex277 + l271: + position, tokenIndex = position271, tokenIndex271 return false }, /* 28 lbrack <- <('[' sp)> */ @@ -2756,136 +2690,136 @@ func (p *PQL) Init() { nil, /* 31 timestampbasicfmt <- <([0-9] [0-9] [0-9] [0-9] '-' ('0' / '1') [0-9] '-' [0-3] [0-9] 'T' [0-9] [0-9] ':' [0-9] [0-9])> */ func() bool { - position282, tokenIndex282 := position, tokenIndex + position276, tokenIndex276 := position, tokenIndex { - position283 := position + position277 := position if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l282 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l282 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l282 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l282 + goto l276 } position++ if buffer[position] != rune('-') { - goto l282 + goto l276 } position++ { - position284, tokenIndex284 := position, tokenIndex + position278, tokenIndex278 := position, tokenIndex if buffer[position] != rune('0') { - goto l285 + goto l279 } position++ - goto l284 - l285: - position, tokenIndex = position284, tokenIndex284 + goto l278 + l279: + position, tokenIndex = position278, tokenIndex278 if buffer[position] != rune('1') { - goto l282 + goto l276 } position++ } - l284: + l278: if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l282 + goto l276 } position++ if buffer[position] != rune('-') { - goto l282 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('3') { - goto l282 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l282 + goto l276 } position++ if buffer[position] != rune('T') { - goto l282 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l282 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l282 + goto l276 } position++ if buffer[position] != rune(':') { - goto l282 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l282 + goto l276 } position++ if c := buffer[position]; c < rune('0') || c > rune('9') { - goto l282 + goto l276 } position++ - add(ruletimestampbasicfmt, position283) + add(ruletimestampbasicfmt, position277) } return true - l282: - position, tokenIndex = position282, tokenIndex282 + l276: + position, tokenIndex = position276, tokenIndex276 return false }, /* 32 timestampfmt <- <(('"' timestampbasicfmt '"') / ('\'' timestampbasicfmt '\'') / timestampbasicfmt)> */ func() bool { - position286, tokenIndex286 := position, tokenIndex + position280, tokenIndex280 := position, tokenIndex { - position287 := position + position281 := position { - position288, tokenIndex288 := position, tokenIndex + position282, tokenIndex282 := position, tokenIndex if buffer[position] != rune('"') { - goto l289 + goto l283 } position++ if !_rules[ruletimestampbasicfmt]() { - goto l289 + goto l283 } if buffer[position] != rune('"') { - goto l289 + goto l283 } position++ - goto l288 - l289: - position, tokenIndex = position288, tokenIndex288 + goto l282 + l283: + position, tokenIndex = position282, tokenIndex282 if buffer[position] != rune('\'') { - goto l290 + goto l284 } position++ if !_rules[ruletimestampbasicfmt]() { - goto l290 + goto l284 } if buffer[position] != rune('\'') { - goto l290 + goto l284 } position++ - goto l288 - l290: - position, tokenIndex = position288, tokenIndex288 + goto l282 + l284: + position, tokenIndex = position282, tokenIndex282 if !_rules[ruletimestampbasicfmt]() { - goto l286 + goto l280 } } - l288: - add(ruletimestampfmt, position287) + l282: + add(ruletimestampfmt, position281) } return true - l286: - position, tokenIndex = position286, tokenIndex286 + l280: + position, tokenIndex = position280, tokenIndex280 return false }, /* 33 timestamp <- <( Action51)> */ From b158f1c378e20d8fad68b7dcb7731b9023c49931 Mon Sep 17 00:00:00 2001 From: Yuce Tekol Date: Tue, 6 Nov 2018 22:47:09 +0300 Subject: [PATCH 3/4] unquote attribute values --- pql/pql.peg | 4 ++-- pql/pql.peg.go | 44 +++++++++++++++++++++++--------------------- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/pql/pql.peg b/pql/pql.peg index 2a6620960..1d07798a2 100644 --- a/pql/pql.peg +++ b/pql/pql.peg @@ -45,8 +45,8 @@ item <- ( 'null' &(comma / sp close) { p.addVal(nil) } / < '-'? [0-9]+ ('.'[0-9]*)? > { p.addNumVal(buffer[begin:end]) } / < '-'? '.'[0-9]+ > { p.addNumVal(buffer[begin:end]) } / < ([[A-Z]] / [0-9] / '-' / '_' / ':')+ > { p.addVal(buffer[begin:end]) } - / '"' < doublequotedstring > '"' { p.addVal(buffer[begin:end]) } - / '\'' < singlequotedstring > '\'' { p.addVal(buffer[begin:end]) } + / < '"' doublequotedstring '"' > { s, _ := strconv.Unquote(buffer[begin:end]); p.addVal(s) } + / < '\'' singlequotedstring '\'' > { s, _ := strconv.Unquote(buffer[begin:end]); p.addVal(s) } ) doublequotedstring <- ( '\\\"' / [^"] )* diff --git a/pql/pql.peg.go b/pql/pql.peg.go index e98ed9ce9..a108bc985 100644 --- a/pql/pql.peg.go +++ b/pql/pql.peg.go @@ -483,9 +483,11 @@ func (p *PQL) Execute() { case ruleAction39: p.addVal(buffer[begin:end]) case ruleAction40: - p.addVal(buffer[begin:end]) + s, _ := strconv.Unquote(buffer[begin:end]) + p.addVal(s) case ruleAction41: - p.addVal(buffer[begin:end]) + s, _ := strconv.Unquote(buffer[begin:end]) + p.addVal(s) case ruleAction42: p.addField(buffer[begin:end]) case ruleAction43: @@ -1721,7 +1723,7 @@ func (p *PQL) Init() { position, tokenIndex = position136, tokenIndex136 return false }, - /* 13 item <- <(('n' 'u' 'l' 'l' &(comma / (sp close)) Action34) / ('t' 'r' 'u' 'e' &(comma / (sp close)) Action35) / ('f' 'a' 'l' 's' 'e' &(comma / (sp close)) Action36) / (<('-'? [0-9]+ ('.' [0-9]*)?)> Action37) / (<('-'? '.' [0-9]+)> Action38) / (<([a-z] / [A-Z] / [0-9] / '-' / '_' / ':')+> Action39) / ('"' '"' Action40) / ('\'' '\'' Action41))> */ + /* 13 item <- <(('n' 'u' 'l' 'l' &(comma / (sp close)) Action34) / ('t' 'r' 'u' 'e' &(comma / (sp close)) Action35) / ('f' 'a' 'l' 's' 'e' &(comma / (sp close)) Action36) / (<('-'? [0-9]+ ('.' [0-9]*)?)> Action37) / (<('-'? '.' [0-9]+)> Action38) / (<([a-z] / [A-Z] / [0-9] / '-' / '_' / ':')+> Action39) / (<('"' doublequotedstring '"')> Action40) / (<('\'' singlequotedstring '\'')> Action41))> */ func() bool { position140, tokenIndex140 := position, tokenIndex { @@ -2059,42 +2061,42 @@ func (p *PQL) Init() { goto l142 l176: position, tokenIndex = position142, tokenIndex142 - if buffer[position] != rune('"') { - goto l193 - } - position++ { position194 := position + if buffer[position] != rune('"') { + goto l193 + } + position++ if !_rules[ruledoublequotedstring]() { goto l193 } + if buffer[position] != rune('"') { + goto l193 + } + position++ add(rulePegText, position194) } - if buffer[position] != rune('"') { - goto l193 - } - position++ { add(ruleAction40, position) } goto l142 l193: position, tokenIndex = position142, tokenIndex142 - if buffer[position] != rune('\'') { - goto l140 - } - position++ { position196 := position + if buffer[position] != rune('\'') { + goto l140 + } + position++ if !_rules[rulesinglequotedstring]() { goto l140 } + if buffer[position] != rune('\'') { + goto l140 + } + position++ add(rulePegText, position196) } - if buffer[position] != rune('\'') { - goto l140 - } - position++ { add(ruleAction41, position) } @@ -2905,9 +2907,9 @@ func (p *PQL) Init() { nil, /* 75 Action39 <- <{ p.addVal(buffer[begin:end]) }> */ nil, - /* 76 Action40 <- <{ p.addVal(buffer[begin:end]) }> */ + /* 76 Action40 <- <{ s, _ := strconv.Unquote(buffer[begin:end]); p.addVal(s) }> */ nil, - /* 77 Action41 <- <{ p.addVal(buffer[begin:end]) }> */ + /* 77 Action41 <- <{ s, _ := strconv.Unquote(buffer[begin:end]); p.addVal(s) }> */ nil, /* 78 Action42 <- <{ p.addField(buffer[begin:end]) }> */ nil, From 1e30a9372deefd4c23f132c53331c9ff126ba194 Mon Sep 17 00:00:00 2001 From: Yuce Tekol Date: Tue, 6 Nov 2018 22:58:37 +0300 Subject: [PATCH 4/4] Disabled unquoting for single quoted attribute values; updated test --- pql/parser_test.go | 2 +- pql/pql.peg | 2 +- pql/pql.peg.go | 23 +++++++++++------------ 3 files changed, 13 insertions(+), 14 deletions(-) diff --git a/pql/parser_test.go b/pql/parser_test.go index f63bc3763..e88244f70 100644 --- a/pql/parser_test.go +++ b/pql/parser_test.go @@ -88,7 +88,7 @@ func TestParser_Parse(t *testing.T) { "bool0": true, "bool1": false, "x": nil, - "escape": `\" \\escape\n`, + "escape": "\" \\escape\n", }, }, ) { diff --git a/pql/pql.peg b/pql/pql.peg index 1d07798a2..3f151c334 100644 --- a/pql/pql.peg +++ b/pql/pql.peg @@ -46,7 +46,7 @@ item <- ( 'null' &(comma / sp close) { p.addVal(nil) } / < '-'? '.'[0-9]+ > { p.addNumVal(buffer[begin:end]) } / < ([[A-Z]] / [0-9] / '-' / '_' / ':')+ > { p.addVal(buffer[begin:end]) } / < '"' doublequotedstring '"' > { s, _ := strconv.Unquote(buffer[begin:end]); p.addVal(s) } - / < '\'' singlequotedstring '\'' > { s, _ := strconv.Unquote(buffer[begin:end]); p.addVal(s) } + / '\'' < singlequotedstring > '\'' { p.addVal(buffer[begin:end]) } ) doublequotedstring <- ( '\\\"' / [^"] )* diff --git a/pql/pql.peg.go b/pql/pql.peg.go index a108bc985..7bc7de6fc 100644 --- a/pql/pql.peg.go +++ b/pql/pql.peg.go @@ -486,8 +486,7 @@ func (p *PQL) Execute() { s, _ := strconv.Unquote(buffer[begin:end]) p.addVal(s) case ruleAction41: - s, _ := strconv.Unquote(buffer[begin:end]) - p.addVal(s) + p.addVal(buffer[begin:end]) case ruleAction42: p.addField(buffer[begin:end]) case ruleAction43: @@ -1723,7 +1722,7 @@ func (p *PQL) Init() { position, tokenIndex = position136, tokenIndex136 return false }, - /* 13 item <- <(('n' 'u' 'l' 'l' &(comma / (sp close)) Action34) / ('t' 'r' 'u' 'e' &(comma / (sp close)) Action35) / ('f' 'a' 'l' 's' 'e' &(comma / (sp close)) Action36) / (<('-'? [0-9]+ ('.' [0-9]*)?)> Action37) / (<('-'? '.' [0-9]+)> Action38) / (<([a-z] / [A-Z] / [0-9] / '-' / '_' / ':')+> Action39) / (<('"' doublequotedstring '"')> Action40) / (<('\'' singlequotedstring '\'')> Action41))> */ + /* 13 item <- <(('n' 'u' 'l' 'l' &(comma / (sp close)) Action34) / ('t' 'r' 'u' 'e' &(comma / (sp close)) Action35) / ('f' 'a' 'l' 's' 'e' &(comma / (sp close)) Action36) / (<('-'? [0-9]+ ('.' [0-9]*)?)> Action37) / (<('-'? '.' [0-9]+)> Action38) / (<([a-z] / [A-Z] / [0-9] / '-' / '_' / ':')+> Action39) / (<('"' doublequotedstring '"')> Action40) / ('\'' '\'' Action41))> */ func() bool { position140, tokenIndex140 := position, tokenIndex { @@ -2082,21 +2081,21 @@ func (p *PQL) Init() { goto l142 l193: position, tokenIndex = position142, tokenIndex142 + if buffer[position] != rune('\'') { + goto l140 + } + position++ { position196 := position - if buffer[position] != rune('\'') { - goto l140 - } - position++ if !_rules[rulesinglequotedstring]() { goto l140 } - if buffer[position] != rune('\'') { - goto l140 - } - position++ add(rulePegText, position196) } + if buffer[position] != rune('\'') { + goto l140 + } + position++ { add(ruleAction41, position) } @@ -2909,7 +2908,7 @@ func (p *PQL) Init() { nil, /* 76 Action40 <- <{ s, _ := strconv.Unquote(buffer[begin:end]); p.addVal(s) }> */ nil, - /* 77 Action41 <- <{ s, _ := strconv.Unquote(buffer[begin:end]); p.addVal(s) }> */ + /* 77 Action41 <- <{ p.addVal(buffer[begin:end]) }> */ nil, /* 78 Action42 <- <{ p.addField(buffer[begin:end]) }> */ nil,