lib/rouge/lexers/c.rb in rouge-0.2.6 vs lib/rouge/lexers/c.rb in rouge-0.2.7

- old
+ new

@@ -9,22 +9,32 @@ # optional comment or whitespace ws = %r((?:\s|//.*?\n|/[*].*?[*]/)+) id = /[a-zA-Z_][a-zA-Z0-9_]*/ - keywords = %w( - auto break case const continue default do else enum extern - for goto if register restricted return sizeof static struct - switch typedef union volatile virtual while - ) + def self.keywords + @keywords ||= Set.new %w( + auto break case const continue default do else enum extern + for goto if register restricted return sizeof static struct + switch typedef union volatile virtual while + ) + end - keywords_type = %w(int long float short double char unsigned signed void) + def self.keywords_type + @keywords_type ||= Set.new %w( + int long float short double char unsigned signed void + ) + end - __reserved = %w( - asm int8 based except int16 stdcall cdecl fastcall int32 - declspec finally int61 try leave - ) + def self.reserved + @reserved ||= Set.new %w( + __asm __int8 __based __except __int16 __stdcall __cdecl + __fastcall __int32 __declspec __finally __int61 __try __leave + inline _inline __inline naked _naked __naked restrict _restrict + __restrict thread _thread __thread typename _typename __typename + ) + end state :whitespace do rule /^#if\s+0\b/, 'Comment.Preproc', :if_0 rule /^#/, 'Comment.Preproc', :macro rule /^#{ws}#if\s+0\b/, 'Comment.Preproc', :if_0 @@ -39,26 +49,35 @@ rule %r(//(\n|(.|\n)*?[^\\]\n)), 'Comment.Single' rule %r(/(\\\n)?[*](.|\n)*?[*](\\\n)?/), 'Comment.Multiline' end state :statements do + rule /\s+/m, 'Text' + rule /L?"/, 'Literal.String', :string rule %r(L?'(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\'\n])')i, 'Literal.String.Char' rule %r((\d+\.\d*|\.\d+|\d+)[e][+-]?\d+[lu]*)i, 'Literal.Number.Float' rule /0x[0-9a-f]+[lu]*/i, 'Literal.Number.Hex' rule /0[0-7]+[lu]*/i, 'Literal.Number.Oct' rule /\d+[lu]*/i, 'Literal.Number.Integer' rule %r(\*/), 'Error' rule %r([~!%^&*+=\|?:<>/-]), 'Operator' rule /[()\[\],.]/, 'Punctuation' rule /\bcase\b/, 'Keyword', :case - rule /(?:#{keywords.join('|')})\b/, 'Keyword' - rule /(?:#{keywords_type.join('|')})\b/, 'Keyword.Type' - rule /(?:_{0,2}inline|naked|restrict|thread|typename)\b/, 'Keyword.Reserved' - rule /__(?:#{__reserved.join('|')})\b/, 'Keyword.Reserved' rule /(?:true|false|NULL)\b/, 'Name.Builtin' - rule id, 'Name' - rule /\s+/m, 'Text' + rule id do |m| + name = m[0] + + if self.class.keywords.include? name + token 'Keyword' + elsif self.class.keywords_type.include? name + token 'Keyword.Type' + elsif self.class.reserved.include? name + token 'Keyword.Reserved' + else + token 'Name' + end + end end state :case do rule /:/, 'Punctuation', :pop! mixin :statements