Blame browser/lexical.ml

Packit bd2e5d
(*************************************************************************)
Packit bd2e5d
(*                                                                       *)
Packit bd2e5d
(*                         OCaml LablTk library                          *)
Packit bd2e5d
(*                                                                       *)
Packit bd2e5d
(*            Jacques Garrigue, Kyoto University RIMS                    *)
Packit bd2e5d
(*                                                                       *)
Packit bd2e5d
(*   Copyright 1999 Institut National de Recherche en Informatique et    *)
Packit bd2e5d
(*   en Automatique and Kyoto University.  All rights reserved.          *)
Packit bd2e5d
(*   This file is distributed under the terms of the GNU Library         *)
Packit bd2e5d
(*   General Public License, with the special exception on linking       *)
Packit bd2e5d
(*   described in file ../../../LICENSE.                                 *)
Packit bd2e5d
(*                                                                       *)
Packit bd2e5d
(*************************************************************************)
Packit bd2e5d
Packit bd2e5d
(* $Id$ *)
Packit bd2e5d
Packit bd2e5d
open StdLabels
Packit bd2e5d
open Tk
Packit bd2e5d
open Jg_tk
Packit bd2e5d
open Parser
Packit bd2e5d
Packit bd2e5d
let tags =
Packit bd2e5d
  ["control"; "define"; "structure"; "char";
Packit bd2e5d
   "infix"; "label"; "uident"]
Packit bd2e5d
and colors =
Packit bd2e5d
    ["blue"; "forestgreen"; "purple"; "gray40";
Packit bd2e5d
     "indianred4"; "saddlebrown"; "midnightblue"]
Packit bd2e5d
Packit bd2e5d
let init_tags tw =
Packit bd2e5d
  List.iter2 tags colors ~f:
Packit bd2e5d
  begin fun tag col ->
Packit bd2e5d
    Text.tag_configure tw ~tag ~foreground:(`Color col)
Packit bd2e5d
  end;
Packit bd2e5d
  Text.tag_configure tw ~tag:"error" ~foreground:`Red;
Packit bd2e5d
  Text.tag_configure tw ~tag:"error" ~relief:`Raised;
Packit bd2e5d
  Text.tag_raise tw ~tag:"error"
Packit bd2e5d
Packit bd2e5d
let tag ?(start=tstart) ?(stop=tend) tw =
Packit bd2e5d
  let tpos c = (Text.index tw ~index:start, [`Char c]) in
Packit bd2e5d
  let text = Text.get tw ~start ~stop in
Packit bd2e5d
  let buffer = Lexing.from_string text in
Packit bd2e5d
  Location.init buffer "";
Packit bd2e5d
  Location.input_name := "";
Packit bd2e5d
  List.iter tags
Packit bd2e5d
    ~f:(fun tag -> Text.tag_remove tw ~start ~stop ~tag);
Packit bd2e5d
  let last = ref (EOF, 0, 0) in
Packit bd2e5d
  try
Packit bd2e5d
    while true do
Packit bd2e5d
    let token = Lexer.token buffer
Packit bd2e5d
    and start = Lexing.lexeme_start buffer
Packit bd2e5d
    and stop = Lexing.lexeme_end buffer in
Packit bd2e5d
    let tag =
Packit bd2e5d
      match token with
Packit bd2e5d
        AMPERAMPER
Packit bd2e5d
      | AMPERSAND
Packit bd2e5d
      | BARBAR
Packit bd2e5d
      | DO | DONE
Packit bd2e5d
      | DOWNTO
Packit bd2e5d
      | ELSE
Packit bd2e5d
      | FOR
Packit bd2e5d
      | IF
Packit bd2e5d
      | LAZY
Packit bd2e5d
      | MATCH
Packit bd2e5d
      | OR
Packit bd2e5d
      | THEN
Packit bd2e5d
      | TO
Packit bd2e5d
      | TRY
Packit bd2e5d
      | WHEN
Packit bd2e5d
      | WHILE
Packit bd2e5d
      | WITH
Packit bd2e5d
          -> "control"
Packit bd2e5d
      | AND
Packit bd2e5d
      | AS
Packit bd2e5d
      | BAR
Packit bd2e5d
      | CLASS
Packit bd2e5d
      | CONSTRAINT
Packit bd2e5d
      | EXCEPTION
Packit bd2e5d
      | EXTERNAL
Packit bd2e5d
      | FUN
Packit bd2e5d
      | FUNCTION
Packit bd2e5d
      | FUNCTOR
Packit bd2e5d
      | IN
Packit bd2e5d
      | INHERIT
Packit bd2e5d
      | INITIALIZER
Packit bd2e5d
      | LET
Packit bd2e5d
      | METHOD
Packit bd2e5d
      | MODULE
Packit bd2e5d
      | MUTABLE
Packit bd2e5d
      | NEW
Packit bd2e5d
      | OF
Packit bd2e5d
      | PRIVATE
Packit bd2e5d
      | REC
Packit bd2e5d
      | TYPE
Packit bd2e5d
      | VAL
Packit bd2e5d
      | VIRTUAL
Packit bd2e5d
          -> "define"
Packit bd2e5d
      | BEGIN
Packit bd2e5d
      | END
Packit bd2e5d
      | INCLUDE
Packit bd2e5d
      | OBJECT
Packit bd2e5d
      | OPEN
Packit bd2e5d
      | SIG
Packit bd2e5d
      | STRUCT
Packit bd2e5d
          -> "structure"
Packit bd2e5d
      | CHAR _
Packit bd2e5d
      | STRING _
Packit bd2e5d
          -> "char"
Packit bd2e5d
      | BACKQUOTE
Packit bd2e5d
      | INFIXOP1 _
Packit bd2e5d
      | INFIXOP2 _
Packit bd2e5d
      | INFIXOP3 _
Packit bd2e5d
      | INFIXOP4 _
Packit bd2e5d
      | PREFIXOP _
Packit bd2e5d
      | HASH
Packit bd2e5d
          -> "infix"
Packit bd2e5d
      | LABEL _
Packit bd2e5d
      | OPTLABEL _
Packit bd2e5d
      | QUESTION
Packit bd2e5d
      | TILDE
Packit bd2e5d
          -> "label"
Packit bd2e5d
      | UIDENT _ -> "uident"
Packit bd2e5d
      | LIDENT _ ->
Packit bd2e5d
          begin match !last with
Packit bd2e5d
            (QUESTION | TILDE), _, _ -> "label"
Packit bd2e5d
          | _ -> ""
Packit bd2e5d
          end
Packit bd2e5d
      | COLON ->
Packit bd2e5d
          begin match !last with
Packit bd2e5d
            LIDENT _, lstart, lstop ->
Packit bd2e5d
              if lstop = start then
Packit bd2e5d
                Text.tag_add tw ~tag:"label"
Packit bd2e5d
                  ~start:(tpos lstart) ~stop:(tpos stop);
Packit bd2e5d
              ""
Packit bd2e5d
          | _ -> ""
Packit bd2e5d
          end
Packit bd2e5d
      | EOF -> raise End_of_file
Packit bd2e5d
      | _ -> ""
Packit bd2e5d
    in
Packit bd2e5d
    if tag <> "" then
Packit bd2e5d
      Text.tag_add tw ~tag ~start:(tpos start) ~stop:(tpos stop);
Packit bd2e5d
    last := (token, start, stop)
Packit bd2e5d
    done
Packit bd2e5d
  with
Packit bd2e5d
    End_of_file -> ()
Packit bd2e5d
  | Lexer.Error (err, loc) -> ()