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.
194 lines
6.1 KiB
194 lines
6.1 KiB
/* |
|
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 |
|
} |
|
] |
|
}; |
|
|
|
return { |
|
name: 'Ada', |
|
case_insensitive: true, |
|
keywords: { |
|
keyword: |
|
'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', |
|
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+'}, |
|
] |
|
}; |
|
} |
|
|
|
module.exports = ada;
|
|
|