|
| 1 | +/* |
| 2 | +Language: xtlang |
| 3 | +Description: This is a mixture of Scheme and xtlang for the `Extempore programming environment <https://extemporelang.github.io/>`. |
| 4 | +Author: YUYA CHIBA <[email protected]> |
| 5 | +Origin: scheme.js |
| 6 | +Category: lisp |
| 7 | +*/ |
| 8 | + |
| 9 | +function(hljs) { |
| 10 | + var SCHEME_SIMPLE_NUMBER_RE = '(\\-|\\+)?\\d+([./]\\d+)?'; |
| 11 | + var SCHEME_COMPLEX_NUMBER_RE = SCHEME_SIMPLE_NUMBER_RE + '[\\+\\-]' + |
| 12 | + SCHEME_SIMPLE_NUMBER_RE + 'i'; |
| 13 | + |
| 14 | + // valid names for Scheme identifiers(names cannot consist fully |
| 15 | + // of numbers, but this should be good enough for now) |
| 16 | + var VALID_SCHEME_NAME_RE = '[\\w\\!\\$%&\\*\\+,\\/:<=>\\?@\\^~\\|\\-]+'; |
| 17 | + |
| 18 | + // valid characters in xtlang names & types |
| 19 | + var VALID_XTLANG_NAME_RE = '[\\w\\.\\!\\-]+'; |
| 20 | + var VALID_XTLANG_TYPE_RE = '[\\w\\[\\]\\{\\}<>,\\*/\\|\\!\\-]+'; |
| 21 | + |
| 22 | + /* |
| 23 | + * Keywords based on |
| 24 | + * https://bitbucket.org/birkenfeld/pygments-main/src/7941677dc77d4f2bf0bbd6140ade85a9454b8b80/ |
| 25 | + * pygments/lexers/lisp.py?at=default&fileviewer=file-view-default#lisp.py-2420 |
| 26 | + */ |
| 27 | + var COMMON_KEYWORDS_RE = '(lambda|define|if|else|cond|and|or|' + |
| 28 | + 'let|begin|set\\!|map|for\\-each)'; |
| 29 | + var SCHEME_KEYWORDS_RE = '(do|delay|quasiquote|unquote|unquote\\-splicing|' + |
| 30 | + 'eval|case|let\\*|letrec|quote)'; |
| 31 | + var XTLANG_BIND_KEYWORDS_RE = '(bind\\-func|bind\\-val|bind\\-lib|bind\\-type|bind\\-alias|' + |
| 32 | + 'bind\\-poly|bind\\-dylib|bind\\-lib\\-func|bind\\-lib\\-val)'; |
| 33 | + var XTLANG_KEYWORDS_RE = '(letz|memzone|cast|convert|dotimes|doloop)'; |
| 34 | + var COMMON_FUNCTIONS_RE = '(\\*|\\+|-|/|<|<=|=|>|>=|%|abs|acos|' + |
| 35 | + 'angle|append|apply|asin|assoc|assq|assv|' + |
| 36 | + 'atan|boolean\\?|caaaar|caaadr|caaar|caadar|' + |
| 37 | + 'caaddr|caadr|caar|cadaar|cadadr|cadar|' + |
| 38 | + 'caddar|cadddr|caddr|cadr|car|cdaaar|' + |
| 39 | + 'cdaadr|cdaar|cdadar|cdaddr|cdadr|cdar|' + |
| 40 | + 'cddaar|cddadr|cddar|cdddar|cddddr|cdddr|' + |
| 41 | + 'cddr|cdr|ceiling|cons|cos|floor|length|' + |
| 42 | + 'list|log|max|member|min|modulo|not|' + |
| 43 | + 'reverse|round|sin|sqrt|substring|tan|' + |
| 44 | + 'println|random|null\\?|callback|now)'; |
| 45 | + var SCHEME_FUNCTIONS_RE = '(call\\-with\\-current\\-continuation|' + |
| 46 | + 'call\\-with\\-input\\-file|call\\-with\\-output\\-file|' + |
| 47 | + 'call\\-with\\-values|call/cc|char\\->integer|' + |
| 48 | + 'char\\-alphabetic\\?|char\\-ci<=\\?|char\\-ci<\\?|' + |
| 49 | + 'char\\-ci=\\?|char\\-ci>=\\?|char\\-ci>\\?|char\\-downcase|' + |
| 50 | + 'char\\-lower\\-case\\?|char\\-numeric\\?|char\\-ready\\?|' + |
| 51 | + 'char\\-upcase|char\\-upper\\-case\\?|char\\-whitespace\\?|' + |
| 52 | + 'char<=\\?|char<\\?|char=\\?|char>=\\?|char>\\?|char\\?|' + |
| 53 | + 'close\\-input\\-port|close\\-output\\-port|complex\\?|' + |
| 54 | + 'current\\-input\\-port|current\\-output\\-port|denominator|' + |
| 55 | + 'display|dynamic\\-wind|eof\\-object\\?|eq\\?|equal\\?|' + |
| 56 | + 'eqv\\?|even\\?|exact\\->inexact|exact\\?|exp|expt|' + |
| 57 | + 'force|gcd|imag\\-part|inexact\\->exact|inexact\\?|' + |
| 58 | + 'input\\-port\\?|integer\\->char|integer\\?|' + |
| 59 | + 'interaction\\-environment|lcm|list\\->string|' + |
| 60 | + 'list\\->vector|list\\-ref|list\\-tail|list\\?|load|' + |
| 61 | + 'magnitude|make\\-polar|make\\-rectangular|make\\-string|' + |
| 62 | + 'make\\-vector|memq|memv|negative\\?|newline|' + |
| 63 | + 'null\\-environment|number\\->string|number\\?|' + |
| 64 | + 'numerator|odd\\?|open\\-input\\-file|open\\-output\\-file|' + |
| 65 | + 'output\\-port\\?|pair\\?|peek\\-char|port\\?|positive\\?|' + |
| 66 | + 'procedure\\?|quotient|rational\\?|rationalize|read|' + |
| 67 | + 'read\\-char|real\\-part|real\\?|' + |
| 68 | + 'remainder|scheme\\-report\\-environment|set\\-car\\!|' + |
| 69 | + 'set\\-cdr\\!|string|string\\->list|string\\->number|' + |
| 70 | + 'string\\->symbol|string\\-append|string\\-ci<=\\?|' + |
| 71 | + 'string\\-ci<\\?|string\\-ci=\\?|string\\-ci>=\\?|' + |
| 72 | + 'string\\-ci>\\?|string\\-copy|string\\-fill\\!|' + |
| 73 | + 'string\\-length|string\\-ref|string\\-set\\!|string<=\\?|' + |
| 74 | + 'string<\\?|string=\\?|string>=\\?|string>\\?|string\\?|' + |
| 75 | + 'symbol\\->string|symbol\\?|transcript\\-off|transcript\\-on|' + |
| 76 | + 'truncate|values|vector|vector\\->list|vector\\-fill\\!|' + |
| 77 | + 'vector\\-length|vector\\?|' + |
| 78 | + 'with\\-input\\-from\\-file|with\\-output\\-to\\-file|write|' + |
| 79 | + 'write\\-char|zero\\?)'; |
| 80 | + var XTLANG_FUNCTIONS_RE = '(toString|afill\\!|pfill\\!|tfill\\!|tbind|vfill\\!|' + |
| 81 | + 'array\\-fill\\!|pointer\\-fill\\!|tuple\\-fill\\!|' + |
| 82 | + 'vector\\-fill\\!|free|array|tuple|~|cset\\!|cref|&|bor|' + |
| 83 | + 'ang\\-names|<<|>>|nil|printf|sprintf|null|now|' + |
| 84 | + 'pset\\!|pref\\-ptr|vset\\!|vref|aset\\!|aref|aref\\-ptr|' + |
| 85 | + 'tset\\!|tref|tref\\-ptr|salloc|halloc|zalloc|alloc|' + |
| 86 | + 'schedule|exp|log|sin|cos|tan|asin|acos|atan|' + |
| 87 | + 'sqrt|expt|floor|ceiling|truncate|round|' + |
| 88 | + 'llvm_printf|push_zone|pop_zone|memzone|callback|' + |
| 89 | + 'llvm_sprintf|make\\-array|array\\-set\\!|array\\-ref|' + |
| 90 | + 'array\\-ref\\-ptr|pointer\\-set\\!|pointer\\-ref|' + |
| 91 | + 'pointer\\-ref\\-ptr|stack\\-alloc|heap\\-alloc|zone\\-alloc|' + |
| 92 | + 'make\\-tuple|tuple\\-set\\!|tuple\\-ref|tuple\\-ref\\-ptr|' + |
| 93 | + 'closure\\-set\\!|closure\\-ref|pref|pdref|impc_null|bitcast|' + |
| 94 | + 'void|ifret|ret\\->|clrun\\->|make\\-env\\-zone|make\\-env|<>|' + |
| 95 | + 'dtof|ftod|i1tof|i1tod|i1toi8|i1toi32|i1toi64|i8tof|i8tod|' + |
| 96 | + 'i8toi1|i8toi32|i8toi64|i32tof|i32tod|i32toi1|' + |
| 97 | + 'i32toi8|i32toi64|i64tof|i64tod|i64toi1|' + |
| 98 | + 'i64toi8|i64toi32)'; |
| 99 | + |
| 100 | + var SHEBANG = { |
| 101 | + className: 'meta', |
| 102 | + begin: '^#!', |
| 103 | + end: '$' |
| 104 | + }; |
| 105 | + |
| 106 | + var LITERAL = { |
| 107 | + className: 'literal', |
| 108 | + begin: '(#t|#f)' |
| 109 | + }; |
| 110 | + |
| 111 | + var XTLANG_TYPE = { |
| 112 | + className: 'type', |
| 113 | + lexemes: VALID_XTLANG_TYPE_RE, |
| 114 | + variants: [ |
| 115 | + { begin: ':' + VALID_XTLANG_TYPE_RE }, |
| 116 | + { begin: '(<' + VALID_XTLANG_TYPE_RE + '>|\\|' + VALID_XTLANG_TYPE_RE + '\\||/' + |
| 117 | + VALID_XTLANG_TYPE_RE + '/|' + VALID_XTLANG_TYPE_RE + '\\*)\\**' } |
| 118 | + ], |
| 119 | + }; |
| 120 | + |
| 121 | + var NUMBER = { |
| 122 | + className: 'number', |
| 123 | + variants: [ |
| 124 | + { begin: SCHEME_SIMPLE_NUMBER_RE, relevance: 0 }, |
| 125 | + { begin: SCHEME_COMPLEX_NUMBER_RE, relevance: 0 }, |
| 126 | + { begin: '#b[0-1]+(/[0-1]+)?' }, |
| 127 | + { begin: '#o[0-7]+(/[0-7]+)?' }, |
| 128 | + { begin: '#x[0-9a-f]+(/[0-9a-f]+)?' } |
| 129 | + ] |
| 130 | + }; |
| 131 | + |
| 132 | + var STRING = { |
| 133 | + className: 'string', |
| 134 | + variants: [ |
| 135 | + { begin: '"', end:'"'}, |
| 136 | + { begin: '(#\\\\' + VALID_SCHEME_NAME_RE + '|#\\\\.)' } |
| 137 | + ], |
| 138 | + contains: [ |
| 139 | + { |
| 140 | + className: 'doctag', begin: '@\\w+', lexemes: VALID_XTLANG_NAME_RE |
| 141 | + } |
| 142 | + ] |
| 143 | + }; |
| 144 | + |
| 145 | + var COMMENT = [ |
| 146 | + hljs.COMMENT( |
| 147 | + ';', |
| 148 | + '$', |
| 149 | + { |
| 150 | + relevance: 0 |
| 151 | + } |
| 152 | + ), |
| 153 | + hljs.COMMENT('#\\|', '\\|#') |
| 154 | + ]; |
| 155 | + |
| 156 | + var IDENT = { |
| 157 | + className: 'variable', |
| 158 | + begin: VALID_XTLANG_NAME_RE, |
| 159 | + relevance: 0 |
| 160 | + }; |
| 161 | + |
| 162 | + var QUOTED_IDENT = { |
| 163 | + className: 'symbol', |
| 164 | + begin: '\'' + VALID_SCHEME_NAME_RE |
| 165 | + }; |
| 166 | + |
| 167 | + var SPECIAL_OPERATORS = { |
| 168 | + className: 'symbol', |
| 169 | + begin: '(\'|#|`|,@|,|\\.)' |
| 170 | + }; |
| 171 | + |
| 172 | + var QUOTED_LIST = { |
| 173 | + variants: [ |
| 174 | + { begin: /'/ }, |
| 175 | + { begin: '`' } |
| 176 | + ], |
| 177 | + contains: [ |
| 178 | + { |
| 179 | + begin: '\\(', end: '\\)', |
| 180 | + contains: ['self', LITERAL, STRING, NUMBER, IDENT, QUOTED_IDENT, SPECIAL_OPERATORS] |
| 181 | + } |
| 182 | + ] |
| 183 | + }; |
| 184 | + |
| 185 | + var COMMON_KEYWORDS = { |
| 186 | + className: 'keyword', |
| 187 | + begin: COMMON_KEYWORDS_RE, |
| 188 | + lexemes: VALID_SCHEME_NAME_RE |
| 189 | + }; |
| 190 | + |
| 191 | + var SCHEME_KEYWORDS = { |
| 192 | + className: 'keyword', |
| 193 | + begin: SCHEME_KEYWORDS_RE, |
| 194 | + lexemes: VALID_SCHEME_NAME_RE |
| 195 | + } |
| 196 | + |
| 197 | + var XTLANG_KEYWORDS = { |
| 198 | + className: 'keyword', |
| 199 | + begin: XTLANG_KEYWORDS_RE, |
| 200 | + lexemes: VALID_XTLANG_NAME_RE |
| 201 | + }; |
| 202 | + |
| 203 | + var COMMON_FUNCTIONS = { |
| 204 | + className: 'funciton', |
| 205 | + begin: COMMON_FUNCTIONS_RE, |
| 206 | + lexemes: VALID_SCHEME_NAME_RE |
| 207 | + }; |
| 208 | + |
| 209 | + var SCHEME_FUNCTIONS = { |
| 210 | + className: 'funciton', |
| 211 | + begin: SCHEME_FUNCTIONS_RE, |
| 212 | + lexemes: VALID_SCHEME_NAME_RE, |
| 213 | + }; |
| 214 | + |
| 215 | + var XTLANG_FUNCTIONS = { |
| 216 | + className: 'funciton', |
| 217 | + begin: XTLANG_FUNCTIONS_RE, |
| 218 | + lexemes: VALID_XTLANG_NAME_RE, |
| 219 | + }; |
| 220 | + |
| 221 | + var DEFINE = { |
| 222 | + className: 'keyword', |
| 223 | + lexemes: VALID_SCHEME_NAME_RE, |
| 224 | + end: '$', |
| 225 | + variants : [ |
| 226 | + { begin: XTLANG_BIND_KEYWORDS_RE }, |
| 227 | + { begin: 'define' } |
| 228 | + ], |
| 229 | + contains: [ |
| 230 | + hljs.inherit(hljs.TITLE_MODE, { begin: VALID_SCHEME_NAME_RE, endsParent: true}) |
| 231 | + ] |
| 232 | + }; |
| 233 | + |
| 234 | + var XTLANG = { |
| 235 | + lexemes: VALID_SCHEME_NAME_RE, |
| 236 | + variants: [ |
| 237 | + XTLANG_KEYWORDS, XTLANG_FUNCTIONS, |
| 238 | + ] |
| 239 | + }; |
| 240 | + |
| 241 | + var SCHEME = { |
| 242 | + lexemes: VALID_SCHEME_NAME_RE, |
| 243 | + variants: [ |
| 244 | + SCHEME_KEYWORDS, SCHEME_FUNCTIONS |
| 245 | + ] |
| 246 | + }; |
| 247 | + |
| 248 | + var COMMON = { |
| 249 | + endsWithParent: true, |
| 250 | + relevance: 0 |
| 251 | + }; |
| 252 | + |
| 253 | + var LIST = { |
| 254 | + variants: [ |
| 255 | + { begin: '\\(', end: '\\)' }, |
| 256 | + { begin: '\\[', end: '\\]' } |
| 257 | + ], |
| 258 | + contains: [DEFINE, XTLANG, SCHEME, COMMON] |
| 259 | + }; |
| 260 | + |
| 261 | + COMMON.contains = [LITERAL, NUMBER, XTLANG_TYPE, STRING, QUOTED_IDENT, |
| 262 | + SPECIAL_OPERATORS, QUOTED_LIST, COMMON_KEYWORDS, |
| 263 | + COMMON_FUNCTIONS, IDENT, LIST].concat(COMMENT); |
| 264 | + |
| 265 | + return { |
| 266 | + aliases: ['xtm'], |
| 267 | + illegal: /\S/, |
| 268 | + contains: [ |
| 269 | + SHEBANG, NUMBER, STRING, QUOTED_IDENT, SPECIAL_OPERATORS, QUOTED_LIST, LIST |
| 270 | + ].concat(COMMENT) |
| 271 | + }; |
| 272 | +} |
0 commit comments