rouge 3.16.0 → 3.21.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (111) hide show
  1. checksums.yaml +4 -4
  2. data/bin/rougify +2 -2
  3. data/lib/rouge.rb +67 -53
  4. data/lib/rouge/demos/augeas +16 -0
  5. data/lib/rouge/demos/bibtex +12 -0
  6. data/lib/rouge/demos/brightscript +6 -0
  7. data/lib/rouge/demos/cypher +5 -0
  8. data/lib/rouge/demos/datastudio +21 -0
  9. data/lib/rouge/demos/ecl +18 -0
  10. data/lib/rouge/demos/ghc-cmm +23 -0
  11. data/lib/rouge/demos/hlsl +20 -0
  12. data/lib/rouge/demos/isbl +4 -0
  13. data/lib/rouge/demos/janet +3 -0
  14. data/lib/rouge/demos/livescript +15 -0
  15. data/lib/rouge/demos/rego +8 -0
  16. data/lib/rouge/demos/solidity +13 -0
  17. data/lib/rouge/demos/ssh +4 -0
  18. data/lib/rouge/demos/vcl +12 -0
  19. data/lib/rouge/demos/velocity +9 -0
  20. data/lib/rouge/demos/yang +17 -0
  21. data/lib/rouge/demos/zig +6 -0
  22. data/lib/rouge/lexer.rb +2 -1
  23. data/lib/rouge/lexers/apache.rb +22 -12
  24. data/lib/rouge/lexers/apache/keywords.rb +24 -0
  25. data/lib/rouge/lexers/augeas.rb +93 -0
  26. data/lib/rouge/lexers/batchfile.rb +1 -1
  27. data/lib/rouge/lexers/bibtex.rb +115 -0
  28. data/lib/rouge/lexers/brightscript.rb +147 -0
  29. data/lib/rouge/lexers/cmake.rb +1 -0
  30. data/lib/rouge/lexers/coffeescript.rb +47 -15
  31. data/lib/rouge/lexers/console.rb +53 -37
  32. data/lib/rouge/lexers/cpp.rb +21 -7
  33. data/lib/rouge/lexers/css.rb +3 -1
  34. data/lib/rouge/lexers/cypher.rb +108 -0
  35. data/lib/rouge/lexers/datastudio.rb +138 -0
  36. data/lib/rouge/lexers/diff.rb +1 -1
  37. data/lib/rouge/lexers/docker.rb +1 -1
  38. data/lib/rouge/lexers/ecl.rb +175 -0
  39. data/lib/rouge/lexers/fsharp.rb +1 -0
  40. data/lib/rouge/lexers/ghc_cmm.rb +340 -0
  41. data/lib/rouge/lexers/gherkin.rb +1 -1
  42. data/lib/rouge/lexers/gherkin/keywords.rb +9 -6
  43. data/lib/rouge/lexers/haskell.rb +27 -19
  44. data/lib/rouge/lexers/hlsl.rb +166 -0
  45. data/lib/rouge/lexers/html.rb +7 -7
  46. data/lib/rouge/lexers/isbl.rb +97 -0
  47. data/lib/rouge/lexers/isbl/builtins.rb +17 -0
  48. data/lib/rouge/lexers/janet.rb +217 -0
  49. data/lib/rouge/lexers/javascript.rb +4 -4
  50. data/lib/rouge/lexers/jinja.rb +22 -7
  51. data/lib/rouge/lexers/json.rb +3 -0
  52. data/lib/rouge/lexers/json_doc.rb +1 -0
  53. data/lib/rouge/lexers/jsx.rb +47 -59
  54. data/lib/rouge/lexers/julia.rb +4 -2
  55. data/lib/rouge/lexers/kotlin.rb +14 -2
  56. data/lib/rouge/lexers/lasso.rb +11 -12
  57. data/lib/rouge/lexers/lasso/keywords.rb +20 -0
  58. data/lib/rouge/lexers/livescript.rb +310 -0
  59. data/lib/rouge/lexers/llvm.rb +6 -33
  60. data/lib/rouge/lexers/llvm/keywords.rb +25 -0
  61. data/lib/rouge/lexers/lua.rb +2 -2
  62. data/lib/rouge/lexers/lua/keywords.rb +28 -0
  63. data/lib/rouge/lexers/markdown.rb +9 -5
  64. data/lib/rouge/lexers/mathematica.rb +2 -2
  65. data/lib/rouge/lexers/mathematica/keywords.rb +17 -0
  66. data/lib/rouge/lexers/matlab.rb +3 -4
  67. data/lib/rouge/lexers/matlab/builtins.rb +11 -0
  68. data/lib/rouge/lexers/matlab/keywords.rb +15 -0
  69. data/lib/rouge/lexers/nasm.rb +42 -168
  70. data/lib/rouge/lexers/opentype_feature_file.rb +27 -42
  71. data/lib/rouge/lexers/pascal.rb +1 -1
  72. data/lib/rouge/lexers/perl.rb +21 -3
  73. data/lib/rouge/lexers/php.rb +48 -33
  74. data/lib/rouge/lexers/php/keywords.rb +202 -0
  75. data/lib/rouge/lexers/powershell.rb +5 -3
  76. data/lib/rouge/lexers/python.rb +58 -57
  77. data/lib/rouge/lexers/racket.rb +24 -1
  78. data/lib/rouge/lexers/rego.rb +60 -0
  79. data/lib/rouge/lexers/ruby.rb +16 -3
  80. data/lib/rouge/lexers/sass/common.rb +1 -0
  81. data/lib/rouge/lexers/scala.rb +1 -1
  82. data/lib/rouge/lexers/solidity.rb +185 -0
  83. data/lib/rouge/lexers/sparql.rb +5 -4
  84. data/lib/rouge/lexers/sqf.rb +2 -2
  85. data/lib/rouge/lexers/sqf/keywords.rb +12 -0
  86. data/lib/rouge/lexers/ssh.rb +33 -0
  87. data/lib/rouge/lexers/terraform.rb +15 -0
  88. data/lib/rouge/lexers/tsx.rb +10 -3
  89. data/lib/rouge/lexers/turtle.rb +1 -1
  90. data/lib/rouge/lexers/twig.rb +4 -4
  91. data/lib/rouge/lexers/typescript.rb +1 -8
  92. data/lib/rouge/lexers/typescript/common.rb +18 -4
  93. data/lib/rouge/lexers/varnish.rb +53 -16
  94. data/lib/rouge/lexers/velocity.rb +71 -0
  95. data/lib/rouge/lexers/viml.rb +6 -38
  96. data/lib/rouge/lexers/viml/keywords.rb +11 -4
  97. data/lib/rouge/lexers/vue.rb +4 -1
  98. data/lib/rouge/lexers/xml.rb +5 -3
  99. data/lib/rouge/lexers/yaml.rb +5 -3
  100. data/lib/rouge/lexers/yang.rb +147 -0
  101. data/lib/rouge/lexers/zig.rb +139 -0
  102. data/lib/rouge/version.rb +1 -1
  103. metadata +47 -10
  104. data/lib/rouge/demos/varnish +0 -55
  105. data/lib/rouge/lexers/apache/keywords.yml +0 -764
  106. data/lib/rouge/lexers/lasso/keywords.yml +0 -446
  107. data/lib/rouge/lexers/lua/builtins.rb +0 -24
  108. data/lib/rouge/lexers/mathematica/builtins.rb +0 -13
  109. data/lib/rouge/lexers/matlab/builtins.yml +0 -3515
  110. data/lib/rouge/lexers/php/builtins.rb +0 -203
  111. data/lib/rouge/lexers/sqf/commands.rb +0 -15
@@ -9,12 +9,14 @@ module Rouge
9
9
  # line before passing the remainder of the line to the language lexer for
10
10
  # the shell (by default, the {Shell} lexer).
11
11
  #
12
- # The {ConsoleLexer} class accepts four options:
12
+ # The {ConsoleLexer} class accepts five options:
13
13
  # 1. **lang**: the shell language to lex (default: `shell`);
14
14
  # 2. **output**: the output language (default: `plaintext?token=Generic.Output`);
15
15
  # 3. **prompt**: comma-separated list of strings that indicate the end of a
16
16
  # prompt (default: `$,#,>,;`);
17
17
  # 4. **comments**: whether to enable comments.
18
+ # 5. **error**: comma-separated list of strings that indicate the start of an
19
+ # error message
18
20
  #
19
21
  # The comments option, if enabled, will lex lines that begin with a `#` as a
20
22
  # comment. Please note that this option will only work if the prompt is
@@ -39,12 +41,13 @@ module Rouge
39
41
  tag 'console'
40
42
  aliases 'terminal', 'shell_session', 'shell-session'
41
43
  filenames '*.cap'
42
- desc 'A generic lexer for shell sessions. Accepts ?lang and ?output lexer options, a ?prompt option, and ?comments to enable # comments.'
44
+ desc 'A generic lexer for shell sessions. Accepts ?lang and ?output lexer options, a ?prompt option, ?comments to enable # comments, and ?error to handle error messages.'
43
45
 
44
46
  option :lang, 'the shell language to lex (default: shell)'
45
47
  option :output, 'the output language (default: plaintext?token=Generic.Output)'
46
48
  option :prompt, 'comma-separated list of strings that indicate the end of a prompt. (default: $,#,>,;)'
47
49
  option :comments, 'enable hash-comments at the start of a line - otherwise interpreted as a prompt. (default: false, implied by ?prompt not containing `#`)'
50
+ option :error, 'comma-separated list of strings that indicate the start of an error message'
48
51
 
49
52
  def initialize(*)
50
53
  super
@@ -52,14 +55,24 @@ module Rouge
52
55
  @lang = lexer_option(:lang) { 'shell' }
53
56
  @output = lexer_option(:output) { PlainText.new(token: Generic::Output) }
54
57
  @comments = bool_option(:comments) { :guess }
58
+ @error = list_option(:error) { nil }
55
59
  end
56
60
 
57
- def prompt_regex
58
- @prompt_regex ||= begin
59
- /^#{prompt_prefix_regex}(?:#{end_chars.map(&Regexp.method(:escape)).join('|')})/
61
+ # whether to allow comments. if manually specifying a prompt that isn't
62
+ # simply "#", we flag this to on
63
+ def allow_comments?
64
+ case @comments
65
+ when :guess
66
+ @prompt && !@prompt.empty? && !end_chars.include?('#')
67
+ else
68
+ @comments
60
69
  end
61
70
  end
62
71
 
72
+ def comment_regex
73
+ /\A\s*?#/
74
+ end
75
+
63
76
  def end_chars
64
77
  @end_chars ||= if @prompt.any?
65
78
  @prompt.reject { |c| c.empty? }
@@ -70,22 +83,9 @@ module Rouge
70
83
  end
71
84
  end
72
85
 
73
- # whether to allow comments. if manually specifying a prompt that isn't
74
- # simply "#", we flag this to on
75
- def allow_comments?
76
- case @comments
77
- when :guess
78
- @prompt && !@prompt.empty? && !end_chars.include?('#')
79
- else
80
- @comments
81
- end
82
- end
83
-
84
- def prompt_prefix_regex
85
- if allow_comments?
86
- /[^<#]*?/m
87
- else
88
- /.*?/m
86
+ def error_regex
87
+ @error_regex ||= if @error.any?
88
+ /^(?:#{@error.map(&Regexp.method(:escape)).join('|')})/
89
89
  end
90
90
  end
91
91
 
@@ -102,6 +102,10 @@ module Rouge
102
102
  end
103
103
  end
104
104
 
105
+ def line_regex
106
+ /(\\.|[^\\])*?(\n|$)/m
107
+ end
108
+
105
109
  def output_lexer
106
110
  @output_lexer ||= case @output
107
111
  when nil
@@ -115,22 +119,6 @@ module Rouge
115
119
  end
116
120
  end
117
121
 
118
- def line_regex
119
- /(\\.|[^\\])*?(\n|$)/m
120
- end
121
-
122
- def comment_regex
123
- /\A\s*?#/
124
- end
125
-
126
- def stream_tokens(input, &output)
127
- input = StringScanner.new(input)
128
- lang_lexer.reset!
129
- output_lexer.reset!
130
-
131
- process_line(input, &output) while !input.eos?
132
- end
133
-
134
122
  def process_line(input, &output)
135
123
  input.scan(line_regex)
136
124
 
@@ -162,6 +150,12 @@ module Rouge
162
150
  lang_lexer.reset!
163
151
 
164
152
  yield Comment, input[0]
153
+ elsif error_regex =~ input[0]
154
+ puts "console: matched error #{input[0].inspect}" if @debug
155
+ output_lexer.reset!
156
+ lang_lexer.reset!
157
+
158
+ yield Generic::Error, input[0]
165
159
  else
166
160
  puts "console: matched output #{input[0].inspect}" if @debug
167
161
  lang_lexer.reset!
@@ -169,6 +163,28 @@ module Rouge
169
163
  output_lexer.continue_lex(input[0], &output)
170
164
  end
171
165
  end
166
+
167
+ def prompt_prefix_regex
168
+ if allow_comments?
169
+ /[^<#]*?/m
170
+ else
171
+ /.*?/m
172
+ end
173
+ end
174
+
175
+ def prompt_regex
176
+ @prompt_regex ||= begin
177
+ /^#{prompt_prefix_regex}(?:#{end_chars.map(&Regexp.method(:escape)).join('|')})/
178
+ end
179
+ end
180
+
181
+ def stream_tokens(input, &output)
182
+ input = StringScanner.new(input)
183
+ lang_lexer.reset!
184
+ output_lexer.reset!
185
+
186
+ process_line(input, &output) while !input.eos?
187
+ end
172
188
  end
173
189
  end
174
190
  end
@@ -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
@@ -67,15 +68,28 @@ module Rouge
67
68
  rule %r/#{dq}[lu]*/i, Num::Integer
68
69
  rule %r/\bnullptr\b/, Name::Builtin
69
70
  rule %r/(?:u8|u|U|L)?R"([a-zA-Z0-9_{}\[\]#<>%:;.?*\+\-\/\^&|~!=,"']{,16})\(.*?\)\1"/m, Str
71
+ rule %r/::/, Operator
70
72
  end
71
73
 
72
74
  state :classname do
73
75
  rule id, Name::Class, :pop!
74
76
 
75
77
  # template specification
76
- rule %r/\s*(?=>)/m, Text, :pop!
77
- rule %r/[.]{3}/, Operator
78
78
  mixin :whitespace
79
+ rule %r/[.]{3}/, Operator
80
+ rule %r/,/, Punctuation, :pop!
81
+ rule(//) { pop! }
82
+ end
83
+
84
+ state :template do
85
+ rule %r/[>;]/, Punctuation, :pop!
86
+ rule %r/typename\b/, Keyword, :classname
87
+ mixin :statements
88
+ end
89
+
90
+ state :case do
91
+ rule %r/:(?!:)/, Punctuation, :pop!
92
+ mixin :statements
79
93
  end
80
94
  end
81
95
  end
@@ -11,7 +11,9 @@ module Rouge
11
11
  filenames '*.css'
12
12
  mimetypes 'text/css'
13
13
 
14
- identifier = /[a-zA-Z0-9_-]+/
14
+ # Documentation: https://www.w3.org/TR/CSS21/syndata.html#characters
15
+
16
+ identifier = /[\p{L}_-][\p{Word}\p{Cf}-]*/
15
17
  number = /-?(?:[0-9]+(\.[0-9]+)?|\.[0-9]+)/
16
18
 
17
19
  def self.attributes
@@ -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