123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- /*
- Language: Ada
- Author: Lars Schulna <kartoffelbrei.mit.muskatnuss@gmail.org>
- Description: Ada is a general-purpose programming language that has great support for saftey critical and real-time applications.
- It has been developed by the DoD and thus has been used in military and safety-critical applications (like civil aviation).
- The first version appeared in the 80s, but it's still actively developed today with
- the newest standard being Ada2012.
- */
- // We try to support full Ada2012
- //
- // We highlight all appearances of types, keywords, literals (string, char, number, bool)
- // and titles (user defined function/procedure/package)
- // CSS classes are set accordingly
- //
- // Languages causing problems for language detection:
- // xml (broken by Foo : Bar type), elm (broken by Foo : Bar type), vbscript-html (broken by body keyword)
- // sql (ada default.txt has a lot of sql keywords)
- /** @type LanguageFn */
- function ada(hljs) {
- // Regular expression for Ada numeric literals.
- // stolen form the VHDL highlighter
- // Decimal literal:
- const INTEGER_RE = '\\d(_|\\d)*';
- const EXPONENT_RE = '[eE][-+]?' + INTEGER_RE;
- const DECIMAL_LITERAL_RE = INTEGER_RE + '(\\.' + INTEGER_RE + ')?' + '(' + EXPONENT_RE + ')?';
- // Based literal:
- const BASED_INTEGER_RE = '\\w+';
- const BASED_LITERAL_RE = INTEGER_RE + '#' + BASED_INTEGER_RE + '(\\.' + BASED_INTEGER_RE + ')?' + '#' + '(' + EXPONENT_RE + ')?';
- const NUMBER_RE = '\\b(' + BASED_LITERAL_RE + '|' + DECIMAL_LITERAL_RE + ')';
- // Identifier regex
- const ID_REGEX = '[A-Za-z](_?[A-Za-z0-9.])*';
- // bad chars, only allowed in literals
- const BAD_CHARS = `[]\\{\\}%#'"`;
- // Ada doesn't have block comments, only line comments
- const COMMENTS = hljs.COMMENT('--', '$');
- // variable declarations of the form
- // Foo : Bar := Baz;
- // where only Bar will be highlighted
- const VAR_DECLS = {
- // TODO: These spaces are not required by the Ada syntax
- // however, I have yet to see handwritten Ada code where
- // someone does not put spaces around :
- begin: '\\s+:\\s+',
- end: '\\s*(:=|;|\\)|=>|$)',
- // endsWithParent: true,
- // returnBegin: true,
- illegal: BAD_CHARS,
- contains: [
- {
- // workaround to avoid highlighting
- // named loops and declare blocks
- beginKeywords: 'loop for declare others',
- endsParent: true
- },
- {
- // properly highlight all modifiers
- className: 'keyword',
- beginKeywords: 'not null constant access function procedure in out aliased exception'
- },
- {
- className: 'type',
- begin: ID_REGEX,
- endsParent: true,
- relevance: 0
- }
- ]
- };
- const KEYWORDS = [
- "abort",
- "else",
- "new",
- "return",
- "abs",
- "elsif",
- "not",
- "reverse",
- "abstract",
- "end",
- "accept",
- "entry",
- "select",
- "access",
- "exception",
- "of",
- "separate",
- "aliased",
- "exit",
- "or",
- "some",
- "all",
- "others",
- "subtype",
- "and",
- "for",
- "out",
- "synchronized",
- "array",
- "function",
- "overriding",
- "at",
- "tagged",
- "generic",
- "package",
- "task",
- "begin",
- "goto",
- "pragma",
- "terminate",
- "body",
- "private",
- "then",
- "if",
- "procedure",
- "type",
- "case",
- "in",
- "protected",
- "constant",
- "interface",
- "is",
- "raise",
- "use",
- "declare",
- "range",
- "delay",
- "limited",
- "record",
- "when",
- "delta",
- "loop",
- "rem",
- "while",
- "digits",
- "renames",
- "with",
- "do",
- "mod",
- "requeue",
- "xor"
- ];
- return {
- name: 'Ada',
- case_insensitive: true,
- keywords: {
- keyword: KEYWORDS,
- literal: [
- "True",
- "False"
- ]
- },
- contains: [
- COMMENTS,
- // strings "foobar"
- {
- className: 'string',
- begin: /"/,
- end: /"/,
- contains: [
- {
- begin: /""/,
- relevance: 0
- }
- ]
- },
- // characters ''
- {
- // character literals always contain one char
- className: 'string',
- begin: /'.'/
- },
- {
- // number literals
- className: 'number',
- begin: NUMBER_RE,
- relevance: 0
- },
- {
- // Attributes
- className: 'symbol',
- begin: "'" + ID_REGEX
- },
- {
- // package definition, maybe inside generic
- className: 'title',
- begin: '(\\bwith\\s+)?(\\bprivate\\s+)?\\bpackage\\s+(\\bbody\\s+)?',
- end: '(is|$)',
- keywords: 'package body',
- excludeBegin: true,
- excludeEnd: true,
- illegal: BAD_CHARS
- },
- {
- // function/procedure declaration/definition
- // maybe inside generic
- begin: '(\\b(with|overriding)\\s+)?\\b(function|procedure)\\s+',
- end: '(\\bis|\\bwith|\\brenames|\\)\\s*;)',
- keywords: 'overriding function procedure with is renames return',
- // we need to re-match the 'function' keyword, so that
- // the title mode below matches only exactly once
- returnBegin: true,
- contains:
- [
- COMMENTS,
- {
- // name of the function/procedure
- className: 'title',
- begin: '(\\bwith\\s+)?\\b(function|procedure)\\s+',
- end: '(\\(|\\s+|$)',
- excludeBegin: true,
- excludeEnd: true,
- illegal: BAD_CHARS
- },
- // 'self'
- // // parameter types
- VAR_DECLS,
- {
- // return type
- className: 'type',
- begin: '\\breturn\\s+',
- end: '(\\s+|;|$)',
- keywords: 'return',
- excludeBegin: true,
- excludeEnd: true,
- // we are done with functions
- endsParent: true,
- illegal: BAD_CHARS
- }
- ]
- },
- {
- // new type declarations
- // maybe inside generic
- className: 'type',
- begin: '\\b(sub)?type\\s+',
- end: '\\s+',
- keywords: 'type',
- excludeBegin: true,
- illegal: BAD_CHARS
- },
- // see comment above the definition
- VAR_DECLS
- // no markup
- // relevance boosters for small snippets
- // {begin: '\\s*=>\\s*'},
- // {begin: '\\s*:=\\s*'},
- // {begin: '\\s+:=\\s+'},
- ]
- };
- }
- export { ada as default };
|