123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208 |
- /**
- * @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;
|