module Rouge module Lexers class ObjectiveC < RegexLexer tag 'objective_c' aliases 'objective-c', 'objectivec', 'obj_c', 'obj-c', 'objc' # XXX TODO: objc has .h files too filenames '*.m' mimetypes 'text/x-objective-c' id = /[a-zA-Z$_][a-zA-Z0-9$_]*/ def self.decorators @decorators = Set.new %w( private protected public encode synchronized try throw catch finally end property synthesize dynamic selector ) end def self.keywords_type @keywords_type ||= Set.new %w( int long float short double char unsigned signed void id BOOL IBOutlet IBAction SEL ) end 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 in ) end def self.reserved @reserved ||= Set.new %w( inline naked restrict thread typename _inline _naked _restrict _thread _typename __inline __naked __restrict __thread __typename __asm __int8 __based __except __int16 __stdcall __cdecl __fastcall __int32 __declspec __finally __int64 __try __leave ) end state :whitespace do rule /^\s*#if\s+0/, 'Comment', :if0 rule /^\s*#/, 'Comment.Preproc', :macro rule /\n/, 'Text' rule /\s+/, 'Text' rule /\\\n/, 'Literal.String.Escape' rule %r(//(\\.|.)*?\n), 'Comment.Single' rule %r(/[*].*?[*]/), 'Comment.Multiline' end state :statements do rule /[L@]?"/, 'Literal.String', :string rule /(L|@)?'(\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\'\n]|\\.)'/, 'Literal.String.Char' rule /(\d+[.]\d*|[.]\d+|\d+)e[+-]?\d+l?/i, 'Literal.Number.Float' rule /(\d+[.]\d*|[.]\d+)f?/i, 'Literal.Number.Float' rule /\d+f/i, 'Literal.Number.Float' rule /0x[0-9a-f]+l?/i, 'Literal.Number.Hex' rule /0[0-7]+l?/i, 'Literal.Number.Oct' rule /\d+l?/i, 'Literal.Number.Integer' rule %r([~!%^&*+=|?:<>/-]), 'Operator' rule /[()\[\],.]/, 'Punctuation' rule /#{id}:(?!:)/, 'Name.Label' rule /@(#{id})/ do |m| if self.class.decorators.include? m[1] token 'Keyword' else token 'Error' end end rule /(TRUE|FALSE|nil|NULL)\b/, 'Name.Builtin' 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' end end end state :root do mixin :whitespace rule %r( ([a-zA-Z0-9_*\s]+?[\s*]) # return arguments (#{id}) # method name (\s*[(][^;]*?[)]) # signature )x end end end end