209 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			209 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @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;
 |