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:规则位于12.2.4 Regular expressionshttp ://caml.inria.fr/pub/docs/manual-ocaml/manual026.html

4

2 回答 2

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 的特定示例失败。它实际上看起来像一个错误。但也许我遗漏了一些明显的东西。)

于 2012-08-02T03:43:53.827 回答
2

[^'\x0D']include描述的集合,'\x0A'反之亦然,所以这两个集合的并集包含了一切。我认为这就是你想要的:

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