rouge 3.5.1 → 3.10.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/lib/rouge.rb +1 -0
  4. data/lib/rouge/cli.rb +19 -11
  5. data/lib/rouge/demos/ada +26 -0
  6. data/lib/rouge/demos/armasm +12 -0
  7. data/lib/rouge/demos/batchfile +3 -0
  8. data/lib/rouge/demos/bbcbasic +6 -0
  9. data/lib/rouge/demos/clean +6 -0
  10. data/lib/rouge/demos/cmhg +8 -0
  11. data/lib/rouge/demos/cuda +11 -0
  12. data/lib/rouge/demos/cython +6 -0
  13. data/lib/rouge/demos/eex +1 -0
  14. data/lib/rouge/demos/epp +4 -0
  15. data/lib/rouge/demos/gdscript +18 -0
  16. data/lib/rouge/demos/haxe +5 -0
  17. data/lib/rouge/demos/hocon +8 -0
  18. data/lib/rouge/demos/hql +5 -0
  19. data/lib/rouge/demos/jsl +3 -0
  20. data/lib/rouge/demos/lustre +6 -0
  21. data/lib/rouge/demos/lutin +18 -0
  22. data/lib/rouge/demos/mason +22 -0
  23. data/lib/rouge/demos/msgtrans +4 -0
  24. data/lib/rouge/demos/openedge +4 -0
  25. data/lib/rouge/demos/opentype_feature_file +6 -0
  26. data/lib/rouge/demos/plist +1 -132
  27. data/lib/rouge/demos/powershell +12 -48
  28. data/lib/rouge/demos/reasonml +12 -0
  29. data/lib/rouge/demos/sas +13 -0
  30. data/lib/rouge/demos/sparql +6 -0
  31. data/lib/rouge/demos/terraform +0 -15
  32. data/lib/rouge/demos/xojo +2 -1
  33. data/lib/rouge/demos/xpath +2 -0
  34. data/lib/rouge/demos/xquery +22 -0
  35. data/lib/rouge/formatters/html.rb +18 -2
  36. data/lib/rouge/formatters/html_line_table.rb +53 -0
  37. data/lib/rouge/formatters/tex.rb +14 -12
  38. data/lib/rouge/guessers/disambiguation.rb +12 -0
  39. data/lib/rouge/guessers/modeline.rb +1 -1
  40. data/lib/rouge/lexers/ada.rb +162 -0
  41. data/lib/rouge/lexers/apache.rb +1 -1
  42. data/lib/rouge/lexers/armasm.rb +145 -0
  43. data/lib/rouge/lexers/batchfile.rb +164 -0
  44. data/lib/rouge/lexers/bbcbasic.rb +112 -0
  45. data/lib/rouge/lexers/bpf.rb +12 -12
  46. data/lib/rouge/lexers/ceylon.rb +5 -5
  47. data/lib/rouge/lexers/clean.rb +156 -0
  48. data/lib/rouge/lexers/cmhg.rb +34 -0
  49. data/lib/rouge/lexers/common_lisp.rb +1 -1
  50. data/lib/rouge/lexers/console.rb +1 -1
  51. data/lib/rouge/lexers/cpp.rb +4 -1
  52. data/lib/rouge/lexers/cuda.rb +35 -0
  53. data/lib/rouge/lexers/cython.rb +151 -0
  54. data/lib/rouge/lexers/docker.rb +2 -2
  55. data/lib/rouge/lexers/eex.rb +51 -0
  56. data/lib/rouge/lexers/elixir.rb +25 -11
  57. data/lib/rouge/lexers/elm.rb +1 -1
  58. data/lib/rouge/lexers/epp.rb +51 -0
  59. data/lib/rouge/lexers/escape.rb +3 -0
  60. data/lib/rouge/lexers/fsharp.rb +4 -4
  61. data/lib/rouge/lexers/gdscript.rb +171 -0
  62. data/lib/rouge/lexers/gherkin.rb +4 -2
  63. data/lib/rouge/lexers/glsl.rb +1 -1
  64. data/lib/rouge/lexers/graphql.rb +10 -3
  65. data/lib/rouge/lexers/handlebars.rb +14 -3
  66. data/lib/rouge/lexers/haxe.rb +246 -0
  67. data/lib/rouge/lexers/hocon.rb +86 -0
  68. data/lib/rouge/lexers/hql.rb +139 -0
  69. data/lib/rouge/lexers/html.rb +2 -2
  70. data/lib/rouge/lexers/http.rb +6 -6
  71. data/lib/rouge/lexers/idlang.rb +1 -1
  72. data/lib/rouge/lexers/igorpro.rb +1 -1
  73. data/lib/rouge/lexers/javascript.rb +1 -1
  74. data/lib/rouge/lexers/jsl.rb +55 -0
  75. data/lib/rouge/lexers/json.rb +44 -6
  76. data/lib/rouge/lexers/jsp.rb +3 -3
  77. data/lib/rouge/lexers/julia.rb +1 -1
  78. data/lib/rouge/lexers/liquid.rb +23 -0
  79. data/lib/rouge/lexers/lustre.rb +79 -0
  80. data/lib/rouge/lexers/lutin.rb +33 -0
  81. data/lib/rouge/lexers/magik.rb +2 -1
  82. data/lib/rouge/lexers/make.rb +44 -16
  83. data/lib/rouge/lexers/mason.rb +115 -0
  84. data/lib/rouge/lexers/matlab.rb +4 -2
  85. data/lib/rouge/lexers/matlab/builtins.yml +3515 -0
  86. data/lib/rouge/lexers/mosel.rb +43 -43
  87. data/lib/rouge/lexers/msgtrans.rb +26 -0
  88. data/lib/rouge/lexers/nim.rb +2 -1
  89. data/lib/rouge/lexers/nix.rb +1 -1
  90. data/lib/rouge/lexers/ocaml.rb +12 -48
  91. data/lib/rouge/lexers/ocaml/common.rb +53 -0
  92. data/lib/rouge/lexers/openedge.rb +429 -0
  93. data/lib/rouge/lexers/opentype_feature_file.rb +113 -0
  94. data/lib/rouge/lexers/perl.rb +12 -14
  95. data/lib/rouge/lexers/php.rb +31 -9
  96. data/lib/rouge/lexers/php/builtins.rb +181 -174
  97. data/lib/rouge/lexers/plain_text.rb +1 -1
  98. data/lib/rouge/lexers/powershell.rb +181 -635
  99. data/lib/rouge/lexers/puppet.rb +2 -2
  100. data/lib/rouge/lexers/q.rb +1 -1
  101. data/lib/rouge/lexers/r.rb +2 -3
  102. data/lib/rouge/lexers/reasonml.rb +65 -0
  103. data/lib/rouge/lexers/ruby.rb +2 -2
  104. data/lib/rouge/lexers/rust.rb +12 -9
  105. data/lib/rouge/lexers/sas.rb +563 -0
  106. data/lib/rouge/lexers/scala.rb +1 -1
  107. data/lib/rouge/lexers/sed.rb +1 -1
  108. data/lib/rouge/lexers/shell.rb +1 -1
  109. data/lib/rouge/lexers/smarty.rb +10 -10
  110. data/lib/rouge/lexers/sparql.rb +129 -0
  111. data/lib/rouge/lexers/sql.rb +26 -6
  112. data/lib/rouge/lexers/swift.rb +4 -4
  113. data/lib/rouge/lexers/terraform.rb +8 -0
  114. data/lib/rouge/lexers/tex.rb +1 -1
  115. data/lib/rouge/lexers/toml.rb +1 -1
  116. data/lib/rouge/lexers/vala.rb +1 -1
  117. data/lib/rouge/lexers/vhdl.rb +1 -1
  118. data/lib/rouge/lexers/wollok.rb +1 -1
  119. data/lib/rouge/lexers/xml.rb +1 -1
  120. data/lib/rouge/lexers/xojo.rb +4 -4
  121. data/lib/rouge/lexers/xpath.rb +332 -0
  122. data/lib/rouge/lexers/xquery.rb +145 -0
  123. data/lib/rouge/lexers/yaml.rb +5 -3
  124. data/lib/rouge/regex_lexer.rb +14 -13
  125. data/lib/rouge/tex_theme_renderer.rb +7 -3
  126. data/lib/rouge/themes/magritte.rb +3 -3
  127. data/lib/rouge/themes/monokai_sublime.rb +2 -1
  128. data/lib/rouge/themes/pastie.rb +1 -1
  129. data/lib/rouge/themes/thankful_eyes.rb +1 -1
  130. data/lib/rouge/themes/tulip.rb +1 -1
  131. data/lib/rouge/util.rb +2 -2
  132. data/lib/rouge/version.rb +1 -1
  133. data/rouge.gemspec +4 -3
  134. metadata +61 -5
  135. data/lib/rouge/lexers/matlab/builtins.rb +0 -13
@@ -1,49 +1,13 @@
1
- Function Get-IPv4Scopes
2
- <#
3
- .SYNOPSIS
4
- Read IPv4Scopes from an array of servers
5
- .PARAMETER Servers
6
- Specifies an array of servers
7
- .EXAMPLE
8
- Get-IPv4Scopes
9
-
10
- Will prompt for all inputs
11
- #>
1
+ function Verb-Noun
12
2
  {
13
- [CmdletBinding()]
14
- Param(
15
- # 1
16
- [parameter(
17
- Mandatory=$true,
18
- Position=0,
19
- ValueFromPipelineByPropertyName=$true,
20
- HelpMessage="Server List"
21
- )]
22
- [string[]]$Servers,
23
- #2
24
- [parameter(Mandatory=$false,ValueFromPipeline=$false)]
25
- [bool]$Unique=$false
26
- ) #EndParam
27
-
28
- Begin {}
29
-
30
- Process {
31
- $arrayJobs=@()
32
- foreach ($server in $Servers) {
33
- $arrayJobs+=Invoke-Command -ComputerName $server -scriptblock {Get-DhcpServerv4Scope} -AsJob
34
- }
35
- $complete=$false
36
- while (-not $complete) {
37
- $arrayJobsInProgress= $arrayJobs | Where-Object { $_.State -match 'running' }
38
- if (-not $arrayJobsInProgress) { $complete=$true }
39
- }
40
- $Scopes=$arrayJobs|Receive-Job
41
- $UniqueScopes=$Scopes|Sort-Object -Property ScopeId -Unique
42
- }
43
-
44
- End {
45
- if ($Unique) { return $UniqueScopes }
46
- else { return $Scopes }
47
- }
48
-
49
- } #end function
3
+ <#
4
+ .SYNOPSIS
5
+ Tells you what it does
6
+
7
+ .DESCRIPTION
8
+ Tells you what it does with more detail.
9
+ #>
10
+ param ([string]$Name, [string]$Extension = "txt", [string]$foo="bar")
11
+ $name = $name + "." + $extension
12
+ $name
13
+ }
@@ -0,0 +1,12 @@
1
+ /* I like a teacher who gives you something to take
2
+ home to think about besides homework. */
3
+ let gpa_score = 5.0;
4
+ type schoolPerson = Teacher | Director | Student(string);
5
+
6
+ let greeting = person =>
7
+ switch (person) {
8
+ | Teacher => "Hey Professor!"
9
+ | Director => "Hello Director."
10
+ | Student("Richard") => "Still here Ricky?"
11
+ | Student(anyOtherName) => "Hey, " ++ anyOtherName ++ "."
12
+ };
@@ -0,0 +1,13 @@
1
+ data sim;
2
+ do i = 1 to 100;
3
+ x1 = rand("Normal");
4
+ x2 = rand("Binomial", 0.5, 100);
5
+ output;
6
+ end;
7
+ run;
8
+
9
+ proc means data=sashelp.class;
10
+ class sex;
11
+ var height weight;
12
+ output out = mean_by_sex;
13
+ run;
@@ -0,0 +1,6 @@
1
+ SELECT ?item ?itemLabel
2
+ WHERE
3
+ {
4
+ ?item wdt:P31 wd:Q146.
5
+ SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
6
+ }
@@ -1,10 +1,3 @@
1
- # From: https://github.com/terraform-providers/terraform-provider-aws/blob/master/examples/count/main.tf
2
-
3
- # Specify the provider and access details
4
- provider "aws" {
5
- region = "${var.aws_region}"
6
- }
7
-
8
1
  resource "aws_elb" "web" {
9
2
  name = "terraform-example-elb"
10
3
 
@@ -21,11 +14,3 @@ resource "aws_elb" "web" {
21
14
  # The instances are registered automatically
22
15
  instances = ["${aws_instance.web.*.id}"]
23
16
  }
24
-
25
- resource "aws_instance" "web" {
26
- instance_type = "m1.small"
27
- ami = "${lookup(var.aws_amis, var.aws_region)}"
28
-
29
- # This will create 4 instances
30
- count = 4
31
- }
@@ -1,7 +1,8 @@
1
1
  Dim f As FolderItem
2
2
  f = GetOpenFolderItem(FileTypes1.jpeg) // defined in the File Type Set editor
3
+ rem - we should check for nil!
3
4
  If not f.Exists Then
4
- Beep
5
+ Beep 'Just for fun
5
6
  MsgBox("The file " + f.NativePath + "doesn't ""exist.""")
6
7
  Else // document exists
7
8
  ImageWell1.image=Picture.Open(f)
@@ -0,0 +1,2 @@
1
+ (: Authors named Bob Joe who didn't graduate from Harvard :)
2
+ //author[first-name = "Joe" and last-name = "Bob"][degree/@from != "Harvard"]
@@ -0,0 +1,22 @@
1
+ declare namespace html = "http://www.w3.org/1999/xhtml";
2
+
3
+ declare function local:test-function($catalog as document-node()) {
4
+ <html>
5
+ <head>
6
+ <title>XQuery example for the Rouge highlighter</title>
7
+ <link href="style.css"/>
8
+ </head>
9
+ <body>
10
+ <h1>List</h1>
11
+ <ul>
12
+ {for $product in $catalog/items/product[@sell-by > current-date()] return
13
+ <li>
14
+ <ul>
15
+ <li>{data($product/name)}</li>
16
+ <li>{$product/price * (1 + $product/tax)}$</li>
17
+ </ul>
18
+ </li>}
19
+ </ul>
20
+ </body>
21
+ </html>
22
+ };
@@ -15,7 +15,7 @@ module Rouge
15
15
  def span(tok, val)
16
16
  return val if escape?(tok)
17
17
 
18
- safe_span(tok, val.gsub(/[&<>]/, TABLE_FOR_ESCAPE_HTML))
18
+ safe_span(tok, escape_special_html_chars(val))
19
19
  end
20
20
 
21
21
  def safe_span(tok, safe_val)
@@ -29,12 +29,28 @@ module Rouge
29
29
  end
30
30
  end
31
31
 
32
-
33
32
  TABLE_FOR_ESCAPE_HTML = {
34
33
  '&' => '&amp;',
35
34
  '<' => '&lt;',
36
35
  '>' => '&gt;',
37
36
  }
37
+
38
+ private
39
+ # A performance-oriented helper method to escape `&`, `<` and `>` for the rendered
40
+ # HTML from this formatter.
41
+ #
42
+ # `String#gsub` will always return a new string instance irrespective of whether
43
+ # a substitution occurs. This method however invokes `String#gsub` only if
44
+ # a substitution is imminent.
45
+ #
46
+ # Returns either the given `value` argument string as is or a new string with the
47
+ # special characters replaced with their escaped counterparts.
48
+ def escape_special_html_chars(value)
49
+ escape_regex = /[&<>]/
50
+ return value unless value =~ escape_regex
51
+
52
+ value.gsub(escape_regex, TABLE_FOR_ESCAPE_HTML)
53
+ end
38
54
  end
39
55
  end
40
56
  end
@@ -0,0 +1,53 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Formatters
6
+ class HTMLLineTable < Formatter
7
+ tag 'html_line_table'
8
+
9
+ # @param [Rouge::Formatters::Formatter] formatter An instance of a
10
+ # `Rouge::Formatters::HTML` or `Rouge::Formatters::HTMLInline`
11
+ # @param [Hash] opts options for HTMLLineTable instance.
12
+ # @option opts [Integer] :start_line line number to start from. Defaults to `1`.
13
+ # @option opts [String] :table_class Class name for the table.
14
+ # Defaults to `"rouge-line-table"`.
15
+ # @option opts [String] :line_id a `sprintf` template for generating an `id`
16
+ # attribute for each table row corresponding to current line number.
17
+ # Defaults to `"line-%i"`.
18
+ # @option opts [String] :line_class Class name for each table row.
19
+ # Defaults to `"lineno"`.
20
+ # @option opts [String] :gutter_class Class name for rendered line-number cell.
21
+ # Defaults to `"rouge-gutter"`.
22
+ # @option opts [String] :code_class Class name for rendered code cell.
23
+ # Defaults to `"rouge-code"`.
24
+ def initialize(formatter, opts={})
25
+ @formatter = formatter
26
+ @start_line = opts.fetch :start_line, 1
27
+ @table_class = opts.fetch :table_class, 'rouge-line-table'
28
+ @gutter_class = opts.fetch :gutter_class, 'rouge-gutter'
29
+ @code_class = opts.fetch :code_class, 'rouge-code'
30
+ @line_class = opts.fetch :line_class, 'lineno'
31
+ @line_id = opts.fetch :line_id, 'line-%i'
32
+ end
33
+
34
+ def stream(tokens, &b)
35
+ lineno = @start_line - 1
36
+ buffer = [%(<table class="#@table_class"><tbody>)]
37
+ token_lines(tokens) do |line_tokens|
38
+ lineno += 1
39
+ buffer << %(<tr id="#{sprintf @line_id, lineno}" class="#@line_class">)
40
+ buffer << %(<td class="#@gutter_class gl" )
41
+ buffer << %(style="-moz-user-select: none;-ms-user-select: none;)
42
+ buffer << %(-webkit-user-select: none;user-select: none;">)
43
+ buffer << %(<pre>#{lineno}</pre></td>)
44
+ buffer << %(<td class="#@code_class"><pre>)
45
+ @formatter.stream(line_tokens) { |formatted| buffer << formatted }
46
+ buffer << "\n</pre></td></tr>"
47
+ end
48
+ buffer << %(</tbody></table>)
49
+ yield buffer.join
50
+ end
51
+ end
52
+ end
53
+ end
@@ -1,3 +1,6 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
1
4
  module Rouge
2
5
  module Formatters
3
6
  class Tex < Formatter
@@ -19,6 +22,9 @@ module Rouge
19
22
  '^' => '{\textasciicircum}',
20
23
  '|' => '{\textbar}',
21
24
  '\\' => '{\textbackslash}',
25
+ '`' => '{\textasciigrave}',
26
+ "'" => "'{}",
27
+ '"' => '"{}',
22
28
  "\t" => '{\tab}',
23
29
  }
24
30
 
@@ -56,24 +62,20 @@ module Rouge
56
62
  end
57
63
 
58
64
  def render_line(line, &b)
59
- head, *rest = line
60
- return unless head
61
-
62
- tag_first(*head, &b)
63
- rest.each do |(tok, val)|
64
- yield tag(tok, val)
65
+ line.each do |(tok, val)|
66
+ hphantom_tag(tok, val, &b)
65
67
  end
66
68
  end
67
69
 
68
- # special handling for the first token
69
- # of a line. we replace all initial spaces
70
- # with \hphantom{xxxx}, which renders an
71
- # empty space equal to the size of the x's.
72
- def tag_first(tok, val)
70
+ # Special handling for leading spaces, since they may be gobbled
71
+ # by a previous command. We replace all initial spaces with
72
+ # \hphantom{xxxx}, which renders an empty space equal to the size
73
+ # of the x's.
74
+ def hphantom_tag(tok, val)
73
75
  leading = nil
74
76
  val.sub!(/^[ ]+/) { leading = $&.size; '' }
75
77
  yield "\\hphantom{#{'x' * leading}}" if leading
76
- yield tag(tok, val)
78
+ yield tag(tok, val) unless val.empty?
77
79
  end
78
80
 
79
81
  def tag(tok, val)
@@ -75,6 +75,8 @@ module Rouge
75
75
  disambiguate '*.h' do
76
76
  next ObjectiveC if matches?(/@(end|implementation|protocol|property)\b/)
77
77
  next ObjectiveC if contains?('@"')
78
+ next Cpp if matches?(/^\s*(?:catch|class|constexpr|namespace|private|
79
+ protected|public|template|throw|try|using)\b/x)
78
80
 
79
81
  C
80
82
  end
@@ -86,7 +88,11 @@ module Rouge
86
88
  next Mathematica if contains?('(*')
87
89
  next Mathematica if contains?(':=')
88
90
 
91
+ next Mason if matches?(/<%(def|method|text|doc|args|flags|attr|init|once|shared|perl|cleanup|filter)([^>]*)(>)/)
92
+
89
93
  next Matlab if matches?(/^\s*?%/)
94
+
95
+ next Mason if matches? %r!(</?%|<&)!
90
96
  end
91
97
 
92
98
  disambiguate '*.php' do
@@ -114,6 +120,12 @@ module Rouge
114
120
 
115
121
  next Python
116
122
  end
123
+
124
+ disambiguate 'Messages' do
125
+ next MsgTrans if matches?(/^[^\s:]+:[^\s:]+/)
126
+
127
+ next PlainText
128
+ end
117
129
  end
118
130
  end
119
131
  end
@@ -37,7 +37,7 @@ module Rouge
37
37
 
38
38
  matches = MODELINES.map { |re| re.match(search_space) }.compact
39
39
  return lexers unless matches.any?
40
-
40
+
41
41
  match_set = Set.new(matches.map { |m| m[1] })
42
42
  lexers.select { |l| match_set.include?(l.tag) || l.aliases.any? { |a| match_set.include?(a) } }
43
43
  end
@@ -0,0 +1,162 @@
1
+ # -*- coding: utf-8 -*- #
2
+ # frozen_string_literal: true
3
+
4
+ module Rouge
5
+ module Lexers
6
+ class Ada < RegexLexer
7
+ tag 'ada'
8
+ filenames '*.ada', '*.ads', '*.adb', '*.gpr'
9
+ mimetypes 'text/x-ada'
10
+
11
+ title 'Ada'
12
+ desc 'The Ada 2012 programming language'
13
+
14
+ # Ada identifiers are Unicode with underscores only allowed as separators.
15
+ ID = /\b[[:alpha:]](?:\p{Pc}?[[:alnum:]])*\b/
16
+
17
+ # Numerals can also contain underscores.
18
+ NUM = /\d(_?\d)*/
19
+ XNUM = /\h(_?\h)*/
20
+ EXP = /(E[-+]?#{NUM})?/i
21
+
22
+ # Return a hash mapping lower-case identifiers to token classes.
23
+ def self.idents
24
+ @idents ||= Hash.new(Name).tap do |h|
25
+ %w(
26
+ abort abstract accept access aliased all array at begin body
27
+ case constant declare delay delta digits do else elsif end
28
+ exception exit for generic goto if in interface is limited
29
+ loop new null of others out overriding pragma private
30
+ protected raise range record renames requeue return reverse
31
+ select separate some synchronized tagged task terminate then
32
+ until use when while with
33
+ ).each {|w| h[w] = Keyword}
34
+
35
+ %w(abs and mod not or rem xor).each {|w| h[w] = Operator::Word}
36
+
37
+ %w(
38
+ entry function package procedure subtype type
39
+ ).each {|w| h[w] = Keyword::Declaration}
40
+
41
+ %w(
42
+ boolean character constraint_error duration float integer
43
+ natural positive long_float long_integer long_long_float
44
+ long_long_integer program_error short_float short_integer
45
+ short_short_integer storage_error string tasking_error
46
+ wide_character wide_string wide_wide_character
47
+ wide_wide_string
48
+ ).each {|w| h[w] = Name::Builtin}
49
+ end
50
+ end
51
+
52
+ state :whitespace do
53
+ rule %r{\s+}m, Text
54
+ rule %r{--.*$}, Comment::Single
55
+ end
56
+
57
+ state :dquote_string do
58
+ rule %r{[^"\n]+}, Literal::String::Double
59
+ rule %r{""}, Literal::String::Escape
60
+ rule %r{"}, Literal::String::Double, :pop!
61
+ rule %r{\n}, Error, :pop!
62
+ end
63
+
64
+ state :attr do
65
+ mixin :whitespace
66
+ rule ID, Name::Attribute, :pop!
67
+ rule %r{}, Text, :pop!
68
+ end
69
+
70
+ # Handle a dotted name immediately following a declaration keyword.
71
+ state :decl_name do
72
+ mixin :whitespace
73
+ rule %r{body\b}i, Keyword::Declaration # package body Foo.Bar is...
74
+ rule %r{(#{ID})(\.)} do
75
+ groups Name::Namespace, Punctuation
76
+ end
77
+ # function "<=" (Left, Right: Type) is ...
78
+ rule %r{#{ID}|"(and|or|xor|/?=|<=?|>=?|\+|–|&\|/|mod|rem|\*?\*|abs|not)"},
79
+ Name::Function, :pop!
80
+ rule %r{}, Text, :pop!
81
+ end
82
+
83
+ # Handle a sequence of library unit names: with Ada.Foo, Ada.Bar;
84
+ #
85
+ # There's a chance we entered this state mistakenly since 'with'
86
+ # has multiple other uses in Ada (none of which are likely to
87
+ # appear at the beginning of a line). Try to bail as soon as
88
+ # possible if we see something suspicious like keywords.
89
+ #
90
+ # See ada_spec.rb for some examples.
91
+ state :libunit_name do
92
+ mixin :whitespace
93
+
94
+ rule ID do |m|
95
+ t = self.class.idents[m[0].downcase]
96
+ if t <= Name
97
+ # Convert all kinds of Name to namespaces in this context.
98
+ token Name::Namespace
99
+ else
100
+ # Yikes, we're not supposed to get a keyword in a library unit name!
101
+ # We probably entered this state by mistake, so try to fix it.
102
+ token t
103
+ if t == Keyword::Declaration
104
+ goto :decl_name
105
+ else
106
+ pop!
107
+ end
108
+ end
109
+ end
110
+
111
+ rule %r{[.,]}, Punctuation
112
+ rule %r{}, Text, :pop!
113
+ end
114
+
115
+ state :root do
116
+ mixin :whitespace
117
+
118
+ # String literals.
119
+ rule %r{'.'}, Literal::String::Char
120
+ rule %r{"[^"\n]*}, Literal::String::Double, :dquote_string
121
+
122
+ # Real literals.
123
+ rule %r{#{NUM}\.#{NUM}#{EXP}}, Literal::Number::Float
124
+ rule %r{#{NUM}##{XNUM}\.#{XNUM}##{EXP}}, Literal::Number::Float
125
+
126
+ # Integer literals.
127
+ rule %r{2#[01](_?[01])*##{EXP}}, Literal::Number::Bin
128
+ rule %r{8#[0-7](_?[0-7])*##{EXP}}, Literal::Number::Oct
129
+ rule %r{16##{XNUM}*##{EXP}}, Literal::Number::Hex
130
+ rule %r{#{NUM}##{XNUM}##{EXP}}, Literal::Number::Integer
131
+ rule %r{#{NUM}#\w+#}, Error
132
+ rule %r{#{NUM}#{EXP}}, Literal::Number::Integer
133
+
134
+ # Special constructs.
135
+ rule %r{'}, Punctuation, :attr
136
+ rule %r{<<#{ID}>>}, Name::Label
137
+
138
+ # Context clauses are tricky because the 'with' keyword is used
139
+ # for many purposes. Detect at beginning of the line only.
140
+ rule %r{^(?:(limited)(\s+))?(?:(private)(\s+))?(with)\b}i do
141
+ groups Keyword::Namespace, Text, Keyword::Namespace, Text, Keyword::Namespace
142
+ push :libunit_name
143
+ end
144
+
145
+ # Operators and punctuation characters.
146
+ rule %r{[+*/&<=>|]|-|=>|\.\.|\*\*|[:></]=|<<|>>|<>}, Operator
147
+ rule %r{[.,:;()]}, Punctuation
148
+
149
+ rule ID do |m|
150
+ t = self.class.idents[m[0].downcase]
151
+ token t
152
+ if t == Keyword::Declaration
153
+ push :decl_name
154
+ end
155
+ end
156
+
157
+ # Flag word-like things that don't match the ID pattern.
158
+ rule %r{\b(\p{Pc}|[[alpha]])\p{Word}*}, Error
159
+ end
160
+ end
161
+ end
162
+ end