1""" 2 pygments.lexers.fortran 3 ~~~~~~~~~~~~~~~~~~~~~~~ 4 5 Lexers for Fortran languages. 6 7 :copyright: Copyright 2006-2021 by the Pygments team, see AUTHORS. 8 :license: BSD, see LICENSE for details. 9""" 10 11import re 12 13from pygments.lexer import RegexLexer, bygroups, include, words, using, default 14from pygments.token import Text, Comment, Operator, Keyword, Name, String, \ 15 Number, Punctuation, Generic 16 17__all__ = ['FortranLexer', 'FortranFixedLexer'] 18 19 20class FortranLexer(RegexLexer): 21 """ 22 Lexer for FORTRAN 90 code. 23 24 .. versionadded:: 0.10 25 """ 26 name = 'Fortran' 27 aliases = ['fortran'] 28 filenames = ['*.f03', '*.f90', '*.F03', '*.F90'] 29 mimetypes = ['text/x-fortran'] 30 flags = re.IGNORECASE | re.MULTILINE 31 32 # Data Types: INTEGER, REAL, COMPLEX, LOGICAL, CHARACTER and DOUBLE PRECISION 33 # Operators: **, *, +, -, /, <, >, <=, >=, ==, /= 34 # Logical (?): NOT, AND, OR, EQV, NEQV 35 36 # Builtins: 37 # http://gcc.gnu.org/onlinedocs/gcc-3.4.6/g77/Table-of-Intrinsic-Functions.html 38 39 tokens = { 40 'root': [ 41 (r'^#.*\n', Comment.Preproc), 42 (r'!.*\n', Comment), 43 include('strings'), 44 include('core'), 45 (r'[a-z][\w$]*', Name), 46 include('nums'), 47 (r'[\s]+', Text), 48 ], 49 'core': [ 50 # Statements 51 (words(( 52 'ABSTRACT', 'ACCEPT', 'ALL', 'ALLSTOP', 'ALLOCATABLE', 'ALLOCATE', 53 'ARRAY', 'ASSIGN', 'ASSOCIATE', 'ASYNCHRONOUS', 'BACKSPACE', 'BIND', 54 'BLOCK', 'BLOCKDATA', 'BYTE', 'CALL', 'CASE', 'CLASS', 'CLOSE', 55 'CODIMENSION', 'COMMON', 'CONCURRRENT', 'CONTIGUOUS', 'CONTAINS', 56 'CONTINUE', 'CRITICAL', 'CYCLE', 'DATA', 'DEALLOCATE', 'DECODE', 57 'DEFERRED', 'DIMENSION', 'DO', 'ELEMENTAL', 'ELSE', 'ENCODE', 'END', 58 'ENDASSOCIATE', 'ENDBLOCK', 'ENDDO', 'ENDENUM', 'ENDFORALL', 59 'ENDFUNCTION', 'ENDIF', 'ENDINTERFACE', 'ENDMODULE', 'ENDPROGRAM', 60 'ENDSELECT', 'ENDSUBMODULE', 'ENDSUBROUTINE', 'ENDTYPE', 'ENDWHERE', 61 'ENTRY', 'ENUM', 'ENUMERATOR', 'EQUIVALENCE', 'ERROR STOP', 'EXIT', 62 'EXTENDS', 'EXTERNAL', 'EXTRINSIC', 'FILE', 'FINAL', 'FORALL', 'FORMAT', 63 'FUNCTION', 'GENERIC', 'GOTO', 'IF', 'IMAGES', 'IMPLICIT', 64 'IMPORT', 'IMPURE', 'INCLUDE', 'INQUIRE', 'INTENT', 'INTERFACE', 65 'INTRINSIC', 'IS', 'LOCK', 'MEMORY', 'MODULE', 'NAMELIST', 'NULLIFY', 66 'NONE', 'NON_INTRINSIC', 'NON_OVERRIDABLE', 'NOPASS', 'ONLY', 'OPEN', 67 'OPTIONAL', 'OPTIONS', 'PARAMETER', 'PASS', 'PAUSE', 'POINTER', 'PRINT', 68 'PRIVATE', 'PROGRAM', 'PROCEDURE', 'PROTECTED', 'PUBLIC', 'PURE', 'READ', 69 'RECURSIVE', 'RESULT', 'RETURN', 'REWIND', 'SAVE', 'SELECT', 'SEQUENCE', 70 'STOP', 'SUBMODULE', 'SUBROUTINE', 'SYNC', 'SYNCALL', 'SYNCIMAGES', 71 'SYNCMEMORY', 'TARGET', 'THEN', 'TYPE', 'UNLOCK', 'USE', 'VALUE', 72 'VOLATILE', 'WHERE', 'WRITE', 'WHILE'), prefix=r'\b', suffix=r'\s*\b'), 73 Keyword), 74 75 # Data Types 76 (words(( 77 'CHARACTER', 'COMPLEX', 'DOUBLE PRECISION', 'DOUBLE COMPLEX', 'INTEGER', 78 'LOGICAL', 'REAL', 'C_INT', 'C_SHORT', 'C_LONG', 'C_LONG_LONG', 79 'C_SIGNED_CHAR', 'C_SIZE_T', 'C_INT8_T', 'C_INT16_T', 'C_INT32_T', 80 'C_INT64_T', 'C_INT_LEAST8_T', 'C_INT_LEAST16_T', 'C_INT_LEAST32_T', 81 'C_INT_LEAST64_T', 'C_INT_FAST8_T', 'C_INT_FAST16_T', 'C_INT_FAST32_T', 82 'C_INT_FAST64_T', 'C_INTMAX_T', 'C_INTPTR_T', 'C_FLOAT', 'C_DOUBLE', 83 'C_LONG_DOUBLE', 'C_FLOAT_COMPLEX', 'C_DOUBLE_COMPLEX', 84 'C_LONG_DOUBLE_COMPLEX', 'C_BOOL', 'C_CHAR', 'C_PTR', 'C_FUNPTR'), 85 prefix=r'\b', suffix=r'\s*\b'), 86 Keyword.Type), 87 88 # Operators 89 (r'(\*\*|\*|\+|-|\/|<|>|<=|>=|==|\/=|=)', Operator), 90 91 (r'(::)', Keyword.Declaration), 92 93 (r'[()\[\],:&%;.]', Punctuation), 94 # Intrinsics 95 (words(( 96 'Abort', 'Abs', 'Access', 'AChar', 'ACos', 'ACosH', 'AdjustL', 97 'AdjustR', 'AImag', 'AInt', 'Alarm', 'All', 'Allocated', 'ALog', 98 'AMax', 'AMin', 'AMod', 'And', 'ANInt', 'Any', 'ASin', 'ASinH', 99 'Associated', 'ATan', 'ATanH', 'Atomic_Define', 'Atomic_Ref', 100 'BesJ', 'BesJN', 'Bessel_J0', 'Bessel_J1', 'Bessel_JN', 'Bessel_Y0', 101 'Bessel_Y1', 'Bessel_YN', 'BesY', 'BesYN', 'BGE', 'BGT', 'BLE', 102 'BLT', 'Bit_Size', 'BTest', 'CAbs', 'CCos', 'Ceiling', 'CExp', 103 'Char', 'ChDir', 'ChMod', 'CLog', 'Cmplx', 'Command_Argument_Count', 104 'Complex', 'Conjg', 'Cos', 'CosH', 'Count', 'CPU_Time', 'CShift', 105 'CSin', 'CSqRt', 'CTime', 'C_Loc', 'C_Associated', 106 'C_Null_Ptr', 'C_Null_Funptr', 'C_F_Pointer', 'C_F_ProcPointer', 107 'C_Null_Char', 'C_Alert', 'C_Backspace', 'C_Form_Feed', 'C_FunLoc', 108 'C_Sizeof', 'C_New_Line', 'C_Carriage_Return', 109 'C_Horizontal_Tab', 'C_Vertical_Tab', 'DAbs', 'DACos', 'DASin', 110 'DATan', 'Date_and_Time', 'DbesJ', 'DbesJN', 'DbesY', 111 'DbesYN', 'Dble', 'DCos', 'DCosH', 'DDiM', 'DErF', 112 'DErFC', 'DExp', 'Digits', 'DiM', 'DInt', 'DLog', 'DMax', 113 'DMin', 'DMod', 'DNInt', 'Dot_Product', 'DProd', 'DSign', 'DSinH', 114 'DShiftL', 'DShiftR', 'DSin', 'DSqRt', 'DTanH', 'DTan', 'DTime', 115 'EOShift', 'Epsilon', 'ErF', 'ErFC', 'ErFC_Scaled', 'ETime', 116 'Execute_Command_Line', 'Exit', 'Exp', 'Exponent', 'Extends_Type_Of', 117 'FDate', 'FGet', 'FGetC', 'FindLoc', 'Float', 'Floor', 'Flush', 118 'FNum', 'FPutC', 'FPut', 'Fraction', 'FSeek', 'FStat', 'FTell', 119 'Gamma', 'GError', 'GetArg', 'Get_Command', 'Get_Command_Argument', 120 'Get_Environment_Variable', 'GetCWD', 'GetEnv', 'GetGId', 'GetLog', 121 'GetPId', 'GetUId', 'GMTime', 'HostNm', 'Huge', 'Hypot', 'IAbs', 122 'IAChar', 'IAll', 'IAnd', 'IAny', 'IArgC', 'IBClr', 'IBits', 123 'IBSet', 'IChar', 'IDate', 'IDiM', 'IDInt', 'IDNInt', 'IEOr', 124 'IErrNo', 'IFix', 'Imag', 'ImagPart', 'Image_Index', 'Index', 125 'Int', 'IOr', 'IParity', 'IRand', 'IsaTty', 'IShft', 'IShftC', 126 'ISign', 'Iso_C_Binding', 'Is_Contiguous', 'Is_Iostat_End', 127 'Is_Iostat_Eor', 'ITime', 'Kill', 'Kind', 'LBound', 'LCoBound', 128 'Len', 'Len_Trim', 'LGe', 'LGt', 'Link', 'LLe', 'LLt', 'LnBlnk', 129 'Loc', 'Log', 'Log_Gamma', 'Logical', 'Long', 'LShift', 'LStat', 130 'LTime', 'MaskL', 'MaskR', 'MatMul', 'Max', 'MaxExponent', 131 'MaxLoc', 'MaxVal', 'MClock', 'Merge', 'Merge_Bits', 'Move_Alloc', 132 'Min', 'MinExponent', 'MinLoc', 'MinVal', 'Mod', 'Modulo', 'MvBits', 133 'Nearest', 'New_Line', 'NInt', 'Norm2', 'Not', 'Null', 'Num_Images', 134 'Or', 'Pack', 'Parity', 'PError', 'Precision', 'Present', 'Product', 135 'Radix', 'Rand', 'Random_Number', 'Random_Seed', 'Range', 'Real', 136 'RealPart', 'Rename', 'Repeat', 'Reshape', 'RRSpacing', 'RShift', 137 'Same_Type_As', 'Scale', 'Scan', 'Second', 'Selected_Char_Kind', 138 'Selected_Int_Kind', 'Selected_Real_Kind', 'Set_Exponent', 'Shape', 139 'ShiftA', 'ShiftL', 'ShiftR', 'Short', 'Sign', 'Signal', 'SinH', 140 'Sin', 'Sleep', 'Sngl', 'Spacing', 'Spread', 'SqRt', 'SRand', 141 'Stat', 'Storage_Size', 'Sum', 'SymLnk', 'System', 'System_Clock', 142 'Tan', 'TanH', 'Time', 'This_Image', 'Tiny', 'TrailZ', 'Transfer', 143 'Transpose', 'Trim', 'TtyNam', 'UBound', 'UCoBound', 'UMask', 144 'Unlink', 'Unpack', 'Verify', 'XOr', 'ZAbs', 'ZCos', 'ZExp', 145 'ZLog', 'ZSin', 'ZSqRt'), prefix=r'\b', suffix=r'\s*\b'), 146 Name.Builtin), 147 148 # Booleans 149 (r'\.(true|false)\.', Name.Builtin), 150 # Comparing Operators 151 (r'\.(eq|ne|lt|le|gt|ge|not|and|or|eqv|neqv)\.', Operator.Word), 152 ], 153 154 'strings': [ 155 (r'(?s)"(\\\\|\\[0-7]+|\\.|[^"\\])*"', String.Double), 156 (r"(?s)'(\\\\|\\[0-7]+|\\.|[^'\\])*'", String.Single), 157 ], 158 159 'nums': [ 160 (r'\d+(?![.e])(_([1-9]|[a-z]\w*))?', Number.Integer), 161 (r'[+-]?\d*\.\d+([ed][-+]?\d+)?(_([1-9]|[a-z]\w*))?', Number.Float), 162 (r'[+-]?\d+\.\d*([ed][-+]?\d+)?(_([1-9]|[a-z]\w*))?', Number.Float), 163 (r'[+-]?\d+(\.\d*)?[ed][-+]?\d+(_([1-9]|[a-z]\w*))?', Number.Float), 164 ], 165 } 166 167 168class FortranFixedLexer(RegexLexer): 169 """ 170 Lexer for fixed format Fortran. 171 172 .. versionadded:: 2.1 173 """ 174 name = 'FortranFixed' 175 aliases = ['fortranfixed'] 176 filenames = ['*.f', '*.F'] 177 178 flags = re.IGNORECASE 179 180 def _lex_fortran(self, match, ctx=None): 181 """Lex a line just as free form fortran without line break.""" 182 lexer = FortranLexer() 183 text = match.group(0) + "\n" 184 for index, token, value in lexer.get_tokens_unprocessed(text): 185 value = value.replace('\n', '') 186 if value != '': 187 yield index, token, value 188 189 tokens = { 190 'root': [ 191 (r'[C*].*\n', Comment), 192 (r'#.*\n', Comment.Preproc), 193 (r' {0,4}!.*\n', Comment), 194 (r'(.{5})', Name.Label, 'cont-char'), 195 (r'.*\n', using(FortranLexer)), 196 ], 197 'cont-char': [ 198 (' ', Text, 'code'), 199 ('0', Comment, 'code'), 200 ('.', Generic.Strong, 'code'), 201 ], 202 'code': [ 203 (r'(.{66})(.*)(\n)', 204 bygroups(_lex_fortran, Comment, Text), 'root'), 205 (r'(.*)(\n)', bygroups(_lex_fortran, Text), 'root'), 206 default('root'), 207 ] 208 } 209