Просмотр исходного кода

actually return something from parse_dimac

Lucas Stadler лет назад: 10
Родитель
Сommit
32e45b892b
1 измененных файлов с 21 добавлено и 13 удалено
  1. 21 13
      rust/dpll/cnf.rs

+ 21 - 13
rust/dpll/cnf.rs

10
use std::io;
10
use std::io;
11
use std::io::Read;
11
use std::io::Read;
12
12
13
fn parse_dimac(dimac: &str) {
13
struct CNF {
14
    num_vars: u32,
15
    num_clauses: u32,
16
    clauses: Vec<Vec<i32>>
17
}
18
19
fn parse_dimac(dimac: &str) -> Result<CNF, String> {
14
    let mut lines = dimac.lines();
20
    let mut lines = dimac.lines();
15
    let mut num_vars;
21
    let mut num_vars;
16
    let mut num_clauses;
22
    let mut num_clauses;
17
    
23
    
18
    match lines.next() {
24
    match lines.next() {
19
        None => { println!("Error: expected cnf description"); return }
25
        None => { return Err("Error: expected cnf description".to_string()) }
20
        Some(line) => {
26
        Some(line) => {
21
            let desc: Vec<&str> = line.split(" ").collect();
27
            let desc: Vec<&str> = line.split(" ").collect();
22
            if desc.len() != 4 || desc[0] != "p" || desc[1] != "cnf" {
28
            if desc.len() != 4 || desc[0] != "p" || desc[1] != "cnf" {
23
                println!("Error: cnf description must be of the form 'p cnf <num vars> <num clauses>'"to_string());
24
                return;
29
                return Err("Error: cnf description must be of the form 'p cnf <num vars> <num clauses>'".to_string()to_string())
25
            }
30
            }
26
            match desc[2].parse::<u32>() {
31
            match desc[2].parse::<u32>() {
27
                Ok(n) => { num_vars = n }
32
                Ok(n) => { num_vars = n }
28
                Err(e) => { println!("Error: <num vars> must be a positive integer: {}", e); return; }
33
                Err(e) => { return Err(format!("Error: <num vars> must be a positive integer: {}", e)) }
29
            }
34
            }
30
            
35
            
31
            match desc[3].parse::<u32>() {
36
            match desc[3].parse::<u32>() {
32
                Ok(n) => { num_clauses = n }
37
                Ok(n) => { num_clauses = n }
33
                Err(e) => { println!("Error: <num clauses> must be a positive integer: {}", e); return; }
38
                Err(e) => { return Err(format!("Error: <num clauses> must be a positive integer: {}", e)) }
34
            }
39
            }
35
            println!("cnf has {} variables and {} clauses", num_vars, num_clauses)
40
            println!("cnf has {} variables and {} clauses", num_vars, num_clauses)
36
        }
41
        }
38
43
39
    let clause_lines: Vec<&str> = lines.collect();
44
    let clause_lines: Vec<&str> = lines.collect();
40
    if clause_lines.len() as u32 != num_clauses {
45
    if clause_lines.len() as u32 != num_clauses {
41
        println!("Error: Wrong number of clauses: Expected {}, but got {}", num_clauses, clause_lines.len());
42
        return
46
        return Err(format!("Error: Wrong number of clauses: Expected {}, but got {}", num_clauses, clause_lines.len()))
43
    }
47
    }
44
48
45
    let mut clauses: Vec<Vec<i32>> = Vec::with_capacity(num_clauses as usize);
49
    let mut clauses: Vec<Vec<i32>> = Vec::with_capacity(num_clauses as usize);
46
    for clause_line in clause_lines {
50
    for clause_line in clause_lines {
47
        let mut vars: Vec<i32> = clause_line.split(" ").map(|x| x.parse::<i32>().unwrap()).collect();
51
        let mut vars: Vec<i32> = clause_line.split(" ").map(|x| x.parse::<i32>().unwrap()).collect();
48
        if vars.is_empty() {
52
        if vars.is_empty() {
49
            println!("Error: empty clause"to_string());
50
            return
53
            return Err("Error: empty clause".to_string()to_string())
51
        }
54
        }
52
        if vars[vars.len()-1] != 0 {
55
        if vars[vars.len()-1] != 0 {
53
            println!("Clause must be terminated with 0"to_string());
54
            return
56
            return Err("Clause must be terminated with 0".to_string()to_string())
55
        }
57
        }
56
        let l = vars.len();
58
        let l = vars.len();
57
        vars.truncate(l - 1);
59
        vars.truncate(l - 1);
58
        println!("{:?}", vars);
60
        println!("{:?}", vars);
59
        clauses.push(vars)
61
        clauses.push(vars)
60
    }
62
    }
63
64
    let cnf = CNF { num_vars: num_vars, num_clauses: num_clauses, clauses: clauses };
65
    return Ok(cnf)
61
}
66
}
62
67
63
fn main() {
68
fn main() {
64
    let input: &mut String = &mut String::new();
69
    let input: &mut String = &mut String::new();
65
    match io::stdin().read_to_string(input) {
70
    match io::stdin().read_to_string(input) {
66
        Ok(_) => { parse_dimac(input) }
71
        Ok(_) => match parse_dimac(input) {
72
            Ok(cnf) => { println!("ok!") }
73
            Err(e) => { println!("{}", e) }
74
        },
67
        Err(e) => { println!("Error: {}", e) }
75
        Err(e) => { println!("Error: {}", e) }
68
    }
76
    }
69
}
77
}