272 lines
6.7 KiB
JavaScript
272 lines
6.7 KiB
JavaScript
|
/*
|
||
|
Language: D
|
||
|
Author: Aleksandar Ruzicic <aleksandar@ruzicic.info>
|
||
|
Description: D is a language with C-like syntax and static typing. It pragmatically combines efficiency, control, and modeling power, with safety and programmer productivity.
|
||
|
Version: 1.0a
|
||
|
Website: https://dlang.org
|
||
|
Date: 2012-04-08
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Known issues:
|
||
|
*
|
||
|
* - invalid hex string literals will be recognized as a double quoted strings
|
||
|
* but 'x' at the beginning of string will not be matched
|
||
|
*
|
||
|
* - delimited string literals are not checked for matching end delimiter
|
||
|
* (not possible to do with js regexp)
|
||
|
*
|
||
|
* - content of token string is colored as a string (i.e. no keyword coloring inside a token string)
|
||
|
* also, content of token string is not validated to contain only valid D tokens
|
||
|
*
|
||
|
* - special token sequence rule is not strictly following D grammar (anything following #line
|
||
|
* up to the end of line is matched as special token sequence)
|
||
|
*/
|
||
|
|
||
|
/** @type LanguageFn */
|
||
|
function d(hljs) {
|
||
|
/**
|
||
|
* Language keywords
|
||
|
*
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
const D_KEYWORDS = {
|
||
|
$pattern: hljs.UNDERSCORE_IDENT_RE,
|
||
|
keyword:
|
||
|
'abstract alias align asm assert auto body break byte case cast catch class ' +
|
||
|
'const continue debug default delete deprecated do else enum export extern final ' +
|
||
|
'finally for foreach foreach_reverse|10 goto if immutable import in inout int ' +
|
||
|
'interface invariant is lazy macro mixin module new nothrow out override package ' +
|
||
|
'pragma private protected public pure ref return scope shared static struct ' +
|
||
|
'super switch synchronized template this throw try typedef typeid typeof union ' +
|
||
|
'unittest version void volatile while with __FILE__ __LINE__ __gshared|10 ' +
|
||
|
'__thread __traits __DATE__ __EOF__ __TIME__ __TIMESTAMP__ __VENDOR__ __VERSION__',
|
||
|
built_in:
|
||
|
'bool cdouble cent cfloat char creal dchar delegate double dstring float function ' +
|
||
|
'idouble ifloat ireal long real short string ubyte ucent uint ulong ushort wchar ' +
|
||
|
'wstring',
|
||
|
literal:
|
||
|
'false null true'
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Number literal regexps
|
||
|
*
|
||
|
* @type {String}
|
||
|
*/
|
||
|
const decimal_integer_re = '(0|[1-9][\\d_]*)';
|
||
|
const decimal_integer_nosus_re = '(0|[1-9][\\d_]*|\\d[\\d_]*|[\\d_]+?\\d)';
|
||
|
const binary_integer_re = '0[bB][01_]+';
|
||
|
const hexadecimal_digits_re = '([\\da-fA-F][\\da-fA-F_]*|_[\\da-fA-F][\\da-fA-F_]*)';
|
||
|
const hexadecimal_integer_re = '0[xX]' + hexadecimal_digits_re;
|
||
|
|
||
|
const decimal_exponent_re = '([eE][+-]?' + decimal_integer_nosus_re + ')';
|
||
|
const decimal_float_re = '(' + decimal_integer_nosus_re + '(\\.\\d*|' + decimal_exponent_re + ')|' +
|
||
|
'\\d+\\.' + decimal_integer_nosus_re + '|' +
|
||
|
'\\.' + decimal_integer_re + decimal_exponent_re + '?' +
|
||
|
')';
|
||
|
const hexadecimal_float_re = '(0[xX](' +
|
||
|
hexadecimal_digits_re + '\\.' + hexadecimal_digits_re + '|' +
|
||
|
'\\.?' + hexadecimal_digits_re +
|
||
|
')[pP][+-]?' + decimal_integer_nosus_re + ')';
|
||
|
|
||
|
const integer_re = '(' +
|
||
|
decimal_integer_re + '|' +
|
||
|
binary_integer_re + '|' +
|
||
|
hexadecimal_integer_re +
|
||
|
')';
|
||
|
|
||
|
const float_re = '(' +
|
||
|
hexadecimal_float_re + '|' +
|
||
|
decimal_float_re +
|
||
|
')';
|
||
|
|
||
|
/**
|
||
|
* Escape sequence supported in D string and character literals
|
||
|
*
|
||
|
* @type {String}
|
||
|
*/
|
||
|
const escape_sequence_re = '\\\\(' +
|
||
|
'[\'"\\?\\\\abfnrtv]|' + // common escapes
|
||
|
'u[\\dA-Fa-f]{4}|' + // four hex digit unicode codepoint
|
||
|
'[0-7]{1,3}|' + // one to three octal digit ascii char code
|
||
|
'x[\\dA-Fa-f]{2}|' + // two hex digit ascii char code
|
||
|
'U[\\dA-Fa-f]{8}' + // eight hex digit unicode codepoint
|
||
|
')|' +
|
||
|
'&[a-zA-Z\\d]{2,};'; // named character entity
|
||
|
|
||
|
/**
|
||
|
* D integer number literals
|
||
|
*
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
const D_INTEGER_MODE = {
|
||
|
className: 'number',
|
||
|
begin: '\\b' + integer_re + '(L|u|U|Lu|LU|uL|UL)?',
|
||
|
relevance: 0
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* [D_FLOAT_MODE description]
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
const D_FLOAT_MODE = {
|
||
|
className: 'number',
|
||
|
begin: '\\b(' +
|
||
|
float_re + '([fF]|L|i|[fF]i|Li)?|' +
|
||
|
integer_re + '(i|[fF]i|Li)' +
|
||
|
')',
|
||
|
relevance: 0
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* D character literal
|
||
|
*
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
const D_CHARACTER_MODE = {
|
||
|
className: 'string',
|
||
|
begin: '\'(' + escape_sequence_re + '|.)',
|
||
|
end: '\'',
|
||
|
illegal: '.'
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* D string escape sequence
|
||
|
*
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
const D_ESCAPE_SEQUENCE = {
|
||
|
begin: escape_sequence_re,
|
||
|
relevance: 0
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* D double quoted string literal
|
||
|
*
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
const D_STRING_MODE = {
|
||
|
className: 'string',
|
||
|
begin: '"',
|
||
|
contains: [D_ESCAPE_SEQUENCE],
|
||
|
end: '"[cwd]?'
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* D wysiwyg and delimited string literals
|
||
|
*
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
const D_WYSIWYG_DELIMITED_STRING_MODE = {
|
||
|
className: 'string',
|
||
|
begin: '[rq]"',
|
||
|
end: '"[cwd]?',
|
||
|
relevance: 5
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* D alternate wysiwyg string literal
|
||
|
*
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
const D_ALTERNATE_WYSIWYG_STRING_MODE = {
|
||
|
className: 'string',
|
||
|
begin: '`',
|
||
|
end: '`[cwd]?'
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* D hexadecimal string literal
|
||
|
*
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
const D_HEX_STRING_MODE = {
|
||
|
className: 'string',
|
||
|
begin: 'x"[\\da-fA-F\\s\\n\\r]*"[cwd]?',
|
||
|
relevance: 10
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* D delimited string literal
|
||
|
*
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
const D_TOKEN_STRING_MODE = {
|
||
|
className: 'string',
|
||
|
begin: 'q"\\{',
|
||
|
end: '\\}"'
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Hashbang support
|
||
|
*
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
const D_HASHBANG_MODE = {
|
||
|
className: 'meta',
|
||
|
begin: '^#!',
|
||
|
end: '$',
|
||
|
relevance: 5
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* D special token sequence
|
||
|
*
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
const D_SPECIAL_TOKEN_SEQUENCE_MODE = {
|
||
|
className: 'meta',
|
||
|
begin: '#(line)',
|
||
|
end: '$',
|
||
|
relevance: 5
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* D attributes
|
||
|
*
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
const D_ATTRIBUTE_MODE = {
|
||
|
className: 'keyword',
|
||
|
begin: '@[a-zA-Z_][a-zA-Z_\\d]*'
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* D nesting comment
|
||
|
*
|
||
|
* @type {Object}
|
||
|
*/
|
||
|
const D_NESTING_COMMENT_MODE = hljs.COMMENT(
|
||
|
'\\/\\+',
|
||
|
'\\+\\/',
|
||
|
{
|
||
|
contains: ['self'],
|
||
|
relevance: 10
|
||
|
}
|
||
|
);
|
||
|
|
||
|
return {
|
||
|
name: 'D',
|
||
|
keywords: D_KEYWORDS,
|
||
|
contains: [
|
||
|
hljs.C_LINE_COMMENT_MODE,
|
||
|
hljs.C_BLOCK_COMMENT_MODE,
|
||
|
D_NESTING_COMMENT_MODE,
|
||
|
D_HEX_STRING_MODE,
|
||
|
D_STRING_MODE,
|
||
|
D_WYSIWYG_DELIMITED_STRING_MODE,
|
||
|
D_ALTERNATE_WYSIWYG_STRING_MODE,
|
||
|
D_TOKEN_STRING_MODE,
|
||
|
D_FLOAT_MODE,
|
||
|
D_INTEGER_MODE,
|
||
|
D_CHARACTER_MODE,
|
||
|
D_HASHBANG_MODE,
|
||
|
D_SPECIAL_TOKEN_SEQUENCE_MODE,
|
||
|
D_ATTRIBUTE_MODE
|
||
|
]
|
||
|
};
|
||
|
}
|
||
|
|
||
|
module.exports = d;
|