fortran-src
Provides lexing, parsing, and basic analyses of Fortran code covering standards: FORTRAN 66, FORTRAN 77, Fortran 90, Fortran 95 and part of Fortran 2003. Includes data flow and basic block analysis, a renamer, and type analysis. For example usage, see the 'camfort' project (https://github.com/camfort/camfort), which uses fortran-src as its front end.
For features that output graphs, the intended usage is to pipe it into the command 'dot -Tpdf' and redirect that into a PDF file. The 'dot' command is part of the GraphViz project (https://www.graphviz.org/), please see their manual for the many other options that can be explored for visualisation purposes.
Usage: fortran-src [OPTION...] <file>
-v VERSION, -F VERSION --fortranVersion=VERSION Fortran version to use, format: Fortran[66/77/77Legacy/77Extended/90]
-a ACTION --action=ACTION lex or parse action
-t --typecheck parse and run typechecker
-R --rename parse and rename variables
-B --bblocks analyse basic blocks
-S --supergraph analyse super graph of basic blocks
-r --reprint Parse and output using pretty printer
--dot output graphs in GraphViz DOT format
--dump-mod-file dump the information contained within mod files
-I DIR --include-dir=DIR directory to search for precompiled 'mod files'
-c --compile compile an .fsmod file from the input
--show-block-numbers[=LINE-NUM] Show the corresponding AST-block identifier number next to every line of code.
--show-flows-to=AST-BLOCK-ID dump a graph showing flows-to information from the given AST-block ID; prefix with 's' for supergraph
--show-flows-from=AST-BLOCK-ID dump a graph showing flows-from information from the given AST-block ID; prefix with 's' for supergraph
Building
fortran-src supports building with Stack or Cabal. You should be able to build
and use without any dependencies other than GHC itself.
As of 2021-04-28, fortran-src supports and is regularly tested on GHC 8.6,
8.8, 8.10 and 9.0. Releases prior to/newer than those may have issues. We
welcome fixes that would let us support a wider range of compilers.
You will likely need at least 3 GiBs of memory to build fortran-src.
For installing GHC and build tools, we strongly recommend
ghcup.
When latest recommended is used, it means the latest version of the tool
that ghcup tags with recommended
. This sometimes lags behind the
latest
-tagged version. With ghcup installed, run ghcup list
for a better
understanding.
Following are general guides for any OS that provides the relevant tools. If you
have trouble, consider checking the CI workflow files in .github/workflows
.
Stack
We support the latest recommended version of Stack (as of 2021-09-17, Stack
2.7). Generally, any Stack 2.x should work. (Stack 1.x may work with minor
alternations -- you may have to download the resolver manually.)
stack build
For an interactive shell:
stack build
stack ghci
Note that running stack ghci
before running stack build
won't work properly,
due to stack ghci
not running build tools like Alex and Happy. So parser
modules will not be built, and you'll receive an error after building the other
modules. You can cheat a bit and run stack build
until you see Building library for [...]
(= preprocessing has finished), then hit <Ctrl-C>
to stop
the build and run stack ghci
as usual.
Cabal
We support the latest recommended version of Cabal (as of 2021-09-17, Cabal 3.4)
cabal build
Usage
As a dependency
fortran-src is available on Hackage, so add fortran-src
to your project
dependencies. That's all.
If you're using Stack, note that Stackage retains an old version watch out,
because TODO
TODO you can stuff a Hackage reference into stack.yaml
using
extra-deps
, like:
fortran-src is available on Hackage. Stackage has a very old version and is
definitely not what you want, but you can specify a newer Hackage version in
stack.yaml
to use it conveniently with Stack-based projects.
resolver: ...
...
extra-deps:
- ...
- fortran-src-$VERSION
If you have Cabal properly configured, you should be able install fortran-src
from Hackage:
cabal install fortran-src
Otherwise, we suggest building from source if you want to use the fortran-src
CLI tool. See #Build from source for details.