class Rouge::Lexers::Fortran

def self.intrinsics

def self.intrinsics
  @intrinsics ||= Set.new %w(
    abs achar acos adjustl adjustr aimag aint all allocated anint any
    asin associated atan atan2 bit_size btest ceiling char cmplx conjg
    cos cosh count cpu_time cshift date_and_time dble digits dim
    dot_product dprod eoshift epsilon exp exponent floor fraction huge
    iachar iand ibclr ibits ibset ichar ieor index int ior ishift ishiftc
    kind lbound len len_trim lge lgt lle llt log log10 logical matmul max
    maxexponent maxloc maxval merge min minexponent minloc minval mod
    modulo mvbits nearest nint not null pack precision present product
    radix random_number random_seed range real repeat reshape rrspacing
    scale scan selected_int_kind selected_real_kind set_exponent shape
    sign sin sinh size spacing spread sqrt sum system_clock tan tanh tiny
    transfer transpose trim ubound unpack verify
  )
end

def self.keywords

def self.keywords
  # Fortran allows to omit whitespace between certain keywords...
  @keywords ||= Set.new %w(
    allocatable allocate assignment backspace block blockdata call case
    close common contains continue cycle data deallocate default
    dimension do elemental else elseif elsewhere end endblockdata enddo
    endfile endforall endfunction endif endinterface endmodule endprogram
    endselect endsubroutine endtype endwhere entry equivalence exit
    external forall format function go goto if implicit in include inout
    inquire intent interface intrinsic module namelist none nullify only
    open operator optional out parameter pointer print private procedure
    program public pure read recursive result return rewind save select
    selectcase sequence stop subroutine target then to type use where
    while write
  )
end

def self.types

def self.types
  @types ||= Set.new %w(
    character complex double precision doubleprecision integer logical real
  )
end