l0bsterssg

node.js static responsive blog post generator
Log | Files | Refs | README

ocaml.js (2511B)


      1 /*
      2 Language: OCaml
      3 Author: Mehdi Dogguy <mehdi@dogguy.org>
      4 Contributors: Nicolas Braud-Santoni <nicolas.braud-santoni@ens-cachan.fr>, Mickael Delahaye <mickael.delahaye@gmail.com>
      5 Description: OCaml language definition.
      6 Website: https://ocaml.org
      7 Category: functional
      8 */
      9 
     10 function ocaml(hljs) {
     11   /* missing support for heredoc-like string (OCaml 4.0.2+) */
     12   return {
     13     name: 'OCaml',
     14     aliases: ['ml'],
     15     keywords: {
     16       $pattern: '[a-z_]\\w*!?',
     17       keyword:
     18         'and as assert asr begin class constraint do done downto else end ' +
     19         'exception external for fun function functor if in include ' +
     20         'inherit! inherit initializer land lazy let lor lsl lsr lxor match method!|10 method ' +
     21         'mod module mutable new object of open! open or private rec sig struct ' +
     22         'then to try type val! val virtual when while with ' +
     23         /* camlp4 */
     24         'parser value',
     25       built_in:
     26         /* built-in types */
     27         'array bool bytes char exn|5 float int int32 int64 list lazy_t|5 nativeint|5 string unit ' +
     28         /* (some) types in Pervasives */
     29         'in_channel out_channel ref',
     30       literal:
     31         'true false'
     32     },
     33     illegal: /\/\/|>>/,
     34     contains: [
     35       {
     36         className: 'literal',
     37         begin: '\\[(\\|\\|)?\\]|\\(\\)',
     38         relevance: 0
     39       },
     40       hljs.COMMENT(
     41         '\\(\\*',
     42         '\\*\\)',
     43         {
     44           contains: ['self']
     45         }
     46       ),
     47       { /* type variable */
     48         className: 'symbol',
     49         begin: '\'[A-Za-z_](?!\')[\\w\']*'
     50         /* the grammar is ambiguous on how 'a'b should be interpreted but not the compiler */
     51       },
     52       { /* polymorphic variant */
     53         className: 'type',
     54         begin: '`[A-Z][\\w\']*'
     55       },
     56       { /* module or constructor */
     57         className: 'type',
     58         begin: '\\b[A-Z][\\w\']*',
     59         relevance: 0
     60       },
     61       { /* don't color identifiers, but safely catch all identifiers with '*/
     62         begin: '[a-z_]\\w*\'[\\w\']*', relevance: 0
     63       },
     64       hljs.inherit(hljs.APOS_STRING_MODE, {className: 'string', relevance: 0}),
     65       hljs.inherit(hljs.QUOTE_STRING_MODE, {illegal: null}),
     66       {
     67         className: 'number',
     68         begin:
     69           '\\b(0[xX][a-fA-F0-9_]+[Lln]?|' +
     70           '0[oO][0-7_]+[Lln]?|' +
     71           '0[bB][01_]+[Lln]?|' +
     72           '[0-9][0-9_]*([Lln]|(\\.[0-9_]*)?([eE][-+]?[0-9_]+)?)?)',
     73         relevance: 0
     74       },
     75       {
     76         begin: /[-=]>/ // relevance booster
     77       }
     78     ]
     79   }
     80 }
     81 
     82 module.exports = ocaml;