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.
271 lines
6.7 KiB
271 lines
6.7 KiB
/* |
|
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;
|
|
|