22using Pidgin ;
33using System . Collections . Generic ;
44using SimpleStateMachine . StructuralSearch . StructuralSearch ;
5- using static Pidgin . Parser ;
65
76namespace SimpleStateMachine . StructuralSearch . Extensions ;
87
98internal static class ParserExtensions
109{
11- public static Parser < TToken , T > Try < TToken , T > ( this Parser < TToken , T > parser )
10+ public static Parser < TToken , T > Try < TToken , T > ( this Parser < TToken , T > parser )
1211 => Parser . Try ( parser ) ;
1312
14- public static Parser < TToken , IEnumerable < T > > AsMany < TToken , T > ( this Parser < TToken , T > parser )
15- => parser . Select ( x => ( IEnumerable < T > ) new List < T > { x } ) ;
13+ public static Parser < TToken , IEnumerable < T > > AsMany < TToken , T > ( this Parser < TToken , T > parser )
14+ => parser . Select ( IEnumerable < T > ( x ) => new List < T > { x } ) ;
15+
16+ public static Parser < TToken , T > AsLazy < TToken , T > ( this Func < Parser < TToken , T > > parser )
17+ => Parser . Rec ( ( ) => parser ( ) ?? throw new ArgumentNullException ( nameof ( parser ) ) ) ;
1618
1719 public static Parser < TToken , IEnumerable < T > > AtLeastOnceUntilNot < TToken , T , U > ( this Parser < TToken , T > parser , Parser < TToken , U > terminator ) =>
1820 parser != null
19- ? parser . AtLeastOnceUntil ( Not ( terminator ) )
21+ ? parser . AtLeastOnceUntil ( Parser . Not ( terminator ) )
2022 : throw new ArgumentNullException ( nameof ( parser ) ) ;
2123
22- public static Parser < TToken , IEnumerable < T > > UntilNot < TToken , T , U > ( this Parser < TToken , T > parser , Parser < TToken , U > terminator ) =>
23- parser != null
24- ? parser . Until ( Not ( terminator ) )
25- : throw new ArgumentNullException ( nameof ( parser ) ) ;
24+ public static Parser < TToken , IEnumerable < T > > UntilNot < TToken , T , U > ( this Parser < TToken , T > parser , Parser < TToken , U > terminator )
25+ {
26+ ArgumentNullException . ThrowIfNull ( parser ) ;
27+
28+ return parser . Until ( Parser . Not ( terminator ) ) ;
29+ }
2630
2731 public static bool TryParse ( this Parser < char , string > parser , string value , out string ? result )
2832 {
29- if ( parser is null )
30- throw new ArgumentNullException ( nameof ( parser ) ) ;
31-
33+ ArgumentNullException . ThrowIfNull ( parser ) ;
34+
3235 var res = parser . Parse ( value ) ;
3336 result = res . Success ? res . Value : default ;
3437 return res . Success ;
3538 }
36-
37- public static Parser < TToken , T > ThenInvoke < TToken , T > ( this Parser < TToken , T > parser , Action < T > action )
39+
40+ public static Parser < TToken , T > ThenInvoke < TToken , T > ( this Parser < TToken , T > parser , Action < T > action )
3841 => parser . Select ( x =>
3942 {
4043 action . Invoke ( x ) ;
4144 return x ;
4245 } ) ;
4346
44- public static Parser < TToken , bool > Contains < TToken , T > ( this Parser < TToken , T > parser )
47+ public static Parser < TToken , bool > Contains < TToken , T > ( this Parser < TToken , T > parser )
4548 => parser != null
4649 ? parser . Optional ( ) . Select ( x => x . HasValue )
4750 : throw new ArgumentNullException ( nameof ( parser ) ) ;
4851
49- public static Parser < char , Match < T > > Match < T > ( this Parser < char , T > parser )
50- => Map ( ( oldPos , oldOffset , result , newPos , newOffset ) =>
52+ public static Parser < char , Match < T > > Match < T > ( this Parser < char , T > parser )
53+ => Parser . Map ( ( oldPos , oldOffset , result , newPos , newOffset ) =>
5154 {
5255 var line = new LinePosition ( oldPos . Line , newPos . Line ) ;
5356 var column = new ColumnPosition ( oldPos . Col , newPos . Col ) ;
@@ -59,42 +62,27 @@ public static Parser<char, Match<T>> Match<T>(this Parser<char, T> parser)
5962 parser ,
6063 Parser < char > . CurrentPos , Parser < char > . CurrentOffset ) ;
6164
62- public static Parser < TToken , T > WithDebug < TToken , T > ( this Parser < TToken , T > parser , string label )
63- => Map ( ( u , t , v ) =>
65+ public static Parser < TToken , T > WithDebug < TToken , T > ( this Parser < TToken , T > parser , string label )
66+ => Parser . Map ( ( u , t , _ ) =>
6467 {
6568 Console . WriteLine ( $ "{ label } ({ t . Col } ) : { u } ") ;
6669 return u ;
6770 } , parser , Parser < TToken > . CurrentPos , Parser < TToken > . CurrentSourcePosDelta ) ;
6871
69- public static Parser < TToken , T > WithDebug < TToken , T > ( this Parser < TToken , T > parser )
70- {
71- return Map ( ( u , t , v ) =>
72+ public static Parser < TToken , T > WithDebug < TToken , T > ( this Parser < TToken , T > parser ) =>
73+ Parser . Map ( ( u , t , _ ) =>
7274 {
7375 Console . WriteLine ( $ "({ t . Col } ) : { u } ") ;
7476 return u ;
7577 } , parser , Parser < TToken > . CurrentPos , Parser < TToken > . CurrentSourcePosDelta ) ;
76- }
7778
78- public static Parser < TToken , T > BetweenAsThen < TToken , T , U , V > ( this Parser < TToken , T > parser ,
79- Parser < TToken , U > parser1 ,
80- Parser < TToken , V > parser2 , Func < U , T , V , T > func )
81- {
82- if ( parser1 == null )
83- throw new ArgumentNullException ( nameof ( parser1 ) ) ;
84- if ( parser2 == null )
85- throw new ArgumentNullException ( nameof ( parser2 ) ) ;
86-
87- return Map ( func , parser1 , parser , parser2 ) ;
88- }
89-
90- public static Parser < TToken , R > As < TToken , T , R > ( this Parser < TToken , T > parser )
91- where T : R
92- => parser . Select ( x => ( R ) x ) ;
79+ public static Parser < TToken , TInterface > As < TToken , TClass , TInterface > ( this Parser < TToken , TClass > parser )
80+ where TClass : TInterface => parser . Select ( x => ( TInterface ) x ) ;
9381
94- public static Parser < TToken , T > After < TToken , T , U > ( this Parser < TToken , T > parser , Parser < TToken , U > parserAfter )
95- => parserAfter . Then ( parser , ( u , t ) => t ) ;
82+ public static Parser < TToken , T > After < TToken , T , TNextToken > ( this Parser < TToken , T > parser , Parser < TToken , TNextToken > parserAfter )
83+ => parserAfter . Then ( parser , ( _ , t ) => t ) ;
9684
9785 // TODO optimization
98- public static Parser < char , T > ParenthesisedOptional < T , TResult > ( this Parser < char , T > parser , Func < char , Parser < char , TResult > > custom )
99- => OneOf ( CommonParser . Parenthesised ( parser , custom ) . Try ( ) , parser ) ;
86+ public static Parser < char , T > ParenthesisedOptional < T , TResult > ( this Parser < char , T > parser , Func < char , Parser < char , TResult > > custom )
87+ => Parser . OneOf ( CommonParser . Parenthesised ( parser , custom ) . Try ( ) , parser ) ;
10088}
0 commit comments