3 * Description: Standard ML programming language
.
4 * Author: Matthew Fluet <mfluet@acm
.org>
9 comment_face
--- comments
10 function_name_face
---
12 keyword_face
--- keywords
13 reference_face
--- special constants
(nums
)
14 string_face
--- strings
16 variable_name_face
---
19 require_state
(sml_simple
);
22 formatting
= [\
\t\n\011\012\013]+;
24 sml_formatting_str
= "[ \\t\\n\\011\\012\\013]+";
25 sml_formatting_re
= regexp
(sml_formatting_str
);
29 sml_letter_str
= "[A-Za-z]";
30 sml_letter_re
= regexp
(sml_letter_str
);
32 symbol
= [-!%&
$#+/:<=>?@
\\~`|
*^];
34 sml_symbol_str
= "[-!%&$#+/:<=>?@\\\\~`|*^]";
35 sml_symbol_re
= regexp
(sml_symbol_str
);
39 sml_digit_str
= "[0-9]";
40 sml_digit_re
= regexp
(sml_digit_str
);
42 hexdigit
= [0-9a
-fA
-F];
44 sml_hexdigit_str
= "[0-9a-fA-F]";
45 sml_hexdigit_re
= regexp
(sml_hexdigit_str
);
50 sml_posdecint_str
= sprintf
("(%s)+",sml_digit_str
);
51 sml_posdecint_re
= regexp
(sml_posdecint_str
);
53 poshexint
= "0x"{hexdigit
}+;
55 sml_poshexint_str
= sprintf
("0x(%s)+",sml_hexdigit_str
);
56 sml_poshexint_re
= regexp
(sml_poshexint_str
);
58 negdecint
= "~"{posdecint
};
60 sml_negdecint_str
= sprintf
("~(%s)",sml_posdecint_str
);
61 sml_negdecint_re
= regexp
(sml_negdecint_str
);
63 neghexint
= "~"{poshexint
};
65 sml_neghexint_str
= sprintf
("~(%s)",sml_poshexint_str
);
66 sml_neghexint_re
= regexp
(sml_neghexint_str
);
68 decint
= {posdecint
} |
{negdecint
};
70 sml_decint_str
= sprintf
("(%s)|(%s)",sml_posdecint_str,sml_negdecint_str
);
71 sml_decint_re
= regexp
(sml_decint_str
);
73 hexint
= {poshexint
} |
{neghexint
};
75 sml_hexint_str
= sprintf
("(%s)|(%s)",sml_poshexint_str,sml_negdecint_str
);
76 sml_hexint_re
= regexp
(sml_hexint_str
);
78 decword
= "0w"{digit
}+;
80 sml_decword_str
= sprintf
("0w(%s)+",sml_digit_str
);
81 sml_decword_re
= regexp
(sml_decword_str
);
83 hexword
= "0wx"{hexdigit
}+;
85 sml_hexword_str
= sprintf
("0wx(%s)+",sml_hexdigit_str
);
86 sml_hexword_re
= regexp
(sml_hexword_str
);
92 sml_exp_re
= regexp
(sml_exp_str
);
94 real
= ({decint
}"."{digit
}+ ({exp
}{decint
})?
) |
({decint
}{exp
}{decint
});
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
);
102 scon_num
= {decint
} |
{hexint
} |
{decword
} |
{hexword
} |
{real
}
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,
108 sml_scon_num_re
= regexp
(sml_scon_num_str
);
111 numericlab
= [1-9]{digit
}*;
113 sml_numericlab_str
= sprintf
("[1-9](%s)*",sml_digit_str
);
114 sml_numericlab_re
= regexp
(sml_numericlab_str
);
116 alphanumid
= {letter
}({letter
} |
{digit
} |
[_
'])*;
118 sml_alphanumid_str = sprintf("(%s)((%s)|(%s)|[_'])*",
119 sml_letter_str,sml_letter_str,sml_digit_str);
121 symbolicid = {symbol}+;
123 sml_symbolicid_str = sprintf("(%s
)+",sml_symbol_str);
124 sml_symbolicid_re = regexp(sml_symbolicid_str);
126 id = {alphanumid} | {symbolicid};
128 sml_id_str = sprintf("(%s
)|
(%s
)",sml_alphanumid_str,sml_symbolicid_str);
129 sml_id_re = regexp(sml_id_str);
131 tyvar = "'"({letter} | {digit} | [_'])*;
133 sml_tyvar_str
= sprintf
("'((%s)|(%s)|[_'])*",sml_letter_str,sml_digit_str
);
134 sml_tyvar_re
= regexp
(sml_tyvar_str
);
136 longid
= ({alphanumid
}".")+ {id
};
138 sml_longid_str
= sprintf
("((%s)\\.)+(%s)",sml_alphanumid_str,sml_id_str
);
139 sml_longid_re
= regexp
(sml_longid_str
);
142 lab
= {id
} |
{numericlab
}
144 sml_lab_str
= sprintf
("(%s)|(%s)",sml_id_str,sml_numericlab_str
);
145 sml_lab_re
= regexp
(sml_lab_str
);
147 sel
= "#" {formatting
} {lab
}
149 sml_sel_str
= sprintf
("#(%s)(%s)",sml_formatting_str,sml_lab_str
);
150 sml_sel_re
= regexp
(sml_sel_str
);
152 infix
= "infix"("r")?
{formatting
} ({digit
})?
154 sml_infix_str
= sprintf
("(infix(r?))(%s)(%s)?",sml_formatting_str,sml_digit_str
);
155 sml_infix_re
= regexp
(sml_infix_str
);
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
}
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
);
173 state sml_verbose extends sml_simple
178 keyword_face
(false);
187 * Special constants
(nums
)
190 reference_face
(true);
192 reference_face
(false);