@@ -236,10 +236,20 @@ pub fn parse<Ctx: ScriptContext>(
236236 // pubkeyhash and [T] VERIFY and [T] 0NOTEQUAL
237237 Tk :: Verify => match_token!(
238238 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+ ) ,
243253 x => {
244254 tokens. un_next( x) ;
245255 non_term. push( NonTerm :: Verify ) ;
@@ -355,16 +365,9 @@ pub fn parse<Ctx: ScriptContext>(
355365 }
356366 Some ( NonTerm :: MaybeAndV ) => {
357367 // 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 ) ;
368371 }
369372 }
370373 Some ( NonTerm :: MaybeSwap ) => {
@@ -389,7 +392,14 @@ pub fn parse<Ctx: ScriptContext>(
389392 Some ( NonTerm :: Verify ) => term. reduce1 ( Terminal :: Verify ) ?,
390393 Some ( NonTerm :: NonZero ) => term. reduce1 ( Terminal :: NonZero ) ?,
391394 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+ }
393403 Some ( NonTerm :: AndB ) => term. reduce2 ( Terminal :: AndB ) ?,
394404 Some ( NonTerm :: OrB ) => term. reduce2 ( Terminal :: OrB ) ?,
395405 Some ( NonTerm :: OrC ) => term. reduce2 ( Terminal :: OrC ) ?,
@@ -485,3 +495,10 @@ pub fn parse<Ctx: ScriptContext>(
485495 assert_eq ! ( term. 0 . len( ) , 1 ) ;
486496 Ok ( term. pop ( ) . unwrap ( ) )
487497}
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