浏览代码

actually return something from parse_dimac

Lucas Stadler 10 年之前
父节点
当前提交
32e45b892b
共有 1 个文件被更改,包括 21 次插入13 次删除
  1. 21 13
      rust/dpll/cnf.rs

+ 21 - 13
rust/dpll/cnf.rs

@ -10,27 +10,32 @@
10 10
use std::io;
11 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 20
    let mut lines = dimac.lines();
15 21
    let mut num_vars;
16 22
    let mut num_clauses;
17 23
    
18 24
    match lines.next() {
19
        None => { println!("Error: expected cnf description"); return }
25
        None => { return Err("Error: expected cnf description".to_string()) }
20 26
        Some(line) => {
21 27
            let desc: Vec<&str> = line.split(" ").collect();
22 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 31
            match desc[2].parse::<u32>() {
27 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 36
            match desc[3].parse::<u32>() {
32 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 40
            println!("cnf has {} variables and {} clauses", num_vars, num_clauses)
36 41
        }
@ -38,32 +43,35 @@ fn parse_dimac(dimac: &str) {
38 43
39 44
    let clause_lines: Vec<&str> = lines.collect();
40 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 49
    let mut clauses: Vec<Vec<i32>> = Vec::with_capacity(num_clauses as usize);
46 50
    for clause_line in clause_lines {
47 51
        let mut vars: Vec<i32> = clause_line.split(" ").map(|x| x.parse::<i32>().unwrap()).collect();
48 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 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 58
        let l = vars.len();
57 59
        vars.truncate(l - 1);
58 60
        println!("{:?}", vars);
59 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 68
fn main() {
64 69
    let input: &mut String = &mut String::new();
65 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 75
        Err(e) => { println!("Error: {}", e) }
68 76
    }
69 77
}