mirror of
https://github.com/compiler-explorer/compiler-explorer.git
synced 2025-12-27 10:33:59 -05:00
OCaml language support
This commit is contained in:
20
etc/config/ocaml.amazon.properties
Normal file
20
etc/config/ocaml.amazon.properties
Normal file
@@ -0,0 +1,20 @@
|
||||
compilers=&ocaml
|
||||
defaultCompiler=ocaml4071flambda
|
||||
|
||||
group.ocaml.compilers=ocaml4042:ocaml4061:ocaml4071:ocaml4071flambda
|
||||
group.ocaml.isSemVer=true
|
||||
group.ocaml.baseName=x86-64 ocamlopt
|
||||
|
||||
compiler.ocaml4042.exe=/opt/compiler-explorer/ocaml-4.04.2/usr/bin/ocamlopt
|
||||
compiler.ocaml4042.semver=4.04.2
|
||||
compiler.ocaml4061.exe=/opt/compiler-explorer/ocaml-4.06.1/usr/bin/ocamlopt
|
||||
compiler.ocaml4061.semver=4.06.1
|
||||
compiler.ocaml4071.exe=/opt/compiler-explorer/ocaml-4.07.1/usr/bin/ocamlopt
|
||||
compiler.ocaml4071.semver=4.07.1
|
||||
compiler.ocaml4071flambda.exe=/opt/compiler-explorer/ocaml-4.07.1+flambda/usr/bin/ocamlopt
|
||||
compiler.ocaml4071flambda.semver=4.07.1+flambda
|
||||
|
||||
#################################
|
||||
#################################
|
||||
# Installed libs (See c++.amazon.properties for a scheme of libs group)
|
||||
libs=
|
||||
9
etc/config/ocaml.defaults.properties
Normal file
9
etc/config/ocaml.defaults.properties
Normal file
@@ -0,0 +1,9 @@
|
||||
compilers=/usr/bin/ocamlopt
|
||||
supportsBinary=false
|
||||
compilerType=ocaml
|
||||
|
||||
|
||||
#################################
|
||||
#################################
|
||||
# Installed libs (See c++.amazon.properties for a scheme of libs group)
|
||||
libs=
|
||||
1
examples/ocaml/default.ml
Normal file
1
examples/ocaml/default.ml
Normal file
@@ -0,0 +1 @@
|
||||
let square x = x * x
|
||||
8
examples/ocaml/max_array.ml
Normal file
8
examples/ocaml/max_array.ml
Normal file
@@ -0,0 +1,8 @@
|
||||
let max_array array =
|
||||
let max = ref 0 in
|
||||
for i = 0 to Array.length array do
|
||||
let el = array.(i) in
|
||||
if el > !max
|
||||
then max := el;
|
||||
done;
|
||||
!max
|
||||
5
examples/ocaml/sum.ml
Normal file
5
examples/ocaml/sum.ml
Normal file
@@ -0,0 +1,5 @@
|
||||
let sum l =
|
||||
let rec sum' acc = function
|
||||
| [] -> acc
|
||||
| x::tl -> sum' (acc + x) tl
|
||||
in sum' 0 l
|
||||
40
lib/compilers/ocaml.js
Normal file
40
lib/compilers/ocaml.js
Normal file
@@ -0,0 +1,40 @@
|
||||
// Copyright (c) 2018, Eugen Bulavin
|
||||
// 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 BaseCompiler = require('../base-compiler'),
|
||||
path = require("path");
|
||||
|
||||
class OCamlCompiler extends BaseCompiler {
|
||||
optionsForFilter() {
|
||||
return ['-S', '-g'];
|
||||
}
|
||||
|
||||
getOutputFilename(dirPath) {
|
||||
return path.join(dirPath, `${path.basename(this.compileFilename, this.lang.extensions[0])}.s`);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = OCamlCompiler;
|
||||
@@ -101,6 +101,12 @@ const languages = {
|
||||
extensions: ['.hs', '.haskell'],
|
||||
alias: []
|
||||
},
|
||||
ocaml: {
|
||||
name: 'OCaml',
|
||||
monaco: 'ocaml',
|
||||
extensions: ['.ml', '.mli'],
|
||||
alias: []
|
||||
},
|
||||
swift: {
|
||||
name: 'Swift',
|
||||
monaco: 'swift',
|
||||
|
||||
135
static/modes/ocaml-mode.js
Normal file
135
static/modes/ocaml-mode.js
Normal file
@@ -0,0 +1,135 @@
|
||||
// Copyright (c) 2018, Eugen Bulavin
|
||||
// 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";
|
||||
|
||||
var monaco = require('../monaco');
|
||||
|
||||
function definition() {
|
||||
return {
|
||||
keywords: [
|
||||
'and',
|
||||
'as',
|
||||
'assert',
|
||||
'asr',
|
||||
'begin',
|
||||
'class',
|
||||
'constraint',
|
||||
'do',
|
||||
'done',
|
||||
'downto',
|
||||
'else',
|
||||
'end',
|
||||
'exception',
|
||||
'external',
|
||||
'false',
|
||||
'for',
|
||||
'fun',
|
||||
'function',
|
||||
'functor',
|
||||
'if',
|
||||
'in',
|
||||
'include',
|
||||
'inherit',
|
||||
'initializer',
|
||||
'land',
|
||||
'lazy',
|
||||
'let',
|
||||
'lor',
|
||||
'lsl',
|
||||
'lsr',
|
||||
'lxor',
|
||||
'match',
|
||||
'method',
|
||||
'mod',
|
||||
'module',
|
||||
'mutable',
|
||||
'new',
|
||||
'nonrec',
|
||||
'object',
|
||||
'of',
|
||||
'open',
|
||||
'or',
|
||||
'private',
|
||||
'rec',
|
||||
'sig',
|
||||
'struct',
|
||||
'then',
|
||||
'to',
|
||||
'true',
|
||||
'try',
|
||||
'type',
|
||||
'val',
|
||||
'virtual',
|
||||
'when',
|
||||
'while',
|
||||
'with',
|
||||
],
|
||||
|
||||
typeKeywords: [
|
||||
'int',
|
||||
'int32',
|
||||
'int64',
|
||||
'bool',
|
||||
'char',
|
||||
'unit',
|
||||
],
|
||||
|
||||
numbers: /-?[0-9.]/,
|
||||
|
||||
tokenizer: {
|
||||
root: [
|
||||
// identifiers and keywords
|
||||
[/[a-z_$][\w$]*/, {
|
||||
cases: {
|
||||
'@typeKeywords': 'keyword',
|
||||
'@keywords': 'keyword',
|
||||
'@default': 'identifier'
|
||||
}
|
||||
}],
|
||||
|
||||
{ include: '@whitespace' },
|
||||
|
||||
[/@numbers/, 'number'],
|
||||
|
||||
[/[+\-*/=<>$@]/, 'operators'],
|
||||
|
||||
[/(")(.*)(")/, ['string', 'string', 'string']]
|
||||
],
|
||||
|
||||
comment: [
|
||||
[/[^(*]+/, 'comment'],
|
||||
[/\*\)/, 'comment', '@pop'],
|
||||
],
|
||||
|
||||
whitespace: [
|
||||
[/[ \t\r\n]+/, 'white'],
|
||||
[/\(\*/, 'comment', '@comment'],
|
||||
],
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
monaco.languages.register({id: 'ocaml'});
|
||||
monaco.languages.setMonarchTokensProvider('ocaml', definition());
|
||||
@@ -39,6 +39,7 @@ require('../modes/rust-mode');
|
||||
require('../modes/ispc-mode');
|
||||
require('../modes/llvm-ir-mode');
|
||||
require('../modes/haskell-mode');
|
||||
require('../modes/ocaml-mode');
|
||||
require('../modes/clean-mode');
|
||||
require('../modes/pascal-mode');
|
||||
require('../modes/cuda-mode');
|
||||
|
||||
Reference in New Issue
Block a user