2010-07-10 9 views
17

Chcę użyć wyrażeń regularnych w OCaml i wygląda na to, że moduł Str zapewnia te funkcje.Wyrażenia regularne w OCaml

Więc próbowałem za pomocą prostego programu:

open Str 
let regx = regexp "." 

ale daje mi następujący błąd

File "lol.ml", line 1, characters 0-1: Error: Error while linking lol.cmo: Reference to undefined global `Str'

Jakby moduł nie jest obecny, ale jeśli usunąć open Str mówi, że regexp jest wartość niezwiązana.

Nie rozumiem, jaki rodzaj problemu jest to, Str powinien być standardowym module (według http://caml.inria.fr/pub/docs/old-311/libref/Str.html), więc jestem pojęcia .. tylko że ja myślałem, że podpis (mli) jest obecny, ale realizacja (ml) nie jest.

Używam Objective Caml version 3.11.0 według narzędzia ocaml.

Czy ktoś może mi pomóc w ustaleniu tego? góry dzięki

+3

Jeśli można go uniknąć, to * bardzo * don nie chcesz używać modułu 'Str'. Jego interfejs API nie jest stały, co prowadzi do wielu problemów. Na szczęście PCRE ma dobre powiązania OCaml na: http://www.ocaml.info/home/ocaml_sources.html Możesz również sprawdzić Mikmatch pod kątem obsługi składni w górnej części silnika PCRE. –

Odpowiedz

25

Od the manual:

Programs that use the str library must be linked as follows:

ocamlc other options str.cma other files 
ocamlopt other options str.cmxa other files 
+1

Dzięki, nie znałem tego problemu! – Jack

16

Albo można umieścić

#load "str.cma";; 

jeśli robisz to w tłumacza

+0

Dzięki, przyda Ci się to podczas próby z toplevel – Jack

+0

hi @newacct, czy możesz wyjaśnić, dlaczego ocamllex wyświetla błąd, kiedy umieszczam ten wiersz w 1. wierszu w moim lexer.mll? błąd: Odniesienie do niezdefiniowanego globalnego 'Str '.... –

1

Jako alternatywę dla modułu Str istnieje również Re2.

  1. zainstalować go za pomocą opam install re2
  2. użyć modułu w your_file.ml tak:

    open Re2.Std 
    open Re2.Infix 
    let change input_text = Re2.rewrite_exn ~/"change this" "to that" input_text 
    let() = printf "%s" (change "change this") 
    
  3. skompilować z ocamlbuild -use-ocamlfind -package re2 -package core -tag thread your_file.byte