source: node_modules/highlight.js/lib/languages/ada.js@ 65b6638

main
Last change on this file since 65b6638 was d24f17c, checked in by Aleksandar Panovski <apano77@…>, 15 months ago

Initial commit

  • Property mode set to 100644
File size: 6.1 KB
Line 
1/*
2Language: Ada
3Author: Lars Schulna <kartoffelbrei.mit.muskatnuss@gmail.org>
4Description: Ada is a general-purpose programming language that has great support for saftey critical and real-time applications.
5 It has been developed by the DoD and thus has been used in military and safety-critical applications (like civil aviation).
6 The first version appeared in the 80s, but it's still actively developed today with
7 the newest standard being Ada2012.
8*/
9
10// We try to support full Ada2012
11//
12// We highlight all appearances of types, keywords, literals (string, char, number, bool)
13// and titles (user defined function/procedure/package)
14// CSS classes are set accordingly
15//
16// Languages causing problems for language detection:
17// xml (broken by Foo : Bar type), elm (broken by Foo : Bar type), vbscript-html (broken by body keyword)
18// sql (ada default.txt has a lot of sql keywords)
19
20/** @type LanguageFn */
21function ada(hljs) {
22 // Regular expression for Ada numeric literals.
23 // stolen form the VHDL highlighter
24
25 // Decimal literal:
26 const INTEGER_RE = '\\d(_|\\d)*';
27 const EXPONENT_RE = '[eE][-+]?' + INTEGER_RE;
28 const DECIMAL_LITERAL_RE = INTEGER_RE + '(\\.' + INTEGER_RE + ')?' + '(' + EXPONENT_RE + ')?';
29
30 // Based literal:
31 const BASED_INTEGER_RE = '\\w+';
32 const BASED_LITERAL_RE = INTEGER_RE + '#' + BASED_INTEGER_RE + '(\\.' + BASED_INTEGER_RE + ')?' + '#' + '(' + EXPONENT_RE + ')?';
33
34 const NUMBER_RE = '\\b(' + BASED_LITERAL_RE + '|' + DECIMAL_LITERAL_RE + ')';
35
36 // Identifier regex
37 const ID_REGEX = '[A-Za-z](_?[A-Za-z0-9.])*';
38
39 // bad chars, only allowed in literals
40 const BAD_CHARS = `[]\\{\\}%#'"`;
41
42 // Ada doesn't have block comments, only line comments
43 const COMMENTS = hljs.COMMENT('--', '$');
44
45 // variable declarations of the form
46 // Foo : Bar := Baz;
47 // where only Bar will be highlighted
48 const VAR_DECLS = {
49 // TODO: These spaces are not required by the Ada syntax
50 // however, I have yet to see handwritten Ada code where
51 // someone does not put spaces around :
52 begin: '\\s+:\\s+',
53 end: '\\s*(:=|;|\\)|=>|$)',
54 // endsWithParent: true,
55 // returnBegin: true,
56 illegal: BAD_CHARS,
57 contains: [
58 {
59 // workaround to avoid highlighting
60 // named loops and declare blocks
61 beginKeywords: 'loop for declare others',
62 endsParent: true
63 },
64 {
65 // properly highlight all modifiers
66 className: 'keyword',
67 beginKeywords: 'not null constant access function procedure in out aliased exception'
68 },
69 {
70 className: 'type',
71 begin: ID_REGEX,
72 endsParent: true,
73 relevance: 0
74 }
75 ]
76 };
77
78 return {
79 name: 'Ada',
80 case_insensitive: true,
81 keywords: {
82 keyword:
83 'abort else new return abs elsif not reverse abstract end ' +
84 'accept entry select access exception of separate aliased exit or some ' +
85 'all others subtype and for out synchronized array function overriding ' +
86 'at tagged generic package task begin goto pragma terminate ' +
87 'body private then if procedure type case in protected constant interface ' +
88 'is raise use declare range delay limited record when delta loop rem while ' +
89 'digits renames with do mod requeue xor',
90 literal:
91 'True False'
92 },
93 contains: [
94 COMMENTS,
95 // strings "foobar"
96 {
97 className: 'string',
98 begin: /"/,
99 end: /"/,
100 contains: [{
101 begin: /""/,
102 relevance: 0
103 }]
104 },
105 // characters ''
106 {
107 // character literals always contain one char
108 className: 'string',
109 begin: /'.'/
110 },
111 {
112 // number literals
113 className: 'number',
114 begin: NUMBER_RE,
115 relevance: 0
116 },
117 {
118 // Attributes
119 className: 'symbol',
120 begin: "'" + ID_REGEX
121 },
122 {
123 // package definition, maybe inside generic
124 className: 'title',
125 begin: '(\\bwith\\s+)?(\\bprivate\\s+)?\\bpackage\\s+(\\bbody\\s+)?',
126 end: '(is|$)',
127 keywords: 'package body',
128 excludeBegin: true,
129 excludeEnd: true,
130 illegal: BAD_CHARS
131 },
132 {
133 // function/procedure declaration/definition
134 // maybe inside generic
135 begin: '(\\b(with|overriding)\\s+)?\\b(function|procedure)\\s+',
136 end: '(\\bis|\\bwith|\\brenames|\\)\\s*;)',
137 keywords: 'overriding function procedure with is renames return',
138 // we need to re-match the 'function' keyword, so that
139 // the title mode below matches only exactly once
140 returnBegin: true,
141 contains:
142 [
143 COMMENTS,
144 {
145 // name of the function/procedure
146 className: 'title',
147 begin: '(\\bwith\\s+)?\\b(function|procedure)\\s+',
148 end: '(\\(|\\s+|$)',
149 excludeBegin: true,
150 excludeEnd: true,
151 illegal: BAD_CHARS
152 },
153 // 'self'
154 // // parameter types
155 VAR_DECLS,
156 {
157 // return type
158 className: 'type',
159 begin: '\\breturn\\s+',
160 end: '(\\s+|;|$)',
161 keywords: 'return',
162 excludeBegin: true,
163 excludeEnd: true,
164 // we are done with functions
165 endsParent: true,
166 illegal: BAD_CHARS
167
168 }
169 ]
170 },
171 {
172 // new type declarations
173 // maybe inside generic
174 className: 'type',
175 begin: '\\b(sub)?type\\s+',
176 end: '\\s+',
177 keywords: 'type',
178 excludeBegin: true,
179 illegal: BAD_CHARS
180 },
181
182 // see comment above the definition
183 VAR_DECLS
184
185 // no markup
186 // relevance boosters for small snippets
187 // {begin: '\\s*=>\\s*'},
188 // {begin: '\\s*:=\\s*'},
189 // {begin: '\\s+:=\\s+'},
190 ]
191 };
192}
193
194module.exports = ada;
Note: See TracBrowser for help on using the repository browser.