From 816867385f194e5c3889e360b574de9e396a14e6 Mon Sep 17 00:00:00 2001 From: justinc11 <18541397+justinc11@users.noreply.github.com> Date: Fri, 30 Aug 2019 22:31:58 -0400 Subject: [PATCH] Add JSL lexer (#871) This commit adds a lexer for the JMP Scripting Language. --- lib/rouge/demos/jsl | 3 +++ lib/rouge/lexers/jsl.rb | 55 +++++++++++++++++++++++++++++++++++++++++ spec/lexers/jsl_spec.rb | 15 +++++++++++ spec/visual/samples/jsl | 24 ++++++++++++++++++ 4 files changed, 97 insertions(+) create mode 100644 lib/rouge/demos/jsl create mode 100644 lib/rouge/lexers/jsl.rb create mode 100644 spec/lexers/jsl_spec.rb create mode 100644 spec/visual/samples/jsl diff --git a/lib/rouge/demos/jsl b/lib/rouge/demos/jsl new file mode 100644 index 0000000000..6c3c39f914 --- /dev/null +++ b/lib/rouge/demos/jsl @@ -0,0 +1,3 @@ +// Create Distribution of Big Class +dt = open( "$sample_data\big class.jmp" ); +dt << Distribution( Column( :age ), Histograms Only( 1 ) ); diff --git a/lib/rouge/lexers/jsl.rb b/lib/rouge/lexers/jsl.rb new file mode 100644 index 0000000000..1c9377d58a --- /dev/null +++ b/lib/rouge/lexers/jsl.rb @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +module Rouge + module Lexers + class JSL < RegexLexer + title "JSL" + desc "The JMP Scripting Language (JSL) (jmp.com)" + + tag 'jsl' + filenames '*.jsl' + + state :root do + rule %r/\s+/m, Text::Whitespace + + rule %r(//.*?$), Comment::Single + rule %r(/\*.*?\*/)m, Comment::Multiline + + # messages + rule %r/(<<)(.*?)(\(|;)/ do |m| + groups Operator, Name::Function, Punctuation + end + + # covers built-in and custom functions + rule %r/([a-z_][\w\s'%.\\]*)(\()/i do |m| + groups Keyword, Punctuation + end + + rule %r/\b[+-]?(?:[0-9]+(?:\.[0-9]+)?|\.[0-9]+|\.)(?:e[+-]?[0-9]+)?i?\b/i, Num + + rule %r/\d{2}(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)\d{2}(\d{2})?(:\d{2}:\d{2}(:\d{2}(\.\d*)?)?)?/i, Literal::Date + + rule %r/::[a-z_][\w\s'%.\\]*/i, Name::Variable + rule %r/:\w+/, Name + rule %r/[a-z_][\w\s'%.\\]*/i, Name::Variable + rule %r/"(?:\\!"|[^"])*?"n/m, Name::Variable + + rule %r/(")(\\\[)(.*?)(\]\\)(")/m do + groups Str::Double, Str::Escape, Str::Double, Str::Escape, Str::Double # escaped string + end + rule %r/"/, Str::Double, :dq + + rule %r/[-+*\/!%&<>\|=:]/, Operator + rule %r/[\[\](){},;]/, Punctuation + end + + state :dq do + rule %r/\\![btrnNf0\\"]/, Str::Escape + rule %r/\\/, Str::Double + rule %r/"/, Str::Double, :pop! + rule %r/[^\\"]*/m, Str::Double + end + end + end +end diff --git a/spec/lexers/jsl_spec.rb b/spec/lexers/jsl_spec.rb new file mode 100644 index 0000000000..e88469d1b0 --- /dev/null +++ b/spec/lexers/jsl_spec.rb @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- # +# frozen_string_literal: true + +describe Rouge::Lexers::JSL do + let(:subject) { Rouge::Lexers::JSL.new } + + describe 'guessing' do + include Support::Guessing + + it 'guesses by filename' do + assert_guess :filename => 'foo.jsl' + end + + end +end diff --git a/spec/visual/samples/jsl b/spec/visual/samples/jsl new file mode 100644 index 0000000000..8eeae87ace --- /dev/null +++ b/spec/visual/samples/jsl @@ -0,0 +1,24 @@ +// Single Line Comment +dt = open( "$sample_data\big class.jmp" ); +dt << Distribution( Column( :age ), Histograms Only( 1 ) ); +/* + Multi-line comment +*/ + +escapeSequence = "This is an \!b escaped sequence"; +escapeQuote = "This is a \!" quotation mark"; +escapeStr = "\[This is """"""" an escaped string]\" + +list = List( 1, 3, 5 ); +alsoAList = {7,9,11}; +a name with spaces = 5; +"a-name!with\!"special\characters"n = 5; + +scientificNotation = 5e9; +decimal = 1.234; +date = 01jan00; +dateTime = 12dec1999:12:30:00.45; + +New Window( "Rouge Test", + Text Box( "Syntax highlighting is great!" ) +);