@@ -224,10 +224,20 @@ pub fn parse(tokens: &mut TokenIter) -> Result<Miniscript<bitcoin::PublicKey>, E
224224 // pubkeyhash and [T] VERIFY and [T] 0NOTEQUAL
225225 Tk :: Verify => match_token!(
226226 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+ ) ,
231241 x => {
232242 tokens. un_next( x) ;
233243 non_term. push( NonTerm :: Verify ) ;
@@ -343,16 +353,9 @@ pub fn parse(tokens: &mut TokenIter) -> Result<Miniscript<bitcoin::PublicKey>, E
343353 }
344354 Some ( NonTerm :: MaybeAndV ) => {
345355 // 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 ) ;
356359 }
357360 }
358361 Some ( NonTerm :: MaybeSwap ) => {
@@ -377,7 +380,14 @@ pub fn parse(tokens: &mut TokenIter) -> Result<Miniscript<bitcoin::PublicKey>, E
377380 Some ( NonTerm :: Verify ) => term. reduce1 ( Terminal :: Verify ) ?,
378381 Some ( NonTerm :: NonZero ) => term. reduce1 ( Terminal :: NonZero ) ?,
379382 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+ } ,
381391 Some ( NonTerm :: AndB ) => term. reduce2 ( Terminal :: AndB ) ?,
382392 Some ( NonTerm :: OrB ) => term. reduce2 ( Terminal :: OrB ) ?,
383393 Some ( NonTerm :: OrC ) => term. reduce2 ( Terminal :: OrC ) ?,
@@ -472,3 +482,18 @@ pub fn parse(tokens: &mut TokenIter) -> Result<Miniscript<bitcoin::PublicKey>, E
472482 assert_eq ! ( term. 0 . len( ) , 1 ) ;
473483 Ok ( term. pop ( ) . unwrap ( ) )
474484}
485+
486+ fn isAndV ( tokens : & mut TokenIter ) -> bool {
487+ match tokens. peek ( ) {
488+ None
489+ | Some ( & Tk :: If )
490+ | Some ( & Tk :: NotIf )
491+ | Some ( & Tk :: Else )
492+ | Some ( & Tk :: ToAltStack ) => {
493+ false
494+ } ,
495+ _ => {
496+ true
497+ }
498+ }
499+ }
0 commit comments