@@ -7,6 +7,7 @@ use chumsky::extra;
77use chumsky:: input:: Input ;
88use chumsky:: input:: MapExtra ;
99use chumsky:: input:: ValueInput ;
10+ use chumsky:: prelude:: any;
1011use chumsky:: prelude:: choice;
1112use chumsky:: prelude:: just;
1213use chumsky:: prelude:: recursive;
@@ -92,7 +93,8 @@ pub fn parse(source: &str) -> Result<ast::Ast, FznError<'_>> {
9293 |node| ( & node. node , & node. span ) ,
9394 ) ;
9495
95- let ast = parameters ( )
96+ let ast = predicates ( )
97+ . ignore_then ( parameters ( ) )
9698 . ignore_then ( arrays ( ) )
9799 . then ( variables ( ) )
98100 . then ( arrays ( ) )
@@ -128,6 +130,23 @@ pub fn parse(source: &str) -> Result<ast::Ast, FznError<'_>> {
128130type FznExtra < ' tokens , ' src > =
129131 extra:: Full < Rich < ' tokens , Token < ' src > , ast:: Span > , extra:: SimpleState < ParseState > , ( ) > ;
130132
133+ fn predicates < ' tokens , ' src : ' tokens , I > ( ) -> impl Parser < ' tokens , I , ( ) , FznExtra < ' tokens , ' src > >
134+ where
135+ I : ValueInput < ' tokens , Span = ast:: Span , Token = Token < ' src > > ,
136+ {
137+ predicate ( ) . repeated ( ) . collect :: < Vec < _ > > ( ) . ignored ( )
138+ }
139+
140+ fn predicate < ' tokens , ' src : ' tokens , I > ( ) -> impl Parser < ' tokens , I , ( ) , FznExtra < ' tokens , ' src > >
141+ where
142+ I : ValueInput < ' tokens , Span = ast:: Span , Token = Token < ' src > > ,
143+ {
144+ just ( Ident ( "predicate" ) )
145+ . ignore_then ( any ( ) . and_is ( just ( SemiColon ) . not ( ) ) . repeated ( ) )
146+ . then ( just ( SemiColon ) )
147+ . ignored ( )
148+ }
149+
131150fn parameters < ' tokens , ' src : ' tokens , I > ( ) -> impl Parser < ' tokens , I , ( ) , FznExtra < ' tokens , ' src > >
132151where
133152 I : ValueInput < ' tokens , Span = ast:: Span , Token = Token < ' src > > ,
@@ -583,6 +602,29 @@ mod tests {
583602 ) ;
584603 }
585604
605+ #[ test]
606+ fn predicate_statements_are_ignored ( ) {
607+ let source = r#"
608+ predicate some_predicate(int: xs, var int: ys);
609+ solve satisfy;
610+ "# ;
611+
612+ let ast = parse ( source) . expect ( "valid fzn" ) ;
613+
614+ assert_eq ! (
615+ ast,
616+ ast:: Ast {
617+ variables: BTreeMap :: default ( ) ,
618+ arrays: BTreeMap :: default ( ) ,
619+ constraints: vec![ ] ,
620+ solve: ast:: SolveObjective {
621+ method: node( 71 , 78 , ast:: Method :: Satisfy ) ,
622+ annotations: vec![ ] ,
623+ }
624+ }
625+ ) ;
626+ }
627+
586628 #[ test]
587629 fn empty_minimization_model ( ) {
588630 let source = r#"
0 commit comments