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
|