Skip to main content

parser_demo/
parser_demo.rs

1use zelen::parse;
2
3fn main() {
4    println!("=== MiniZinc Parser Examples ===\n");
5    
6    // Example 1: N-Queens problem
7    println!("Example 1: N-Queens Problem");
8    let nqueens = r#"
9% N-Queens Problem
10int: n = 8;
11
12% Decision variables: queen position in each row
13array[1..n] of var 1..n: queens;
14
15% All queens in different columns
16constraint alldifferent(queens);
17
18% No two queens on same diagonal
19constraint forall(i in 1..n, j in i+1..n) (
20    queens[i] != queens[j] + (j - i) /\
21    queens[i] != queens[j] - (j - i)
22);
23
24solve satisfy;
25
26output ["queens = ", show(queens), "\n"];
27    "#;
28    
29    match parse(nqueens) {
30        Ok(model) => println!("✓ Successfully parsed {} items\n", model.items.len()),
31        Err(e) => println!("✗ Parse error:\n{}\n", e),
32    }
33    
34    // Example 2: Simple optimization
35    println!("Example 2: Simple Optimization");
36    let optimization = r#"
37int: budget = 100;
38array[1..5] of int: costs = [10, 20, 15, 30, 25];
39array[1..5] of int: values = [50, 100, 75, 150, 125];
40array[1..5] of var 0..1: x;
41
42constraint sum(i in 1..5)(costs[i] * x[i]) <= budget;
43
44solve maximize sum(i in 1..5)(values[i] * x[i]);
45    "#;
46    
47    match parse(optimization) {
48        Ok(model) => println!("✓ Successfully parsed {} items\n", model.items.len()),
49        Err(e) => println!("✗ Parse error:\n{}\n", e),
50    }
51    
52    // Example 3: Syntax error - missing colon
53    println!("Example 3: Syntax Error (missing colon)");
54    let error1 = r#"
55int n = 5;
56var 1..n: x;
57    "#;
58    
59    match parse(error1) {
60        Ok(_) => println!("✗ Should have failed!\n"),
61        Err(e) => println!("✓ Caught error:\n{}\n", e),
62    }
63    
64    // Example 4: Syntax error - missing semicolon
65    println!("Example 4: Syntax Error (missing semicolon)");
66    let error2 = r#"
67int: n = 5
68var 1..n: x;
69    "#;
70    
71    match parse(error2) {
72        Ok(_) => println!("✗ Should have failed!\n"),
73        Err(e) => println!("✓ Caught error:\n{}\n", e),
74    }
75    
76    // Example 5: Complex expressions
77    println!("Example 5: Complex Expressions");
78    let complex = r#"
79int: n = 10;
80array[1..n] of var 1..100: x;
81
82constraint sum(x) == 500;
83constraint forall(i in 1..n-1)(x[i] <= x[i+1]);
84constraint x[1] >= 10;
85constraint x[n] <= 90;
86
87solve minimize sum(i in 1..n)(x[i] * x[i]);
88    "#;
89    
90    match parse(complex) {
91        Ok(model) => println!("✓ Successfully parsed {} items\n", model.items.len()),
92        Err(e) => println!("✗ Parse error:\n{}\n", e),
93    }
94    
95    // Example 6: Array comprehension
96    println!("Example 6: Array Comprehension");
97    let array_comp = r#"
98int: n = 10;
99array[1..n] of int: squares = [i*i | i in 1..n];
100array[int] of int: evens = [i | i in 1..20 where i mod 2 == 0];
101    "#;
102    
103    match parse(array_comp) {
104        Ok(model) => println!("✓ Successfully parsed {} items\n", model.items.len()),
105        Err(e) => println!("✗ Parse error:\n{}\n", e),
106    }
107    
108    // Example 7: Set operations
109    println!("Example 7: Set Operations");
110    let sets = r#"
111set of int: S = {1, 3, 5, 7, 9};
112set of int: T = 1..10;
113var 1..10: x;
114
115constraint x in S;
116constraint x in T;
117    "#;
118    
119    match parse(sets) {
120        Ok(model) => println!("✓ Successfully parsed {} items\n", model.items.len()),
121        Err(e) => println!("✗ Parse error:\n{}\n", e),
122    }
123    
124    println!("=== All examples completed ===");
125}