# glsl-parser

> transform streamed glsl tokens into an ast

Latest version **2.0.1** (published 2018-08-28) · MIT license · 0 weekly downloads

## Install

```sh
npm install glsl-parser
pnpm add glsl-parser
yarn add glsl-parser
bun add glsl-parser
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 2.0.1 |
| Published | 2018-08-28 |
| First published | 2012-11-20 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 3 |
| Unpacked size | 36.2 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 98 |
| Maintainers | chrisdickinson, dfcreative, hughsk, mattdesl, mikkoh, mikolalysenko, rezaali, substack, tatumcreative, thibauts, wwwtyro, yoshuawuyts |
| Keywords | glsl, parser, ast, through, stream |

## Links

- npm: https://www.npmjs.com/package/glsl-parser
- Repository: https://github.com/stackgl/glsl-parser
- Homepage: https://github.com/stackgl/glsl-parser#readme
- Issues: https://github.com/stackgl/glsl-parser/issues
- npm.io page: https://npm.io/package/glsl-parser

## Dependencies (3)

- [through](https://npm.io/package/through.md) 2.3.4
- [through2](https://npm.io/package/through2.md) ^0.6.3
- [glsl-tokenizer](https://npm.io/package/glsl-tokenizer.md) ^2.1.4

## Alternatives

- [babylon](https://npm.io/package/babylon.md) — 5.1M weekly downloads
- [csscolorparser](https://npm.io/package/csscolorparser.md) — 3.7M weekly downloads
- [expr-eval-fork](https://npm.io/package/expr-eval-fork.md) — 1.5M weekly downloads
- [@leeoniya/ufuzzy](https://npm.io/package/@leeoniya/ufuzzy.md) — 247.7K weekly downloads
- [xml-parser](https://npm.io/package/xml-parser.md) — 78.4K weekly downloads

## Recent versions

- 2.0.1 (latest) — 2018-08-28
- 2.0.0 — 2015-03-06
- 1.0.1 — 2014-07-05
- 1.0.0 — 2014-06-27
- 0.0.9 — 2014-05-25
- 0.0.8 — 2014-05-24
- 0.0.7 — 2014-04-24
- 0.0.6 — 2014-04-04
- 0.0.5 — 2012-12-02
- 0.0.4 — 2012-11-28
- 0.0.3 — 2012-11-28
- 0.0.2 — 2012-11-25
- 0.0.1 — 2012-11-24
- 0.0.0 — 2012-11-20

## README

# glsl-parser

![](http://img.shields.io/badge/stability-stable-green.svg?style=flat)
![](http://img.shields.io/npm/v/glsl-parser.svg?style=flat)
![](http://img.shields.io/npm/dm/glsl-parser.svg?style=flat)
![](http://img.shields.io/npm/l/glsl-parser.svg?style=flat)

A GLSL parser that takes tokens from
[glsl-tokenizer](http://github.com/stackgl/glsl-tokenizer) and turns them into
an AST.

May either be used synchronously or as a stream.

## API

### `stream = require('glsl-parser/stream')`

Creates a GLSL parser stream, which emits nodes as they're parsed.

``` javascript
var TokenStream = require('glsl-tokenizer/stream')
var ParseStream = require('glsl-parser/stream')
var fs = require('fs')

fs.createReadStream('test.glsl')
  .pipe(TokenStream())
  .pipe(ParseStream())
  .on('data', function(x) {
    console.log('ast of', x.type)
  })
```

### `ast = stream.program`

The full program's AST, which will be updated with each incoming token.

### `ast = require('glsl-parser/direct')(tokens)`

Synchronously parses an array of tokens from `glsl-tokenizer`.

``` javascript
var TokenString = require('glsl-tokenizer/string')
var ParseTokens = require('glsl-parser/direct')
var fs = require('fs')

var src = fs.readFileSync('test.glsl', 'utf8')
var tokens = TokenString(src)
var ast = ParseTokens(tokens)

console.log(ast)
```

## Nodes

* `stmtlist`
* `stmt`
* `struct`
* `function`
* `functionargs`
* `decl`
* `decllist`
* `forloop`
* `whileloop`
* `if`
* `expr`
* `precision`
* `comment`
* `preprocessor`
* `keyword`
* `ident`
* `return`
* `continue`
* `break`
* `discard`
* `do-while`
* `binary`
* `ternary`
* `unary`

## Known Issues

* because i am not smart enough to write a fully streaming parser, the current parser "cheats" a bit when it encounters a `expr` node! it actually waits until it has all the tokens it needs to build a tree for a given expression, then builds it and emits the constituent child nodes in the expected order. the `expr` parsing is heavily influenced by [crockford's tdop article](http://javascript.crockford.com/tdop/tdop.html). the rest of the parser is heavily influenced by fever dreams.

* the parser might hit a state where it's looking at what *could be* an expression, or it could be a declaration --
that is, the statement starts with a previously declared `struct`. it'll opt to pretend it's a declaration, but that
might not be the case -- it might be a user-defined constructor starting a statement!

* "unhygenic" `#if` / `#endif` macros are completely unhandled at the moment, since they're a bit of a pain.
if you've got unhygenic macros in your code, move the #if / #endifs to statement level, and have them surround
wholly parseable code. this sucks, and i am sorry.

## License

MIT, see [LICENSE.md](LICENSE.md) for more details.

---
_Source: https://npm.io/package/glsl-parser · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
