2012-08-02 3 views
2

non-line-termination-character = <any character other than %x000D/%x000A>lexer.mll에 정의하고 싶습니다. let non_line_termination_character = [^('\x0D' '\x0A')]을 시도했지만 구문 오류가 발생했습니다.OCaml에서 "not belong to"에 대한 정규 표현

let non_line_termination_character = [^'\x0D'] intersect [^'\x0A']이 효과가 있다고 생각하지만, intersect을 어떻게 표현할 지 모르겠다.

아무도 도와 줄 수 있습니까?

PS는 : http://caml.inria.fr/pub/docs/manual-ocaml/manual026.html

답변

2

호를 허용하지 않는 ocamllex 설정된 문자 구문 :이 규칙의 12.2.4 Regular expressions이다. 다음은 나를위한 작품이다 :

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