Skip to content

Commit

Permalink
Merge pull request microsoft#34 from masad-frost/fm-scheme
Browse files Browse the repository at this point in the history
Add Scheme language
  • Loading branch information
alexdima committed May 29, 2018
2 parents c09fd5d + 817ca5b commit 3dd38f1
Show file tree
Hide file tree
Showing 6 changed files with 236 additions and 0 deletions.
1 change: 1 addition & 0 deletions scripts/bundle.js
Expand Up @@ -61,6 +61,7 @@ bundleOne('redshift/redshift');
bundleOne('pgsql/pgsql');
bundleOne('redis/redis');
bundleOne('csp/csp');
bundleOne('scheme/scheme');

function bundleOne(moduleId, exclude) {
requirejs.optimize({
Expand Down
1 change: 1 addition & 0 deletions src/monaco.contribution.ts
Expand Up @@ -44,3 +44,4 @@ import './swift/swift.contribution';
import './vb/vb.contribution';
import './xml/xml.contribution';
import './yaml/yaml.contribution';
import './scheme/scheme.contribution';
18 changes: 18 additions & 0 deletions src/scheme/scheme.contribution.ts
@@ -0,0 +1,18 @@
/*---------------------------------------------------------------------------------------------
* 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';

// Allow for running under nodejs/requirejs in tests
const _monaco: typeof monaco =
typeof monaco === 'undefined' ? (<any>self).monaco : monaco;

registerLanguage({
id: 'scheme',
extensions: ['.scm', '.ss', '.sch', '.rkt'],
aliases: ['scheme', 'Scheme'],
loader: () => _monaco.Promise.wrap(import('./scheme')),
});
91 changes: 91 additions & 0 deletions src/scheme/scheme.test.ts
@@ -0,0 +1,91 @@
/*---------------------------------------------------------------------------------------------
* 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('scheme', [
// Keywords
[
{
line: 'define-macro some',
tokens: [
{ startIndex: 0, type: 'keyword.scheme' },
{ startIndex: 12, type: 'white.scheme' },
{ startIndex: 13, type: 'variable.scheme' },
],
},
],

// comments
[
{
line: '; comment',
tokens: [{ startIndex: 0, type: 'comment.scheme' }],
},
],
[
{
line: '|# comment',
tokens: [{ startIndex: 0, type: 'comment.scheme' }],
},
{
line: 'multiline',
tokens: [{ startIndex: 0, type: 'comment.scheme' }],
},
{
line: '#| cons',
tokens: [
{ startIndex: 0, type: 'comment.scheme' },
{ startIndex: 2, type: 'white.scheme' },
{ startIndex: 3, type: 'keyword.scheme' },
],
},
],

// strings
[
{
line: '"\\n string "',
tokens: [
{ startIndex: 0, type: 'string.scheme' },
{ startIndex: 1, type: 'string.escape.scheme' },
{ startIndex: 3, type: 'string.scheme' },
],
},
],
[
{
line: '" string \\',
tokens: [{ startIndex: 0, type: 'string.scheme' }],
},
{
line: 'multiline',
tokens: [{ startIndex: 0, type: 'string.scheme' }],
},
{
line: ' ',
tokens: [
// previous line needs to be terminated with \
{ startIndex: 0, type: 'white.scheme' },
],
},
],

// numbers
[
{
line: '1e2',
tokens: [{ startIndex: 0, type: 'number.float.scheme' }],
},
],
[
{
line: '#x03BB',
tokens: [{ startIndex: 0, type: 'number.hex.scheme' }],
},
],
]);
124 changes: 124 additions & 0 deletions src/scheme/scheme.ts
@@ -0,0 +1,124 @@
/*---------------------------------------------------------------------------------------------
* 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: '"' },
],

surroundingPairs: [
{ open: '{', close: '}' },
{ open: '[', close: ']' },
{ open: '(', close: ')' },
{ open: '"', close: '"' },
],
};

export const language = <ILanguage>{
defaultToken: '',
ignoreCase: true,
tokenPostfix: '.scheme',

brackets: [
{ open: '(', close: ')', token: 'delimiter.parenthesis' },
{ open: '{', close: '}', token: 'delimiter.curly' },
{ open: '[', close: ']', token: 'delimiter.square' },
],

keywords: [
'case',
'do',
'let',
'loop',
'if',
'else',
'when',
'cons',
'car',
'cdr',
'cond',
'lambda',
'lambda*',
'syntax-rules',
'format',
'set!',
'quote',
'eval',
'append',
'list',
'list?',
'member?',
'load',
],

constants: ['#t', '#f'],

operators: ['eq?', 'eqv?', 'equal?', 'and', 'or', 'not', 'null?'],

tokenizer: {
root: [
[/#[xXoObB][0-9a-fA-F]+/, 'number.hex'],
[/[+-]?\d+(?:(?:\.\d*)?(?:[eE][+-]?\d+)?)?/, 'number.float'],

[/(?:\b(?:(define|define-syntax|define-macro))\b)(\s+)((?:\w|\-|\!|\?)*)/, ['keyword', 'white', 'variable']],

[
/[a-zA-Z_#][a-zA-Z0-9_\-\?\!\*]*/,
{
cases: {
'@keywords': 'keyword',
'@constants': 'constant',
'@operators': 'operators',
'@default': 'identifier',
},
},
],

{ include: '@whitespace' },
{ include: '@strings' },
],

comment: [
[/[^\|#]+/, 'comment'],
[/\|\#/, 'comment', '@push'],
[/#\|/, 'comment', '@pop'],
[/[\|#]/, 'comment'],
],

whitespace: [
[/[ \t\r\n]+/, 'white'],
[/\|\#/, 'comment', '@comment'],
[/;.*$/, 'comment'],
],

strings: [
[/"$/, 'string', '@popall'],
[/"(?=.)/, 'string', '@multiLineString'],
],

multiLineString: [
[/\\./, 'string.escape'],
[/"/, 'string', '@popall'],
[/.(?=.*")/, 'string'],
[/.*\\$/, 'string'],
[/.*$/, 'string', '@popall'],
],
},
};
1 change: 1 addition & 0 deletions test/setup.js
Expand Up @@ -65,6 +65,7 @@ define(['require'], function (require) {
'release/dev/redis/redis.test',
'release/dev/csp/csp.test',
'release/dev/st/st.test',
'release/dev/scheme/scheme.test',
], function () {
run(); // We can launch the tests!
}, function (err) {
Expand Down

0 comments on commit 3dd38f1

Please sign in to comment.