@@ -224,10 +224,20 @@ pub fn parse(tokens: &mut TokenIter) -> Result<Miniscript<bitcoin::PublicKey>, E
224
224
// pubkeyhash and [T] VERIFY and [T] 0NOTEQUAL
225
225
Tk :: Verify => match_token!(
226
226
tokens,
227
- Tk :: Equal , Tk :: Hash20 ( hash) , Tk :: Hash160 , Tk :: Dup
228
- => term. reduce0( Terminal :: PkH (
229
- hash160:: Hash :: from_inner( hash)
230
- ) ) ?,
227
+ Tk :: Equal => match_token!(
228
+ tokens,
229
+ Tk :: Hash20 ( hash) , Tk :: Hash160 , Tk :: Dup => {
230
+ term. reduce0( Terminal :: PkH (
231
+ hash160:: Hash :: from_inner( hash)
232
+ ) ) ?
233
+ } ,
234
+ Tk :: Hash32 ( hash) , Tk :: Sha256 , Tk :: Verify , Tk :: Equal , Tk :: Num ( 32 ) , Tk :: Size => {
235
+ non_term. push( NonTerm :: Verify ) ;
236
+ term. reduce0( Terminal :: Sha256 (
237
+ sha256:: Hash :: from_inner( hash)
238
+ ) ) ?
239
+ } ,
240
+ ) ,
231
241
x => {
232
242
tokens. un_next( x) ;
233
243
non_term. push( NonTerm :: Verify ) ;
@@ -343,16 +353,9 @@ pub fn parse(tokens: &mut TokenIter) -> Result<Miniscript<bitcoin::PublicKey>, E
343
353
}
344
354
Some ( NonTerm :: MaybeAndV ) => {
345
355
// Handle `and_v` prefixing
346
- match tokens. peek ( ) {
347
- None
348
- | Some ( & Tk :: If )
349
- | Some ( & Tk :: NotIf )
350
- | Some ( & Tk :: Else )
351
- | Some ( & Tk :: ToAltStack ) => { }
352
- _ => {
353
- non_term. push ( NonTerm :: AndV ) ;
354
- non_term. push ( NonTerm :: Expression ) ;
355
- }
356
+ if isAndV ( tokens) {
357
+ non_term. push ( NonTerm :: AndV ) ;
358
+ non_term. push ( NonTerm :: Expression ) ;
356
359
}
357
360
}
358
361
Some ( NonTerm :: MaybeSwap ) => {
@@ -377,7 +380,14 @@ pub fn parse(tokens: &mut TokenIter) -> Result<Miniscript<bitcoin::PublicKey>, E
377
380
Some ( NonTerm :: Verify ) => term. reduce1 ( Terminal :: Verify ) ?,
378
381
Some ( NonTerm :: NonZero ) => term. reduce1 ( Terminal :: NonZero ) ?,
379
382
Some ( NonTerm :: ZeroNotEqual ) => term. reduce1 ( Terminal :: ZeroNotEqual ) ?,
380
- Some ( NonTerm :: AndV ) => term. reduce2 ( Terminal :: AndV ) ?,
383
+ Some ( NonTerm :: AndV ) => {
384
+ if isAndV ( tokens) {
385
+ non_term. push ( NonTerm :: AndV ) ;
386
+ non_term. push ( NonTerm :: MaybeAndV ) ;
387
+ } else {
388
+ term. reduce2 ( Terminal :: AndV ) ?
389
+ }
390
+ }
381
391
Some ( NonTerm :: AndB ) => term. reduce2 ( Terminal :: AndB ) ?,
382
392
Some ( NonTerm :: OrB ) => term. reduce2 ( Terminal :: OrB ) ?,
383
393
Some ( NonTerm :: OrC ) => term. reduce2 ( Terminal :: OrC ) ?,
@@ -472,3 +482,10 @@ pub fn parse(tokens: &mut TokenIter) -> Result<Miniscript<bitcoin::PublicKey>, E
472
482
assert_eq ! ( term. 0 . len( ) , 1 ) ;
473
483
Ok ( term. pop ( ) . unwrap ( ) )
474
484
}
485
+
486
+ fn isAndV ( tokens : & mut TokenIter ) -> bool {
487
+ match tokens. peek ( ) {
488
+ None | Some ( & Tk :: If ) | Some ( & Tk :: NotIf ) | Some ( & Tk :: Else ) | Some ( & Tk :: ToAltStack ) => false ,
489
+ _ => true ,
490
+ }
491
+ }
0 commit comments