5

私の OCaml .ml コードは次のようになります。

open Str

let idregex = Str.regexp ['a'-'z' 'A'-'Z']+ ['a'-'z' 'A'-'Z' '0'-'9' '_']*;

let evalT (x,y) = (match x with 
    Str.regexp "Id(" (idregex as var) ")" -> (x,y)

上記のコードが機能しないのはなぜですか? どうすれば動作させることができますか?

編集:

多くの解析を行う必要はありません。だから、OCamlexファイルではなく、OCaml .mlファイルに残してほしい

4

2 に答える 2

7

このmatchキーワードは OCaml パターンで機能します。正規表現は OCaml のパターンではなく、別の種類のパターンなので、使用しないmatchでください。

関数と同じStrモジュールregexpは、一致する関数があります。

行うべき正規表現マッチングがたくさんある場合は、 を使用できますocamllex。これは、(残念ながら無効な) の定義と同様の定義のファイルを読み取り、idregexOCaml コードを生成してマッチングを行います。

Strこれは、モジュールを使用してパターンの単純な一致を行う方法を示すセッションです。

$ ocaml
        OCaml version 4.01.0

# #load "str.cma";;
# let idregex = Str.regexp "[a-zA-Z]+[a-zA-Z0-9_]*";;
val idregex : Str.regexp = <abstr>
# Str.string_match idregex "a_32" 0;;
- : bool = true
# Str.string_match idregex "32" 0;;
- : bool = false

余談ですが、あなたのコードは実際には OCaml のようには見えません。OCaml と ocamllex を混ぜたようなものです。実際にはmicmatchと呼ばれる、これに少し似たシステムがあります。ストック OCaml 言語を使用することを計画しているようですが (これには拍手を送ります)、ある時点で micmatch を調べるのは興味深いかもしれません。

于 2014-08-09T18:28:45.167 に答える