From ad6843c9d0ce0a91c03990b9d4f1ef371fe1c4ad Mon Sep 17 00:00:00 2001 From: Guillaume Maudoux Date: Wed, 24 Jan 2018 16:43:45 +0100 Subject: [PATCH] Add support for the Oz language --- AUTHORS.en.txt | 1 + CHANGES.md | 8 ++++ src/languages/oz.js | 80 ++++++++++++++++++++++++++++++++++++++ test/detect/oz/default.txt | 17 ++++++++ 4 files changed, 106 insertions(+) create mode 100644 src/languages/oz.js create mode 100644 test/detect/oz/default.txt diff --git a/AUTHORS.en.txt b/AUTHORS.en.txt index e64be3abab..30b86e2fb8 100644 --- a/AUTHORS.en.txt +++ b/AUTHORS.en.txt @@ -252,3 +252,4 @@ Contributors: - Nicolas LLOBERA - Morten Piibeleht - Martin Clausen +- Guillaume Maudoux diff --git a/CHANGES.md b/CHANGES.md index 05473a2656..45de15c78e 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,11 @@ +## Master (UNRELEASED) + +New languages: + +- *Oz* Esoteric general-purpose language by [Guillaume Maudoux][]. + +[Guillaume Maudoux]: https://github.com/layus + ## Version 9.12.0 New language: diff --git a/src/languages/oz.js b/src/languages/oz.js new file mode 100644 index 0000000000..65ba9dbed5 --- /dev/null +++ b/src/languages/oz.js @@ -0,0 +1,80 @@ +/* +Language: Oz +Author: Guillaume Maudoux +Category: misc +Home page: http://mozart.github.io/ +Description: Oz is a multi-paradigm language that is designed for advanced, + concurrent, networked, soft real-time, and reactive applications. It combines + ongoing research in programming language design and implementation, + constraint logic programming, distributed computing, and human-computer + interfaces. +*/ + +function(hljs) { + var COMMENT = { + variants: [ + hljs.COMMENT('%', '$'), + hljs.COMMENT( '/\\*', '\\*/', {relevance: 0}) + ] + }; + + var IDENTIFIER = { + className: 'title', + variants: [ + { begin: '[A-Z][A-Za-z]*' }, + { begin: '\\$' }, + ] + } + + var OPERATOR = { + className: 'symbol', + variants: [ + { begin: '\\$|\\+|-|==|<=|>=|#|\\|', relevance: 0}, + { begin: '\\\\=|=<', relevance: 10 } + ] + } + + var FUNCTION = { + begin: '(fun|proc)( *lazy)?( *)?\\{', + returnBegin: true, + end: '}', + className: 'function', + relevance: 0, + keywords: { + keyword: 'fun proc', + meta: 'lazy' + }, + contains: [ + { begin: '{ *', end: ' *', contains: [ IDENTIFIER ], relevance: 10 }, + { begin: '!|\\?', className: 'comment', relevance: 10}, + OPERATOR, + ] + }; + + return { + aliases: ['oz'], + keywords: { + keyword: 'andthen at attr case catch choice ' + + 'class cond declare define dis do ' + + 'div else elsecase elseif elseof end ' + + 'export fail feat finally from for ' + + 'functor if import in local ' + + 'lock meth mod not of or orelse ' + + 'prepare prop raise require ' + + 'self skip suchthat then thread try', + literal: 'true false unit', + }, + contains: [ + COMMENT, + FUNCTION, + OPERATOR, + hljs.QUOTE_STRING_MODE, + { className: 'keyword', begin: '\\[\\]' }, + { className: 'literal', begin: "'", end: "'", relevance: 0}, + { className: 'symbol', begin: '`', end: '`' }, + + // No markup, relevance booster + { begin: '\\bnil\\b' }, + ] + }; +} diff --git a/test/detect/oz/default.txt b/test/detect/oz/default.txt new file mode 100644 index 0000000000..e6adff1908 --- /dev/null +++ b/test/detect/oz/default.txt @@ -0,0 +1,17 @@ +declare +proc {Test} %% lazy functions + fun lazy {Next X} X+1 end + A = {Next 42} +in + thread `A` = 43 end +end +{Browse "This is "#'okay'} + +/* Take the head of each list */ +fun {Heads LL} + case LL of nil then nil + [] nil|Ls then {Heads Ls} + [] (H|_)|Ls then H|{Heads Ls} + end +end +{Browse {Heads [ [a aa aaa] [b] nil [d dd] ]}}