UNPKG

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