lib/rouge/lexers/io.rb
# -*- coding: utf-8 -*- # module Rouge module Lexers class IO < RegexLexer tag 'io' desc 'The IO programming language (http://iolanguage.com)' mimetypes 'text/x-iosrc' filenames '*.io' def self.analyze_text(text) return 1 if text.shebang? 'io' end def self.constants @constants ||= Set.new %w(nil false true) end def self.builtins @builtins ||= Set.new %w( args call clone do doFile doString else elseif for if list method return super then ) end state :root do rule /\s+/m, Text rule %r(//.*?\n), Comment::Single rule %r(#.*?\n), Comment::Single rule %r(/(\\\n)?[*].*?[*](\\\n)?/)m, Comment::Multiline rule %r(/[+]), Comment::Multiline, :nested_comment rule /"(\\\\|\\"|[^"])*"/, Str rule %r(:?:=), Keyword rule /[()]/, Punctuation rule %r([-=;,*+><!/|^.%&\[\]{}]), Operator rule /[A-Z]\w*/, Name::Class rule /[a-z_]\w*/ do |m| name = m[0] if self.class.constants.include? name token Keyword::Constant elsif self.class.builtins.include? name token Name::Builtin else token Name end end rule %r((\d+[.]?\d*|\d*[.]\d+)(e[+-]?[0-9]+)?)i, Num::Float rule /\d+/, Num::Integer rule /@@?/, Keyword end state :nested_comment do rule %r([^/+]+)m, Comment::Multiline rule %r(/[+]), Comment::Multiline, :nested_comment rule %r([+]/), Comment::Multiline, :pop! end end end end