• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

tree-sitter/tree-sitter-haskell: Haskell grammar for tree-sitter.

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称(OpenSource Name):

tree-sitter/tree-sitter-haskell

开源软件地址(OpenSource Url):

https://github.com/tree-sitter/tree-sitter-haskell

开源编程语言(OpenSource Language):

JavaScript 78.8%

开源软件介绍(OpenSource Introduction):

tree-sitter-haskell

CI

Haskell grammar for tree-sitter.

References

Building with nvim-treesitter

When installing the grammar from source, be sure to include the scanner in the source files:

lua <<EOF
local parser_config = require "nvim-treesitter.parsers".get_parser_configs()
parser_config.haskell = {
  install_info = {
    url = "~/path/to/tree-sitter-haskell",
    files = {"src/parser.c", "src/scanner.c"}
  }
}
EOF

Supported Language Extensions

These extensions are supported , unsupported or not applicable because they don't involve parsing ➖️:

  • AllowAmbiguousTypes ➖️
  • ApplicativeDo ➖️
  • Arrows
  • BangPatterns
  • BinaryLiterals
  • BlockArguments
  • CApiFFI
  • ConstrainedClassMethods
  • ConstraintKinds
  • CPP
  • CUSKs
  • DataKinds
  • DatatypeContexts
  • DefaultSignatures
  • DeriveAnyClass ➖️
  • DeriveDataTypeable ➖️
  • DeriveFoldable ➖️
  • DeriveFunctor ➖️
  • DeriveGeneric ➖️
  • DeriveLift ➖️
  • DeriveTraversable ➖️
  • DerivingStrategies
  • DerivingVia
  • DisambiguateRecordFields ➖️
  • DuplicateRecordFields ➖️
  • EmptyCase
  • EmptyDataDecls
  • EmptyDataDeriving
  • ExistentialQuantification
  • ExplicitForAll
  • ExplicitNamespaces
  • ExtendedDefaultRules ➖️
  • FlexibleContexts
  • FlexibleInstances
  • ForeignFunctionInterface
  • FunctionalDependencies
  • GADTs
  • GADTSyntax
  • GeneralisedNewtypeDeriving ➖️
  • GHCForeignImportPrim
  • Haskell2010 ➖️
  • Haskell98 ➖️
  • HexFloatLiterals
  • ImplicitParams
  • ImplicitPrelude ➖️
  • ImportQualifiedPost
  • ImpredicativeTypes ➖️
  • IncoherentInstances ➖️
  • InstanceSigs
  • InterruptibleFFI
  • KindSignatures
  • LambdaCase
  • LexicalNegation
  • LiberalTypeSynonyms
  • LinearTypes
  • MagicHash
  • Modifiers
  • MonadComprehensions ➖️
  • MonadFailDesugaring ➖️
  • MonoLocalBinds ➖️
  • MonomorphismRestriction ➖️
  • MultiParamTypeClasses
  • MultiWayIf
  • NamedFieldPuns
  • NamedWildCards
  • NegativeLiterals ➖️
  • NondecreasingIndentation
  • NPlusKPatterns ➖️
  • NullaryTypeClasses
  • NumDecimals ➖️
  • NumericUnderscores
  • OverlappingInstances ➖️
  • OverloadedLabels
  • OverloadedLists ➖️
  • OverloadedStrings ➖️
  • PackageImports
  • ParallelListComp
  • PartialTypeSignatures
  • PatternGuards
  • PatternSynonyms
  • PolyKinds ➖️
  • PostfixOperators ➖️
  • QualifiedDo
  • QuantifiedConstraints
  • QuasiQuotes
  • Rank2Types
  • RankNTypes
  • RebindableSyntax ➖️
  • RecordWildCards ➖️
  • RecursiveDo
  • RoleAnnotations
  • Safe ➖️
  • ScopedTypeVariables
  • StandaloneDeriving
  • StandaloneKindSignatures
  • StarIsType
  • StaticPointers
  • Strict ➖️
  • StrictData ➖️
  • TemplateHaskell
  • TemplateHaskellQuotes
  • TraditionalRecordSyntax ➖️
  • TransformListComp
  • Trustworthy ➖️
  • TupleSections
  • TypeApplications
  • TypeFamilies
  • TypeFamilyDependencies
  • TypeInType
  • TypeOperators
  • TypeSynonymInstances ➖️
  • UnboxedSums
  • UnboxedTuples
  • UndecidableInstances ➖️
  • UndecidableSuperClasses ➖️
  • UnicodeSyntax
  • UnliftedFFITypes ➖️
  • UnliftedNewtypes
  • Unsafe ➖️
  • ViewPatterns

Bugs

CPP

Preprocessor #elif and #else directives cannot be handled correctly, since the parser state would have to be manually reset to what it was at the #if. As a workaround, the code blocks in the alternative branches are parsed as part of the directives.

Layout

NondecreasingIndentation is not supported (yet?).

Operators on newlines in do

A strange edge case is when an infix operator follows an expression statement of a do block with an indent of less or equal the do's layout column:

f = do
  readSomething
  >>= doSomething

The >>= causes the do's layout to be terminated, resulting in an AST similar to

f = (do readSomething) >>= doSomething

This is checked heuristically, probably unreliably.

Testing

Requires: tree-sitter(-cli)

Run test corpus

These are stored in ./tests/corpus/

$ tree-sitter test

Test parsing an example codebase

Requires: bc
This will print the percentage of the codebase parsed, and the time taken

$ ./script/parse-examples             # this clones all repos
$ ./script/parse-example <example>    # where <example> is a project under ./examples/

Enable scanner debug output

To get an extra-verbose scanner, unoptimized, with debug symbols:

$ CFLAGS='-DDEBUG' make debug.so
$ cp debug.so $HOME/.cache/tree-sitter/lib/haskell.so    # So `tree-sitter-cli` uses our binary
$ tree-sitter test
$ ./script/parse-example <example>

If you want to debug the scanner with gdb, you can b tree_sitter_haskell_external_scanner_scan with tree-sitter test.

Create visual graph of parser steps

Requires: graphviz

$ tree-sitter parse -D test/Basic.hs    # Produces log.html



鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap