2012-08-02 32 views
2

我想在lexer.mll中定義non-line-termination-character = <any character other than %x000D/%x000A>。我試過let non_line_termination_character = [^('\x0D' '\x0A')],但它給了我一個語法錯誤。在OCaml中的「不屬於」的正則表達式

我認爲let non_line_termination_character = [^'\x0D'] intersect [^'\x0A']會工作,但我不知道如何表達intersect

任何人都可以幫忙嗎?

PS:規則是在12.2.4 Regular expressionshttp://caml.inria.fr/pub/docs/manual-ocaml/manual026.html

回答

2

在ocamllex設置不允許括號字符的語法。以下作品適用於我:

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

在ocamllex中沒有相交正則表達式的通用算子。但是對於兩個字符集a和b,您可以編寫a # (a # b)

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

(古怪,我的測試表明這個工程的每一個字符集我嘗試,但它不能用於非CR和非LF的具體例子。實際上,它似乎是一個錯誤。但也許我缺少一些明顯的東西)。

2

[^'\x0D']描述的集合包括'\x0A',反之亦然,所以兩個集合的聯合包含了所有內容。我想這就是你想要的:

[^'\x0D' '\x0A'] 
+0

對不起,我犯了一個錯誤......剛在OP – SoftTimur 2012-08-02 03:51:27