Original text:
example, the Unicode PLACE OF INTEREST SIGN (U+2318) would be defined in ABNF as "%x2318". <del> The terminology of RFC8259 applies except where clarified below. Definitions for "Object", "Array", and "Number" remain unchanged. Importantly "object" and "array" in particular do not take on a generic meaning, such as they would in a general programming context. </del>  Additional terms used in this specification are defined below. value is anonymous, JSONPath uses the abstract name "$" to refer to the root node of the argument. <del> JSONPath expressions can use the _dot-notation_ </del>  <del> or the _bracket-notation_ </del>  for paths input to a JSONPath processor.  [1] Where a JSONPath processor uses JSONPath expressions as output paths, these will always be converted to Output Paths which employ the more general <del> _bracket-notation_.  [2] Bracket notation is more general than dot </del>  notation and can serve as a canonical form when a JSONPath processor uses JSONPath expressions as output paths. Firstly, "$" selects the root node which is the argument.  So the result is a list consisting of just the root node. <del> Next, ".a" selects from any input node of type object and selects any value of the input node corresponding to the member name ""a"".  The result is again a list of one node: "[{"b":0},{"b":1},{"c":2}]". </del>  Next, "[*]" selects from any input node which is an array and selects all the elements of the input node.  The result is a list of three nodes: "{"b":0}", "{"b":1}", and "{"c":2}". Finally, ".b" selects from any input node of type object with a <del> member name "b" and selects the value of the input node corresponding to that name.  The result is a list containing "0", "1".  This is the concatenation of three lists, two of length one containing "0", "1", respectively, and one of length zero. </del>  As a consequence of this approach, if any of the selectors selects no nodes, then the whole query selects no nodes. 3.5. <del> 3.5.1. </del>  <del> 3.5.1.1. </del>  <del> A dot child selector has a member name known as a dot child name or a single asterisk ("*"). </del>  <del> A dot child name corresponds to a name in a object. </del>  <del> More general child names, such as the empty string, are supported by "Union Child" (unionchild). </del>  <del> Note that the "dot-child-name" rule follows the philosophy of JSON strings and is allowed to contain bit sequences that cannot encode Unicode characters (a single unpaired UTF-16 surrogate, for example). The behaviour of an implementation is undefined for child names which do not encode Unicode characters. </del>  <del> 3.5.1.2. </del>  <del> A dot child name which is not a single asterisk ("*") is considered to have a member name.  It selects the value corresponding to the name from any object node.  It selects no nodes from a node which is not a object. </del>  <del> The member name of a dot child name is the sequence of Unicode characters contained in that name. </del>  <del> A dot child name consisting of a single asterisk is a wild card.  It selects all the values of any object node.  It also selects all the elements of any array node.  It selects no nodes from number, string, or literal nodes. </del>  3.5.2. 3.5.2.1. <del> A union selector consists of one or more union elements. </del>  3.5.2.2. <del> A union selects any node which is selected by at least one of the union selectors and selects the concatenation of the lists (in the order of the selectors) of nodes selected by the union elements. </del>  <del> 3.5.2.3. </del>  <del> 3.5.2.3.1. </del>  <del> A child is a quoted string. </del>  <del> Notes: 1. double-quoted strings follow JSON in RFC8259.  Single- quoted strings follow an analogous pattern.  2.  "HEXDIG" includes A-F and a-f. </del>  <del> 3.5.2.3.2. </del>  <del> If the child is a quoted string, the string MUST be converted to a member name by removing the surrounding quotes and replacing each escape sequence with its equivalent Unicode character, as in the table below: </del>  <del> The child selects the value corresponding to the member name from any object node that has a member with that name.  It selects no nodes from a node which is not a object. </del>  <del> 3.5.2.4. </del>  <del> 3.5.2.4.1. </del>  <del> An array selector selects zero or more elements of an array node.  An array selector takes the form of an index, which selects at most one element, or a slice, which selects zero or more elements. </del>  <del> An array index is an integer (in base 10). </del>  <del> Note: the syntax does not allow integers with leading zeros such as "01" and "-01". </del>  <del> An array slice consists of three optional integers (in base 10) </del>  separated by colons. <del> Note: the array slices ":" and "::" are both syntactically valid, as are ":2:2", "2::2", and "2:4:". </del>  <del> 3.5.2.4.2. </del>  <del> 3.5.2.4.2.1. </del>  This section is non-normative. The following section specifies the behaviour fully, without depending on JavaScript or Python behaviour. <del> 3.5.2.4.2.2. </del>  An array selector is either an array slice or an array index, which is defined in terms of an array slice. against an array whose size doesn't fit in the implementation's representation of an integer, the implementation MUST raise an error.  4. <del> TBD: Define a media type for JSONPath expressions. </del>  5.  This section gives security considerations, as required by RFC3552. <del> 6.  References </del>  <del> 6.1.  URIs </del>  [1] https://github.com/ietf-wg-jsonpath/draft-ietf-jsonpath-jsonpath

Reviewer comments:
This is a full rebase of branch pr-98 () on current main.
Does this incorporate any changes from the discussions from , or is it a simple rebase?
It is a simple rebase, followed by a number of edits coming from the discussions here. Most of the remaining conversations need some further discussion, so I hope to cover them with my updated slides in a couple of hours.
Looks like a good next step on our path.

Revised text:
example, the Unicode PLACE OF INTEREST SIGN (U+2318) would be defined in ABNF as "%x2318".  <ins> The terminology of RFC8259 applies except where clarified below.  The terms "Primitive" and "Structured" are used to group the types as in Section 1 of RFC8259.  Definitions for "Object", "Array", "Number", and "String" remain unchanged.  Importantly "object" and "array" in particular do not take on a generic meaning, such as they would in a general programming context. </ins> Additional terms used in this specification are defined below. value is anonymous, JSONPath uses the abstract name "$" to refer to the root node of the argument.  <ins> JSONPath expressions can use the _dot notation_ </ins>  <ins> or the _bracket notation_ </ins> for paths input to a JSONPath processor.  [1] Where a JSONPath processor uses JSONPath expressions as output paths, these will always be converted to Output Paths which employ the more general  <ins> _bracket notation_.  [2] Bracket notation is more general than dot </ins> notation and can serve as a canonical form when a JSONPath processor uses JSONPath expressions as output paths. Firstly, "$" selects the root node which is the argument.  So the result is a list consisting of just the root node.  <ins> Next, ".a" selects from any input node of type object and selects the node of any member value of the input node corresponding to the member name ""a"".  The result is again a list of one node: "[{"b":0},{"b":1},{"c":2}]". </ins> Next, "[*]" selects from any input node which is an array and selects all the elements of the input node.  The result is a list of three nodes: "{"b":0}", "{"b":1}", and "{"c":2}". Finally, ".b" selects from any input node of type object with a  <ins> member name "b" and selects the node of the member value of the input node corresponding to that name.  The result is a list containing "0", "1".  This is the concatenation of three lists, two of length one containing "0", "1", respectively, and one of length zero. </ins> As a consequence of this approach, if any of the selectors selects no nodes, then the whole query selects no nodes. 3.5.  <ins> A JSONPath query consists of a sequence of selectors.  Valid selectors are </ins>  <ins> Root selector "$" </ins>  <ins> Dot selector ".<name>", used with object member names exclusively. </ins>  <ins> Dot wild card selector ".*". </ins>  <ins> Index selector "[<index>]", where "<index>" is either an (possibly negative) array index or an object member name. </ins>  <ins> Index wild card selector "[*]". </ins>  <ins> Array slice selector "[<start>:<end>:<step>]", where "<start>", "<end>", "<step>" are integer literals. Nested descendants selector "..". Union selector "[<sel1>,<sel2>,...,<selN>]", holding a comma delimited list of index, index wild card, array slice, and filter selectors. </ins>  <ins> Filter selector "[?(<expr>)]" </ins>  <ins> Current item selector "@" 3.5.1. 3.5.1.1. </ins>  <ins> Every valid JSONPath query MUST begin with the root selector "$". 3.5.1.2. The Argument -- the root JSON value -- becomes the root node, which is addressed by the root selector "$". </ins> 3.5.2. 3.5.2.1.  <ins> A dot selector starts with a dot "." followed by an object's member name. Member names containing other characters than allowed by "dot- selector" -- such as space ` ` and minus "-" characters -- MUST NOT be used with the "dot-selector".  (Such member names can be addressed by the "index-selector" instead.) </ins> 3.5.2.2.  <ins> The "dot-selector" selects the node of the member value corresponding to the member name from any JSON object.  It selects no nodes from any other JSON value. Note that the "dot-selector" follows the philosophy of JSON strings and is allowed to contain bit sequences that cannot encode Unicode characters (a single unpaired UTF-16 surrogate, for example).  The behaviour of an implementation is undefined for member names which do not encode Unicode characters. </ins>  <ins> 3.5.3. </ins>  <ins> 3.5.3.1. </ins>  <ins> The dot wild card selector has the form ".*". </ins>  <ins> 3.5.3.2. </ins>  <ins> A "dot-wild-selector" acts as a wild card by selecting the nodes of all member values of an object as well as all element nodes of an array.  Applying the "dot-wild-selector" to a primitive JSON value (number, string, or true/false/null) selects no node. </ins>  <ins> 3.5.4. </ins>  <ins> 3.5.4.1. </ins>  <ins> An index selector "[<index>]" addresses at most one object member value or at most one array element value. </ins>  <ins> Applying the "index-selector" to an object value, a "quoted-member- name" string is required.  JSONPath allows it to be enclosed in _single_ or _double_ quotes. </ins>  <ins> Applying the "index-selector" to an array, a numerical "element- index" is required.  JSONPath allows it to be negative. </ins>  <ins> Notes: 1. "double-quoted" strings follow JSON in RFC8259; "single- quoted" strings follow an analogous pattern.  2.  An "element-index" is an integer (in base 10, as in JSON numbers).  3.  As in JSON numbers, the syntax does not allow octal-like integers with leading zeros such as "01" or "-01". </ins>  <ins> 3.5.4.2. </ins>  <ins> A "quoted-member-name" string MUST be converted to a member name by removing the surrounding quotes and replacing each escape sequence with its equivalent Unicode character, as in the table below: The "index-selector" applied with a "quoted-member-name" to an object selects the node of the corresponding member value from it, if and only if that object has a member with that name.  Nothing is selected from a value which is not a object. Array indexing via "element-index" is a way of selecting a particular array element using a zero-based index.  For example, selector "[0]" selects the first and selector "[4]" the fifth element of a sufficiently long array. A negative "element-index" counts from the array end.  For example, selector "[-1]" selects the last and selector "[-2]" selects the last but one element of an array with at least two elements. 3.5.5. 3.5.5.1. The index wild card selector has the form "[*]". 3.5.5.2. An "index-wild-selector" selects the nodes of all member values of an object as well as of all elements of an array.  Applying the "index- wild-selector" to a primitive JSON value (such as a number, string, or true/false/null) selects no node. The "index-wild-selector" behaves identically to the "dot-wild- selector". 3.5.6. 3.5.6.1. The array slice selector has the form "[<start>:<end>:<step>]".  It selects elements starting at index "<start>", ending at -- but not including -- "<end>", while incrementing by "step". The "slice-selector" consists of three optional decimal integers </ins> separated by colons.  <ins> 3.5.6.2. </ins>  <ins> The "slice-selector" was inspired by the slice operator of ECMAScript 4 (ES4), which was deprecated in 2014, and that of Python. </ins>  <ins> 3.5.6.2.1. </ins> This section is non-normative. The following section specifies the behaviour fully, without depending on JavaScript or Python behaviour.  <ins> 3.5.6.2.2. </ins> An array selector is either an array slice or an array index, which is defined in terms of an array slice. against an array whose size doesn't fit in the implementation's representation of an integer, the implementation MUST raise an error. <ins> 3.5.7. 3.5.7.1. The descendant selector starts with a double dot ".." and can be followed by an object member name (similar to the "dot-selector"), by an "index-selector" acting on objects or arrays, or by a wild card. 3.5.7.2. The "descendant-selector" is inspired by ECMAScript for XML (E4X). It selects the node and all its descendants. 3.5.8. 3.5.8.1. The union selector is syntactically related to the "index-selector". It contains multiple, comma separated entries. Task (T1): This, besides slice-index, is currently one of only two places in the document that mentions whitespace.  Whitespace needs to be handled throughout the ABNF syntax.  Room Consensus at the 2021-06-15 interim was that JSONPath generally is generous with allowing insignificant whitespace throughout.  Minimizing the impact of the many whitespace insertion points by choosing a rule name such as "S" was mentioned.  Some conventions will probably help with minimizing the number of places where S needs to be inserted. 3.5.8.2. A union selects any node which is selected by at least one of the union selectors and selects the concatenation of the lists (in the order of the selectors) of nodes selected by the union elements. Note that any node selected in more than one of the union selectors is kept as many times in the node list. 3.5.9. 3.5.9.1. The filter selector has the form "[?<expr>]".  It works via iterating over structured values, i.e. arrays and objects. During iteration process each array element or object member is visited and its value -- accessible via symbol "@" -- or one of its descendants -- uniquely defined by a relative path -- is tested against a boolean expression "boolean-expr". The current item is selected if and only if the result is "true". Notes: Parentheses can be used with "boolean-expr" for grouping.  So filter selection syntax in the original proposal "[?(<expr>)]" is naturally contained in the current lean syntax "[?<expr>]" as a special case. Comparisons are restricted to primitive values (such as number, string, "true", "false", "null").  Comparisons with complex values will fail, i.e. no selection occurs. Types are not implicitly converted in comparisons.  So ""13 == '13'"" selects no node. A member or element value by itself is _falsy_ only, if it does not exist.  Otherwise it is _truthy_, resulting in its value.  To be more specific explicit comparisons are necessary.  This existence test -- as an exception of the general rule -- also works with complex values. Regular expression tests can be applied to "string" values only. Containment tests work with arrays and objects. Explicit boolean type conversion is done by the not operator "neg- op". The behaviour of operators is consistent with the 'C'-family of programming languages. 3.5.9.2. The "filter-selector" works with arrays and objects exclusively.  Its result might be a list of _zero_, _one_, _multiple_ or _all_ of their element or member values then.  Applied to other value types, it will select nothing. Negation operator "neg-op" allows to test _falsiness_ of values. Applying negation operator twice "!!" gives us _truthiness_ of values. Some examples: </ins> 4.  <ins> Task (T2): Separate out expression language.  For now, this section is a repository for ABNF taken from RFC8259.  This needs to be deduplicated with definitions above. </ins> 5. <ins> TBD: Define a media type for JSONPath expressions. 6. </ins> This section gives security considerations, as required by RFC3552.  <ins> 7.  References </ins>  <ins> 7.1.  URIs </ins> [1] https://github.com/ietf-wg-jsonpath/draft-ietf-jsonpath-jsonpath