From 3ff7e86f8c1612e32d3f25fe2acadc5949d4acbd Mon Sep 17 00:00:00 2001 From: David de Hilster Date: Thu, 5 Nov 2020 11:12:12 -0500 Subject: [PATCH] LEXER-ECL-001 Lexer for ECL (Enterprise Control Language) Signed-off-by: David de Hilster --- src/ecl/ecl.contribution.ts | 14 ++ src/ecl/ecl.test.ts | 10 + src/ecl/ecl.ts | 484 ++++++++++++++++++++++++++++++++++++ src/monaco.contribution.ts | 1 + 4 files changed, 509 insertions(+) create mode 100644 src/ecl/ecl.contribution.ts create mode 100644 src/ecl/ecl.test.ts create mode 100644 src/ecl/ecl.ts diff --git a/src/ecl/ecl.contribution.ts b/src/ecl/ecl.contribution.ts new file mode 100644 index 00000000..9aacefa6 --- /dev/null +++ b/src/ecl/ecl.contribution.ts @@ -0,0 +1,14 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import { registerLanguage } from '../_.contribution'; + +registerLanguage({ + id: 'ecl', + extensions: ['.ecl'], + aliases: ['ECL', 'Ecl', 'ecl'], + loader: () => import('./ecl') +}); diff --git a/src/ecl/ecl.test.ts b/src/ecl/ecl.test.ts new file mode 100644 index 00000000..0866d10c --- /dev/null +++ b/src/ecl/ecl.test.ts @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { testTokenization } from '../test/testRunner'; + +testTokenization('csp', []); diff --git a/src/ecl/ecl.ts b/src/ecl/ecl.ts new file mode 100644 index 00000000..861ea6a8 --- /dev/null +++ b/src/ecl/ecl.ts @@ -0,0 +1,484 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import IRichLanguageConfiguration = monaco.languages.LanguageConfiguration; +import ILanguage = monaco.languages.IMonarchLanguage; + +export const conf: IRichLanguageConfiguration = { + comments: { + lineComment: '//', + blockComment: ['/*', '*/'] + }, + brackets: [ + ['{', '}'], + ['[', ']'], + ['(', ')'] + ], + autoClosingPairs: [ + { open: '{', close: '}' }, + { open: '[', close: ']' }, + { open: '(', close: ')' }, + { open: "'", close: "'", notIn: ['string', 'comment'] }, + { open: '"', close: '"', notIn: ['string', 'comment'] } + ], + surroundingPairs: [ + { open: '{', close: '}' }, + { open: '[', close: ']' }, + { open: '(', close: ')' }, + { open: '<', close: '>' }, + { open: "'", close: "'" }, + { open: '"', close: '"' } + ] +}; + +export const language = { + defaultToken: '', + tokenPostfix: '.ecl', + ignoreCase: true, + + brackets: [ + { open: '{', close: '}', token: 'delimiter.curly' }, + { open: '[', close: ']', token: 'delimiter.square' }, + { open: '(', close: ')', token: 'delimiter.parenthesis' }, + { open: '<', close: '>', token: 'delimiter.angle' } + ], + + pounds: [ + 'append', + 'break', + 'declare', + 'demangle', + 'end', + 'for', + 'getdatatype', + 'if', + 'inmodule', + 'loop', + 'mangle', + 'onwarning', + 'option', + 'set', + 'stored', + 'uniquename' + ].join('|'), + + keywords: [ + '__compressed__', + 'after', + 'all', + 'and', + 'any', + 'as', + 'atmost', + 'before', + 'beginc', + 'best', + 'between', + 'case', + 'cluster', + 'compressed', + 'compression', + 'const', + 'counter', + 'csv', + 'default', + 'descend', + 'embed', + 'encoding', + 'encrypt', + 'end', + 'endc', + 'endembed', + 'endmacro', + 'enum', + 'escape', + 'except', + 'exclusive', + 'expire', + 'export', + 'extend', + 'fail', + 'few', + 'fileposition', + 'first', + 'flat', + 'forward', + 'from', + 'full', + 'function', + 'functionmacro', + 'group', + 'grouped', + 'heading', + 'hole', + 'ifblock', + 'import', + 'in', + 'inner', + 'interface', + 'internal', + 'joined', + 'keep', + 'keyed', + 'last', + 'left', + 'limit', + 'linkcounted', + 'literal', + 'little_endian', + 'load', + 'local', + 'locale', + 'lookup', + 'lzw', + 'macro', + 'many', + 'maxcount', + 'maxlength', + 'min skew', + 'module', + 'mofn', + 'multiple', + 'named', + 'namespace', + 'nocase', + 'noroot', + 'noscan', + 'nosort', + 'not', + 'noxpath', + 'of', + 'onfail', + 'only', + 'opt', + 'or', + 'outer', + 'overwrite', + 'packed', + 'partition', + 'penalty', + 'physicallength', + 'pipe', + 'prefetch', + 'quote', + 'record', + 'repeat', + 'retry', + 'return', + 'right', + 'right1', + 'right2', + 'rows', + 'rowset', + 'scan', + 'scope', + 'self', + 'separator', + 'service', + 'shared', + 'skew', + 'skip', + 'smart', + 'soapaction', + 'sql', + 'stable', + 'store', + 'terminator', + 'thor', + 'threshold', + 'timelimit', + 'timeout', + 'token', + 'transform', + 'trim', + 'type', + 'unicodeorder', + 'unordered', + 'unsorted', + 'unstable', + 'update', + 'use', + 'validate', + 'virtual', + 'whole', + 'width', + 'wild', + 'within', + 'wnotrim', + 'xml', + 'xpath' + ], + + functions: [ + 'abs', + 'acos', + 'aggregate', + 'allnodes', + 'apply', + 'ascii', + 'asin', + 'assert', + 'asstring', + 'atan', + 'atan2', + 'ave', + 'build', + 'buildindex', + 'case', + 'catch', + 'choose', + 'choosen', + 'choosesets', + 'clustersize', + 'combine', + 'correlation', + 'cos', + 'cosh', + 'count', + 'covariance', + 'cron', + 'dataset', + 'dedup', + 'define', + 'denormalize', + 'dictionary', + 'distribute', + 'distributed', + 'distribution', + 'ebcdic', + 'enth', + 'error', + 'evaluate', + 'event', + 'eventextra', + 'eventname', + 'exists', + 'exp', + 'fail', + 'failcode', + 'failmessage', + 'fetch', + 'fromunicode', + 'fromxml', + 'getenv', + 'getisvalid', + 'global', + 'graph', + 'group', + 'hash', + 'hash32', + 'hash64', + 'hashcrc', + 'hashmd5', + 'having', + 'httpcall', + 'httpheader', + 'if', + 'iff', + 'index', + 'intformat', + 'isvalid', + 'iterate', + 'join', + 'keydiff', + 'keypatch', + 'keyunicode', + 'length', + 'library', + 'limit', + 'ln', + 'loadxml', + 'local', + 'log', + 'loop', + 'map', + 'matched', + 'matchlength', + 'matchposition', + 'matchtext', + 'matchunicode', + 'max', + 'merge', + 'mergejoin', + 'min', + 'nofold', + 'nolocal', + 'nonempty', + 'normalize', + 'nothor', + 'notify', + 'output', + 'parallel', + 'parse', + 'pipe', + 'power', + 'preload', + 'process', + 'project', + 'pull', + 'random', + 'range', + 'rank', + 'ranked', + 'realformat', + 'recordof', + 'regexfind', + 'regexreplace', + 'regroup', + 'rejected', + 'rollup', + 'round', + 'roundup', + 'row', + 'rowdiff', + 'sample', + 'sequential', + 'set', + 'sin', + 'sinh', + 'sizeof', + 'soapcall', + 'sort', + 'sorted', + 'sqrt', + 'stepped', + 'stored', + 'sum', + 'table', + 'tan', + 'tanh', + 'thisnode', + 'topn', + 'tounicode', + 'toxml', + 'transfer', + 'transform', + 'trim', + 'truncate', + 'typeof', + 'ungroup', + 'unicodeorder', + 'variance', + 'wait', + 'which', + 'workunit', + 'xmldecode', + 'xmlencode', + 'xmltext', + 'xmlunicode' + ], + + typesint: ['integer', 'unsigned'].join('|'), + + typesnum: ['data', 'qstring', 'string', 'unicode', 'utf8', 'varstring', 'varunicode'], + + typesone: [ + 'ascii', + 'big_endian', + 'boolean', + 'data', + 'decimal', + 'ebcdic', + 'grouped', + 'integer', + 'linkcounted', + 'pattern', + 'qstring', + 'real', + 'record', + 'rule', + 'set of', + 'streamed', + 'string', + 'token', + 'udecimal', + 'unicode', + 'unsigned', + 'utf8', + 'varstring', + 'varunicode' + ].join('|'), + + operators: ['+', '-', '/', ':=', '<', '<>', '=', '>', '\\', 'and', 'in', 'not', 'or'], + + symbols: /[=>](?!@symbols)/, '@brackets'], + [ + /@symbols/, + { + cases: { + '@operators': 'delimiter', + '@default': '' + } + } + ], + + // numbers + [/[0-9_]*\.[0-9_]+([eE][\-+]?\d+)?/, 'number.float'], + [/0[xX][0-9a-fA-F_]+/, 'number.hex'], + [/0[bB][01]+/, 'number.hex'], // binary: use same theme style as hex + [/[0-9_]+/, 'number'], + + // delimiter: after number because of .\d floats + [/[;,.]/, 'delimiter'], + + // strings + [/"([^"\\]|\\.)*$/, 'string.invalid'], + [/"/, 'string', '@string'], + + // characters + [/'[^\\']'/, 'string'], + [/(')(@escapes)(')/, ['string', 'string.escape', 'string']], + [/'/, 'string.invalid'] + ], + + whitespace: [ + [/[ \t\v\f\r\n]+/, ''], + [/\/\*/, 'comment', '@comment'], + [/\/\/.*$/, 'comment'] + ], + + comment: [ + [/[^\/*]+/, 'comment'], + [/\*\//, 'comment', '@pop'], + [/[\/*]/, 'comment'] + ], + + string: [ + [/[^\\']+/, 'string'], + [/@escapes/, 'string.escape'], + [/\\./, 'string.escape.invalid'], + [/'/, 'string', '@pop'] + ] + } +}; diff --git a/src/monaco.contribution.ts b/src/monaco.contribution.ts index d67526d5..1bdc4586 100644 --- a/src/monaco.contribution.ts +++ b/src/monaco.contribution.ts @@ -16,6 +16,7 @@ import './csp/csp.contribution'; import './css/css.contribution'; import './dart/dart.contribution'; import './dockerfile/dockerfile.contribution'; +import './ecl/ecl.contribution'; import './fsharp/fsharp.contribution'; import './go/go.contribution'; import './graphql/graphql.contribution';