lib/rouge/lexers/fortran.rb in rouge-2.1.1 vs lib/rouge/lexers/fortran.rb in rouge-2.2.0
- old
+ new
@@ -17,49 +17,52 @@
name = /[A-Z][_A-Z0-9]*/i
kind_param = /(\d+|#{name})/
exponent = /[ED][+-]?\d+/i
def self.keywords
- # Fortran allows to omit whitespace between certain keywords...
+ # Special rules for two-word keywords are defined further down.
+ # Note: Fortran allows to omit whitespace between certain keywords.
@keywords ||= Set.new %w(
- abstract all allocatable allocate assign assignment asynchronous
- backspace bind block blockdata close common concurrent contiguous call
- case class codimension contains continue cycle data deallocate
- deferred dimension do elemental else elseif elsewhere end endblock
- endblockdata enddo endenum endfile endforall endfunction endif
- endinterface endmodule endprogram endselect endsubmodule endsubroutine
- endtype endwhere endwhile entry enum enumerator equivalence error exit
- external final flush forall format function generic go goto if
- implicit import in include inout inquire intent interface intrinsic is
- module namelist non_overridable none nopass nullify only open operator
- optional out parameter pass pause pointer print private procedure
- program protected public pure read recursive result return rewind save
- select selectcase sequence stop submodule subroutine target then to
- type use value volatile wait where while write
+ abstract allocatable allocate assign assignment associate asynchronous
+ backspace bind block blockdata call case class close codimension
+ common concurrent contains contiguous continue critical cycle data
+ deallocate deferred dimension do elemental else elseif elsewhere end
+ endassociate endblock endblockdata enddo endenum endfile endforall
+ endfunction endif endinterface endmodule endprogram endselect
+ endsubmodule endsubroutine endtype endwhere endwhile entry enum
+ enumerator equivalence exit extends external final flush forall format
+ function generic goto if implicit import in include inout inquire
+ intent interface intrinsic is lock module namelist non_overridable
+ none nopass nullify only open operator optional out parameter pass
+ pause pointer print private procedure program protected public pure
+ read recursive result return rewind save select selectcase sequence
+ stop submodule subroutine target then type unlock use value volatile
+ wait where while write
)
end
def self.types
- # There is a separate rule for "double precision" (two words) below
+ # A special rule for the two-word version "double precision" is
+ # defined further down.
@types ||= Set.new %w(
character complex doubleprecision integer logical real
)
end
def self.intrinsics
@intrinsics ||= Set.new %w(
abs achar acos acosh adjustl adjustr aimag aint all allocated anint
- any asin asinh associated atan atan2 atanh bessel_j0 bessel_j1
- bessel_jn bessel_y0 bessel_y1 bessel_yn bge bgt bit_size ble blt btest
- c_associated c_f_pointer c_f_procpointer c_funloc c_loc c_sizeof
- ceiling char cmplx command_argument_count compiler_options
- compiler_version conjg cos cosh count cpu_time cshift date_and_time
- dble digits dim dot_product dprod dshiftl dshiftr eoshift epsilon erf
- erfc_scaled erfc execute_command_line exp exponent extends_type_of
- findloc floor fraction gamma get_command_argument get_command
- get_environment_variable huge hypot iachar iall iand iany ibclr ibits
- ibset ichar ieee_class ieee_copy_sign ieee_get_flag
+ any asin asinh associated atan atan2 atanh atomic_define atomic_ref
+ bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn bge bgt
+ bit_size ble blt btest c_associated c_f_pointer c_f_procpointer
+ c_funloc c_loc c_sizeof ceiling char cmplx command_argument_count
+ compiler_options compiler_version conjg cos cosh count cpu_time cshift
+ date_and_time dble digits dim dot_product dprod dshiftl dshiftr
+ eoshift epsilon erf erfc_scaled erfc execute_command_line exp exponent
+ extends_type_of findloc floor fraction gamma get_command_argument
+ get_command get_environment_variable huge hypot iachar iall iand iany
+ ibclr ibits ibset ichar ieee_class ieee_copy_sign ieee_get_flag
ieee_get_halting_mode ieee_get_rounding_mode ieee_get_status
ieee_get_underflow_mode ieee_is_finite ieee_is_nan ieee_is_normal
ieee_logb ieee_next_after ieee_rem ieee_rint ieee_scalb
ieee_selected_real_kind ieee_set_flag ieee_set_halting_mode
ieee_set_rounding_mode ieee_set_status ieee_set_underflow_mode
@@ -122,12 +125,15 @@
rule /[.](TRUE|FALSE)[.](_#{kind_param})?/i, Keyword::Constant
rule %r{\*\*|//|==|/=|<=|>=|=>|[-+*/<>=%]}, Operator
rule /\.(?:EQ|NE|LT|LE|GT|GE|NOT|AND|OR|EQV|NEQV|[A-Z]+)\./i, Operator::Word
- # To make sure "double precision" written as two words is highlighted
- # properly. "doubleprecision" is covered by a different rule.
+ # Special rules for two-word keywords and types.
+ # Note: "doubleprecision" is covered by the normal keyword rule.
rule /double\s+precision\b/i, Keyword::Type
+ rule /go\s+to\b/i, Keyword
+ rule /sync\s+(all|images|memory)\b/i, Keyword
+ rule /error\s+stop\b/i, Keyword
rule /#{name}/m do |m|
match = m[0].downcase
if self.class.keywords.include? match
token Keyword