2626use phpDocumentor \JsonPath \AST \Wildcard ;
2727
2828use function is_array ;
29- use function Parsica \Parsica \alphaChar ;
3029use function Parsica \Parsica \alphaNumChar ;
30+ use function Parsica \Parsica \any ;
3131use function Parsica \Parsica \atLeastOne ;
3232use function Parsica \Parsica \between ;
3333use function Parsica \Parsica \char ;
3434use function Parsica \Parsica \choice ;
3535use function Parsica \Parsica \collect ;
3636use function Parsica \Parsica \keepSecond ;
37+ use function Parsica \Parsica \noneOfS ;
3738use function Parsica \Parsica \optional ;
3839use function Parsica \Parsica \recursive ;
3940use function Parsica \Parsica \sepBy ;
@@ -47,7 +48,7 @@ final class ParserBuilder
4748 /** @return Parser<RootNode> */
4849 private static function rootNode (): Parser
4950 {
50- return char ('$ ' )->map (static fn () => new RootNode ());
51+ return char ('$ ' )->map (static fn () => new RootNode ())-> label ( ' $ ' ) ;
5152 }
5253
5354 /** @return Parser<CurrentNode> */
@@ -62,16 +63,26 @@ private static function fieldAccess(): Parser
6263 $ fieldName = self ::fieldName ();
6364
6465 return choice (
65- keepSecond (char ('. ' ), $ fieldName ),
66+ keepSecond (char ('. ' ), any ( $ fieldName, self :: wildcard ()) ),
6667 between (string ("[' " ), string ("'] " ), $ fieldName ),
6768 )->map (static fn ($ args ) => new FieldAccess ($ args ));
6869 }
6970
71+ /** @return Parser<Wildcard> */
72+ private static function wildcard (): Parser
73+ {
74+ return string ('* ' )->label ('Wildcard ' )->map (static fn () => new Wildcard ());
75+ }
76+
7077 /** @return Parser<FilterNode> */
7178 private static function filter (): Parser
7279 {
7380 return choice (
74- string ('[*] ' )->map (static fn () => new FilterNode (new Wildcard ())),
81+ between (
82+ string ('[ ' ),
83+ string ('] ' ),
84+ self ::wildcard (),
85+ )->map (static fn ($ wildcard ) => new FilterNode ($ wildcard )),
7586 between (
7687 string ('[?( ' ),
7788 string (')] ' ),
@@ -88,9 +99,11 @@ private static function expression(): Parser
8899 );
89100
90101 $ value = choice (
91- between (char ('" ' ), char ('" ' ), atLeastOne (alphaChar ()))->map (static fn ($ value ) => new Value ($ value )),
92- between (char ("' " ), char ("' " ), atLeastOne (alphaChar ()))->map (static fn ($ value ) => new Value ($ value )),
93- );
102+ between (char ('" ' ), char ('" ' ), atLeastOne (noneOfS ('" ' )))
103+ ->map (static fn ($ value ) => new Value ($ value )),
104+ between (char ("' " ), char ("' " ), atLeastOne (noneOfS ("' " )))
105+ ->map (static fn ($ value ) => new Value ($ value )),
106+ )->label ('VALUE ' );
94107
95108 return collect (
96109 choice (
@@ -109,15 +122,9 @@ private static function currentNodeFollowUp(): Parser
109122 self ::fieldAccess (),
110123 );
111124
112- $ path = recursive ();
113- $ path ->recurse (collect ($ inner , $ path ));
114-
115- return collect (
116- self ::currentNode (),
117- some ($ inner )->optional ()->map (static fn ($ args ) => is_array ($ args ) ? $ args : []),
118- )->map (
119- static fn ($ args ) => new Path ([$ args [0 ], ...$ args [1 ]])
120- );
125+ return self ::currentNode ()->followedBy (
126+ some ($ inner )->map (static fn ($ args ) => is_array ($ args ) ? $ args : []),
127+ )->map (static fn ($ args ) => new Path ([new CurrentNode (), ...$ args ]));
121128 }
122129
123130 /** @return Parser<FunctionCall> */
@@ -135,10 +142,13 @@ private static function functionCall(): Parser
135142 )->map (static fn ($ a ) => new FunctionCall ($ a [0 ], ...$ a [1 ]));
136143 }
137144
138- /** @return Parser<list<Path >> */
145+ /** @return Parser<list<mixed >> */
139146 private static function arguments (): Parser
140147 {
141- return sepBy (char (', ' ), self ::currentNodeFollowUp ());
148+ return sepBy (
149+ char (', ' ),
150+ choice (self ::currentNodeFollowUp (), self ::currentNode ()),
151+ );
142152 }
143153
144154 /** @return Parser<FieldName> */
@@ -173,8 +183,9 @@ public function build(): Parser
173183 {
174184 return choice (
175185 self ::rootFollowUp (),
186+ self ::currentNodeFollowUp (),
176187 self ::rootNode (),
177188 self ::currentNode (),
178- )->thenEof ();
189+ )->thenEof ()-> label ( ' End of Query ' ) ;
179190 }
180191}
0 commit comments