Commit | Line | Data |
---|---|---|
7f918cf1 CE |
1 | /** |
2 | * Name: sml_verbose | |
3 | * Description: Standard ML programming language. | |
4 | * Author: Matthew Fluet <mfluet@acm.org> | |
5 | */ | |
6 | ||
7 | /* | |
8 | builtin_face --- | |
9 | comment_face --- comments | |
10 | function_name_face --- | |
11 | highlight_face --- | |
12 | keyword_face --- keywords | |
13 | reference_face --- special constants (nums) | |
14 | string_face --- strings | |
15 | type_face --- | |
16 | variable_name_face --- | |
17 | */ | |
18 | ||
19 | require_state (sml_simple); | |
20 | ||
21 | /* | |
22 | formatting = [\ \t\n\011\012\013]+; | |
23 | */ | |
24 | sml_formatting_str = "[ \\t\\n\\011\\012\\013]+"; | |
25 | sml_formatting_re = regexp(sml_formatting_str); | |
26 | /* | |
27 | letter = [A-Za-z]; | |
28 | */ | |
29 | sml_letter_str = "[A-Za-z]"; | |
30 | sml_letter_re = regexp(sml_letter_str); | |
31 | /* | |
32 | symbol = [-!%&$#+/:<=>?@\\~`|*^]; | |
33 | */ | |
34 | sml_symbol_str = "[-!%&$#+/:<=>?@\\\\~`|*^]"; | |
35 | sml_symbol_re = regexp(sml_symbol_str); | |
36 | /* | |
37 | digit = [0-9]; | |
38 | */ | |
39 | sml_digit_str = "[0-9]"; | |
40 | sml_digit_re = regexp(sml_digit_str); | |
41 | /* | |
42 | hexdigit = [0-9a-fA-F]; | |
43 | */ | |
44 | sml_hexdigit_str = "[0-9a-fA-F]"; | |
45 | sml_hexdigit_re = regexp(sml_hexdigit_str); | |
46 | ||
47 | /* | |
48 | posdecint = {digit}+; | |
49 | */ | |
50 | sml_posdecint_str = sprintf("(%s)+",sml_digit_str); | |
51 | sml_posdecint_re = regexp(sml_posdecint_str); | |
52 | /* | |
53 | poshexint = "0x"{hexdigit}+; | |
54 | */ | |
55 | sml_poshexint_str = sprintf("0x(%s)+",sml_hexdigit_str); | |
56 | sml_poshexint_re = regexp(sml_poshexint_str); | |
57 | /* | |
58 | negdecint = "~"{posdecint}; | |
59 | */ | |
60 | sml_negdecint_str = sprintf("~(%s)",sml_posdecint_str); | |
61 | sml_negdecint_re = regexp(sml_negdecint_str); | |
62 | /* | |
63 | neghexint = "~"{poshexint}; | |
64 | */ | |
65 | sml_neghexint_str = sprintf("~(%s)",sml_poshexint_str); | |
66 | sml_neghexint_re = regexp(sml_neghexint_str); | |
67 | /* | |
68 | decint = {posdecint} | {negdecint}; | |
69 | */ | |
70 | sml_decint_str = sprintf("(%s)|(%s)",sml_posdecint_str,sml_negdecint_str); | |
71 | sml_decint_re = regexp(sml_decint_str); | |
72 | /* | |
73 | hexint = {poshexint} | {neghexint}; | |
74 | */ | |
75 | sml_hexint_str = sprintf("(%s)|(%s)",sml_poshexint_str,sml_negdecint_str); | |
76 | sml_hexint_re = regexp(sml_hexint_str); | |
77 | /* | |
78 | decword = "0w"{digit}+; | |
79 | */ | |
80 | sml_decword_str = sprintf("0w(%s)+",sml_digit_str); | |
81 | sml_decword_re = regexp(sml_decword_str); | |
82 | /* | |
83 | hexword = "0wx"{hexdigit}+; | |
84 | */ | |
85 | sml_hexword_str = sprintf("0wx(%s)+",sml_hexdigit_str); | |
86 | sml_hexword_re = regexp(sml_hexword_str); | |
87 | ||
88 | /* | |
89 | exp = "E" | "e"; | |
90 | */ | |
91 | sml_exp_str = "E|e"; | |
92 | sml_exp_re = regexp(sml_exp_str); | |
93 | /* | |
94 | real = ({decint}"."{digit}+ ({exp}{decint})?) | ({decint}{exp}{decint}); | |
95 | */ | |
96 | sml_real_str = sprintf("((%s)\\.(%s)+((%s)(%s))?)|((%s)(%s)(%s))", | |
97 | sml_decint_str,sml_digit_str,sml_exp_str,sml_decint_str, | |
98 | sml_decint_str,sml_exp_str,sml_decint_str); | |
99 | sml_real_re = regexp(sml_real_str); | |
100 | ||
101 | /* | |
102 | scon_num = {decint} | {hexint} | {decword} | {hexword} | {real} | |
103 | */ | |
104 | sml_scon_num_str = sprintf("\\b((%s)|(%s)|(%s)|(%s)|(%s))\\b", | |
105 | sml_decint_str,sml_hexint_str, | |
106 | sml_decword_str,sml_hexword_str, | |
107 | sml_real_str); | |
108 | sml_scon_num_re = regexp(sml_scon_num_str); | |
109 | ||
110 | /* | |
111 | numericlab = [1-9]{digit}*; | |
112 | */ | |
113 | sml_numericlab_str = sprintf("[1-9](%s)*",sml_digit_str); | |
114 | sml_numericlab_re = regexp(sml_numericlab_str); | |
115 | /* | |
116 | alphanumid = {letter}({letter} | {digit} | [_'])*; | |
117 | */ | |
118 | sml_alphanumid_str = sprintf("(%s)((%s)|(%s)|[_'])*", | |
119 | sml_letter_str,sml_letter_str,sml_digit_str); | |
120 | /* | |
121 | symbolicid = {symbol}+; | |
122 | */ | |
123 | sml_symbolicid_str = sprintf("(%s)+",sml_symbol_str); | |
124 | sml_symbolicid_re = regexp(sml_symbolicid_str); | |
125 | /* | |
126 | id = {alphanumid} | {symbolicid}; | |
127 | */ | |
128 | sml_id_str = sprintf("(%s)|(%s)",sml_alphanumid_str,sml_symbolicid_str); | |
129 | sml_id_re = regexp(sml_id_str); | |
130 | /* | |
131 | tyvar = "'"({letter} | {digit} | [_'])*; | |
132 | */ | |
133 | sml_tyvar_str = sprintf("'((%s)|(%s)|[_'])*",sml_letter_str,sml_digit_str); | |
134 | sml_tyvar_re = regexp(sml_tyvar_str); | |
135 | /* | |
136 | longid = ({alphanumid}".")+ {id}; | |
137 | */ | |
138 | sml_longid_str = sprintf("((%s)\\.)+(%s)",sml_alphanumid_str,sml_id_str); | |
139 | sml_longid_re = regexp(sml_longid_str); | |
140 | ||
141 | /* | |
142 | lab = {id} | {numericlab} | |
143 | */ | |
144 | sml_lab_str = sprintf("(%s)|(%s)",sml_id_str,sml_numericlab_str); | |
145 | sml_lab_re = regexp(sml_lab_str); | |
146 | /* | |
147 | sel = "#" {formatting} {lab} | |
148 | */ | |
149 | sml_sel_str = sprintf("#(%s)(%s)",sml_formatting_str,sml_lab_str); | |
150 | sml_sel_re = regexp(sml_sel_str); | |
151 | /* | |
152 | infix = "infix"("r")? {formatting} ({digit})? | |
153 | */ | |
154 | sml_infix_str = sprintf("(infix(r?))(%s)(%s)?",sml_formatting_str,sml_digit_str); | |
155 | sml_infix_re = regexp(sml_infix_str); | |
156 | ||
157 | /* | |
158 | val_with_tyvar = "val" {formatting} {tyvar} | |
159 | val_with_tyvarseq = "val" {formatting} "(" {formatting} {tyvar} | |
160 | fun_with_tyvar = "fun" {formatting} {tyvar} | |
161 | fun_with_tyvarseq = "fun" {formatting} "(" {formatting} {tyvar} | |
162 | */ | |
163 | sml_val_with_tyvar_str = sprintf("(val)(%s)(%s)",sml_formatting_str,sml_tyvar_str); | |
164 | sml_val_with_tyvar_re = regexp(sml_val_with_tyvar_str); | |
165 | sml_val_with_tyvarseq_str = sprintf("(val)(%s)(\\\()(%s)(%s)",sml_formatting_str,sml_formatting_str,sml_tyvar_str); | |
166 | sml_val_with_tyvarseq_re = regexp(sml_val_with_tyvarseq_str); | |
167 | sml_fun_with_tyvar_str = sprintf("(fun)(%s)(%s)",sml_formatting_str,sml_tyvar_str); | |
168 | sml_fun_with_tyvar_re = regexp(sml_fun_with_tyvar_str); | |
169 | sml_fun_with_tyvarseq_str = sprintf("(fun)(%s)(\\\()(%s)(%s)",sml_formatting_str,sml_formatting_str,sml_tyvar_str); | |
170 | sml_fun_with_tyvarseq_re = regexp(sml_fun_with_tyvarseq_str); | |
171 | ||
172 | ||
173 | state sml_verbose extends sml_simple | |
174 | { | |
175 | sml_infix_re { | |
176 | keyword_face (true); | |
177 | language_print ($1); | |
178 | keyword_face (false); | |
179 | language_print ($3); | |
180 | language_print ($4); | |
181 | } | |
182 | sml_sel_re { | |
183 | language_print ($0); | |
184 | } | |
185 | ||
186 | /* | |
187 | * Special constants (nums) | |
188 | */ | |
189 | sml_scon_num_re { | |
190 | reference_face (true); | |
191 | language_print ($0); | |
192 | reference_face (false); | |
193 | } | |
194 | } | |
195 | ||
196 | \f | |
197 | /* | |
198 | Local variables: | |
199 | mode: c | |
200 | End: | |
201 | */ |