2

non-line-termination-character = <any character other than %x000D / %x000A>で定義したいと思いますlexer.mll。を試しlet non_line_termination_character = [^('\x0D' '\x0A')]ましたが、構文エラーが発生しました。

うまくいくと思いますlet non_line_termination_character = [^'\x0D'] intersect [^'\x0A']が、表現方法がわかりませんintersect

誰でも助けてもらえますか?

PS: ルールは http://caml.inria.fr/pub/docs/manual-ocaml/manual026.html に12.2.4 Regular expressionsあります。

4

2 に答える 2

2

ocamllex の文字セットの構文では、括弧を使用できません。以下は私にとってはうまくいきます:

let non_line_termination_character = [^ '\x0d' '\x0a' ]

ocamllex には正規表現を交差させる一般的な演算子はありません。しかし、2 つの文字セット a と b については、 と書くことができますa # (a # b)

let nona = [^ 'a']
let nonb = [^ 'b']
let nonab = nona # (nona # nonb)

(奇妙なことに、私のテストでは、これが試したすべての文字セットで機能することが示されていますが、CR と LF 以外の特定の例では失敗します。実際にはバグのようです。しかし、明らかな何かが欠けている可能性があります。)

于 2012-08-02T03:43:53.827 に答える
2

セットはインクルードによって記述さ[^'\x0D']'\x0A'、その逆も同様であるため、2 つのセットの結合にはすべてが含まれます。これがあなたがしようとしていたことだと思います:

[^'\x0D' '\x0A']
于 2012-08-02T03:46:56.657 に答える