tree-sitter grammar for F# (still WIP) Based on the 4.1 F# language specification (Mostly, Appendix A) and the F# compiler parser
First, run npm install
to install the tree-sitter cli
.
Next, the grammar can be build using npm run build
, or used to parse a file with npm run parse $file
The parser consists of two parts:
src/scanner.cc
is responsible for parsing newlines and comments and keeps track of indentation to open and close scopes.grammar.js
the main tree-sitter grammar. The indent tokens from the external scanner is access though the$.virtual_open_section
andvirtual_end_section
tokens.
The grammar starts with the file
node at the begging of the rules.
local parser_config = require "nvim-treesitter.parsers".get_parser_configs()
parser_config.fsharp = {
install_info = {
url = "path/to/tree-sitter-fsharp",
files = {"src/scanner.cc", "src/parser.c" }
},
filetype = "fsharp",
}
local parser_config = require "nvim-treesitter.parsers".get_parser_configs()
parser_config.fsharp = {
install_info = {
url = "https://github.com/Nsidorenco/tree-sitter-fsharp",
branch = "develop",
files = {"src/scanner.cc", "src/parser.c" },
generate_requires_npm = true,
requires_generate_from_grammar = true
},
filetype = "fsharp",
}
Then run :TSInstallFromGrammar fsharp
inside Nvim.
The grammar currently has support for most language features, but might have rough edges. Some parts, like the type annotations are still very bare-bones.
The grammar supports indentation-based scoping but does not fully support offside indentation and opening new indentation levels on record/list construction.
The precedence rules for the different grammar nodes (and particularly expressions) are not set properly yet, which means that the parser size is much larger than needed.
- Computational expressions
- Type annotations
- Annotations
- Offside tokens inside indentation scope
- Testing
- Set properly precedence rules
To run all tests stores in corpus/
run
$ npm test
$ npm run debug $file
Clone the repo and start playing around with it. If you find a code example which fails to parse, please reduce it to a minimal example, such that it can be added to the corpus as a test case.
PRs fleshing out the grammar or fixing bugs are very welcome!