1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
| /**
| * @param {string} value
| * @returns {RegExp}
| * */
|
| /**
| * @param {RegExp | string } re
| * @returns {string}
| */
| function source(re) {
| if (!re) return null;
| if (typeof re === "string") return re;
|
| return re.source;
| }
|
| /**
| * @param {RegExp | string } re
| * @returns {string}
| */
| function anyNumberOfTimes(re) {
| return concat('(', re, ')*');
| }
|
| /**
| * @param {...(RegExp | string) } args
| * @returns {string}
| */
| function concat(...args) {
| const joined = args.map((x) => source(x)).join("");
| return joined;
| }
|
| /** @type LanguageFn */
| function gams(hljs) {
| const KEYWORDS = {
| keyword:
| 'abort acronym acronyms alias all and assign binary card diag display ' +
| 'else eq file files for free ge gt if integer le loop lt maximizing ' +
| 'minimizing model models ne negative no not option options or ord ' +
| 'positive prod put putpage puttl repeat sameas semicont semiint smax ' +
| 'smin solve sos1 sos2 sum system table then until using while xor yes',
| literal:
| 'eps inf na',
| built_in:
| 'abs arccos arcsin arctan arctan2 Beta betaReg binomial ceil centropy ' +
| 'cos cosh cvPower div div0 eDist entropy errorf execSeed exp fact ' +
| 'floor frac gamma gammaReg log logBeta logGamma log10 log2 mapVal max ' +
| 'min mod ncpCM ncpF ncpVUpow ncpVUsin normal pi poly power ' +
| 'randBinomial randLinear randTriangle round rPower sigmoid sign ' +
| 'signPower sin sinh slexp sllog10 slrec sqexp sqlog10 sqr sqrec sqrt ' +
| 'tan tanh trunc uniform uniformInt vcPower bool_and bool_eqv bool_imp ' +
| 'bool_not bool_or bool_xor ifThen rel_eq rel_ge rel_gt rel_le rel_lt ' +
| 'rel_ne gday gdow ghour gleap gmillisec gminute gmonth gsecond gyear ' +
| 'jdate jnow jstart jtime errorLevel execError gamsRelease gamsVersion ' +
| 'handleCollect handleDelete handleStatus handleSubmit heapFree ' +
| 'heapLimit heapSize jobHandle jobKill jobStatus jobTerminate ' +
| 'licenseLevel licenseStatus maxExecError sleep timeClose timeComp ' +
| 'timeElapsed timeExec timeStart'
| };
| const PARAMS = {
| className: 'params',
| begin: /\(/,
| end: /\)/,
| excludeBegin: true,
| excludeEnd: true
| };
| const SYMBOLS = {
| className: 'symbol',
| variants: [
| {
| begin: /=[lgenxc]=/
| },
| {
| begin: /\$/
| }
| ]
| };
| const QSTR = { // One-line quoted comment string
| className: 'comment',
| variants: [
| {
| begin: '\'',
| end: '\''
| },
| {
| begin: '"',
| end: '"'
| }
| ],
| illegal: '\\n',
| contains: [hljs.BACKSLASH_ESCAPE]
| };
| const ASSIGNMENT = {
| begin: '/',
| end: '/',
| keywords: KEYWORDS,
| contains: [
| QSTR,
| hljs.C_LINE_COMMENT_MODE,
| hljs.C_BLOCK_COMMENT_MODE,
| hljs.QUOTE_STRING_MODE,
| hljs.APOS_STRING_MODE,
| hljs.C_NUMBER_MODE
| ]
| };
| const COMMENT_WORD = /[a-z0-9&#*=?@\\><:,()$[\]_.{}!+%^-]+/;
| const DESCTEXT = { // Parameter/set/variable description text
| begin: /[a-z][a-z0-9_]*(\([a-z0-9_, ]*\))?[ \t]+/,
| excludeBegin: true,
| end: '$',
| endsWithParent: true,
| contains: [
| QSTR,
| ASSIGNMENT,
| {
| className: 'comment',
| // one comment word, then possibly more
| begin: concat(
| COMMENT_WORD,
| // [ ] because \s would be too broad (matching newlines)
| anyNumberOfTimes(concat(/[ ]+/, COMMENT_WORD))
| ),
| relevance: 0
| }
| ]
| };
|
| return {
| name: 'GAMS',
| aliases: ['gms'],
| case_insensitive: true,
| keywords: KEYWORDS,
| contains: [
| hljs.COMMENT(/^\$ontext/, /^\$offtext/),
| {
| className: 'meta',
| begin: '^\\$[a-z0-9]+',
| end: '$',
| returnBegin: true,
| contains: [
| {
| className: 'meta-keyword',
| begin: '^\\$[a-z0-9]+'
| }
| ]
| },
| hljs.COMMENT('^\\*', '$'),
| hljs.C_LINE_COMMENT_MODE,
| hljs.C_BLOCK_COMMENT_MODE,
| hljs.QUOTE_STRING_MODE,
| hljs.APOS_STRING_MODE,
| // Declarations
| {
| beginKeywords:
| 'set sets parameter parameters variable variables ' +
| 'scalar scalars equation equations',
| end: ';',
| contains: [
| hljs.COMMENT('^\\*', '$'),
| hljs.C_LINE_COMMENT_MODE,
| hljs.C_BLOCK_COMMENT_MODE,
| hljs.QUOTE_STRING_MODE,
| hljs.APOS_STRING_MODE,
| ASSIGNMENT,
| DESCTEXT
| ]
| },
| { // table environment
| beginKeywords: 'table',
| end: ';',
| returnBegin: true,
| contains: [
| { // table header row
| beginKeywords: 'table',
| end: '$',
| contains: [DESCTEXT]
| },
| hljs.COMMENT('^\\*', '$'),
| hljs.C_LINE_COMMENT_MODE,
| hljs.C_BLOCK_COMMENT_MODE,
| hljs.QUOTE_STRING_MODE,
| hljs.APOS_STRING_MODE,
| hljs.C_NUMBER_MODE
| // Table does not contain DESCTEXT or ASSIGNMENT
| ]
| },
| // Function definitions
| {
| className: 'function',
| begin: /^[a-z][a-z0-9_,\-+' ()$]+\.{2}/,
| returnBegin: true,
| contains: [
| { // Function title
| className: 'title',
| begin: /^[a-z0-9_]+/
| },
| PARAMS,
| SYMBOLS
| ]
| },
| hljs.C_NUMBER_MODE,
| SYMBOLS
| ]
| };
| }
|
| module.exports = gams;
|
|