diff options
Diffstat (limited to 'otherlibs/labltk/browser/lexical.ml')
-rw-r--r-- | otherlibs/labltk/browser/lexical.ml | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/otherlibs/labltk/browser/lexical.ml b/otherlibs/labltk/browser/lexical.ml index 655c3cc18..38dcb8f81 100644 --- a/otherlibs/labltk/browser/lexical.ml +++ b/otherlibs/labltk/browser/lexical.ml @@ -25,24 +25,28 @@ and colors = "indianred4"; "saddlebrown"; "midnightblue"] let init_tags tw = - List.iter2 tags colors f: + List.iter2 tags colors ~f: begin fun tag col -> - Text.tag_configure tw :tag foreground:(`Color col) + Text.tag_configure tw ~tag ~foreground:(`Color col) end; - Text.tag_configure tw tag:"error" foreground:`Red; - Text.tag_configure tw tag:"error" relief:`Raised; - Text.tag_raise tw tag:"error" + Text.tag_configure tw ~tag:"error" ~foreground:`Red; + Text.tag_configure tw ~tag:"error" ~relief:`Raised; + Text.tag_raise tw ~tag:"error" -let tag ?(:start=tstart) ?(:end=tend) tw = - let tpos c = (Text.index tw index:start, [`Char c]) in - let text = Text.get tw :start :end in +let tag ?(start=tstart) ?(stop=tend) tw = + let tpos c = (Text.index tw ~index:start, [`Char c]) in + let text = Text.get tw ~start ~stop in let buffer = Lexing.from_string text in List.iter tags - f:(fun tag -> Text.tag_remove tw :start :end :tag); + ~f:(fun tag -> Text.tag_remove tw ~start ~stop ~tag); + let last = ref (EOF, 0, 0) in try while true do + let token = Lexer.token buffer + and start = Lexing.lexeme_start buffer + and stop = Lexing.lexeme_end buffer in let tag = - match Lexer.token buffer with + match token with AMPERAMPER | AMPERSAND | BARBAR @@ -108,17 +112,31 @@ let tag ?(:start=tstart) ?(:end=tend) tw = | SHARP -> "infix" | LABEL _ - | LABELID _ + | OPTLABEL _ | QUESTION + | TILDE -> "label" | UIDENT _ -> "uident" + | LIDENT _ -> + begin match !last with + (QUESTION | TILDE), _, _ -> "label" + | _ -> "" + end + | COLON -> + begin match !last with + LIDENT _, lstart, lstop -> + if lstop = start then + Text.tag_add tw ~tag:"label" + ~start:(tpos lstart) ~stop:(tpos stop); + "" + | _ -> "" + end | EOF -> raise End_of_file | _ -> "" in if tag <> "" then - Text.tag_add tw :tag - start:(tpos (Lexing.lexeme_start buffer)) - end:(tpos (Lexing.lexeme_end buffer)) + Text.tag_add tw ~tag ~start:(tpos start) ~stop:(tpos stop); + last := (token, start, stop) done with End_of_file -> () |