You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
3.3 KiB
121 lines
3.3 KiB
/* |
|
Language: Mercury |
|
Author: mucaho <mkucko@gmail.com> |
|
Description: Mercury is a logic/functional programming language which combines the clarity and expressiveness of declarative programming with advanced static analysis and error detection features. |
|
Website: https://www.mercurylang.org |
|
*/ |
|
|
|
function mercury(hljs) { |
|
const KEYWORDS = { |
|
keyword: |
|
'module use_module import_module include_module end_module initialise ' + |
|
'mutable initialize finalize finalise interface implementation pred ' + |
|
'mode func type inst solver any_pred any_func is semidet det nondet ' + |
|
'multi erroneous failure cc_nondet cc_multi typeclass instance where ' + |
|
'pragma promise external trace atomic or_else require_complete_switch ' + |
|
'require_det require_semidet require_multi require_nondet ' + |
|
'require_cc_multi require_cc_nondet require_erroneous require_failure', |
|
meta: |
|
// pragma |
|
'inline no_inline type_spec source_file fact_table obsolete memo ' + |
|
'loop_check minimal_model terminates does_not_terminate ' + |
|
'check_termination promise_equivalent_clauses ' + |
|
// preprocessor |
|
'foreign_proc foreign_decl foreign_code foreign_type ' + |
|
'foreign_import_module foreign_export_enum foreign_export ' + |
|
'foreign_enum may_call_mercury will_not_call_mercury thread_safe ' + |
|
'not_thread_safe maybe_thread_safe promise_pure promise_semipure ' + |
|
'tabled_for_io local untrailed trailed attach_to_io_state ' + |
|
'can_pass_as_mercury_type stable will_not_throw_exception ' + |
|
'may_modify_trail will_not_modify_trail may_duplicate ' + |
|
'may_not_duplicate affects_liveness does_not_affect_liveness ' + |
|
'doesnt_affect_liveness no_sharing unknown_sharing sharing', |
|
built_in: |
|
'some all not if then else true fail false try catch catch_any ' + |
|
'semidet_true semidet_false semidet_fail impure_true impure semipure' |
|
}; |
|
|
|
const COMMENT = hljs.COMMENT('%', '$'); |
|
|
|
const NUMCODE = { |
|
className: 'number', |
|
begin: "0'.\\|0[box][0-9a-fA-F]*" |
|
}; |
|
|
|
const ATOM = hljs.inherit(hljs.APOS_STRING_MODE, { |
|
relevance: 0 |
|
}); |
|
const STRING = hljs.inherit(hljs.QUOTE_STRING_MODE, { |
|
relevance: 0 |
|
}); |
|
const STRING_FMT = { |
|
className: 'subst', |
|
begin: '\\\\[abfnrtv]\\|\\\\x[0-9a-fA-F]*\\\\\\|%[-+# *.0-9]*[dioxXucsfeEgGp]', |
|
relevance: 0 |
|
}; |
|
STRING.contains = STRING.contains.slice(); // we need our own copy of contains |
|
STRING.contains.push(STRING_FMT); |
|
|
|
const IMPLICATION = { |
|
className: 'built_in', |
|
variants: [ |
|
{ |
|
begin: '<=>' |
|
}, |
|
{ |
|
begin: '<=', |
|
relevance: 0 |
|
}, |
|
{ |
|
begin: '=>', |
|
relevance: 0 |
|
}, |
|
{ |
|
begin: '/\\\\' |
|
}, |
|
{ |
|
begin: '\\\\/' |
|
} |
|
] |
|
}; |
|
|
|
const HEAD_BODY_CONJUNCTION = { |
|
className: 'built_in', |
|
variants: [ |
|
{ |
|
begin: ':-\\|-->' |
|
}, |
|
{ |
|
begin: '=', |
|
relevance: 0 |
|
} |
|
] |
|
}; |
|
|
|
return { |
|
name: 'Mercury', |
|
aliases: [ |
|
'm', |
|
'moo' |
|
], |
|
keywords: KEYWORDS, |
|
contains: [ |
|
IMPLICATION, |
|
HEAD_BODY_CONJUNCTION, |
|
COMMENT, |
|
hljs.C_BLOCK_COMMENT_MODE, |
|
NUMCODE, |
|
hljs.NUMBER_MODE, |
|
ATOM, |
|
STRING, |
|
{ // relevance booster |
|
begin: /:-/ |
|
}, |
|
{ // relevance booster |
|
begin: /\.$/ |
|
} |
|
] |
|
}; |
|
} |
|
|
|
module.exports = mercury;
|
|
|