Skip to content

Commit 6e4bd9e

Browse files
committed
feat(fzn-rs): Ignore predicate declarations in flatzinc
1 parent 26e792c commit 6e4bd9e

File tree

1 file changed

+43
-1
lines changed

1 file changed

+43
-1
lines changed

fzn_rs/src/fzn/mod.rs

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use chumsky::extra;
77
use chumsky::input::Input;
88
use chumsky::input::MapExtra;
99
use chumsky::input::ValueInput;
10+
use chumsky::prelude::any;
1011
use chumsky::prelude::choice;
1112
use chumsky::prelude::just;
1213
use 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<'_>> {
128130
type 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+
131150
fn parameters<'tokens, 'src: 'tokens, I>() -> impl Parser<'tokens, I, (), FznExtra<'tokens, 'src>>
132151
where
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

Comments
 (0)