|
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) -> ()
|