summaryrefslogtreecommitdiff
path: root/vendor/bundle/ruby/3.4.0/gems/rouge-4.7.0/lib/rouge/lexers/isabelle.rb
blob: 6b97b22a178891168d05a9d11e5b2bfbb7674fe1 (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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
# -*- coding: utf-8 -*- #
# frozen_string_literal: true
# Lexer adapted from https://github.com/pygments/pygments/blob/ad55974ce83b85dbb333ab57764415ab84169461/pygments/lexers/theorem.py

module Rouge
  module Lexers
    class Isabelle < RegexLexer
      title "Isabelle"
      desc 'Isabelle theories (isabelle.in.tum.de)'
      tag 'isabelle'
      aliases 'isa', 'Isabelle'
      filenames '*.thy'
      mimetypes 'text/x-isabelle'

      def self.keyword_minor
        @keyword_minor ||= Set.new %w(
          and assumes attach avoids binder checking
          class_instance class_relation code_module congs
          constant constrains datatypes defines file fixes
          for functions hints identifier if imports in
          includes infix infixl infixr is keywords lazy
          module_name monos morphisms no_discs_sels notes
          obtains open output overloaded parametric permissive
          pervasive rep_compat shows structure type_class
          type_constructor unchecked unsafe where
        )
      end

      def self.keyword_diag
        @keyword_diag ||= Set.new %w(
          ML_command ML_val class_deps code_deps code_thms
          display_drafts find_consts find_theorems find_unused_assms
          full_prf help locale_deps nitpick pr prf
          print_abbrevs print_antiquotations print_attributes
          print_binds print_bnfs print_bundles
          print_case_translations print_cases print_claset
          print_classes print_codeproc print_codesetup
          print_coercions print_commands print_context
          print_defn_rules print_dependencies print_facts
          print_induct_rules print_inductives print_interps
          print_locale print_locales print_methods print_options
          print_orders print_quot_maps print_quotconsts
          print_quotients print_quotientsQ3 print_quotmapsQ3
          print_rules print_simpset print_state print_statement
          print_syntax print_theorems print_theory print_trans_rules
          prop pwd quickcheck refute sledgehammer smt_status
          solve_direct spark_status term thm thm_deps thy_deps
          try try0 typ unused_thms value values welcome
          print_ML_antiquotations print_term_bindings values_prolog
        )
      end

      def self.keyword_thy
        @keyword_thy ||= Set.new %w(theory begin end)
      end

      def self.keyword_section
        @keyword_section ||= Set.new %w(header chapter)
      end

      def self.keyword_subsection
        @keyword_subsection ||= Set.new %w(section subsection subsubsection sect subsect subsubsect)
      end

      def self.keyword_theory_decl
        @keyword_theory_decl ||= Set.new %w(
          ML ML_file abbreviation adhoc_overloading arities
          atom_decl attribute_setup axiomatization bundle
          case_of_simps class classes classrel codatatype
          code_abort code_class code_const code_datatype
          code_identifier code_include code_instance code_modulename
          code_monad code_printing code_reflect code_reserved
          code_type coinductive coinductive_set consts context
          datatype datatype_new datatype_new_compat declaration
          declare default_sort defer_recdef definition defs
          domain domain_isomorphism domaindef equivariance
          export_code extract extract_type fixrec fun
          fun_cases hide_class hide_const hide_fact hide_type
          import_const_map import_file import_tptp import_type_map
          inductive inductive_set instantiation judgment lemmas
          lifting_forget lifting_update local_setup locale
          method_setup nitpick_params no_adhoc_overloading
          no_notation no_syntax no_translations no_type_notation
          nominal_datatype nonterminal notation notepad oracle
          overloading parse_ast_translation parse_translation
          partial_function primcorec primrec primrec_new
          print_ast_translation print_translation quickcheck_generator
          quickcheck_params realizability realizers recdef record
          refute_params setup setup_lifting simproc_setup
          simps_of_case sledgehammer_params spark_end spark_open
          spark_open_siv spark_open_vcg spark_proof_functions
          spark_types statespace syntax syntax_declaration text
          text_raw theorems translations type_notation
          type_synonym typed_print_translation typedecl hoarestate
          install_C_file install_C_types wpc_setup c_defs c_types
          memsafe SML_export SML_file SML_import approximate
          bnf_axiomatization cartouche datatype_compat
          free_constructors functor nominal_function
          nominal_termination permanent_interpretation
          binds defining smt2_status term_cartouche
          boogie_file text_cartouche
        )
      end

      def self.keyword_theory_script
        @keyword_theory_script ||= Set.new %w(inductive_cases inductive_simps)
      end

      def self.keyword_theory_goal
        @keyword_theory_goal ||= Set.new %w(
          ax_specification bnf code_pred corollary cpodef
          crunch crunch_ignore
          enriched_type function instance interpretation lemma
          lift_definition nominal_inductive nominal_inductive2
          nominal_primrec pcpodef primcorecursive
          quotient_definition quotient_type recdef_tc rep_datatype
          schematic_corollary schematic_lemma schematic_theorem
          spark_vc specification subclass sublocale termination
          theorem typedef wrap_free_constructors
        )
      end

      def self.keyword_qed
        @keyword_qed ||= Set.new %w(by done qed)
      end

      def self.keyword_abandon_proof
        @keyword_abandon_proof ||= Set.new %w(sorry oops)
      end

      def self.keyword_proof_goal
        @keyword_proof_goal ||= Set.new %w(have hence interpret)
      end

      def self.keyword_proof_block
        @keyword_proof_block ||= Set.new %w(next proof)
      end

      def self.keyword_proof_chain
        @keyword_proof_chain ||= Set.new %w(finally from then ultimately with)
      end

      def self.keyword_proof_decl
        @keyword_proof_decl ||= Set.new %w(
          ML_prf also include including let moreover note
          txt txt_raw unfolding using write
        )
      end

      def self.keyword_proof_asm
        @keyword_proof_asm ||= Set.new %w(assume case def fix presume)
      end

      def self.keyword_proof_asm_goal
        @keyword_proof_asm_goal ||= Set.new %w(guess obtain show thus)
      end

      def self.keyword_proof_script
        @keyword_proof_script ||= Set.new %w(apply apply_end apply_trace back defer prefer)
      end

      state :root do
        rule %r/\s+/, Text::Whitespace
        rule %r/\(\*/, Comment, :comment
        rule %r/\{\*|‹/, Text, :text

        rule %r/::|\[|\]|-|[:()_=,|+!?]/, Operator
        rule %r/[{}.]|\.\./, Operator::Word

        def word(keywords)
          return %r/\b(#{keywords.join('|')})\b/
        end

        rule %r/[a-zA-Z]\w*/ do |m|
          sym = m[0]

          if self.class.keyword_minor.include?(sym) ||
            self.class.keyword_proof_script.include?(sym)
            token Keyword::Pseudo
          elsif self.class.keyword_diag.include?(sym)
            token Keyword::Type
          elsif self.class.keyword_thy.include?(sym) ||
            self.class.keyword_theory_decl.include?(sym) ||
            self.class.keyword_qed.include?(sym) ||
            self.class.keyword_proof_goal.include?(sym) ||
            self.class.keyword_proof_block.include?(sym) ||
            self.class.keyword_proof_decl.include?(sym) ||
            self.class.keyword_proof_chain.include?(sym) ||
            self.class.keyword_proof_asm.include?(sym) ||
            self.class.keyword_proof_asm_goal.include?(sym)
            token Keyword
          elsif self.class.keyword_section.include?(sym)
            token Generic::Heading
          elsif self.class.keyword_subsection.include?(sym)
            token Generic::Subheading
          elsif self.class.keyword_theory_goal.include?(sym) ||
            self.class.keyword_theory_script.include?(sym)
            token Keyword::Namespace
          elsif self.class.keyword_abandon_proof.include?(sym)
            token Generic::Error
          else
            token Name
          end
        end

        rule %r/\\<\w*>/, Str::Symbol

        rule %r/'[^\W\d][.\w']*/, Name::Variable

        rule %r/0[xX][\da-fA-F][\da-fA-F_]*/, Num::Hex
        rule %r/0[oO][0-7][0-7_]*/, Num::Oct
        rule %r/0[bB][01][01_]*/, Num::Bin

        rule %r/"/, Str, :string
        rule %r/`/, Str::Other, :fact
        # Everything except for (most) operators whitespaces may be name
        rule %r/[^\s:|\[\]\-()=,+!?{}._][^\s:|\[\]\-()=,+!?{}]*/, Name
      end

      state :comment do
        rule %r/[^(*)]+/, Comment
        rule %r/\(\*/, Comment, :comment
        rule %r/\*\)/, Comment, :pop!
        rule %r/[(*)]/, Comment
      end

      state :text do
        rule %r/[^{*}‹›]+/, Text
        rule %r/\{\*|‹/, Text, :text
        rule %r/\*\}|›/, Text, :pop!
        rule %r/[{*}]/, Text
      end

      state :string do
        rule %r/[^"\\]+/, Str
        rule %r/\\<\w*>/, Str::Symbol
        rule %r/\\"/, Str
        rule %r/\\/, Str
        rule %r/"/, Str, :pop!
      end

      state :fact do
        rule %r/[^`\\]+/, Str::Other
        rule %r/\\<\w*>/, Str::Symbol
        rule %r/\\`/, Str::Other
        rule %r/\\/, Str::Other
        rule %r/`/, Str::Other, :pop!
      end
    end
  end
end