Add the jakt programming language (#3845)

This commit is contained in:
TrMen
2022-07-09 17:03:23 +02:00
committed by GitHub
parent 8a72ddc559
commit ed4c5814ae
10 changed files with 344 additions and 0 deletions

3
.github/labeler.yml vendored
View File

@@ -55,6 +55,9 @@ lang-fortran:
- lib/compilers/flang.ts
- lib/compilers/fortran.js
- etc/config/fortran.*.properties
lang-jakt:
- lib/compilers/jakt.ts
- etc/config/jakt.*.properties
lang-go:
- lib/compilers/golang.js
- etc/config/go.*.properties

View File

@@ -0,0 +1,19 @@
compilers=rustbased:selfhosted
defaultCompiler=selfhosted
externalparser=CEAsmParser
externalparser.exe=/usr/local/bin/asm-parser
objdumper=/opt/compiler-explorer/gcc-12.1.0/bin/objdump
supportsBinary=true
supportsExecute=true
versionFlag=--version
compilerType=jakt
compiler.rustbased.exe=/opt/compiler-explorer/jakt-trunk/jakt-rs
compiler.rustbased.name=jakt (Written in Rust)
compiler.rustbased.options=--runtime-path /opt/compiler-explorer/jakt-trunk/runtime --prettify-cpp-source --clang-format-path /opt/compiler-explorer/clang-trunk/bin/clang-format --dot-clang-format-path /opt/compiler-explorer/jakt-trunk/.clang-format --cxx-compiler-path /opt/compiler-explorer/clang-trunk/bin/clang++
compiler.selfhosted.exe=/opt/compiler-explorer/jakt-trunk/jakt-selfhost
compiler.selfhosted.name=jakt (Selfhosted)
compiler.selfhosted.options=-b --runtime-path /opt/compiler-explorer/jakt-trunk/runtime --prettify-cpp-source --clang-format-path /opt/compiler-explorer/clang-trunk/bin/clang-format --dot-clang-format-path /opt/compiler-explorer/jakt-trunk/.clang-format --cxx-compiler-path /opt/compiler-explorer/clang-trunk/bin/clang++

View File

@@ -0,0 +1,14 @@
# Default settings for Jakt
objdumper=objdump
supportsBinary=true
supportsExecute=true
versionFlag=--version
compilerType=jakt
compilers=jakt
defaultCompiler=jakt
compiler.jakt.exe=/usr/bin/jakt
compiler.jakt.name=jakt
compiler.jakt.options=--prettify-cpp-source

View File

@@ -0,0 +1,7 @@
function square(num: i32) -> i32 {
return num * num
}
function main() {
return square(num: 3)
}

View File

@@ -52,6 +52,7 @@ export {GCCRSCompiler} from './gccrs';
export {GolangCompiler} from './golang';
export {HaskellCompiler} from './haskell';
export {ISPCCompiler} from './ispc';
export {JaktCompiler} from './jakt';
export {JavaCompiler} from './java';
export {KotlinCompiler} from './kotlin';
export {LDCCompiler} from './ldc';

83
lib/compilers/jakt.ts Normal file
View File

@@ -0,0 +1,83 @@
// Copyright (c) 2022, Compiler Explorer Authors
// All rights reserved.
//
// 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.
import path from 'path';
import {ExecutionOptions} from '../../types/compilation/compilation.interfaces';
import {ParseFilters} from '../../types/features/filters.interfaces';
import {BaseCompiler} from '../base-compiler';
import * as exec from '../exec';
export class JaktCompiler extends BaseCompiler {
static get key() {
return 'jakt';
}
constructor(info, env) {
super(info, env);
// TODO: The jakt compiler emits a file by the same name as the input,
// so this won't work if we have another input file that isn't called example.jakt
this.outputFilebase = 'example';
}
override optionsForFilter(filters: ParseFilters, outputFilename: any) {
return ['--binary-dir', path.dirname(outputFilename)];
}
override getObjdumpOutputFilename(defaultOutputFilename) {
const parsed_path = path.parse(defaultOutputFilename);
return path.join(parsed_path.dir, parsed_path.name);
}
override getExecutableFilename(dirPath, outputFilebase, key?) {
return path.join(dirPath, outputFilebase);
}
// We have no dynamic linking in Jakt
override getSharedLibraryPathsAsArguments(libraries, libDownloadPath) {
return [];
}
// We have no dynamic linking in Jakt
override getSharedLibraryLinks(libraries): string[] {
return [];
}
override getOutputFilename(dirPath: string, outputFilebase: string, key?: any): string {
return path.join(dirPath, `${outputFilebase}.cpp`);
}
override async exec(filepath: string, args: string[], execOptions: ExecutionOptions) {
return exec.execute(filepath, args, execOptions).then(result => {
if (result.code !== 0) {
// We still want to display the transpiled C++, even if it can't execute.
// So fake a successful execute here.
result.code = 0;
}
return result;
});
}
}

View File

@@ -33,6 +33,16 @@ type DefKeys = 'name' | 'monaco' | 'extensions' | 'alias' | 'previewFilter' | 'f
type LanguageDefinition = Pick<Language, DefKeys>;
const definitions: Record<LanguageKey, LanguageDefinition> = {
jakt: {
name: 'Jakt',
monaco: 'jakt',
extensions: ['.jakt'],
alias: [],
logoUrl: '',
logoUrlDark: null,
formatter: null,
previewFilter: null,
},
'c++': {
name: 'C++',
monaco: 'cppp',

View File

@@ -41,6 +41,7 @@ import './fortran-mode';
import './gccdump-rtl-gimple-mode';
import './haskell-mode';
import './ispc-mode';
import './jakt-mode';
import './llvm-ir-mode';
import './mlir-mode';
import './nc-mode';

205
static/modes/jakt-mode.ts Normal file
View File

@@ -0,0 +1,205 @@
// Copyright (c) 2022, Compiler Explorer Authors
// All rights reserved.
//
// 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';
const monaco = require('monaco-editor');
function definition() {
return {
defaultToken: 'invalid',
keywords: [
'struct',
'class',
'enum',
'namespace',
'if',
'else',
'match',
'while',
'for',
'loop',
'return',
'break',
'continue',
'throw',
'yield',
'function',
'extern',
'import',
'throws',
'defer',
'unsafe',
'cpp',
'try',
'catch',
'mut',
'let',
'anon',
'raw',
'private',
'public',
'true',
'false',
'weak',
],
typeKeywords: [
'Optional',
'String',
'i8',
'i16',
'i32',
'i64',
'f32',
'f64',
'bool',
'c_int',
'c_char',
'usize',
'void',
],
operators: [
'=>',
'..',
'?',
'and',
'not',
'or',
'as',
'in',
'+',
'-',
'/',
'*',
'=',
'^',
'&',
'!',
'>',
'<',
'%',
'<<',
'>>',
'+=',
'-=',
'/=',
'*=',
'==',
'^=',
'&=',
'?=',
'|=',
'!=',
'>=',
'<=',
'%=',
'<<=',
'>>=',
],
symbols: /[=><!~?:&|+\-*/^%]+/,
escapes: /\\(?:[abfnrtv\\"']|x[0-9A-Fa-f]{1,4}|u[0-9A-Fa-f]{4}|U[0-9A-Fa-f]{8})/,
tokenizer: {
root: [
// identifiers and keywords
[
/[a-z_$][\w$]*/,
{
cases: {
'@typeKeywords': 'keyword',
'@keywords': 'keyword',
'@default': 'identifier',
},
},
],
[/[A-Z][\w$]*/, 'type.identifier'], // to show class names nicely
// whitespace
{include: '@whitespace'},
// delimiters and operators
[/[{}()[\]]/, '@brackets'],
[/[<>](?!@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'],
[/0o[0-7_]*[0-7][Ll]?/, 'number.octal'],
[/0[bB][0-1_]*[0-1][Ll]?/, 'number.binary'],
[/\d+/, 'number'],
// delimiter: after number because of .\d floats
[/[;,.]/, 'delimiter'],
// strings
[/"([^"\\]|\\.)*$/, 'string.invalid'], // non-teminated string
[/c?\\\\.*$/, 'string'],
[/c?"/, 'string', '@string'],
// characters
[/'[^\\']'/, 'string'],
[/(')(@escapes)(')/, ['string', 'string.escape', 'string']],
[/'/, 'string.invalid'],
],
whitespace: [
[/[ \r\n]+/, 'white'],
[/\/\*/, 'comment', '@comment'],
[/\/\+/, 'comment', '@comment'],
[/\/\/.*$/, 'comment'],
[/\t/, 'comment.invalid'],
],
comment: [
[/[^/*]+/, 'comment'],
[/\/\*/, 'comment.invalid'],
[/[/*]/, 'comment'],
],
string: [
[/[^\\"]+/, 'string'],
[/@escapes/, 'string.escape'],
[/\\./, 'string.escape.invalid'],
[/"/, 'string', '@pop'],
],
},
};
}
monaco.languages.register({id: 'jakt'});
monaco.languages.setMonarchTokensProvider('jakt', definition());
export {};

View File

@@ -24,6 +24,7 @@
export type LanguageKey =
| 'mlir'
| 'jakt'
| 'c++'
| 'llvm'
| 'cppx'