equal
deleted
inserted
replaced
38 signature LEXICON = |
38 signature LEXICON = |
39 sig |
39 sig |
40 include SCANNER |
40 include SCANNER |
41 include LEXICON0 |
41 include LEXICON0 |
42 val is_xid: string -> bool |
42 val is_xid: string -> bool |
43 val is_tfree: string -> bool |
43 val is_tid: string -> bool |
44 type lexicon |
44 type lexicon |
45 datatype token = |
45 datatype token = |
46 Token of string | |
46 Token of string | |
47 IdentSy of string | |
47 IdentSy of string | |
48 VarSy of string | |
48 VarSy of string | |
49 TFreeSy of string | |
49 TFreeSy of string | |
50 TVarSy of string | |
50 TVarSy of string | |
51 EndToken |
51 EndToken |
52 val id: string |
52 val id: string |
53 val var: string |
53 val var: string |
54 val tfree: string |
54 val tid: string |
55 val tvar: string |
55 val tvar: string |
56 val terminals: string list |
56 val terminals: string list |
57 val is_terminal: string -> bool |
57 val is_terminal: string -> bool |
58 val str_of_token: token -> string |
58 val str_of_token: token -> string |
59 val display_token: token -> string |
59 val display_token: token -> string |
60 val matching_tokens: token * token -> bool |
60 val matching_tokens: token * token -> bool |
|
61 val token_assoc: (token option * 'a list) list * token -> 'a list |
61 val valued_token: token -> bool |
62 val valued_token: token -> bool |
62 val predef_term: string -> token option |
63 val predef_term: string -> token option |
63 val dest_lexicon: lexicon -> string list |
64 val dest_lexicon: lexicon -> string list |
64 val empty_lexicon: lexicon |
65 val empty_lexicon: lexicon |
65 val extend_lexicon: lexicon -> string list -> lexicon |
66 val extend_lexicon: lexicon -> string list -> lexicon |
81 fun is_xid s = |
82 fun is_xid s = |
82 (case explode s of |
83 (case explode s of |
83 "_" :: cs => is_ident cs |
84 "_" :: cs => is_ident cs |
84 | cs => is_ident cs); |
85 | cs => is_ident cs); |
85 |
86 |
86 fun is_tfree s = |
87 fun is_tid s = |
87 (case explode s of |
88 (case explode s of |
88 "'" :: cs => is_ident cs |
89 "'" :: cs => is_ident cs |
89 | _ => false); |
90 | _ => false); |
90 |
91 |
91 |
92 |
116 |
117 |
117 (* terminal arguments *) |
118 (* terminal arguments *) |
118 |
119 |
119 val id = "id"; |
120 val id = "id"; |
120 val var = "var"; |
121 val var = "var"; |
121 val tfree = "tfree"; |
122 val tid = "tid"; |
122 val tvar = "tvar"; |
123 val tvar = "tvar"; |
123 |
124 |
124 val terminals = [id, var, tfree, tvar]; |
125 val terminals = [id, var, tid, tvar]; |
125 |
126 |
126 fun is_terminal s = s mem terminals; |
127 fun is_terminal s = s mem terminals; |
127 |
128 |
128 |
129 |
129 (* str_of_token *) |
130 (* str_of_token *) |
139 (* display_token *) |
140 (* display_token *) |
140 |
141 |
141 fun display_token (Token s) = quote s |
142 fun display_token (Token s) = quote s |
142 | display_token (IdentSy s) = "id(" ^ s ^ ")" |
143 | display_token (IdentSy s) = "id(" ^ s ^ ")" |
143 | display_token (VarSy s) = "var(" ^ s ^ ")" |
144 | display_token (VarSy s) = "var(" ^ s ^ ")" |
144 | display_token (TFreeSy s) = "tfree(" ^ s ^ ")" |
145 | display_token (TFreeSy s) = "tid(" ^ s ^ ")" |
145 | display_token (TVarSy s) = "tvar(" ^ s ^ ")" |
146 | display_token (TVarSy s) = "tvar(" ^ s ^ ")" |
146 | display_token EndToken = ""; |
147 | display_token EndToken = ""; |
147 |
148 |
148 |
149 |
149 (* matching_tokens *) |
150 (* matching_tokens *) |
155 | matching_tokens (TVarSy _, TVarSy _) = true |
156 | matching_tokens (TVarSy _, TVarSy _) = true |
156 | matching_tokens (EndToken, EndToken) = true |
157 | matching_tokens (EndToken, EndToken) = true |
157 | matching_tokens _ = false; |
158 | matching_tokens _ = false; |
158 |
159 |
159 |
160 |
|
161 (* this function is needed in parser.ML but is placed here |
|
162 for better performance *) |
|
163 fun token_assoc (list, key) = |
|
164 let fun assoc [] = [] |
|
165 | assoc ((keyi, xi) :: pairs) = |
|
166 if is_none keyi orelse matching_tokens (the keyi, key) then |
|
167 (assoc pairs) @ xi |
|
168 else assoc pairs; |
|
169 in assoc list end; |
|
170 |
|
171 |
160 (* valued_token *) |
172 (* valued_token *) |
161 |
173 |
162 fun valued_token (Token _) = false |
174 fun valued_token (Token _) = false |
163 | valued_token (IdentSy _) = true |
175 | valued_token (IdentSy _) = true |
164 | valued_token (VarSy _) = true |
176 | valued_token (VarSy _) = true |
170 (* predef_term *) |
182 (* predef_term *) |
171 |
183 |
172 fun predef_term name = |
184 fun predef_term name = |
173 if name = id then Some (IdentSy name) |
185 if name = id then Some (IdentSy name) |
174 else if name = var then Some (VarSy name) |
186 else if name = var then Some (VarSy name) |
175 else if name = tfree then Some (TFreeSy name) |
187 else if name = tid then Some (TFreeSy name) |
176 else if name = tvar then Some (TVarSy name) |
188 else if name = tvar then Some (TVarSy name) |
177 else None; |
189 else None; |
178 |
190 |
179 |
191 |
180 |
192 |