summaryrefslogtreecommitdiff
path: root/vendor/bundle/ruby/3.4.0/gems/rouge-4.5.2/lib/rouge/lexers/magik.rb
blob: 0a3f47aa1b242f051efbd523acf92a92ae6a1b52 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# -*- coding: utf-8 -*- #
# frozen_string_literal: true

module Rouge
  module Lexers
    class Magik < RegexLexer
      title "Magik"
      desc "Smallworld Magik"
      tag 'magik'
      filenames '*.magik'
      mimetypes 'text/x-magik', 'application/x-magik'

      def self.keywords
        @keywords ||= %w(
           _package
           _pragma
           _block _endblock
           _handling _default
           _protect _protection _endprotect
           _try _with _when _endtry
           _catch _endcatch
           _throw
           _lock _endlock
           _if _then _elif _else _endif
           _for _over _while _loop _finally _endloop _loopbody _continue _leave
           _return
           _class
           _local _constant _recursive _global _dynamic _import
           _private _iter _abstract _method _endmethod
           _proc _endproc
           _gather _scatter _allresults _optional
           _thisthread _self _clone _super
           _primitive
           _unset _true _false _maybe
           _is _isnt _not _and _or _xor _cf _andif _orif
           _div _mod
        )
      end

      def self.string_double
        @string_double ||= /"[^"\n]*?"/
      end
      def self.string_single
        @string_single ||= /'[^'\n]*?'/
      end

      def self.digits
        @digits ||= /[0-9]+/
      end
      def self.radix
        @radix ||= /r[0-9a-z]/i
      end
      def self.exponent
        @exponent ||= /(e|&)[+-]?#{Magik.digits}/i
      end
      def self.decimal
        @decimal ||= /\.#{Magik.digits}/
      end
      def self.number
        @number = /#{Magik.digits}(#{Magik.radix}|#{Magik.exponent}|#{Magik.decimal})*/
      end

      def self.character
        @character ||= /%u[0-9a-z]{4}|%[^\s]+/i
      end

      def self.simple_identifier
        @simple_identifier ||= /(?>(?:[a-z0-9_!?]|\\.)+)/i
      end
      def self.piped_identifier
        @piped_identifier ||= /\|[^\|\n]*\|/
      end
      def self.identifier
        @identifier ||= /(?:#{Magik.simple_identifier}|#{Magik.piped_identifier})+/i
      end
      def self.package_identifier
        @package_identifier ||= /#{Magik.identifier}:#{Magik.identifier}/
      end
      def self.symbol
        @symbol ||= /:#{Magik.identifier}/i
      end
      def self.global_ref
        @global_ref ||= /@[\s]*#{Magik.identifier}:#{Magik.identifier}/
      end
      def self.label
        @label = /@[\s]*#{Magik.identifier}/
      end

      state :root do
        rule %r/##(.*)?/, Comment::Doc
        rule %r/#(.*)?/, Comment::Single

        rule %r/(_method)(\s+)/ do
          groups Keyword, Text::Whitespace
          push :method_name
        end

        rule %r/(?:#{Magik.keywords.join('|')})\b/, Keyword

        rule Magik.string_double, Literal::String
        rule Magik.string_single, Literal::String
        rule Magik.symbol, Str::Symbol
        rule Magik.global_ref, Name::Label
        rule Magik.label, Name::Label
        rule Magik.character, Literal::String::Char
        rule Magik.number, Literal::Number
        rule Magik.package_identifier, Name
        rule Magik.identifier, Name

        rule %r/[\[\]{}()\.,;]/, Punctuation
        rule %r/\$/, Punctuation
        rule %r/(<<|^<<)/, Operator
        rule %r/(>>)/, Operator
        rule %r/[-~+\/*%=&^<>]|!=/, Operator

        rule %r/[\s]+/, Text::Whitespace
      end

      state :method_name do
        rule %r/(#{Magik.identifier})(\.)(#{Magik.identifier})/ do
          groups Name::Class, Punctuation, Name::Function
          pop!
        end
      end
    end
  end
end