122 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/*
 | 
						|
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;
 |