Skip to content
This repository was archived by the owner on Apr 22, 2020. It is now read-only.

Commit aadaa3d

Browse files
author
mikesamuel
committed
F# and OCAML language extension
1 parent 28ba1c5 commit aadaa3d

File tree

4 files changed

+159
-29
lines changed

4 files changed

+159
-29
lines changed

src/lang-lisp.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ PR.registerLangHandler(
8686
/^\'(?:-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?)?/],
8787
// A word that optionally ends with = ! or ?.
8888
[PR.PR_PLAIN,
89-
/^-*(?:\w|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/],
89+
/^-*(?:[a-z_]|\\[\x21-\x7e])(?:[\w-]*|\\[\x21-\x7e])[=!?]?/i],
9090
// A printable non-space non-special character
9191
[PR.PR_PUNCTUATION, /^[^\w\t\n\r \xA0()\"\\\';]+/]
9292
]),

src/lang-lua.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,9 @@ PR.registerLangHandler(
5050
// A number is a hex integer literal, a decimal real literal, or in
5151
// scientific notation.
5252
[PR.PR_LITERAL,
53-
/^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+\-]?\d+)?))/i
54-
],
53+
/^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],
5554
// An identifier
56-
[PR.PR_PLAIN, /^\w+/],
55+
[PR.PR_PLAIN, /^[a-z_]\w*/i],
5756
// A run of punctuation
5857
[PR.PR_PUNCTUATION, /^[^\w\t\n\r \xA0]+/]
5958
]),

src/lang-ml.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
// Copyright (C) 2008 Google Inc.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
15+
16+
17+
/**
18+
* @fileoverview
19+
* Registers a language handler for OCaml, SML, F# and similar languages.
20+
*
21+
* Based on the lexical grammar at
22+
* http://research.microsoft.com/fsharp/manual/spec2.aspx#_Toc202383715
23+
*
24+
25+
*/
26+
27+
PR.registerLangHandler(
28+
PR.createSimpleLexer(
29+
[
30+
// Whitespace is made up of spaces, tabs and newline characters.
31+
[PR.PR_PLAIN, /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
32+
// #if ident/#else/#endif directives delimit conditional compilation
33+
// sections
34+
[PR.PR_COMMENT,
35+
/^#(?:if[\t\n\r \xA0]+(?:[a-z_$][\w\']*|``[^\r\n\t`]*(?:``|$))|else|endif|light)/i,
36+
null, '#'],
37+
// A double or single quoted, possibly multi-line, string.
38+
// F# allows escaped newlines in strings.
39+
[PR.PR_STRING, /^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])*(?:\'|$))/, null, '"\'']
40+
],
41+
[
42+
// Block comments are delimited by (* and *) and may be
43+
// nested. Single-line comments begin with // and extend to
44+
// the end of a line.
45+
// TODO: (*...*) comments can be nested. This does not handle that.
46+
[PR.PR_COMMENT, /^(?:\/\/[^\r\n]*|\(\*[\s\S]*?\*\))/],
47+
[PR.PR_KEYWORD, /^(?:abstract|and|as|assert|begin|class|default|delegate|do|done|downcast|downto|elif|else|end|exception|extern|false|finally|for|fun|function|if|in|inherit|inline|interface|internal|lazy|let|match|member|module|mutable|namespace|new|null|of|open|or|override|private|public|rec|return|static|struct|then|to|true|try|type|upcast|use|val|void|when|while|with|yield|asr|land|lor|lsl|lsr|lxor|mod|sig|atomic|break|checked|component|const|constraint|constructor|continue|eager|event|external|fixed|functor|global|include|method|mixin|object|parallel|process|protected|pure|sealed|trait|virtual|volatile)\b/],
48+
// A number is a hex integer literal, a decimal real literal, or in
49+
// scientific notation.
50+
[PR.PR_LITERAL,
51+
/^[+\-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],
52+
[PR.PR_PLAIN, /^(?:[a-z_]\w*[!?#]?|``[^\r\n\t`]*(?:``|$))/i],
53+
// A printable non-space non-special character
54+
[PR.PR_PUNCTUATION, /^[^\t\n\r \xA0\"\'\w]+/]
55+
]),
56+
['fs', 'ml']);

tests/prettify_test.html

Lines changed: 100 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
onerror="alert('Error: failed to load ' + this.src)"></script>
99
<script src="../src/lang-lua.js" type="text/javascript"
1010
onerror="alert('Error: failed to load ' + this.src)"></script>
11+
<script src="../src/lang-ml.js" type="text/javascript"
12+
onerror="alert('Error: failed to load ' + this.src)"></script>
1113
<script type="text/javascript">
1214
// get accurate timing
1315
PR_SHOULD_USE_CONTINUATION = false;
@@ -802,6 +804,26 @@ <h1>Bug 42 - Lisp Syntax Highlighting</h1>
802804
)
803805
</pre>
804806

807+
<h1>Bug 33 - OCaml and F#</h1>
808+
<pre class="prettyprint lang-ml" id="issue33">
809+
(*
810+
* Print the 10th fibonacci number
811+
*)
812+
813+
//// A line comment
814+
"A string";;
815+
(0, 125, 0xa0, -1.0, 1e6, 1.2e-3);; // number literals
816+
817+
#if fibby
818+
let
819+
rec fib = function (0, a, _) -> a
820+
| (n, a, b) -> fib(n - 1, a + b, a)
821+
in
822+
print_int(fib(10, 1, 1));;
823+
#endif
824+
</pre>
825+
<p>Still TODO: handle nested <code>(* (* comments *) *)</code> properly.</p>
826+
805827
<h1>Bug 45 - Square brackets in strings</h1>
806828
<pre class="prettyprint" id="issue45">
807829
throw new RuntimeException("Element [" + element.getName() +
@@ -1784,41 +1806,94 @@ <h1>Bug 45 - Square brackets in strings</h1>
17841806
'&nbsp; `END`KWDend`END`PLN<br>' +
17851807
'&nbsp; `END`KWDreturn`END`PLN shellsort<br>' +
17861808
'`END`KWDend`END'),
1809+
issue33: (
1810+
'`COM(*<br>' +
1811+
'&nbsp;* Print the 10th fibonacci number<br>' +
1812+
'&nbsp;*)`END`PLN<br>' +
1813+
'<br>' +
1814+
'`END`COM//// A line comment`END`PLN<br>' +
1815+
'`END`STR"A string"`END`PUN;;`END`PLN<br>' +
1816+
'`END`PUN(`END`LIT0`END`PUN,`END`PLN `END`LIT125`END`PUN,`END' +
1817+
'`PLN `END`LIT0xa0`END`PUN,`END`PLN `END`LIT-1.0`END`PUN,`END' +
1818+
'`PLN `END`LIT1e6`END`PUN,`END`PLN `END`LIT1.2e-3`END`PUN);;`END' +
1819+
'`PLN &nbsp;`END`COM// number literals`END`PLN<br>' +
1820+
'<br>' +
1821+
'`END`COM#if fibby`END`PLN<br>' +
1822+
'&nbsp; `END`KWDlet`END`PLN<br>' +
1823+
'&nbsp; &nbsp; `END`KWDrec`END`PLN fib `END`PUN=`END`PLN `END' +
1824+
'`KWDfunction`END`PLN `END`PUN(`END`LIT0`END`PUN,`END`PLN a`END' +
1825+
'`PUN,`END`PLN _`END`PUN)`END`PLN `END`PUN-&gt;`END`PLN a<br>' +
1826+
'&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ' +
1827+
'&nbsp;`END`PUN|`END`PLN `END`PUN(`END`PLNn`END`PUN,`END`PLN a`END' +
1828+
'`PUN,`END`PLN b`END`PUN)`END`PLN `END`PUN-&gt;`END`PLN fib`END' +
1829+
'`PUN(`END`PLNn `END`PUN-`END`PLN `END`LIT1`END`PUN,`END' +
1830+
'`PLN a `END`PUN+`END`PLN b`END`PUN,`END`PLN a`END`PUN)`END' +
1831+
'`PLN<br>' +
1832+
'&nbsp; `END`KWDin`END`PLN<br>' +
1833+
'&nbsp; &nbsp; print_int`END`PUN(`END`PLNfib`END`PUN(`END`LIT10`END' +
1834+
'`PUN,`END`PLN `END`LIT1`END`PUN,`END`PLN `END`LIT1`END' +
1835+
'`PUN));;`END`PLN<br>' +
1836+
'`END`COM#endif`END'),
17871837
issue42: (
17881838
'`COM; -*- mode: lisp -*-`END`PLN<br>' +
17891839
'<br>' +
1790-
'`END`OPN(`END`KWDdefun`END`PLN back-six-lines `END`OPN(`END`CLO)`END`PLN `END`OPN(`END`PLNinteractive`END`CLO)`END`PLN `END`OPN(`END`PLNforward-line `END`LIT-6`END`CLO))`END`PLN<br>' +
1791-
'`END`OPN(`END`KWDdefun`END`PLN forward-six-lines `END`OPN(`END`CLO)`END`PLN `END`OPN(`END`PLNinteractive`END`CLO)`END`PLN `END`OPN(`END`PLNforward-line `END`LIT6`END`CLO))`END`PLN<br>' +
1792-
'<br>' +
1793-
'`END`OPN(`END`PLNglobal-set-key `END`STR"\\M-l"`END`PLN `END`LIT\'goto-line`END`CLO)`END`PLN<br>' +
1794-
'`END`OPN(`END`PLNglobal-set-key `END`STR"\\C-z"`END`PLN `END`LIT\'advertised-undo`END`CLO)`END`PLN<br>' +
1795-
'`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNC-insert`END`PUN]`END`PLN `END`LIT\'clipboard-kill-ring-save`END`CLO)`END`PLN<br>' +
1796-
'`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNS-insert`END`PUN]`END`PLN `END`LIT\'clipboard-yank`END`CLO)`END`PLN<br>' +
1797-
'`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNC-up`END`PUN]`END`PLN `END`LIT\'back-six-lines`END`CLO)`END`PLN<br>' +
1798-
'`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNC-down`END`PUN]`END`PLN `END`LIT\'forward-six-lines`END`CLO)`END`PLN<br>' +
1799-
'<br>' +
1800-
'`END`OPN(`END`KWDsetq`END`PLN visible-bell `END`KWDt`END`CLO)`END`PLN<br>' +
1801-
'`END`OPN(`END`KWDsetq`END`PLN user-mail-address `END`STR"[email protected]"`END`CLO)`END`PLN<br>' +
1802-
'`END`OPN(`END`KWDsetq`END`PLN default-major-mode `END`LIT\'text-mode`END`CLO)`END`PLN<br>' +
1803-
'<br>' +
1804-
'`END`OPN(`END`PLNsetenv `END`STR"TERM"`END`PLN `END`STR"emacs"`END`CLO)`END`PLN<br>' +
1805-
'`END`OPN(`END`PLNc-set-offset `END`LIT\'case-label`END`PLN `END`LIT2`END`CLO)`END`PLN<br>' +
1806-
'`END`OPN(`END`KWDsetq`END`PLN c-basic-offset `END`LIT2`END`CLO)`END`PLN<br>' +
1807-
'`END`OPN(`END`KWDsetq`END`PLN perl-indent-level `END`LIT2`END`CLO)`END`PLN<br>' +
1808-
'`END`OPN(`END`KWDsetq`END`PLN delete-key-deletes-forward `END`KWDt`END`CLO)`END`PLN<br>' +
1809-
'`END`OPN(`END`KWDsetq`END`PLN indent-tabs-mode `END`KWDnil`END`CLO)`END`PLN<br>' +
1840+
'`END`OPN(`END`KWDdefun`END`PLN back-six-lines `END`OPN(`END`CLO)`END' +
1841+
'`PLN `END`OPN(`END`PLNinteractive`END`CLO)`END`PLN `END`OPN(`END' +
1842+
'`PLNforward-line `END`LIT-6`END`CLO))`END`PLN<br>' +
1843+
'`END`OPN(`END`KWDdefun`END`PLN forward-six-lines `END`OPN(`END' +
1844+
'`CLO)`END`PLN `END`OPN(`END`PLNinteractive`END`CLO)`END`PLN `END' +
1845+
'`OPN(`END`PLNforward-line `END`LIT6`END`CLO))`END`PLN<br>' +
1846+
'<br>' +
1847+
'`END`OPN(`END`PLNglobal-set-key `END`STR"\\M-l"`END`PLN `END' +
1848+
'`LIT\'goto-line`END`CLO)`END`PLN<br>' +
1849+
'`END`OPN(`END`PLNglobal-set-key `END`STR"\\C-z"`END`PLN `END' +
1850+
'`LIT\'advertised-undo`END`CLO)`END`PLN<br>' +
1851+
'`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNC-insert`END' +
1852+
'`PUN]`END`PLN `END`LIT\'clipboard-kill-ring-save`END`CLO)`END' +
1853+
'`PLN<br>' +
1854+
'`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNS-insert`END`PUN]`END' +
1855+
'`PLN `END`LIT\'clipboard-yank`END`CLO)`END`PLN<br>' +
1856+
'`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNC-up`END`PUN]`END' +
1857+
'`PLN `END`LIT\'back-six-lines`END`CLO)`END`PLN<br>' +
1858+
'`END`OPN(`END`PLNglobal-set-key `END`PUN[`END`PLNC-down`END`PUN]`END' +
1859+
'`PLN `END`LIT\'forward-six-lines`END`CLO)`END`PLN<br>' +
1860+
'<br>' +
1861+
'`END`OPN(`END`KWDsetq`END`PLN visible-bell `END`KWDt`END`CLO)`END' +
1862+
'`PLN<br>' +
1863+
'`END`OPN(`END`KWDsetq`END`PLN user-mail-address `END' +
1864+
'`STR"[email protected]"`END`CLO)`END`PLN<br>' +
1865+
'`END`OPN(`END`KWDsetq`END`PLN default-major-mode `END' +
1866+
'`LIT\'text-mode`END`CLO)`END`PLN<br>' +
1867+
'<br>' +
1868+
'`END`OPN(`END`PLNsetenv `END`STR"TERM"`END`PLN `END' +
1869+
'`STR"emacs"`END`CLO)`END`PLN<br>' +
1870+
'`END`OPN(`END`PLNc-set-offset `END`LIT\'case-label`END`PLN `END' +
1871+
'`LIT2`END`CLO)`END`PLN<br>' +
1872+
'`END`OPN(`END`KWDsetq`END`PLN c-basic-offset `END`LIT2`END`CLO)`END' +
1873+
'`PLN<br>' +
1874+
'`END`OPN(`END`KWDsetq`END`PLN perl-indent-level `END`LIT2`END`CLO)`END' +
1875+
'`PLN<br>' +
1876+
'`END`OPN(`END`KWDsetq`END`PLN delete-key-deletes-forward `END`KWDt`END' +
1877+
'`CLO)`END`PLN<br>' +
1878+
'`END`OPN(`END`KWDsetq`END`PLN indent-tabs-mode `END`KWDnil`END' +
1879+
'`CLO)`END`PLN<br>' +
18101880
'<br>' +
18111881
'`END`COM;; Text mode`END`PLN<br>' +
18121882
'`END`OPN(`END`PLNadd-hook `END`LIT\'text-mode-hook`END`PLN <br>' +
1813-
'&nbsp; `END`LIT\'`END`OPN(`END`KWDlambda`END`PLN `END`OPN(`END`CLO)`END`PLN<br>' +
1814-
'&nbsp; &nbsp; &nbsp;`END`OPN(`END`PLNturn-on-auto-fill`END`CLO)`END`PLN<br>' +
1883+
'&nbsp; `END`LIT\'`END`OPN(`END`KWDlambda`END`PLN `END`OPN(`END' +
1884+
'`CLO)`END`PLN<br>' +
1885+
'&nbsp; &nbsp; &nbsp;`END`OPN(`END`PLNturn-on-auto-fill`END`CLO)`END' +
1886+
'`PLN<br>' +
18151887
'&nbsp; &nbsp;`END`CLO)`END`PLN<br>' +
18161888
'`END`CLO)`END`PLN<br>' +
18171889
'<br>' +
18181890
'`END`COM;; Fundamental mode`END`PLN<br>' +
1819-
'`END`OPN(`END`PLNadd-hook `END`LIT\'fundamental-mode-hook`END`PLN <br>' +
1820-
'&nbsp; `END`LIT\'`END`OPN(`END`KWDlambda`END`PLN `END`OPN(`END`CLO)`END`PLN<br>' +
1821-
'&nbsp; &nbsp; &nbsp;`END`OPN(`END`PLNturn-on-auto-fill`END`CLO)`END`PLN<br>' +
1891+
'`END`OPN(`END`PLNadd-hook `END`LIT\'fundamental-mode-hook`END' +
1892+
'`PLN <br>' +
1893+
'&nbsp; `END`LIT\'`END`OPN(`END`KWDlambda`END`PLN `END`OPN(`END' +
1894+
'`CLO)`END`PLN<br>' +
1895+
'&nbsp; &nbsp; &nbsp;`END`OPN(`END`PLNturn-on-auto-fill`END' +
1896+
'`CLO)`END`PLN<br>' +
18221897
'&nbsp; &nbsp;`END`CLO)`END`PLN<br>' +
18231898
'`END`CLO)`END'),
18241899
issue45: (

0 commit comments

Comments
 (0)