Hot-keys on this page

r m x p   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

# -*- coding: utf-8 -*- 

""" 

    pygments.lexers.fortran 

    ~~~~~~~~~~~~~~~~~~~~~~~ 

 

    Lexers for Fortran languages. 

 

    :copyright: Copyright 2006-2014 by the Pygments team, see AUTHORS. 

    :license: BSD, see LICENSE for details. 

""" 

 

import re 

 

from pygments.lexer import RegexLexer, include, words 

from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ 

    Number, Punctuation 

 

__all__ = ['FortranLexer'] 

 

 

class FortranLexer(RegexLexer): 

    """ 

    Lexer for FORTRAN 90 code. 

 

    .. versionadded:: 0.10 

    """ 

    name = 'Fortran' 

    aliases = ['fortran'] 

    filenames = ['*.f', '*.f90', '*.F', '*.F90'] 

    mimetypes = ['text/x-fortran'] 

    flags = re.IGNORECASE | re.MULTILINE 

 

    # Data Types: INTEGER, REAL, COMPLEX, LOGICAL, CHARACTER and DOUBLE PRECISION 

    # Operators: **, *, +, -, /, <, >, <=, >=, ==, /= 

    # Logical (?): NOT, AND, OR, EQV, NEQV 

 

    # Builtins: 

    # http://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/Table-of-Intrinsic-Functions.html 

 

    tokens = { 

        'root': [ 

            (r'^#.*\n', Comment.Preproc), 

            (r'!.*\n', Comment), 

            include('strings'), 

            include('core'), 

            (r'[a-z][\w$]*', Name), 

            include('nums'), 

            (r'[\s]+', Text), 

        ], 

        'core': [ 

            # Statements 

            (words(( 

                'ABSTRACT', 'ACCEPT', 'ALL', 'ALLSTOP', 'ALLOCATABLE', 'ALLOCATE', 

                'ARRAY', 'ASSIGN', 'ASSOCIATE', 'ASYNCHRONOUS', 'BACKSPACE', 'BIND', 

                'BLOCK', 'BLOCKDATA', 'BYTE', 'CALL', 'CASE', 'CLASS', 'CLOSE', 

                'CODIMENSION', 'COMMON', 'CONCURRRENT', 'CONTIGUOUS', 'CONTAINS', 

                'CONTINUE', 'CRITICAL', 'CYCLE', 'DATA', 'DEALLOCATE', 'DECODE', 

                'DEFERRED', 'DIMENSION', 'DO', 'ELEMENTAL', 'ELSE', 'ENCODE', 'END', 

                'ENTRY', 'ENUM', 'ENUMERATOR', 'EQUIVALENCE', 'EXIT', 'EXTENDS', 

                'EXTERNAL', 'EXTRINSIC', 'FILE', 'FINAL', 'FORALL', 'FORMAT', 

                'FUNCTION', 'GENERIC', 'GOTO', 'IF', 'IMAGES', 'IMPLICIT', 

                'IMPORT', 'IMPURE', 'INCLUDE', 'INQUIRE', 'INTENT', 'INTERFACE', 

                'INTRINSIC', 'IS', 'LOCK', 'MEMORY', 'MODULE', 'NAMELIST', 'NULLIFY', 

                'NONE', 'NON_INTRINSIC', 'NON_OVERRIDABLE', 'NOPASS', 'OPEN', 'OPTIONAL', 

                'OPTIONS', 'PARAMETER', 'PASS', 'PAUSE', 'POINTER', 'PRINT', 'PRIVATE', 

                'PROGRAM', 'PROCEDURE', 'PROTECTED', 'PUBLIC', 'PURE', 'READ', 

                'RECURSIVE', 'RESULT', 'RETURN', 'REWIND', 'SAVE', 'SELECT', 'SEQUENCE', 

                'STOP', 'SUBMODULE', 'SUBROUTINE', 'SYNC', 'SYNCALL', 'SYNCIMAGES', 

                'SYNCMEMORY', 'TARGET', 'THEN', 'TYPE', 'UNLOCK', 'USE', 'VALUE', 

                'VOLATILE', 'WHERE', 'WRITE', 'WHILE'), prefix=r'\b', suffix=r'\s*\b'), 

             Keyword), 

 

            # Data Types 

            (words(( 

                'CHARACTER', 'COMPLEX', 'DOUBLE PRECISION', 'DOUBLE COMPLEX', 'INTEGER', 

                'LOGICAL', 'REAL', 'C_INT', 'C_SHORT', 'C_LONG', 'C_LONG_LONG', 'C_SIGNED_CHAR', 

                'C_SIZE_T', 'C_INT8_T', 'C_INT16_T', 'C_INT32_T', 'C_INT64_T', 'C_INT_LEAST8_T', 

                'C_INT_LEAST16_T', 'C_INT_LEAST32_T', 'C_INT_LEAST64_T', 'C_INT_FAST8_T', 

                'C_INT_FAST16_T', 'C_INT_FAST32_T', 'C_INT_FAST64_T', 'C_INTMAX_T', 

                'C_INTPTR_T', 'C_FLOAT', 'C_DOUBLE', 'C_LONG_DOUBLE', 'C_FLOAT_COMPLEX', 

                'C_DOUBLE_COMPLEX', 'C_LONG_DOUBLE_COMPLEX', 'C_BOOL', 'C_CHAR', 'C_PTR', 

                'C_FUNPTR'), prefix=r'\b', suffix=r'\s*\b'), 

             Keyword.Type), 

 

            # Operators 

            (r'(\*\*|\*|\+|-|\/|<|>|<=|>=|==|\/=|=)', Operator), 

 

            (r'(::)', Keyword.Declaration), 

 

            (r'[()\[\],:&%;.]', Punctuation), 

            # Intrinsics 

            (words(( 

                'Abort', 'Abs', 'Access', 'AChar', 'ACos', 'ACosH', 'AdjustL', 

                'AdjustR', 'AImag', 'AInt', 'Alarm', 'All', 'Allocated', 'ALog', 

                'AMax', 'AMin', 'AMod', 'And', 'ANInt', 'Any', 'ASin', 'ASinH', 

                'Associated', 'ATan', 'ATanH', 'Atomic_Define', 'Atomic_Ref', 

                'BesJ', 'BesJN', 'Bessel_J0', 'Bessel_J1', 'Bessel_JN', 'Bessel_Y0', 

                'Bessel_Y1', 'Bessel_YN', 'BesY', 'BesYN', 'BGE', 'BGT', 'BLE', 

                'BLT', 'Bit_Size', 'BTest', 'CAbs', 'CCos', 'Ceiling', 'CExp', 

                'Char', 'ChDir', 'ChMod', 'CLog', 'Cmplx', 'Command_Argument_Count', 

                'Complex', 'Conjg', 'Cos', 'CosH', 'Count', 'CPU_Time', 'CShift', 

                'CSin', 'CSqRt', 'CTime', 'C_Loc', 'C_Associated', 

                'C_Null_Ptr', 'C_Null_Funptr', 'C_F_Pointer', 'C_F_ProcPointer', 

                'C_Null_Char', 'C_Alert', 'C_Backspace', 'C_Form_Feed', 'C_FunLoc', 

                'C_Sizeof', 'C_New_Line', 'C_Carriage_Return', 

                'C_Horizontal_Tab', 'C_Vertical_Tab', 'DAbs', 'DACos', 'DASin', 

                'DATan', 'Date_and_Time', 'DbesJ', 'DbesJN', 'DbesY', 

                'DbesYN', 'Dble', 'DCos', 'DCosH', 'DDiM', 'DErF', 

                'DErFC', 'DExp', 'Digits', 'DiM', 'DInt', 'DLog', 'DMax', 

                'DMin', 'DMod', 'DNInt', 'Dot_Product', 'DProd', 'DSign', 'DSinH', 

                'DShiftL', 'DShiftR', 'DSin', 'DSqRt', 'DTanH', 'DTan', 'DTime', 

                'EOShift', 'Epsilon', 'ErF', 'ErFC', 'ErFC_Scaled', 'ETime', 

                'Execute_Command_Line', 'Exit', 'Exp', 'Exponent', 'Extends_Type_Of', 

                'FDate', 'FGet', 'FGetC', 'FindLoc', 'Float', 'Floor', 'Flush', 

                'FNum', 'FPutC', 'FPut', 'Fraction', 'FSeek', 'FStat', 'FTell', 

                'Gamma', 'GError', 'GetArg', 'Get_Command', 'Get_Command_Argument', 

                'Get_Environment_Variable', 'GetCWD', 'GetEnv', 'GetGId', 'GetLog', 

                'GetPId', 'GetUId', 'GMTime', 'HostNm', 'Huge', 'Hypot', 'IAbs', 

                'IAChar', 'IAll', 'IAnd', 'IAny', 'IArgC', 'IBClr', 'IBits', 

                'IBSet', 'IChar', 'IDate', 'IDiM', 'IDInt', 'IDNInt', 'IEOr', 

                'IErrNo', 'IFix', 'Imag', 'ImagPart', 'Image_Index', 'Index', 

                'Int', 'IOr', 'IParity', 'IRand', 'IsaTty', 'IShft', 'IShftC', 

                'ISign', 'Iso_C_Binding', 'Is_Contiguous', 'Is_Iostat_End', 

                'Is_Iostat_Eor', 'ITime', 'Kill', 'Kind', 'LBound', 'LCoBound', 

                'Len', 'Len_Trim', 'LGe', 'LGt', 'Link', 'LLe', 'LLt', 'LnBlnk', 

                'Loc', 'Log', 'Log_Gamma', 'Logical', 'Long', 'LShift', 'LStat', 

                'LTime', 'MaskL', 'MaskR', 'MatMul', 'Max', 'MaxExponent', 

                'MaxLoc', 'MaxVal', 'MClock', 'Merge', 'Merge_Bits', 'Move_Alloc', 

                'Min', 'MinExponent', 'MinLoc', 'MinVal', 'Mod', 'Modulo', 'MvBits', 

                'Nearest', 'New_Line', 'NInt', 'Norm2', 'Not', 'Null', 'Num_Images', 

                'Or', 'Pack', 'Parity', 'PError', 'Precision', 'Present', 'Product', 

                'Radix', 'Rand', 'Random_Number', 'Random_Seed', 'Range', 'Real', 

                'RealPart', 'Rename', 'Repeat', 'Reshape', 'RRSpacing', 'RShift', 

                'Same_Type_As', 'Scale', 'Scan', 'Second', 'Selected_Char_Kind', 

                'Selected_Int_Kind', 'Selected_Real_Kind', 'Set_Exponent', 'Shape', 

                'ShiftA', 'ShiftL', 'ShiftR', 'Short', 'Sign', 'Signal', 'SinH', 

                'Sin', 'Sleep', 'Sngl', 'Spacing', 'Spread', 'SqRt', 'SRand', 

                'Stat', 'Storage_Size', 'Sum', 'SymLnk', 'System', 'System_Clock', 

                'Tan', 'TanH', 'Time', 'This_Image', 'Tiny', 'TrailZ', 'Transfer', 

                'Transpose', 'Trim', 'TtyNam', 'UBound', 'UCoBound', 'UMask', 

                'Unlink', 'Unpack', 'Verify', 'XOr', 'ZAbs', 'ZCos', 'ZExp', 

                'ZLog', 'ZSin', 'ZSqRt'), prefix=r'\b', suffix=r'\s*\b'), 

             Name.Builtin), 

 

            # Booleans 

            (r'\.(true|false)\.', Name.Builtin), 

            # Comparing Operators 

            (r'\.(eq|ne|lt|le|gt|ge|not|and|or|eqv|neqv)\.', Operator.Word), 

        ], 

 

        'strings': [ 

            (r'(?s)"(\\\\|\\[0-7]+|\\.|[^"\\])*"', String.Double), 

            (r"(?s)'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single), 

        ], 

 

        'nums': [ 

            (r'\d+(?![.e])(_[a-z]\w+)?', Number.Integer), 

            (r'[+-]?\d*\.\d+(e[-+]?\d+)?(_[a-z]\w+)?', Number.Float), 

            (r'[+-]?\d+\.\d*(e[-+]?\d+)?(_[a-z]\w+)?', Number.Float), 

        ], 

    }