rouge 3.17.0 → 3.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. checksums.yaml +4 -4
  2. data/lib/rouge.rb +65 -51
  3. data/lib/rouge/demos/cypher +5 -0
  4. data/lib/rouge/demos/datastudio +21 -0
  5. data/lib/rouge/demos/ghc-cmm +23 -0
  6. data/lib/rouge/demos/isbl +4 -0
  7. data/lib/rouge/demos/rego +8 -0
  8. data/lib/rouge/demos/solidity +13 -0
  9. data/lib/rouge/demos/yang +17 -0
  10. data/lib/rouge/lexer.rb +2 -1
  11. data/lib/rouge/lexers/apache.rb +4 -8
  12. data/lib/rouge/lexers/apache/keywords.rb +15 -0
  13. data/lib/rouge/lexers/cmake.rb +1 -0
  14. data/lib/rouge/lexers/console.rb +53 -37
  15. data/lib/rouge/lexers/cpp.rb +12 -5
  16. data/lib/rouge/lexers/cypher.rb +108 -0
  17. data/lib/rouge/lexers/datastudio.rb +138 -0
  18. data/lib/rouge/lexers/fsharp.rb +1 -0
  19. data/lib/rouge/lexers/ghc_cmm.rb +340 -0
  20. data/lib/rouge/lexers/gherkin.rb +1 -1
  21. data/lib/rouge/lexers/isbl.rb +97 -0
  22. data/lib/rouge/lexers/isbl/builtins.rb +17 -0
  23. data/lib/rouge/lexers/json.rb +3 -0
  24. data/lib/rouge/lexers/json_doc.rb +1 -0
  25. data/lib/rouge/lexers/kotlin.rb +4 -0
  26. data/lib/rouge/lexers/lasso.rb +4 -9
  27. data/lib/rouge/lexers/lasso/keywords.rb +14 -0
  28. data/lib/rouge/lexers/lua.rb +1 -1
  29. data/lib/rouge/lexers/markdown.rb +1 -1
  30. data/lib/rouge/lexers/mathematica.rb +1 -1
  31. data/lib/rouge/lexers/matlab.rb +3 -4
  32. data/lib/rouge/lexers/matlab/builtins.rb +11 -0
  33. data/lib/rouge/lexers/pascal.rb +1 -1
  34. data/lib/rouge/lexers/php.rb +47 -32
  35. data/lib/rouge/lexers/python.rb +66 -57
  36. data/lib/rouge/lexers/racket.rb +24 -1
  37. data/lib/rouge/lexers/rego.rb +45 -0
  38. data/lib/rouge/lexers/ruby.rb +11 -1
  39. data/lib/rouge/lexers/solidity.rb +185 -0
  40. data/lib/rouge/lexers/sqf.rb +1 -1
  41. data/lib/rouge/lexers/terraform.rb +15 -0
  42. data/lib/rouge/lexers/typescript.rb +4 -0
  43. data/lib/rouge/lexers/viml.rb +1 -1
  44. data/lib/rouge/lexers/vue.rb +4 -1
  45. data/lib/rouge/lexers/yang.rb +147 -0
  46. data/lib/rouge/version.rb +1 -1
  47. metadata +20 -5
  48. data/lib/rouge/lexers/apache/keywords.yml +0 -764
  49. data/lib/rouge/lexers/lasso/keywords.yml +0 -446
  50. data/lib/rouge/lexers/matlab/builtins.yml +0 -3515
@@ -22,10 +22,10 @@ module Rouge
22
22
 
23
23
  def self.keywords
24
24
  @keywords ||= super + Set.new(%w(
25
- asm auto catch const_cast delete dynamic_cast explicit export
26
- friend mutable namespace new operator private protected public
27
- reinterpret_cast restrict size_of static_cast template this throw
28
- throws typeid typename using virtual final override
25
+ asm auto catch const_cast delete dynamic_cast explicit export friend
26
+ mutable namespace new operator private protected public
27
+ reinterpret_cast restrict size_of static_cast this throw throws
28
+ typeid typename using virtual final override
29
29
 
30
30
  alignas alignof constexpr decltype noexcept static_assert
31
31
  thread_local try
@@ -57,7 +57,8 @@ module Rouge
57
57
  dq = /\d('?\d)*/
58
58
 
59
59
  prepend :statements do
60
- rule %r/class\b/, Keyword, :classname
60
+ rule %r/(class|struct)\b/, Keyword, :classname
61
+ rule %r/template\b/, Keyword, :template
61
62
  rule %r/\d+(\.\d+)?(?:h|(?:min)|s|(?:ms)|(?:us)|(?:ns))/, Num::Other
62
63
  rule %r((#{dq}[.]#{dq}?|[.]#{dq})(e[+-]?#{dq}[lu]*)?)i, Num::Float
63
64
  rule %r(#{dq}e[+-]?#{dq}[lu]*)i, Num::Float
@@ -77,6 +78,12 @@ module Rouge
77
78
  rule %r/[.]{3}/, Operator
78
79
  mixin :whitespace
79
80
  end
81
+
82
+ state :template do
83
+ rule %r/>/, Punctuation, :pop!
84
+ rule %r/typename\b/, Keyword, :classname
85
+ mixin :root
86
+ end
80
87
  end
81
88
  end
82
89
  end
@@ -0,0 +1,108 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Cypher < RegexLexer
7
+ tag 'cypher'
8
+ aliases 'cypher'
9
+ filenames '*.cypher'
10
+ mimetypes 'application/x-cypher-query'
11
+
12
+ title "Cypher"
13
+ desc 'The Cypher query language (neo4j.com/docs/cypher-manual)'
14
+
15
+ def self.functions
16
+ @functions ||= Set.new %w(
17
+ ABS ACOS ALLSHORTESTPATHS ASIN ATAN ATAN2 AVG CEIL COALESCE COLLECT
18
+ COS COT COUNT DATE DEGREES E ENDNODE EXP EXTRACT FILTER FLOOR
19
+ HAVERSIN HEAD ID KEYS LABELS LAST LEFT LENGTH LOG LOG10 LOWER LTRIM
20
+ MAX MIN NODE NODES PERCENTILECONT PERCENTILEDISC PI RADIANS RAND
21
+ RANGE REDUCE REL RELATIONSHIP RELATIONSHIPS REPLACE REVERSE RIGHT
22
+ ROUND RTRIM SHORTESTPATH SIGN SIN SIZE SPLIT SQRT STARTNODE STDEV
23
+ STDEVP STR SUBSTRING SUM TAIL TAN TIMESTAMP TOFLOAT TOINT TOINTEGER
24
+ TOSTRING TRIM TYPE UPPER
25
+ )
26
+ end
27
+
28
+ def self.predicates
29
+ @predicates ||= Set.new %w(
30
+ ALL AND ANY CONTAINS EXISTS HAS IN NONE NOT OR SINGLE XOR
31
+ )
32
+ end
33
+
34
+ def self.keywords
35
+ @keywords ||= Set.new %w(
36
+ AS ASC ASCENDING ASSERT BY CASE COMMIT CONSTRAINT CREATE CSV CYPHER
37
+ DELETE DESC DESCENDING DETACH DISTINCT DROP ELSE END ENDS EXPLAIN
38
+ FALSE FIELDTERMINATOR FOREACH FROM HEADERS IN INDEX IS JOIN LIMIT
39
+ LOAD MATCH MERGE NULL ON OPTIONAL ORDER PERIODIC PROFILE REMOVE
40
+ RETURN SCAN SET SKIP START STARTS THEN TRUE UNION UNIQUE UNWIND USING
41
+ WHEN WHERE WITH CALL YIELD
42
+ )
43
+ end
44
+
45
+ state :root do
46
+ rule %r/[\s]+/, Text
47
+ rule %r(//.*?$), Comment::Single
48
+
49
+ rule %r([*+\-<>=&|~%^]), Operator
50
+ rule %r/[{}),;\[\]]/, Str::Symbol
51
+
52
+ # literal number
53
+ rule %r/(\w+)(:)(\s*)(-?[._\d]+)/ do
54
+ groups Name::Label, Str::Delimiter, Text::Whitespace, Num
55
+ end
56
+
57
+ # function-like
58
+ # - "name("
59
+ # - "name ("
60
+ # - "name ("
61
+ rule %r/(\w+)(\s*)(\()/ do |m|
62
+ name = m[1].upcase
63
+ if self.class.functions.include? name
64
+ groups Name::Function, Text::Whitespace, Str::Symbol
65
+ elsif self.class.keywords.include? name
66
+ groups Keyword, Text::Whitespace, Str::Symbol
67
+ else
68
+ groups Name, Text::Whitespace, Str::Symbol
69
+ end
70
+ end
71
+
72
+ rule %r/:\w+/, Name::Class
73
+
74
+ # number range
75
+ rule %r/(-?\d+)(\.\.)(-?\d+)/ do
76
+ groups Num, Operator, Num
77
+ end
78
+
79
+ # numbers
80
+ rule %r/(\d+\.\d*|\d*\.\d+)(e[+-]?\d+)?/i, Num::Float
81
+ rule %r/\d+e[+-]?\d+/i, Num::Float
82
+ rule %r/0[0-7]+/, Num::Oct
83
+ rule %r/0x[a-f0-9]+/i, Num::Hex
84
+ rule %r/\d+/, Num::Integer
85
+
86
+ rule %r([.\w]+:), Name::Property
87
+
88
+ # remaining "("
89
+ rule %r/\(/, Str::Symbol
90
+
91
+ rule %r/[.\w$]+/ do |m|
92
+ match = m[0].upcase
93
+ if self.class.predicates.include? match
94
+ token Operator::Word
95
+ elsif self.class.keywords.include? match
96
+ token Keyword
97
+ else
98
+ token Name
99
+ end
100
+ end
101
+
102
+ rule %r/"(\\\\|\\"|[^"])*"/, Str::Double
103
+ rule %r/'(\\\\|\\'|[^'])*'/, Str::Single
104
+ rule %r/`(\\\\|\\`|[^`])*`/, Str::Backtick
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,138 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Datastudio < RegexLexer
7
+ tag 'datastudio'
8
+ filenames '*.job'
9
+ mimetypes 'text/x-datastudio'
10
+
11
+ title "Datastudio"
12
+ desc 'Datastudio scripting language'
13
+
14
+ id = /@?[_a-z]\w*/i
15
+
16
+ def self.sql_keywords
17
+ @sql_keywords ||= %w(
18
+ ABORT ABS ABSOLUTE ACCESS ADA ADD ADMIN AFTER AGGREGATE ALIAS
19
+ ALL ALLOCATE ALTER ANALYSE ANALYZE AND ANY ARE AS ASC ASENSITIVE
20
+ ASSERTION ASSIGNMENT ASYMMETRIC AT ATOMIC AUTHORIZATION
21
+ AVG BACKWARD BEFORE BEGIN BETWEEN BITVAR BIT_LENGTH BOTH
22
+ BREADTH BY C CACHE CALL CALLED CARDINALITY CASCADE CASCADED
23
+ CASE CAST CATALOG CATALOG_NAME CHAIN CHARACTERISTICS
24
+ CHARACTER_LENGTH CHARACTER_SET_CATALOG CHARACTER_SET_NAME
25
+ CHARACTER_SET_SCHEMA CHAR_LENGTH CHECK CHECKED CHECKPOINT
26
+ CLASS CLASS_ORIGIN CLOB CLOSE CLUSTER COALSECE COBOL COLLATE
27
+ COLLATION COLLATION_CATALOG COLLATION_NAME COLLATION_SCHEMA
28
+ COLUMN COLUMN_NAME COMMAND_FUNCTION COMMAND_FUNCTION_CODE
29
+ COMMENT COMMIT COMMITTED COMPLETION CONDITION_NUMBER
30
+ CONNECT CONNECTION CONNECTION_NAME CONSTRAINT CONSTRAINTS
31
+ CONSTRAINT_CATALOG CONSTRAINT_NAME CONSTRAINT_SCHEMA
32
+ CONSTRUCTOR CONTAINS CONTINUE CONVERSION CONVERT COPY
33
+ CORRESPONTING COUNT CREATE CREATEDB CREATEUSER CROSS CUBE
34
+ CURRENT CURRENT_DATE CURRENT_PATH CURRENT_ROLE CURRENT_TIME
35
+ CURRENT_TIMESTAMP CURRENT_USER CURSOR CURSOR_NAME CYCLE DATA
36
+ DATABASE DATETIME_INTERVAL_CODE DATETIME_INTERVAL_PRECISION
37
+ DAY DEALLOCATE DECLARE DEFAULT DEFAULTS DEFERRABLE DEFERRED
38
+ DEFINED DEFINER DELETE DELIMITER DELIMITERS DEREF DESC DESCRIBE
39
+ DESCRIPTOR DESTROY DESTRUCTOR DETERMINISTIC DIAGNOSTICS
40
+ DICTIONARY DISCONNECT DISPATCH DISTINCT DO DOMAIN DROP
41
+ DYNAMIC DYNAMIC_FUNCTION DYNAMIC_FUNCTION_CODE EACH ELSE
42
+ ENCODING ENCRYPTED END END-EXEC EQUALS ESCAPE EVERY EXCEPT
43
+ ESCEPTION EXCLUDING EXCLUSIVE EXEC EXECUTE EXISTING EXISTS
44
+ EXPLAIN EXTERNAL EXTRACT FALSE FETCH FINAL FIRST FOR FORCE
45
+ FOREIGN FORTRAN FORWARD FOUND FREE FREEZE FROM FULL FUNCTION
46
+ G GENERAL GENERATED GET GLOBAL GO GOTO GRANT GRANTED GROUP
47
+ GROUPING HANDLER HAVING HIERARCHY HOLD HOST IDENTITY IGNORE
48
+ ILIKE IMMEDIATE IMMUTABLE IMPLEMENTATION IMPLICIT IN INCLUDING
49
+ INCREMENT INDEX INDITCATOR INFIX INHERITS INITIALIZE INITIALLY
50
+ INNER INOUT INPUT INSENSITIVE INSERT INSTANTIABLE INSTEAD
51
+ INTERSECT INTO INVOKER IS ISNULL ISOLATION ITERATE JOIN KEY
52
+ KEY_MEMBER KEY_TYPE LANCOMPILER LANGUAGE LARGE LAST LATERAL
53
+ LEADING LEFT LENGTH LESS LEVEL LIKE LIMIT LISTEN LOAD LOCAL
54
+ LOCALTIME LOCALTIMESTAMP LOCATION LOCATOR LOCK LOWER MAP MATCH
55
+ MAX MAXVALUE MESSAGE_LENGTH MESSAGE_OCTET_LENGTH MESSAGE_TEXT
56
+ METHOD MIN MINUTE MINVALUE MOD MODE MODIFIES MODIFY MONTH
57
+ MORE MOVE MUMPS NAMES NATURAL NCLOB NEW NEXT
58
+ NO NOCREATEDB NOCREATEUSER NONE NOT NOTHING NOTIFY NOTNULL
59
+ NULL NULLABLE NULLIF OBJECT OCTET_LENGTH OF OFF OFFSET OIDS
60
+ OLD ON ONLY OPEN OPERATION OPERATOR OPTION OPTIONS OR ORDER
61
+ ORDINALITY OUT OUTER OUTPUT OVERLAPS OVERLAY OVERRIDING
62
+ OWNER PAD PARAMETER PARAMETERS PARAMETER_MODE PARAMATER_NAME
63
+ PARAMATER_ORDINAL_POSITION PARAMETER_SPECIFIC_CATALOG
64
+ PARAMETER_SPECIFIC_NAME PARAMATER_SPECIFIC_SCHEMA PARTIAL PASCAL
65
+ PENDANT PLACING PLI POSITION POSTFIX PREFIX PREORDER
66
+ PREPARE PRESERVE PRIMARY PRIOR PRIVILEGES PROCEDURAL PROCEDURE
67
+ PUBLIC READ READS RECHECK RECURSIVE REF REFERENCES REFERENCING
68
+ REINDEX RELATIVE RENAME REPEATABLE REPLACE RESET RESTART
69
+ RESTRICT RESULT RETURN RETURNED_LENGTH RETURNED_OCTET_LENGTH
70
+ RETURNED_SQLSTATE RETURNS REVOKE RIGHT ROLE ROLLBACK ROLLUP
71
+ ROUTINE ROUTINE_CATALOG ROUTINE_NAME ROUTINE_SCHEMA ROW ROWS
72
+ ROW_COUNT RULE SAVE_POINT SCALE SCHEMA SCHEMA_NAME SCOPE SCROLL
73
+ SEARCH SECOND SECURITY SELECT SELF SENSITIVE SERIALIZABLE
74
+ SERVER_NAME SESSION SESSION_USER SET SETOF SETS SHARE SHOW
75
+ SIMILAR SIMPLE SIZE SOME SOURCE SPACE SPECIFIC SPECIFICTYPE
76
+ SPECIFIC_NAME SQL SQLCODE SQLERROR SQLEXCEPTION SQLSTATE
77
+ SQLWARNINIG STABLE START STATE STATEMENT STATIC STATISTICS
78
+ STDIN STDOUT STORAGE STRICT STRUCTURE STYPE SUBCLASS_ORIGIN
79
+ SUBLIST SUBSTRING SUM SYMMETRIC SYSID SYSTEM SYSTEM_USER
80
+ TABLE TABLE_NAME TEMP TEMPLATE TEMPORARY TERMINATE THAN THEN
81
+ TIMEZONE_HOUR TIMEZONE_MINUTE TO TOAST TRAILING
82
+ TRANSATION TRANSACTIONS_COMMITTED TRANSACTIONS_ROLLED_BACK
83
+ TRANSATION_ACTIVE TRANSFORM TRANSFORMS TRANSLATE TRANSLATION
84
+ TREAT TRIGGER TRIGGER_CATALOG TRIGGER_NAME TRIGGER_SCHEMA TRIM
85
+ TRUE TRUNCATE TRUSTED TYPE UNCOMMITTED UNDER UNENCRYPTED UNION
86
+ UNIQUE UNKNOWN UNLISTEN UNNAMED UNNEST UNTIL UPDATE UPPER
87
+ USAGE USER USER_DEFINED_TYPE_CATALOG USER_DEFINED_TYPE_NAME
88
+ USER_DEFINED_TYPE_SCHEMA USING VACUUM VALID VALIDATOR VALUES
89
+ VARIABLE VERBOSE VERSION VIEW VOLATILE WHEN WHENEVER WHERE
90
+ WITH WITHOUT WORK WRITE ZONE
91
+ )
92
+ end
93
+
94
+ state :whitespace do
95
+ rule %r/\s+/m, Text
96
+ rule %r(//.*?$), Comment::Single
97
+ rule %r(/[*].*?[*]/)m, Comment::Multiline
98
+ end
99
+
100
+ state :string do
101
+ rule %r/%(\\.|.)+?%/, Str::Escape
102
+ rule %r/\\"/, Str::Double
103
+ rule %r/"/, Str::Double, :pop!
104
+ rule %r/./m, Str::Double
105
+ end
106
+
107
+ state :string_s do
108
+ rule %r/%(\\.|.)+?%/, Str::Escape
109
+ rule %r/\\'/, Str::Single
110
+ rule %r/'/, Str::Single, :pop!
111
+ rule %r/./m, Str::Single
112
+ end
113
+
114
+ state :root do
115
+ mixin :whitespace
116
+
117
+ rule %r/^:#{id}/, Name::Label
118
+ rule %r/@#{id}(\.#{id})?/m, Name::Entity
119
+ rule %r/%(\\.|.)+?%/, Name::Variable
120
+ rule %r/[~!%^&*()+=|\[\]{}:;,.<>\/?-]/, Punctuation
121
+ rule %r/"/, Str::Double, :string
122
+ rule %r/'/, Str::Single, :string_s
123
+ rule %r/\d(\.\d*)?/i, Num
124
+ rule %r/#{id}(?=\s*[(])/, Name::Function
125
+ rule id do |m|
126
+ name = m[0].upcase
127
+
128
+ if self.class.sql_keywords.include? name
129
+ token Keyword
130
+ else
131
+ token Name
132
+ end
133
+ end
134
+ end
135
+
136
+ end
137
+ end
138
+ end
@@ -113,6 +113,7 @@ module Rouge
113
113
  rule %r/#{upper_id}(?=\s*[.])/, Name::Namespace
114
114
  rule upper_id, Name::Class, :pop!
115
115
  rule id, Name, :pop!
116
+ rule %r/\[/, Punctuation, :pop!
116
117
  end
117
118
  end
118
119
  end
@@ -0,0 +1,340 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ # C minus minus (Cmm) is a pun on the name C++. It's an intermediate language
5
+ # of the Glasgow Haskell Compiler (GHC) that is very similar to C, but with
6
+ # many features missing and some special constructs.
7
+ #
8
+ # Cmm is a dialect of C--. The goal of this lexer is to use what GHC produces
9
+ # and parses (Cmm); C-- itself is not supported.
10
+ #
11
+ # https://gitlab.haskell.org/ghc/ghc/wikis/commentary/compiler/cmm-syntax
12
+ #
13
+ module Rouge
14
+ module Lexers
15
+ class GHCCmm < RegexLexer
16
+ title "GHC Cmm (C--)"
17
+ desc "GHC Cmm is the intermediate representation of the GHC Haskell compiler"
18
+ tag 'ghc-cmm'
19
+ filenames '*.cmm', '*.dump-cmm', '*.dump-cmm-*'
20
+ aliases 'cmm'
21
+
22
+ ws = %r(\s|//.*?\n|/[*](?:[^*]|(?:[*][^/]))*[*]+/)mx
23
+
24
+ # Make sure that this is not a preprocessor macro, e.g. `#if` or `#define`.
25
+ id = %r((?!#[a-zA-Z])[\w#\$%_']+)
26
+
27
+ complex_id = %r(
28
+ (?:[\w#$%_']|\(\)|\(,\)|\[\]|[0-9])*
29
+ (?:[\w#$%_']+)
30
+ )mx
31
+
32
+ state :root do
33
+ rule %r/\s+/m, Text
34
+
35
+ # sections markers
36
+ rule %r/^=====.*=====$/, Generic::Heading
37
+
38
+ # timestamps
39
+ rule %r/^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d+ UTC$/, Comment::Single
40
+
41
+ mixin :detect_section
42
+ mixin :preprocessor_macros
43
+
44
+ mixin :info_tbls
45
+ mixin :comments
46
+ mixin :literals
47
+ mixin :keywords
48
+ mixin :types
49
+ mixin :infos
50
+ mixin :names
51
+ mixin :operators
52
+
53
+ # escaped newline
54
+ rule %r/\\\n/, Text
55
+
56
+ # rest is Text
57
+ rule %r/./, Text
58
+ end
59
+
60
+ state :detect_section do
61
+ rule %r/(section)(\s+)/ do |m|
62
+ token Keyword, m[1]
63
+ token Text, m[2]
64
+ push :section
65
+ end
66
+ end
67
+
68
+ state :section do
69
+ rule %r/"(data|cstring|text|rodata|relrodata|bss)"/, Name::Builtin
70
+
71
+ rule %r/{/, Punctuation, :pop!
72
+
73
+ mixin :names
74
+ mixin :operators
75
+ mixin :keywords
76
+
77
+ rule %r/\s+/, Text
78
+ end
79
+
80
+ state :preprocessor_macros do
81
+ rule %r/#(include|endif|else|if)/, Comment::Preproc
82
+
83
+ rule %r{
84
+ (\#define)
85
+ (#{ws}*)
86
+ (#{id})
87
+ }mx do |m|
88
+ token Comment::Preproc, m[1]
89
+ recurse m[2]
90
+ token Name::Label, m[3]
91
+ end
92
+ end
93
+
94
+ state :info_tbls do
95
+ rule %r/({ )(info_tbls)(:)/ do |m|
96
+ token Punctuation, m[1]
97
+ token Name::Entity, m[2]
98
+ token Punctuation, m[3]
99
+
100
+ push :info_tbls_body
101
+ end
102
+ end
103
+
104
+ state :info_tbls_body do
105
+ rule %r/}/, Punctuation, :pop!
106
+ rule %r/{/, Punctuation, :info_tbls_body
107
+
108
+ rule %r/(?=label:)/ do
109
+ push :label
110
+ end
111
+
112
+ rule %r{(\()(#{complex_id})(,)}mx do |m|
113
+ token Punctuation, m[1]
114
+ token Name::Label, m[2]
115
+ token Punctuation, m[3]
116
+ end
117
+
118
+ mixin :literals
119
+ mixin :infos
120
+ mixin :keywords
121
+ mixin :operators
122
+
123
+ rule %r/#{id}/, Text
124
+ rule %r/\s+/, Text
125
+ end
126
+
127
+ state :label do
128
+ mixin :infos
129
+ mixin :names
130
+ mixin :keywords
131
+ mixin :operators
132
+
133
+ rule %r/[^\S\n]+/, Text # Tab, space, etc. but not newline!
134
+ rule %r/\n/, Text, :pop!
135
+ end
136
+
137
+ state :comments do
138
+ rule %r/\/{2}.*/, Comment::Single
139
+ rule %r/\(likely.*?\)/, Comment
140
+ rule %r/\/\*.*?\*\//m, Comment::Multiline
141
+ end
142
+
143
+ state :literals do
144
+ rule %r/-?[0-9]+\.[0-9]+/, Literal::Number::Float
145
+ rule %r/-?[0-9]+/, Literal::Number::Integer
146
+ rule %r/"/, Literal::String::Delimiter, :literal_string
147
+ end
148
+
149
+ state :literal_string do
150
+ # quotes
151
+ rule %r/\\./, Literal::String::Escape
152
+ rule %r/%./, Literal::String::Symbol
153
+ rule %r/"/, Literal::String::Delimiter, :pop!
154
+ rule %r/./, Literal::String
155
+ end
156
+
157
+ state :operators do
158
+ rule %r/\.\./, Operator
159
+ rule %r/[+\-*\/<>=!&|~]/, Operator
160
+ rule %r/[\[\].{}:;,()]/, Punctuation
161
+ end
162
+
163
+ state :keywords do
164
+ rule %r/(const)(\s+)/ do |m|
165
+ token Keyword::Constant, m[1]
166
+ token Text, m[2]
167
+ end
168
+
169
+ rule %r/"/, Literal::String::Double
170
+
171
+ rule %r/(switch)([^{]*)({)/ do |m|
172
+ token Keyword, m[1]
173
+ recurse m[2]
174
+ token Punctuation, m[3]
175
+ end
176
+
177
+ rule %r/(arg|result)(#{ws}+)(hints)(:)/ do |m|
178
+ token Name::Property, m[1]
179
+ recurse m[2]
180
+ token Name::Property, m[3]
181
+ token Punctuation, m[4]
182
+ end
183
+
184
+ rule %r/(returns)(#{ws}*)(to)/ do |m|
185
+ token Keyword, m[1]
186
+ recurse m[2]
187
+ token Keyword, m[3]
188
+ end
189
+
190
+ rule %r/(never)(#{ws}*)(returns)/ do |m|
191
+ token Keyword, m[1]
192
+ recurse m[2]
193
+ token Keyword, m[3]
194
+ end
195
+
196
+ rule %r{(return)(#{ws}*)(\()} do |m|
197
+ token Keyword, m[1]
198
+ recurse m[2]
199
+ token Punctuation, m[3]
200
+ end
201
+
202
+ rule %r{(if|else|goto|call|offset|import|jump|ccall|foreign|prim|case|unwind|export|reserve|push)(#{ws})} do |m|
203
+ token Keyword, m[1]
204
+ recurse m[2]
205
+ end
206
+
207
+ rule %r{(default)(#{ws}*)(:)} do |m|
208
+ token Keyword, m[1]
209
+ recurse m[2]
210
+ token Punctuation, m[3]
211
+ end
212
+ end
213
+
214
+ state :types do
215
+ # Memory access: `type[42]`
216
+ # Note: Only a token for type is produced.
217
+ rule %r/(#{id})(?=\[[^\]])/ do |m|
218
+ token Keyword::Type, m[1]
219
+ end
220
+
221
+ # Array type: `type[]`
222
+ rule %r/(#{id}\[\])/ do |m|
223
+ token Keyword::Type, m[1]
224
+ end
225
+
226
+ # Capture macro substitutions before lexing typed declarations
227
+ # I.e. there is no type in `PREPROCESSOR_MACRO_VARIABLE someFun()`
228
+ rule %r{
229
+ (^#{id})
230
+ (#{ws}+)
231
+ (#{id})
232
+ (#{ws}*)
233
+ (\()
234
+ }mx do |m|
235
+ token Name::Label, m[1]
236
+ recurse m[2]
237
+ token Name::Function, m[3]
238
+ recurse m[4]
239
+ token Punctuation, m[5]
240
+ end
241
+
242
+ # Type in variable or parameter declaration:
243
+ # `type /* optional whitespace */ var_name /* optional whitespace */;`
244
+ # `type /* optional whitespace */ var_name /* optional whitespace */, var_name2`
245
+ # `(type /* optional whitespace */ var_name /* optional whitespace */)`
246
+ # Note: Only the token for type is produced here.
247
+ rule %r{
248
+ (^#{id})
249
+ (#{ws}+)
250
+ (#{id})
251
+ }mx do |m|
252
+ token Keyword::Type, m[1]
253
+ recurse m[2]
254
+ token Name::Label, m[3]
255
+ end
256
+ end
257
+
258
+ state :infos do
259
+ rule %r/(args|res|upd|label|rep|srt|arity|fun_type|arg_space|updfr_space)(:)/ do |m|
260
+ token Name::Property, m[1]
261
+ token Punctuation, m[2]
262
+ end
263
+
264
+ rule %r/(stack_info)(:)/ do |m|
265
+ token Name::Entity, m[1]
266
+ token Punctuation, m[2]
267
+ end
268
+ end
269
+
270
+ state :names do
271
+ rule %r/(::)(#{ws}*)([A-Z]\w+)/ do |m|
272
+ token Operator, m[1]
273
+ recurse m[2]
274
+ token Keyword::Type, m[3]
275
+ end
276
+
277
+ rule %r/<(#{id})>/, Name::Builtin
278
+
279
+ rule %r/(Sp|SpLim|Hp|HpLim|HpAlloc|BaseReg|CurrentNursery|CurrentTSO|R\d{1,2}|gcptr)(?!#{id})/, Name::Variable::Global
280
+ rule %r/([A-Z]#{id})(\.)/ do |m|
281
+ token Name::Namespace, m[1]
282
+ token Punctuation, m[2]
283
+ push :namespace_name
284
+ end
285
+
286
+ # Inline function calls:
287
+ # ```
288
+ # arg1 `lt` arg2
289
+ # ```
290
+ rule %r/(`)(#{id})(`)/ do |m|
291
+ token Punctuation, m[1]
292
+ token Name::Function, m[2]
293
+ token Punctuation, m[3]
294
+ end
295
+
296
+ # Function: `name /* optional whitespace */ (`
297
+ # Function (arguments via explicit stack handling): `name /* optional whitespace */ {`
298
+ rule %r{(?=
299
+ #{complex_id}
300
+ #{ws}*
301
+ [\{\(]
302
+ )}mx do
303
+ push :function
304
+ end
305
+
306
+ rule %r/CLOSURE/, Keyword::Type
307
+ rule %r/#{complex_id}/, Name::Label
308
+ end
309
+
310
+ state :namespace_name do
311
+ rule %r/([A-Z]#{id})(\.)/ do |m|
312
+ token Name::Namespace, m[1]
313
+ token Punctuation, m[2]
314
+ end
315
+
316
+ rule %r{(#{complex_id})(#{ws}*)([\{\(])}mx do |m|
317
+ token Name::Function, m[1]
318
+ recurse m[2]
319
+ token Punctuation, m[3]
320
+ pop!
321
+ end
322
+
323
+ rule %r/#{complex_id}/, Name::Label, :pop!
324
+
325
+ rule %r/(?=.)/m do
326
+ pop!
327
+ end
328
+ end
329
+
330
+ state :function do
331
+ rule %r/INFO_TABLE_FUN|INFO_TABLE_CONSTR|INFO_TABLE_SELECTOR|INFO_TABLE_RET|INFO_TABLE/, Name::Builtin
332
+ rule %r/%#{id}/, Name::Builtin
333
+ rule %r/#{complex_id}/, Name::Function
334
+ rule %r/\s+/, Text
335
+ rule %r/[({]/, Punctuation, :pop!
336
+ mixin :comments
337
+ end
338
+ end
339
+ end
340
+ end