Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/harpocrates/language-rust

Parser and pretty-printer for the Rust language
https://github.com/harpocrates/language-rust

ast parser pretty-printer rust syntax

Last synced: 15 days ago
JSON representation

Parser and pretty-printer for the Rust language

Awesome Lists containing this project

README

        

# Parser and pretty printer for Rust [![Build Status][4]][5] [![Windows build status][7]][8] [![Hackage Version][11]][12]

`language-rust` aspires to efficiently and accurately parse and pretty print the [Rust language][0].
The underlying AST structures are also intended to be as similar as possible to the [`libsyntax` AST
that `rustc`][10] itself uses.

A typical use looks like:

```haskell
>>> :set -XTypeApplications +t
>>> import Language.Rust.Syntax

>>> -- Sample use of the parser
>>> import Language.Rust.Parser
>>> let inp = inputStreamFromString "fn main () { println!(\"Hello world!\"); }"
inp :: InputStream
>>> let sourceFile = parse' @(SourceFile Span) inp
sourceFile :: SourceFile Span

>>> -- Sample use of the pretty printer
>>> import Language.Rust.Pretty
>>> pretty' sourceFile
fn main() {
println!("Hello world!");
}
it :: Doc b
```

## Building

### Cabal

With Cabal and GHC, run

cabal install happy --constraint 'happy >= 1.19.8'
cabal install alex
cabal configure
cabal build

### Stack

With the [Stack][1] tool installed, run

stack init
stack build

The second command is responsible for pulling in all of the dependencies (including executable
tools like [Alex][2], [Happy][3], and GHC itself) and then compiling everything. If Stack complains
about the version of Happy installed, you can explicitly install a recent one with `stack install
happy-1.19.8`.

## Evolution of Rust

As Rust evolves, so will `language-rust`. A best effort will be made to support unstable features
from nightly as they come out, but only compatibility with stable is guaranteed. The last component
of the version number indicates the nightly Rust compiler version against which tests were run. For
example, `0.1.0.26` is tested against `rustc 1.26.0-nightly`.

## Bugs

Please report any bugs to the [github issue tracker][9].

### Parser

Any difference between what is accepted by the `rustc` parser and the `language-rust` parser
indicates one of

* a bug in `language-rust` (this is almost always the case)
* a bug in `rustc`
* that there is a newer version of `rustc` which made a breaking change to this syntax

If the AST/parser of `rustc` changes, the `rustc-tests` test suite should start failing - it
compares the JSON AST debug output of `rustc` to our parsed AST.

### Pretty printer

For the pretty printer, bugs are a bit tougher to list exhaustively. Suggestions for better layout
algorithms are most welcome! The [`fmt-rfcs`][6] repo is loosely used as the reference for "correct"
pretty printing.

[0]: https://www.rust-lang.org/en-US/
[1]: https://docs.haskellstack.org/en/stable/README/
[2]: https://hackage.haskell.org/package/alex
[3]: https://hackage.haskell.org/package/happy
[4]: https://travis-ci.org/harpocrates/language-rust.svg?branch=master
[5]: https://travis-ci.org/harpocrates/language-rust
[6]: https://github.com/rust-lang-nursery/fmt-rfcs
[7]: https://ci.appveyor.com/api/projects/status/um8dxklqmubvn091/branch/master?svg=true
[8]: https://ci.appveyor.com/project/harpocrates/language-rust/branch/master
[9]: https://github.com/harpocrates/language-rust/issues
[10]: https://github.com/rust-lang/rust/blob/master/src/libsyntax/ast.rs
[11]: https://img.shields.io/hackage/v/language-rust.svg
[12]: https://hackage.haskell.org/package/language-rust