diff --git a/etc/config/cppx_blue.default.properties b/etc/config/cppx_blue.default.properties new file mode 100644 index 000000000..d4fb1e940 --- /dev/null +++ b/etc/config/cppx_blue.default.properties @@ -0,0 +1,17 @@ +# Default settings for cppx-blue +compilers=&clang + +group.clang.compilers=bluedefault +group.clang.intelAsm=-mllvm --x86-asm-syntax=intel +compiler.bluedefault.exe=/usr/bin/clang-blue +compiler.bluedefault.name=bluedefault +defaultCompiler=bluedefault +postProcess= +demangler=c++filt +demanglerClassFile=./demangler-cpp +objdumper=objdump +options= +supportsBinary=true +binaryHideFuncRe=^(__.*|_(init|start|fini)|(de)?register_tm_clones|call_gmon_start|frame_dummy|\.plt.*)$ +stubRe=\bmain\b +stubText=int main() { return 0; } \ No newline at end of file diff --git a/etc/config/cppx_gold.defaults.properties b/etc/config/cppx_gold.defaults.properties new file mode 100644 index 000000000..2afcced22 --- /dev/null +++ b/etc/config/cppx_gold.defaults.properties @@ -0,0 +1,16 @@ +# Default settings for cppx-gold +compilers=&clang + +group.gcc.compilers=golddefault +compiler.golddefault.exe=/usr/bin/clang-gold +compiler.golddefault.name=clang default +defaultCompiler=golddefault +postProcess= +demangler=c++filt +demanglerClassFile=./demangler-cpp +objdumper=objdump +options= +supportsBinary=true +binaryHideFuncRe=^(__.*|_(init|start|fini)|(de)?register_tm_clones|call_gmon_start|frame_dummy|\.plt.*)$ +stubRe=\bmain\b +stubText=main() : int! diff --git a/examples/cppx_blue/default.blue b/examples/cppx_blue/default.blue new file mode 100644 index 000000000..46a3d94ba --- /dev/null +++ b/examples/cppx_blue/default.blue @@ -0,0 +1,8 @@ +// Type your code here, or load an example. +int square(int num) { + return num * num; +} + +int main() { + return square(2); +} \ No newline at end of file diff --git a/examples/cppx_gold/default.usyntax b/examples/cppx_gold/default.usyntax new file mode 100644 index 000000000..c60cf31d6 --- /dev/null +++ b/examples/cppx_gold/default.usyntax @@ -0,0 +1,6 @@ +# Type your code here, or load an example. +square(num : int) : int! + return num * num + +main() : int! + return 0 \ No newline at end of file diff --git a/lib/languages.js b/lib/languages.js index ceb11dadc..168031d1a 100644 --- a/lib/languages.js +++ b/lib/languages.js @@ -64,6 +64,18 @@ const languages = { alias: [], previewFilter: /^\s*#include/, }, + cppx_gold: { + name: 'Cppx-Gold', + monaco: 'cppx-gold', + extensions: ['.usyntax', '.cpp', '.cxx', '.h', '.hpp', '.hxx', '.c'], + alias: [], + }, + cppx_blue: { + name: 'Cppx-Blue', + monaco: 'cppp', + extensions: ['.blue', '.cpp', '.cxx', '.h', '.hpp', '.hxx', '.c'], + alias: [], + }, c: { name: 'C', monaco: 'nc', diff --git a/static/modes/cppx-gold-mode.js b/static/modes/cppx-gold-mode.js new file mode 100644 index 000000000..aa492e5b7 --- /dev/null +++ b/static/modes/cppx-gold-mode.js @@ -0,0 +1,274 @@ +// Copyright (c) 2020, Lock3 Software LLC +// All rights reserved. +// Originally based on `./d-mode.js` by Matt Godbolt +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +'use strict'; +var monaco = require('monaco-editor'); + +function definition() { + return { + defaultToken: '', + + brackets: [ + { token: 'delimiter.curly', open: '{', close: '}' }, + { token: 'delimiter.parenthesis', open: '(', close: ')' }, + { token: 'delimiter.square', open: '[', close: ']' }, + { token: 'delimiter.angle', open: '<', close: '>' }, + ], + + keywords: [ + 'array', + 'auto', + 'bool', + 'break', + 'case', + 'catch', + 'char', + 'class', + 'const', + 'constexpr', + 'const_cast', + 'continue', + 'decltype', + 'default', + 'delete', + 'do', + 'dynamic_cast', + 'else', + 'enum', + 'explicit', + 'export', + 'extern', + 'false', + 'final', + 'for', + 'if', + 'in', + 'inline', + 'mutable', + 'namespace', + 'new', + 'noexcept', + 'operator', + 'override', + 'private', + 'protected', + 'public', + 'register', + 'reinterpret_cast', + 'return', + 'sizeof', + 'static', + 'static_assert', + 'static_cast', + 'switch', + 'template', + 'this', + 'thread_local', + 'throw', + 'tile_static', + 'true', + 'try', + 'typedef', + 'typeid', + 'typename', + 'union', + 'using', + 'virtual', + 'void', + 'volatile', + 'wchar_t', + 'where', + 'while', + + // Additional C++ keywords + 'alignas', + 'alignof', + 'and', + 'or', + 'not', + + // Gold specific keywords + 'returns', + 'otherwise', + 'then', + 'until', + 'null', + 'ref', + 'rref', + ], + + typeKeywords: [ + // C++ keywords + 'int', + 'double', + 'float', + + // Gold specific keywords + 'type', + 'uint', + 'uint8', + 'uint16', + 'uint32', + 'uint64', + 'uint128', + 'float16', + 'float32', + 'float64', + 'float128', + 'int8', + 'int16', + 'int32', + 'int64', + 'int128', + 'type', + 'char8', + 'char16', + 'char32', + 'null_t', + ], + + operators: [ + '=', '>', '<', '!', '~', '?', ':', + '==', '<=', '>=', '<>', '&&', '||', + '+', '-', '*', '/', '&', '|', '^', '%', '<<', + '>>', '>>>', '+=', '-=', '*=', '/=', '&=', '|=', + '^=', '%=', '<<=', '>>=', '>>>=', + ], + + symbols: /[=>](?!@symbols)/, '@brackets'], + [/@symbols/, { + cases: { + '@operators': 'operator', + '@default': '', + }, + }], + + // numbers + [/\d*\.\d+([eE][-+]?\d+)?[fFdD]?/, 'number.float'], + [/0[xX][0-9a-fA-F_]*[0-9a-fA-F][Ll]?/, 'number.hex'], + [/0[0-7_]*[0-7][Ll]?/, 'number.octal'], + [/0[bB][0-1_]*[0-1][Ll]?/, 'number.binary'], + [/\d+[lL]?/, 'number'], + + // strings + [/"([^"\\]|\\.)*$/, 'string.invalid'], // non-teminated string + [/"/, 'string', '@string'], + + // characters + [/'[^\\']+'/, 'string'], + [/(')(@escapes)(')/, ['string', 'string.escape', 'string']], + [/'/, 'string.invalid'], + ], + + // strings + string: [ + [/[^\\"]+/, 'string'], + [/@escapes/, 'string.escape'], + [/"/, 'string', '@pop'], + ], + + // characters + characters: [ + [/'[^\\']+'/, 'string'], + [/(')(@escapes)(')/, ['string', 'string.escape', 'string']], + [/'/, 'string.invalid'], + ], + + whitespace: [ + [/[ \t\r\n]+/, 'white'], + [/<#/, 'comment', '@nestingcomment'], + [/#.*$/, 'comment'], + ], + + comment: [ + [/[#]/, 'comment'], + ], + + nestingcomment: [ + [/[^<#]+/, 'comment'], + [/<#/, 'comment', '@push'], + [/<#/, 'comment.invalid'], + [/#>/, 'comment', '@pop'], + [/[<#]/, 'comment'], + ], + }, + }; +} + +function configuration() { + return { + comments: { + lineComment: '#', + blockComment: ['<#', '#>'], + }, + + brackets: [ + ['{', '}'], + ['[', ']'], + ['(', ')'], + ], + + autoClosingPairs: [ + { open: '[', close: ']' }, + { open: '{', close: '}' }, + { open: '(', close: ')' }, + { open: '\'', close: '\'', notIn: ['string', 'comment'] }, + { open: '"', close: '"', notIn: ['string'] }, + ], + + surroundingPairs: [ + { open: '{', close: '}' }, + { open: '[', close: ']' }, + { open: '(', close: ')' }, + { open: '"', close: '"' }, + { open: '\'', close: '\'' }, + ], + }; +} + +monaco.languages.register({id: 'cppx-gold'}); +monaco.languages.setMonarchTokensProvider('cppx-gold', definition()); +monaco.languages.setLanguageConfiguration('cppx-gold', configuration()); diff --git a/static/panes/editor.js b/static/panes/editor.js index 90654dc66..e6c71cffb 100644 --- a/static/panes/editor.js +++ b/static/panes/editor.js @@ -35,6 +35,7 @@ var local = require('../local'); var ga = require('../analytics'); var monacoVim = require('monaco-vim'); require('../modes/cppp-mode'); +require('../modes/cppx-gold-mode'); require('../modes/d-mode'); require('../modes/ispc-mode'); require('../modes/llvm-ir-mode');