mirror of
https://github.com/c-cube/sidekick.git
synced 2025-12-09 12:45:48 -05:00
add dimacs sub-library
This commit is contained in:
parent
c82099731d
commit
d47d619265
5 changed files with 113 additions and 0 deletions
15
src/dimacs/Dagon_dimacs.ml
Normal file
15
src/dimacs/Dagon_dimacs.ml
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
|
||||
(** {1 Main for dimacs} *)
|
||||
|
||||
type 'a or_error = ('a, string) CCResult.t
|
||||
|
||||
let parse file : int list list or_error =
|
||||
try
|
||||
CCIO.with_in file
|
||||
(fun ic ->
|
||||
let lexbuf = Lexing.from_channel ic in
|
||||
Parser.file Lexer.token lexbuf)
|
||||
|> CCResult.return
|
||||
with e ->
|
||||
CCResult.of_exn_trace e
|
||||
|
||||
13
src/dimacs/Dagon_dimacs.mli
Normal file
13
src/dimacs/Dagon_dimacs.mli
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
|
||||
(** {1 Main for dimacs} *)
|
||||
|
||||
(** This library provides a parser for DIMACS files, to represent
|
||||
SAT problems.
|
||||
|
||||
http://www.satcompetition.org/2009/format-benchmarks2009.html
|
||||
*)
|
||||
|
||||
type 'a or_error = ('a, string) CCResult.t
|
||||
|
||||
val parse : string -> int list list or_error
|
||||
(** Parse a file into a list of clauses. *)
|
||||
22
src/dimacs/Lexer.mll
Normal file
22
src/dimacs/Lexer.mll
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
(* Copyright 2005 INRIA *)
|
||||
{
|
||||
open Dagon_util
|
||||
open Parser
|
||||
}
|
||||
|
||||
let number = ['1' - '9'] ['0' - '9']*
|
||||
|
||||
rule token = parse
|
||||
| eof { EOF }
|
||||
| "c" { comment lexbuf }
|
||||
| [' ' '\t' '\r'] { token lexbuf }
|
||||
| 'p' { P }
|
||||
| "cnf" { CNF }
|
||||
| '\n' { Lexing.new_line lexbuf; token lexbuf }
|
||||
| '0' { ZERO }
|
||||
| '-'? number { LIT (int_of_string (Lexing.lexeme lexbuf)) }
|
||||
| _ { Util.errorf "dimacs.lexer: unexpected char `%s`" (Lexing.lexeme lexbuf) }
|
||||
|
||||
and comment = parse
|
||||
| '\n' { Lexing.new_line lexbuf; token lexbuf }
|
||||
| [^'\n'] { comment lexbuf }
|
||||
43
src/dimacs/Parser.mly
Normal file
43
src/dimacs/Parser.mly
Normal file
|
|
@ -0,0 +1,43 @@
|
|||
/* Copyright 2005 INRIA */
|
||||
|
||||
%{
|
||||
open Dagon_util
|
||||
|
||||
let lnum pos = pos.Lexing.pos_lnum
|
||||
let cnum pos = pos.Lexing.pos_cnum - pos.Lexing.pos_bol
|
||||
let pp_pos out (start,stop) =
|
||||
Format.fprintf out "(at %d:%d - %d:%d)"
|
||||
(lnum start) (cnum start) (lnum stop) (cnum stop)
|
||||
%}
|
||||
|
||||
%token <int> LIT
|
||||
%token ZERO
|
||||
%token P CNF EOF
|
||||
|
||||
%start file
|
||||
%type <int list list> file
|
||||
|
||||
%%
|
||||
|
||||
/* DIMACS syntax */
|
||||
|
||||
prelude:
|
||||
| P CNF LIT LIT { () }
|
||||
| error
|
||||
{
|
||||
Util.errorf "expected prelude %a" pp_pos ($startpos,$endpos)
|
||||
}
|
||||
|
||||
clauses:
|
||||
| l=clause* { l }
|
||||
| error
|
||||
{
|
||||
Util.errorf "expected list of clauses %a"
|
||||
pp_pos ($startpos,$endpos)
|
||||
}
|
||||
|
||||
file:
|
||||
| prelude l=clauses EOF { l }
|
||||
|
||||
clause:
|
||||
| l=LIT+ ZERO { l }
|
||||
20
src/dimacs/jbuild
Normal file
20
src/dimacs/jbuild
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
; vim:ft=lisp:
|
||||
|
||||
(jbuild_version 1)
|
||||
|
||||
; main binary
|
||||
(library
|
||||
((name dagon_dimacs)
|
||||
(public_name dagon.dimacs)
|
||||
(optional) ; only if deps present
|
||||
(libraries (containers dagon.util))
|
||||
(flags (:standard -w +a-4-42-44-48-50-58-32-60@8))
|
||||
(ocamlopt_flags (:standard -O3 -color always -bin-annot
|
||||
-unbox-closures -unbox-closures-factor 20))
|
||||
))
|
||||
|
||||
(menhir
|
||||
((modules (Parser))))
|
||||
|
||||
(ocamllex
|
||||
(Lexer))
|
||||
Loading…
Add table
Reference in a new issue