| author | wenzelm | 
| Thu, 06 Nov 2014 15:47:04 +0100 | |
| changeset 58923 | cb9b69cca999 | 
| parent 57905 | c0c5652e796e | 
| child 59683 | d6824d8490be | 
| permissions | -rw-r--r-- | 
| 
57905
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
1  | 
(* Title: Pure/PIDE/command_span.ML  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
2  | 
Author: Makarius  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
3  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
4  | 
Syntactic representation of command spans.  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
5  | 
*)  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
6  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
7  | 
signature COMMAND_SPAN =  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
8  | 
sig  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
9  | 
datatype kind = Command_Span of string * Position.T | Ignored_Span | Malformed_Span  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
10  | 
datatype span = Span of kind * Token.T list  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
11  | 
val kind: span -> kind  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
12  | 
val content: span -> Token.T list  | 
| 58923 | 13  | 
val resolve_files: Keyword.keywords ->  | 
14  | 
(string -> Path.T * Position.T -> Token.file Exn.result list) -> span -> span  | 
|
| 
57905
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
15  | 
end;  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
16  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
17  | 
structure Command_Span: COMMAND_SPAN =  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
18  | 
struct  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
19  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
20  | 
datatype kind = Command_Span of string * Position.T | Ignored_Span | Malformed_Span;  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
21  | 
datatype span = Span of kind * Token.T list;  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
22  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
23  | 
fun kind (Span (k, _)) = k;  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
24  | 
fun content (Span (_, toks)) = toks;  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
25  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
26  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
27  | 
(* resolve inlined files *)  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
28  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
29  | 
local  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
30  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
31  | 
fun clean ((i1, t1) :: (i2, t2) :: toks) =  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
32  | 
if Token.keyword_with (fn s => s = "%" orelse s = "--") t1 then clean toks  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
33  | 
else (i1, t1) :: clean ((i2, t2) :: toks)  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
34  | 
| clean toks = toks;  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
35  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
36  | 
fun clean_tokens toks =  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
37  | 
((0 upto length toks - 1) ~~ toks)  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
38  | 
|> filter (fn (_, tok) => Token.is_proper tok)  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
39  | 
|> clean;  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
40  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
41  | 
fun find_file ((_, tok) :: toks) =  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
42  | 
if Token.is_command tok then  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
43  | 
toks |> get_first (fn (i, tok) =>  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
44  | 
if Token.is_name tok then  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
45  | 
SOME (i, (Path.explode (Token.content_of tok), Token.pos_of tok))  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
46  | 
handle ERROR msg => error (msg ^ Position.here (Token.pos_of tok))  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
47  | 
else NONE)  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
48  | 
else NONE  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
49  | 
| find_file [] = NONE;  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
50  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
51  | 
in  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
52  | 
|
| 58923 | 53  | 
fun resolve_files keywords read_files span =  | 
| 
57905
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
54  | 
(case span of  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
55  | 
Span (Command_Span (cmd, pos), toks) =>  | 
| 58923 | 56  | 
if Keyword.is_theory_load keywords cmd then  | 
| 
57905
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
57  | 
(case find_file (clean_tokens toks) of  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
58  | 
          NONE => error ("Bad file argument of command " ^ quote cmd ^ Position.here pos)
 | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
59  | 
| SOME (i, path) =>  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
60  | 
let  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
61  | 
val toks' = toks |> map_index (fn (j, tok) =>  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
62  | 
if i = j then Token.put_files (read_files cmd path) tok  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
63  | 
else tok);  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
64  | 
in Span (Command_Span (cmd, pos), toks') end)  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
65  | 
else span  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
66  | 
| _ => span);  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
67  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
68  | 
end;  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
69  | 
|
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
70  | 
end;  | 
| 
 
c0c5652e796e
separate module Command_Span: mostly syntactic representation;
 
wenzelm 
parents:  
diff
changeset
 | 
71  |