@@ -236,10 +236,20 @@ pub fn parse<Ctx: ScriptContext>(
236
236
// pubkeyhash and [T] VERIFY and [T] 0NOTEQUAL
237
237
Tk :: Verify => match_token!(
238
238
tokens,
239
- Tk :: Equal , Tk :: Hash20 ( hash) , Tk :: Hash160 , Tk :: Dup
240
- => term. reduce0( Terminal :: PkH (
241
- hash160:: Hash :: from_inner( hash)
242
- ) ) ?,
239
+ Tk :: Equal => match_token!(
240
+ tokens,
241
+ Tk :: Hash20 ( hash) , Tk :: Hash160 , Tk :: Dup => {
242
+ term. reduce0( Terminal :: PkH (
243
+ hash160:: Hash :: from_inner( hash)
244
+ ) ) ?
245
+ } ,
246
+ Tk :: Hash32 ( hash) , Tk :: Sha256 , Tk :: Verify , Tk :: Equal , Tk :: Num ( 32 ) , Tk :: Size => {
247
+ non_term. push( NonTerm :: Verify ) ;
248
+ term. reduce0( Terminal :: Sha256 (
249
+ sha256:: Hash :: from_inner( hash)
250
+ ) ) ?
251
+ } ,
252
+ ) ,
243
253
x => {
244
254
tokens. un_next( x) ;
245
255
non_term. push( NonTerm :: Verify ) ;
@@ -355,16 +365,9 @@ pub fn parse<Ctx: ScriptContext>(
355
365
}
356
366
Some ( NonTerm :: MaybeAndV ) => {
357
367
// Handle `and_v` prefixing
358
- match tokens. peek ( ) {
359
- None
360
- | Some ( & Tk :: If )
361
- | Some ( & Tk :: NotIf )
362
- | Some ( & Tk :: Else )
363
- | Some ( & Tk :: ToAltStack ) => { }
364
- _ => {
365
- non_term. push ( NonTerm :: AndV ) ;
366
- non_term. push ( NonTerm :: Expression ) ;
367
- }
368
+ if is_and_v ( tokens) {
369
+ non_term. push ( NonTerm :: AndV ) ;
370
+ non_term. push ( NonTerm :: Expression ) ;
368
371
}
369
372
}
370
373
Some ( NonTerm :: MaybeSwap ) => {
@@ -389,7 +392,14 @@ pub fn parse<Ctx: ScriptContext>(
389
392
Some ( NonTerm :: Verify ) => term. reduce1 ( Terminal :: Verify ) ?,
390
393
Some ( NonTerm :: NonZero ) => term. reduce1 ( Terminal :: NonZero ) ?,
391
394
Some ( NonTerm :: ZeroNotEqual ) => term. reduce1 ( Terminal :: ZeroNotEqual ) ?,
392
- Some ( NonTerm :: AndV ) => term. reduce2 ( Terminal :: AndV ) ?,
395
+ Some ( NonTerm :: AndV ) => {
396
+ if is_and_v ( tokens) {
397
+ non_term. push ( NonTerm :: AndV ) ;
398
+ non_term. push ( NonTerm :: MaybeAndV ) ;
399
+ } else {
400
+ term. reduce2 ( Terminal :: AndV ) ?
401
+ }
402
+ }
393
403
Some ( NonTerm :: AndB ) => term. reduce2 ( Terminal :: AndB ) ?,
394
404
Some ( NonTerm :: OrB ) => term. reduce2 ( Terminal :: OrB ) ?,
395
405
Some ( NonTerm :: OrC ) => term. reduce2 ( Terminal :: OrC ) ?,
@@ -485,3 +495,10 @@ pub fn parse<Ctx: ScriptContext>(
485
495
assert_eq ! ( term. 0 . len( ) , 1 ) ;
486
496
Ok ( term. pop ( ) . unwrap ( ) )
487
497
}
498
+
499
+ fn is_and_v ( tokens : & mut TokenIter ) -> bool {
500
+ match tokens. peek ( ) {
501
+ None | Some ( & Tk :: If ) | Some ( & Tk :: NotIf ) | Some ( & Tk :: Else ) | Some ( & Tk :: ToAltStack ) => false ,
502
+ _ => true ,
503
+ }
504
+ }
0 commit comments