Permalink
Find file
Fetching contributors…
Cannot retrieve contributors at this time
158 lines (128 sloc) 5.76 KB
%%module languages/fortran/syntax/FortranLex
module FortranLex
%%
%% Input restrictions:
%% -Make sure that the last statement at the end of the file has a '\n' to prevent a parse error.
%% -Userdefined operators (.XYZ.) are not handled yet
%% -include 'file' lines must first be processed or make it a comment (put a ! in front)
%%
%% F77 fixed format text can also be parsed if some pre-processing is done first,
%% Minimal changes needed for fixed form source handling:
%% a. change continuation symbols in 6th column by a & on the previous line (but not in a comment of course)
%% in VIM regexp: :g/^ [^ ]/-1s/$/ \&/ followed by :%/^ [^ ]/ / (5 spaces+nonspace -> 6 spaces)
%% b. change every comment-symbol (* or C) in the first column into a !.
%% in VIM regexp: %s/^[C\*]/!/
exports
sorts
BinaryConstant Character Comment StartCommentBlock
Continuation Dop EOS HexConstant
Icon Ident Label LblDef
Letter OctalConstant
Rcon ScalarIntLiteralConstant Scon
SconDouble SconSingle
%%TODO-F08 FixedComment
%% Ident Aliases:
Name ArrayName ComponentName GenericName NamelistGroupName TypeName EndName CommonBlockName DummyArgName
EntryName ExternalName FunctionName ImpliedDoVariable IntrinsicProcedureName ModuleName ObjectName
ProgramName SFDummyArgName SubroutineName SubroutineNameUse VariableName
lexical syntax
%% Everything following a ! is comment. With the \n it is an End of Statement
"!" ~[\n]* -> Comment
(Comment? "\n" [\ \t]* )+ -> EOS
%% ; at end of line is allowed
(";" [\ \t]*)+ Comment? "\n" [\ \t]* -> EOS
%% Fixed source form comment rules (beware of code starting in 1st column!)
%%TODO-F08 - need different language lexer for fixed format, don't combine
%%TODO-F08
%%TODO-F08 ("\n" [Cc\*] ~[\n]*)+ -> FixedComment
%%TODO-F08 FixedComment "\n" [\ \t]* -> EOS
%% commentlines at the start of a file/program are handled separately in Fortran90.sdf
EOS -> StartCommentBlock
%% Statement separator is also EOS (used seldomly)
([\ \t]* ";" [\ \t]*)+ -> EOS
%%
%% Continuation can optionally be separated by comment. The & on the next line is also optional.
"&" [\ \t]* ("!" ~[\n]*)? "\n" ( [\ \t]+ "&" )? -> Continuation
Continuation -> LAYOUT
%% Layout does NOT have a \n since that's part of EOS
[\ \t] -> LAYOUT
%% number as label: max 5 digits with space in 6th pos
[0-9][0-9][0-9][0-9][0-9] -> Label
[0-9][0-9][0-9][0-9] -> Label
[0-9][0-9][0-9] -> Label
[0-9][0-9] -> Label
[0-9] -> Label
%%3.1.2
[a-zA-Z] -> Letter
[A-Za-z][A-Za-z0-9\_]* -> Ident
%% Integer Constant
[0-9]+ -> Icon
%%R420 Character constants allow '' and "" as escaped ' and " in string literals like 'don''t' (="don't")
%% separate names needed for lexical restrictions later
%% NOTE: continuated strings like 'hello&\n &world' will be parsed as one string with & embedded.
[\'] (~[\'] | "''")* [\'] -> SconSingle
[\"] (~[\"] | '""')* [\"] -> SconDouble
SconSingle | SconDouble -> Scon
%%R301: character definition with the 21 specials from table 3.1
[a-zA-Z0-9\ \=\+\-\*\/\(\)\,\;\'\:\!\"\%\&\<\>\\\?\$] -> Character
%%R412-R416 Real and Double Literal Constant. Kind is handled in R400Datatypes.sdf
%% [sign] significant [exponent-letter exponent] [__kind-param]
%% JD: [\+\-]? removed because of Sign in R707
[0-9]+ "." [0-9]* ([EeDd] [\+\-]? [0-9]+)? -> Rcon
%% [sign] digit-string exponent-letter exponent [__kind-param]
"." [0-9]+ ([EeDd] [\+\-]? [0-9]+)? -> Rcon
%% or [sign] digit-string exponent-letter exponent [__kind-param]
[0-9]+ [EeDd] [\+\-]? [0-9]+ -> Rcon
%%R408
[Bb] [\'] [01]+ [\'] -> BinaryConstant
[Bb] [\"] [01]+ [\"] -> BinaryConstant
%%R409
[Oo] [\'] [0-7]+ [\'] -> OctalConstant
[Oo] [\"] [0-7]+ [\'] -> OctalConstant
%%R410
[Zz] [\'] [0-9A-Fa-f]+ [\"] -> HexConstant
[Zz] [\"] [0-9A-Fa-f]+ [\"] -> HexConstant
%%
[0-9]+ -> ScalarIntLiteralConstant
%%R703,723 defined-unary-operator and defined-binary-operator
%%TODO-F08
%% JD: disabled Userdefined operators to prevent ambig with normal relops in expressions.
"." "TODO" Letter+ "." -> Dop
lexical restrictions
SconSingle -/- [\']
SconDouble -/- [\"]
%% commentline should be the complete line until newline. This must be lexical restriction
%% Comment -/- ~[\n]
%% if (Comment "\n" [\ \t]* )+ -> EOS, then to prevent ambig with layout:
EOS -/- [\ \t]
context-free restrictions
Continuation? -/- ~[\n]
%% layout definition **without** \n due to the EOS definition. Lines are importent in Fortran.
%% Continuation-char & should be part of continuation, so not layout.
LAYOUT? -/- [\ \t\&]
%% to prevent layout/comment parsed as after LblDef (which causes ambigs)
LblDef -/- [\!]
context-free syntax
Label? -> LblDef {cons("label")}
%% Ident Aliasses. TODO: put them in the right modules.
Ident -> Name
Ident -> ArrayName
Ident -> ComponentName
Ident -> GenericName
Ident -> NamelistGroupName
Ident -> TypeName
Ident -> EndName
Ident -> CommonBlockName
Ident -> DummyArgName
Ident -> EntryName
Ident -> ExternalName
Ident -> FunctionName {cons("function-name")}
Ident -> ImpliedDoVariable
Ident -> IntrinsicProcedureName
Ident -> ModuleName {cons("module-name")}
Ident -> ObjectName {cons("object-name")}
Ident -> ProgramName {cons("program-name")}
Ident -> SFDummyArgName
Ident -> SubroutineName
Ident -> SubroutineNameUse
Ident -> VariableName