{
	"name": "moo",
	"versions": {
		"0.0.0": {
			"author": {
				"name": "Garrick Cheung",
				"email": "garrick@garrickcheung.com"
			},
			"name": "moo",
			"description": "moo!",
			"version": "0.0.0",
			"dependencies": {},
			"devDependencies": {},
			"optionalDependencies": {},
			"engines": {
				"node": "*"
			},
			"_npmUser": {
				"name": "GarrickCheung",
				"email": "garrick@garrickcheung.com"
			},
			"_id": "moo@0.0.0",
			"_engineSupported": true,
			"_npmVersion": "1.1.21",
			"_nodeVersion": "v0.6.17",
			"_defaultsLoaded": true,
			"dist": {
				"shasum": "96e7a020a54a38f747c8e9230002b52747621040",
				"tarball": "https://registry.npmjs.org/moo/-/moo-0.0.0.tgz"
			},
			"maintainers": [
				{
					"name": "GarrickCheung",
					"email": "garrick@garrickcheung.com"
				}
			],
			"directories": {},
			"contributors": []
		},
		"0.1.0": {
			"name": "moo",
			"version": "0.1.0",
			"description": "Optimised tokenizer/lexer generator! 🐄 Uses /y for performance. Moo!",
			"main": "moo.js",
			"files": [
				"moo.js"
			],
			"repository": {
				"type": "git",
				"url": "git+https://github.com/tjvr/moo.git"
			},
			"author": {
				"name": "Tim Radvan",
				"email": "tim@tjvr.org"
			},
			"contributors": [
				{
					"name": "Nathan"
				}
			],
			"license": "BSD-3-Clause",
			"scripts": {
				"test": "jest",
				"lint": "eslint moo.js",
				"benchmark": "node test/benchmark.js",
				"moo": "echo 'Mooooo!'"
			},
			"devDependencies": {
				"benchmark": "^2.1.3",
				"chevrotain": "^0.23.0",
				"eslint": "^3.17.1",
				"jest": "^19.0.2",
				"lex": "^1.7.9",
				"lexing": "^0.8.0",
				"remix": "^0.1.4",
				"tokenizer2": "^2.0.0"
			},
			"gitHead": "8f4d1b1868764e0ef1c26fe21ed32a8c0c918350",
			"bugs": {
				"url": "https://github.com/tjvr/moo/issues"
			},
			"homepage": "https://github.com/tjvr/moo#readme",
			"_id": "moo@0.1.0",
			"_shasum": "e5e989bed891ba41a623ea8e4608c413e5dc230e",
			"_from": ".",
			"_npmVersion": "4.0.5",
			"_nodeVersion": "7.4.0",
			"_npmUser": {
				"name": "tjvr",
				"email": "tim@tjvr.org"
			},
			"dist": {
				"shasum": "e5e989bed891ba41a623ea8e4608c413e5dc230e",
				"tarball": "https://registry.npmjs.org/moo/-/moo-0.1.0.tgz"
			},
			"maintainers": [
				{
					"name": "tjvr",
					"email": "tim@tjvr.org"
				}
			],
			"_npmOperationalInternal": {
				"host": "packages-18-east.internal.npmjs.com",
				"tmp": "tmp/moo-0.1.0.tgz_1489769031382_0.48986063804477453"
			},
			"directories": {}
		},
		"0.1.1": {
			"name": "moo",
			"version": "0.1.1",
			"description": "Optimised tokenizer/lexer generator! 🐄 Uses /y for performance. Moo!",
			"main": "moo.js",
			"files": [
				"moo.js"
			],
			"repository": {
				"type": "git",
				"url": "git+https://github.com/tjvr/moo.git"
			},
			"author": {
				"name": "Tim Radvan",
				"email": "tim@tjvr.org"
			},
			"contributors": [
				{
					"name": "Nathan"
				}
			],
			"license": "BSD-3-Clause",
			"scripts": {
				"test": "jest",
				"lint": "eslint moo.js",
				"benchmark": "node test/benchmark.js",
				"moo": "echo 'Mooooo!'"
			},
			"devDependencies": {
				"benchmark": "^2.1.3",
				"chevrotain": "^0.23.0",
				"eslint": "^3.17.1",
				"jest": "^19.0.2",
				"lex": "^1.7.9",
				"lexing": "^0.8.0",
				"remix": "^0.1.4",
				"tokenizer2": "^2.0.0"
			},
			"gitHead": "7bbe566ba9ebd72b5b27f236e7462499d90801b2",
			"bugs": {
				"url": "https://github.com/tjvr/moo/issues"
			},
			"homepage": "https://github.com/tjvr/moo#readme",
			"_id": "moo@0.1.1",
			"_shasum": "a06827dbc4805549a4dce5f54b3d03ba5f0fee35",
			"_from": ".",
			"_npmVersion": "4.0.5",
			"_nodeVersion": "7.4.0",
			"_npmUser": {
				"name": "tjvr",
				"email": "tim@tjvr.org"
			},
			"dist": {
				"shasum": "a06827dbc4805549a4dce5f54b3d03ba5f0fee35",
				"tarball": "https://registry.npmjs.org/moo/-/moo-0.1.1.tgz"
			},
			"maintainers": [
				{
					"name": "nfd",
					"email": "qselsp@gmail.com"
				},
				{
					"name": "tjvr",
					"email": "tim@tjvr.org"
				}
			],
			"_npmOperationalInternal": {
				"host": "packages-12-west.internal.npmjs.com",
				"tmp": "tmp/moo-0.1.1.tgz_1489774262067_0.036127762170508504"
			},
			"directories": {}
		},
		"0.2.0": {
			"name": "moo",
			"version": "0.2.0",
			"description": "Optimised tokenizer/lexer generator! 🐄 Uses /y for performance. Moo!",
			"main": "moo.js",
			"files": [
				"moo.js"
			],
			"repository": {
				"type": "git",
				"url": "git+https://github.com/tjvr/moo.git"
			},
			"author": {
				"name": "Tim Radvan",
				"email": "tim@tjvr.org"
			},
			"contributors": [
				{
					"name": "Nathan"
				}
			],
			"license": "BSD-3-Clause",
			"scripts": {
				"test": "jest",
				"lint": "eslint moo.js",
				"benchmark": "benchr test/benchmark.js",
				"moo": "echo 'Mooooo!'"
			},
			"devDependencies": {
				"benchr": "^3.2.0",
				"chevrotain": "^0.23.0",
				"eslint": "^3.17.1",
				"jest": "^19.0.2",
				"lex": "^1.7.9",
				"lexing": "^0.8.0",
				"remix": "^0.1.4",
				"tokenizer2": "^2.0.0"
			},
			"gitHead": "93c2c78b2fc63697d781b1a91f17fcae0971f05c",
			"bugs": {
				"url": "https://github.com/tjvr/moo/issues"
			},
			"homepage": "https://github.com/tjvr/moo#readme",
			"_id": "moo@0.2.0",
			"_shasum": "ff97028d7e647af628c7216537e2c41de6b917de",
			"_from": ".",
			"_npmVersion": "4.0.5",
			"_nodeVersion": "7.4.0",
			"_npmUser": {
				"name": "tjvr",
				"email": "tim@tjvr.org"
			},
			"dist": {
				"shasum": "ff97028d7e647af628c7216537e2c41de6b917de",
				"tarball": "https://registry.npmjs.org/moo/-/moo-0.2.0.tgz"
			},
			"maintainers": [
				{
					"name": "nfd",
					"email": "qselsp@gmail.com"
				},
				{
					"name": "tjvr",
					"email": "tim@tjvr.org"
				}
			],
			"_npmOperationalInternal": {
				"host": "packages-18-east.internal.npmjs.com",
				"tmp": "tmp/moo-0.2.0.tgz_1490639895120_0.6236708257347345"
			},
			"directories": {}
		},
		"0.3.0": {
			"name": "moo",
			"version": "0.3.0",
			"description": "Optimised tokenizer/lexer generator! 🐄 Uses /y for performance. Moo!",
			"main": "moo.js",
			"files": [
				"moo.js"
			],
			"repository": {
				"type": "git",
				"url": "git+https://github.com/tjvr/moo.git"
			},
			"author": {
				"name": "Tim Radvan",
				"email": "tim@tjvr.org"
			},
			"contributors": [
				{
					"name": "Nathan"
				}
			],
			"license": "BSD-3-Clause",
			"scripts": {
				"test": "jest",
				"lint": "eslint moo.js",
				"benchmark": "benchr test/benchmark.js",
				"moo": "echo 'Mooooo!'"
			},
			"devDependencies": {
				"benchr": "^3.2.0",
				"chevrotain": "^0.27.1",
				"eslint": "^3.17.1",
				"jest": "^19.0.2",
				"lex": "^1.7.9",
				"lexing": "^0.8.0",
				"remix": "^0.1.4",
				"tokenizer2": "^2.0.0"
			},
			"gitHead": "64ef03ff16ad726763427225c7afd3b8303c44e2",
			"bugs": {
				"url": "https://github.com/tjvr/moo/issues"
			},
			"homepage": "https://github.com/tjvr/moo#readme",
			"_id": "moo@0.3.0",
			"_shasum": "c5572dd3d074091dcc5b8c47acf9509010282c5b",
			"_from": ".",
			"_npmVersion": "4.0.5",
			"_nodeVersion": "7.4.0",
			"_npmUser": {
				"name": "tjvr",
				"email": "tim@tjvr.org"
			},
			"dist": {
				"shasum": "c5572dd3d074091dcc5b8c47acf9509010282c5b",
				"tarball": "https://registry.npmjs.org/moo/-/moo-0.3.0.tgz"
			},
			"maintainers": [
				{
					"name": "nfd",
					"email": "qselsp@gmail.com"
				},
				{
					"name": "tjvr",
					"email": "tim@tjvr.org"
				}
			],
			"_npmOperationalInternal": {
				"host": "packages-18-east.internal.npmjs.com",
				"tmp": "tmp/moo-0.3.0.tgz_1491771396546_0.6649731036741287"
			},
			"directories": {}
		},
		"0.3.1": {
			"name": "moo",
			"version": "0.3.1",
			"description": "Optimised tokenizer/lexer generator! 🐄 Uses /y for performance. Moo!",
			"main": "moo.js",
			"files": [
				"moo.js"
			],
			"repository": {
				"type": "git",
				"url": "git+https://github.com/tjvr/moo.git"
			},
			"author": {
				"name": "Tim Radvan",
				"email": "tim@tjvr.org"
			},
			"contributors": [
				{
					"name": "Nathan"
				}
			],
			"license": "BSD-3-Clause",
			"scripts": {
				"test": "jest",
				"lint": "eslint moo.js",
				"benchmark": "benchr test/benchmark.js",
				"moo": "echo 'Mooooo!'"
			},
			"devDependencies": {
				"benchr": "^3.2.0",
				"chevrotain": "^0.27.1",
				"eslint": "^3.17.1",
				"jest": "^19.0.2",
				"lex": "^1.7.9",
				"lexing": "^0.8.0",
				"remix": "^0.1.4",
				"tokenizer2": "^2.0.0"
			},
			"gitHead": "eb32afb221e43bff950fab14964f8d1c8ea6d328",
			"bugs": {
				"url": "https://github.com/tjvr/moo/issues"
			},
			"homepage": "https://github.com/tjvr/moo#readme",
			"_id": "moo@0.3.1",
			"_shasum": "1253a7e85d53ffb87b00dd19aa0c1dafb0e0fac0",
			"_from": ".",
			"_npmVersion": "4.0.5",
			"_nodeVersion": "7.4.0",
			"_npmUser": {
				"name": "tjvr",
				"email": "tim@tjvr.org"
			},
			"dist": {
				"shasum": "1253a7e85d53ffb87b00dd19aa0c1dafb0e0fac0",
				"tarball": "https://registry.npmjs.org/moo/-/moo-0.3.1.tgz"
			},
			"maintainers": [
				{
					"name": "nfd",
					"email": "qselsp@gmail.com"
				},
				{
					"name": "tjvr",
					"email": "tim@tjvr.org"
				}
			],
			"_npmOperationalInternal": {
				"host": "packages-18-east.internal.npmjs.com",
				"tmp": "tmp/moo-0.3.1.tgz_1491999001447_0.07641912926919758"
			},
			"directories": {}
		},
		"0.3.2": {
			"name": "moo",
			"version": "0.3.2",
			"description": "Optimised tokenizer/lexer generator! 🐄 Uses /y for performance. Moo!",
			"main": "moo.js",
			"files": [
				"moo.js"
			],
			"repository": {
				"type": "git",
				"url": "git+https://github.com/tjvr/moo.git"
			},
			"author": {
				"name": "Tim Radvan",
				"email": "tim@tjvr.org"
			},
			"contributors": [
				{
					"name": "Nathan"
				}
			],
			"license": "BSD-3-Clause",
			"scripts": {
				"test": "jest",
				"lint": "eslint moo.js",
				"benchmark": "benchr test/benchmark.js",
				"moo": "echo 'Mooooo!'"
			},
			"devDependencies": {
				"benchr": "^3.2.0",
				"chevrotain": "^0.27.1",
				"eslint": "^3.17.1",
				"jest": "^19.0.2",
				"lex": "^1.7.9",
				"lexing": "^0.8.0",
				"remix": "^0.1.4",
				"tokenizer2": "^2.0.0"
			},
			"gitHead": "f81a32dc1912a74f86793d8093fcdb922ea8241b",
			"bugs": {
				"url": "https://github.com/tjvr/moo/issues"
			},
			"homepage": "https://github.com/tjvr/moo#readme",
			"_id": "moo@0.3.2",
			"_shasum": "1f98352958e735b9708ee3b0af1ad3e81178d0b4",
			"_from": ".",
			"_npmVersion": "4.0.5",
			"_nodeVersion": "7.4.0",
			"_npmUser": {
				"name": "tjvr",
				"email": "tim@tjvr.org"
			},
			"dist": {
				"shasum": "1f98352958e735b9708ee3b0af1ad3e81178d0b4",
				"tarball": "https://registry.npmjs.org/moo/-/moo-0.3.2.tgz"
			},
			"maintainers": [
				{
					"name": "nfd",
					"email": "qselsp@gmail.com"
				},
				{
					"name": "tjvr",
					"email": "tim@tjvr.org"
				}
			],
			"_npmOperationalInternal": {
				"host": "packages-18-east.internal.npmjs.com",
				"tmp": "tmp/moo-0.3.2.tgz_1493995360306_0.7260767470579594"
			},
			"directories": {}
		},
		"0.3.3": {
			"name": "moo",
			"version": "0.3.3",
			"description": "Optimised tokenizer/lexer generator! 🐄 Uses /y for performance. Moo!",
			"main": "moo.js",
			"files": [
				"moo.js"
			],
			"repository": {
				"type": "git",
				"url": "git+https://github.com/tjvr/moo.git"
			},
			"author": {
				"name": "Tim Radvan",
				"email": "tim@tjvr.org"
			},
			"contributors": [
				{
					"name": "Nathan"
				}
			],
			"license": "BSD-3-Clause",
			"scripts": {
				"test": "jest",
				"lint": "eslint moo.js",
				"benchmark": "benchr test/benchmark.js",
				"moo": "echo 'Mooooo!'"
			},
			"devDependencies": {
				"benchr": "^3.2.0",
				"chevrotain": "^0.27.1",
				"eslint": "^3.17.1",
				"jest": "^19.0.2",
				"lex": "^1.7.9",
				"lexing": "^0.8.0",
				"remix": "^0.1.4",
				"tokenizer2": "^2.0.0"
			},
			"gitHead": "caf06ff05356c0c9d865f79468dec26e0dd2ef45",
			"bugs": {
				"url": "https://github.com/tjvr/moo/issues"
			},
			"homepage": "https://github.com/tjvr/moo#readme",
			"_id": "moo@0.3.3",
			"_shasum": "a05ec95ea2bf29777cc402eeb5b20ac757128786",
			"_from": ".",
			"_npmVersion": "4.2.0",
			"_nodeVersion": "7.10.0",
			"_npmUser": {
				"name": "tjvr",
				"email": "tim@tjvr.org"
			},
			"dist": {
				"shasum": "a05ec95ea2bf29777cc402eeb5b20ac757128786",
				"tarball": "https://registry.npmjs.org/moo/-/moo-0.3.3.tgz"
			},
			"maintainers": [
				{
					"name": "nfd",
					"email": "qselsp@gmail.com"
				},
				{
					"name": "tjvr",
					"email": "tim@tjvr.org"
				}
			],
			"_npmOperationalInternal": {
				"host": "s3://npm-registry-packages",
				"tmp": "tmp/moo-0.3.3.tgz_1497380499103_0.3016737231519073"
			},
			"directories": {}
		},
		"0.4.0": {
			"name": "moo",
			"version": "0.4.0",
			"description": "Optimised tokenizer/lexer generator! 🐄 Uses /y for performance. Moo!",
			"main": "moo.js",
			"files": [
				"moo.js"
			],
			"repository": {
				"type": "git",
				"url": "git+https://github.com/tjvr/moo.git"
			},
			"author": {
				"name": "Tim Radvan",
				"email": "tim@tjvr.org"
			},
			"contributors": [
				{
					"name": "Nathan"
				}
			],
			"license": "BSD-3-Clause",
			"scripts": {
				"test": "jest",
				"lint": "eslint moo.js",
				"benchmark": "benchr test/benchmark.js",
				"moo": "echo 'Mooooo!'"
			},
			"devDependencies": {
				"benchr": "^3.2.0",
				"chevrotain": "^0.27.1",
				"eslint": "^3.17.1",
				"jest": "^19.0.2",
				"lex": "^1.7.9",
				"lexing": "^0.8.0",
				"remix": "^0.1.4",
				"tokenizer2": "^2.0.0"
			},
			"gitHead": "2efc96bcdf7690d7d5f73762384f369917641eb5",
			"bugs": {
				"url": "https://github.com/tjvr/moo/issues"
			},
			"homepage": "https://github.com/tjvr/moo#readme",
			"_id": "moo@0.4.0",
			"_npmVersion": "5.0.4",
			"_nodeVersion": "8.1.2",
			"_npmUser": {
				"name": "tjvr",
				"email": "tim@tjvr.org"
			},
			"dist": {
				"integrity": "sha512-Lw00BjiSKYMjYQMTNnQpHwghfdWoSY4oFOEEtN7E1BOXsUgjJoRtPCHYs27SQsWV+LIFupURMflcNRJ/agBAaA==",
				"shasum": "76fc264aa421f986de75755e48f949d5ee5cae78",
				"tarball": "https://registry.npmjs.org/moo/-/moo-0.4.0.tgz"
			},
			"maintainers": [
				{
					"name": "nfd",
					"email": "qselsp@gmail.com"
				},
				{
					"name": "tjvr",
					"email": "tim@tjvr.org"
				}
			],
			"_npmOperationalInternal": {
				"host": "s3://npm-registry-packages",
				"tmp": "tmp/moo-0.4.0.tgz_1500926207269_0.3560128272511065"
			},
			"directories": {}
		},
		"0.4.1": {
			"name": "moo",
			"version": "0.4.1",
			"description": "Optimised tokenizer/lexer generator! 🐄 Much performance. Moo!",
			"main": "moo.js",
			"files": [
				"moo.js"
			],
			"repository": {
				"type": "git",
				"url": "git+https://github.com/tjvr/moo.git"
			},
			"author": {
				"name": "Tim Radvan",
				"email": "tim@tjvr.org"
			},
			"contributors": [
				{
					"name": "Nathan"
				}
			],
			"license": "BSD-3-Clause",
			"scripts": {
				"test": "jest .",
				"lint": "eslint moo.js",
				"benchmark": "benchr test/benchmark.js",
				"moo": "echo 'Mooooo!'"
			},
			"devDependencies": {
				"benchr": "^3.2.0",
				"chevrotain": "^0.27.1",
				"eslint": "^3.17.1",
				"jest": "^19.0.2",
				"lex": "^1.7.9",
				"lexing": "^0.8.0",
				"remix": "^0.1.4",
				"tokenizer2": "^2.0.0"
			},
			"gitHead": "abba95170613293edda67896296badf317d29f2d",
			"bugs": {
				"url": "https://github.com/tjvr/moo/issues"
			},
			"homepage": "https://github.com/tjvr/moo#readme",
			"_id": "moo@0.4.1",
			"_npmVersion": "5.3.0",
			"_nodeVersion": "8.2.1",
			"_npmUser": {
				"name": "tjvr",
				"email": "tim@tjvr.org"
			},
			"dist": {
				"integrity": "sha512-3n0zifsdRBQsklDeV5vEWOyFSvAvgnri8/eHgsTepsPkka3D04Zo4+rFdWgobeLPZTZ1jVGDfwK0rPtAgExwPw==",
				"shasum": "b73f5dcb79ad4a197b16c5e6a913a73a2ca8fe9e",
				"tarball": "https://registry.npmjs.org/moo/-/moo-0.4.1.tgz"
			},
			"maintainers": [
				{
					"name": "nfd",
					"email": "qselsp@gmail.com"
				},
				{
					"name": "tjvr",
					"email": "tim@tjvr.org"
				}
			],
			"_npmOperationalInternal": {
				"host": "s3://npm-registry-packages",
				"tmp": "tmp/moo-0.4.1.tgz_1502295469171_0.9101934120990336"
			},
			"directories": {}
		},
		"0.4.2": {
			"name": "moo",
			"version": "0.4.2",
			"description": "Optimised tokenizer/lexer generator! 🐄 Much performance. Moo!",
			"main": "moo.js",
			"files": [
				"moo.js"
			],
			"repository": {
				"type": "git",
				"url": "git+https://github.com/tjvr/moo.git"
			},
			"author": {
				"name": "Tim Radvan",
				"email": "tim@tjvr.org"
			},
			"contributors": [
				{
					"name": "Nathan"
				}
			],
			"license": "BSD-3-Clause",
			"scripts": {
				"test": "jest .",
				"lint": "eslint moo.js",
				"benchmark": "benchr test/benchmark.js",
				"moo": "echo 'Mooooo!'"
			},
			"devDependencies": {
				"benchr": "^3.2.0",
				"chevrotain": "^0.27.1",
				"eslint": "^3.17.1",
				"jest": "^19.0.2",
				"lex": "^1.7.9",
				"lexing": "^0.8.0",
				"remix": "^0.1.4",
				"tokenizer2": "^2.0.0"
			},
			"gitHead": "f8fcae0a3e055aae495409d1c0751f8f598dbd89",
			"bugs": {
				"url": "https://github.com/tjvr/moo/issues"
			},
			"homepage": "https://github.com/tjvr/moo#readme",
			"_id": "moo@0.4.2",
			"_npmVersion": "5.3.0",
			"_nodeVersion": "8.1.2",
			"_npmUser": {
				"name": "tjvr",
				"email": "tim@tjvr.org"
			},
			"dist": {
				"integrity": "sha512-tPmMMokeW2m6+jb7nrZqR+zwjr6reQLChlkzWdXyxxYxJ7flu5bJnXNM3PxgtpXQexso+799E1ZfBUVViIV5Vg==",
				"shasum": "3cb40862d9ef4e356e0e7c5331f7b6cb1a9a8e70",
				"tarball": "https://registry.npmjs.org/moo/-/moo-0.4.2.tgz"
			},
			"maintainers": [
				{
					"name": "nfd",
					"email": "qselsp@gmail.com"
				},
				{
					"name": "tjvr",
					"email": "tim@tjvr.org"
				}
			],
			"_npmOperationalInternal": {
				"host": "s3://npm-registry-packages",
				"tmp": "tmp/moo-0.4.2.tgz_1504456118730_0.21657011983916163"
			},
			"directories": {}
		},
		"0.4.3": {
			"name": "moo",
			"version": "0.4.3",
			"description": "Optimised tokenizer/lexer generator! 🐄 Much performance. Moo!",
			"main": "moo.js",
			"files": [
				"moo.js"
			],
			"repository": {
				"type": "git",
				"url": "git+https://github.com/tjvr/moo.git"
			},
			"author": {
				"name": "Tim Radvan",
				"email": "tim@tjvr.org"
			},
			"contributors": [
				{
					"name": "Nathan"
				}
			],
			"license": "BSD-3-Clause",
			"scripts": {
				"test": "jest .",
				"lint": "eslint moo.js",
				"benchmark": "benchr test/benchmark.js",
				"moo": "echo 'Mooooo!'"
			},
			"devDependencies": {
				"benchr": "^3.2.0",
				"chevrotain": "^0.27.1",
				"eslint": "^3.17.1",
				"jest": "^19.0.2",
				"lex": "^1.7.9",
				"lexing": "^0.8.0",
				"remix": "^0.1.4",
				"tokenizer2": "^2.0.0"
			},
			"gitHead": "854c303c1abbd780852c486346204e1526c43c70",
			"bugs": {
				"url": "https://github.com/tjvr/moo/issues"
			},
			"homepage": "https://github.com/tjvr/moo#readme",
			"_id": "moo@0.4.3",
			"_npmVersion": "5.4.0",
			"_nodeVersion": "8.1.2",
			"_npmUser": {
				"name": "tjvr",
				"email": "tim@tjvr.org"
			},
			"dist": {
				"integrity": "sha512-gFD2xGCl8YFgGHsqJ9NKRVdwlioeW3mI1iqfLNYQOv0+6JRwG58Zk9DIGQgyIaffSYaO1xsKnMaYzzNr1KyIAw==",
				"shasum": "3f847a26f31cf625a956a87f2b10fbc013bfd10e",
				"tarball": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz"
			},
			"maintainers": [
				{
					"name": "nfd",
					"email": "qselsp@gmail.com"
				},
				{
					"name": "tjvr",
					"email": "tim@tjvr.org"
				}
			],
			"_npmOperationalInternal": {
				"host": "s3://npm-registry-packages",
				"tmp": "tmp/moo-0.4.3.tgz_1505383665229_0.29187062778510153"
			},
			"directories": {}
		},
		"0.5.0": {
			"name": "moo",
			"version": "0.5.0",
			"description": "Optimised tokenizer/lexer generator! 🐄 Much performance. Moo!",
			"main": "moo.js",
			"repository": {
				"type": "git",
				"url": "git+https://github.com/tjvr/moo.git"
			},
			"author": {
				"name": "Tim Radvan",
				"email": "tim@tjvr.org"
			},
			"contributors": [
				{
					"name": "Nathan"
				}
			],
			"license": "BSD-3-Clause",
			"scripts": {
				"test": "jest .",
				"benchmark": "benchr test/benchmark.js",
				"moo": "echo 'Mooooo!'"
			},
			"devDependencies": {
				"benchr": "^3.2.0",
				"chevrotain": "^0.27.1",
				"jest": "^23.6.0",
				"lex": "^1.7.9",
				"lexing": "^0.8.0",
				"remix": "^0.1.4",
				"tokenizer2": "^2.0.0"
			},
			"gitHead": "66b1c144d799123306561bd8810ab4b1ecc9b267",
			"bugs": {
				"url": "https://github.com/tjvr/moo/issues"
			},
			"homepage": "https://github.com/tjvr/moo#readme",
			"_id": "moo@0.5.0",
			"_npmVersion": "6.4.1",
			"_nodeVersion": "10.12.0",
			"_npmUser": {
				"name": "tjvr",
				"email": "tim@tjvr.org"
			},
			"dist": {
				"integrity": "sha512-AMv6iqhTEd5vT/cQlH6cammKS5ekyHhyqTRKi5zKMWl1RTyFnQ3ohPSBNSm8ySe2wlxSKwDonr9D5ZT44mdO3g==",
				"shasum": "72f949e6735aeb27d07eb7c087ea5a70143c56e5",
				"tarball": "https://registry.npmjs.org/moo/-/moo-0.5.0.tgz",
				"fileCount": 4,
				"unpackedSize": 31117,
				"npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJb5dQTCRA9TVsSAnZWagAAuj0P/jYdyV/2Ew9/LT3jAoBE\nIWX9ObUjsGJN4GUPw/2wle2OHJSyDxpFl0GE5YF1B3A468Boye/uXUkgFcue\naX20cWE0vhwY0vn6VboRMa9fmmzh9EtEv/g+O/Gxcw+/q09dgvjChDCoEDQi\nCkEP2ws0izlYQBIGyOBfetB0KKClM8qXHikQ/yjidirwAcxKR38ZN4oNHVrW\nyWYlPOYXaRY3Q7KvZHKCl2ZBiS5l/Y3gXZ1uVhscskZhRZE6Ptb7MPp5AYYg\nJGgSKGgc00VhlKAbisghlePPWNhlmY0Hudnrf+MyjZUheFtxBXVyI4+iwEi0\nYifIR1KVRWAgpIW5ywHIEAlndeyaH4QuqUDt3LH78Ugp7hivDYHX31ugD4hR\ndNPFQKZfvr+18fkVmlMt7KWZG2spSZOJJItkUy8/M6F7qt+uwD8G5SQcNuZ0\ntQCV2jM711BSaxLPr6WlbiXjh6iIIXsmrAwXd4mZ4Sv7NpznueQPYTuuTaVD\nQQ1LORRsYDfCI9WN68lmlPTZtF6d44j4PyNaxCLD3Vnt7CcbarGhdPUH5jmt\nZT9U7uJJQFGb3but3Ig7zDiNK93CrM1Iu4xnWYCjREo8NnNsC7LdI++nQ9VF\nCNPoVE8In525R9kUaG1wVaWqPCghs0aqMXl3yjfCvRGQkSCMaFDQbWcEOkkQ\nHjsH\r\n=hgoa\r\n-----END PGP SIGNATURE-----\r\n"
			},
			"maintainers": [
				{
					"name": "nfd",
					"email": "qselsp@gmail.com"
				},
				{
					"name": "tjvr",
					"email": "tim@tjvr.org"
				}
			],
			"directories": {},
			"_npmOperationalInternal": {
				"host": "s3://npm-registry-packages",
				"tmp": "tmp/moo_0.5.0_1541788690657_0.04266606349050717"
			},
			"_hasShrinkwrap": false
		},
		"0.5.1": {
			"name": "moo",
			"version": "0.5.1",
			"description": "Optimised tokenizer/lexer generator! 🐄 Much performance. Moo!",
			"main": "moo.js",
			"repository": {
				"type": "git",
				"url": "git+https://github.com/tjvr/moo.git"
			},
			"author": {
				"name": "Tim Radvan",
				"email": "tim@tjvr.org"
			},
			"contributors": [
				{
					"name": "Nathan"
				}
			],
			"license": "BSD-3-Clause",
			"scripts": {
				"test": "jest .",
				"benchmark": "benchr test/benchmark.js",
				"moo": "echo 'Mooooo!'"
			},
			"devDependencies": {
				"benchr": "^3.2.0",
				"chevrotain": "4.2.0",
				"jest": "24.7.1",
				"lex": "^1.7.9",
				"lexing": "^0.8.0",
				"remix": "^0.1.4",
				"tokenizer2": "^2.0.0"
			},
			"gitHead": "cf9b14f2c45964b3eddcbe1024476e8410e7f14c",
			"bugs": {
				"url": "https://github.com/tjvr/moo/issues"
			},
			"homepage": "https://github.com/tjvr/moo#readme",
			"_id": "moo@0.5.1",
			"_nodeVersion": "11.15.0",
			"_npmVersion": "6.10.2",
			"dist": {
				"integrity": "sha512-I1mnb5xn4fO80BH9BLcF0yLypy2UKl+Cb01Fu0hJRkJjlCRtxZMWkTdAtDd5ZqCOxtCkhmRwyI57vWT+1iZ67w==",
				"shasum": "7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4",
				"tarball": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz",
				"fileCount": 4,
				"unpackedSize": 31824,
				"npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJdkPh2CRA9TVsSAnZWagAAI2YQAI7ZX7qaIDx+J4TDi3JN\nm1hjGctblFG/NPEFHLqZToYGetgnbJMDDFE5VYzrPlEIQN/bL6wXCIKSms5b\nXSDwhL0JDzbFnxQdU+924o/4RI1MeyXTHuUzr4SdqHOSwVHQXNWfR9F8T0n1\nLQmHpGxj1Av1WyblcMRMqVnuCLPY7IIRh3mFgHnORhhKSngbEtS7dBaeG2ck\nf3S15L2JyvO8AFpuv/bj7pCzVlDwwp+Cr/8z4Tu1WUFoV0QmFPc2Jx5xKbFF\n9hsLsYtREsNFhkHlGezFC3/s1obtgceFHR0zeYDwkA0JqsIh8281qwolGZda\ns/GW8ZZFdZxp2vjjVB7jUD2uh8jMQFskv5/uUlPOF5SxOM2g3+ux5wChek+g\ni/St8zDOujqH4nZUSRoOJ/GO9uc0LjECAHNOVOxSIudJTAJKK/W3OD26Gm3L\ns3iKwHUVB0aPOFeapoithAyOJDztOuevlyAtFWBHdxjRNNyTI+cpyvZ+gWYT\nVJYf2j0SXYEZGH+aVLigXNBHoDJErSWguDEb8ZNb1ELlTSnuIr5DwrUMzy/J\nqrwEyrb76cK+oZY9yh9nIHXbVeiSEr8l4q71N/dTo2VjX3ijkuGTP7LhAsHf\nLiBzS7TAfylEXQIcBvn5uImKkJMH+J1bvy+YGkO3T2ElgzY57GYgN7mwtpSf\nCXgZ\r\n=0u9z\r\n-----END PGP SIGNATURE-----\r\n"
			},
			"maintainers": [
				{
					"name": "nfd",
					"email": "qselsp@gmail.com"
				},
				{
					"name": "tjvr",
					"email": "tim@tjvr.org"
				}
			],
			"_npmUser": {
				"name": "tjvr",
				"email": "tim@tjvr.org"
			},
			"directories": {},
			"_npmOperationalInternal": {
				"host": "s3://npm-registry-packages",
				"tmp": "tmp/moo_0.5.1_1569781877438_0.9688038061782445"
			},
			"_hasShrinkwrap": false
		}
	},
	"time": {
		"modified": "2019-09-29T18:31:20.181Z",
		"created": "2012-05-15T17:54:41.230Z",
		"0.0.0": "2012-05-15T17:54:42.364Z",
		"0.1.0": "2017-03-17T16:43:52.128Z",
		"0.1.1": "2017-03-17T18:11:03.933Z",
		"0.2.0": "2017-03-27T18:38:15.875Z",
		"0.3.0": "2017-04-09T20:56:37.310Z",
		"0.3.1": "2017-04-12T12:10:02.099Z",
		"0.3.2": "2017-05-05T14:42:41.694Z",
		"0.3.3": "2017-06-13T19:01:40.106Z",
		"0.4.0": "2017-07-24T19:56:48.401Z",
		"0.4.1": "2017-08-09T16:17:50.314Z",
		"0.4.2": "2017-09-03T16:28:39.718Z",
		"0.4.3": "2017-09-14T10:07:46.285Z",
		"0.5.0": "2018-11-09T18:38:10.789Z",
		"0.5.1": "2019-09-29T18:31:17.620Z"
	},
	"users": {},
	"dist-tags": {
		"latest": "0.5.1"
	},
	"_uplinks": {
		"npmjs": {
			"etag": "W/\"c1e8324e0c1e6f10aa2c82f96dc7f049\"",
			"fetched": 1593324432019
		}
	},
	"_distfiles": {
		"moo-0.0.0.tgz": {
			"url": "https://registry.npmjs.org/moo/-/moo-0.0.0.tgz",
			"sha": "96e7a020a54a38f747c8e9230002b52747621040",
			"registry": "npmjs"
		},
		"moo-0.1.0.tgz": {
			"url": "https://registry.npmjs.org/moo/-/moo-0.1.0.tgz",
			"sha": "e5e989bed891ba41a623ea8e4608c413e5dc230e",
			"registry": "npmjs"
		},
		"moo-0.1.1.tgz": {
			"url": "https://registry.npmjs.org/moo/-/moo-0.1.1.tgz",
			"sha": "a06827dbc4805549a4dce5f54b3d03ba5f0fee35",
			"registry": "npmjs"
		},
		"moo-0.2.0.tgz": {
			"url": "https://registry.npmjs.org/moo/-/moo-0.2.0.tgz",
			"sha": "ff97028d7e647af628c7216537e2c41de6b917de",
			"registry": "npmjs"
		},
		"moo-0.3.0.tgz": {
			"url": "https://registry.npmjs.org/moo/-/moo-0.3.0.tgz",
			"sha": "c5572dd3d074091dcc5b8c47acf9509010282c5b",
			"registry": "npmjs"
		},
		"moo-0.3.1.tgz": {
			"url": "https://registry.npmjs.org/moo/-/moo-0.3.1.tgz",
			"sha": "1253a7e85d53ffb87b00dd19aa0c1dafb0e0fac0",
			"registry": "npmjs"
		},
		"moo-0.3.2.tgz": {
			"url": "https://registry.npmjs.org/moo/-/moo-0.3.2.tgz",
			"sha": "1f98352958e735b9708ee3b0af1ad3e81178d0b4",
			"registry": "npmjs"
		},
		"moo-0.3.3.tgz": {
			"url": "https://registry.npmjs.org/moo/-/moo-0.3.3.tgz",
			"sha": "a05ec95ea2bf29777cc402eeb5b20ac757128786",
			"registry": "npmjs"
		},
		"moo-0.4.0.tgz": {
			"url": "https://registry.npmjs.org/moo/-/moo-0.4.0.tgz",
			"sha": "76fc264aa421f986de75755e48f949d5ee5cae78",
			"registry": "npmjs"
		},
		"moo-0.4.1.tgz": {
			"url": "https://registry.npmjs.org/moo/-/moo-0.4.1.tgz",
			"sha": "b73f5dcb79ad4a197b16c5e6a913a73a2ca8fe9e",
			"registry": "npmjs"
		},
		"moo-0.4.2.tgz": {
			"url": "https://registry.npmjs.org/moo/-/moo-0.4.2.tgz",
			"sha": "3cb40862d9ef4e356e0e7c5331f7b6cb1a9a8e70",
			"registry": "npmjs"
		},
		"moo-0.4.3.tgz": {
			"url": "https://registry.npmjs.org/moo/-/moo-0.4.3.tgz",
			"sha": "3f847a26f31cf625a956a87f2b10fbc013bfd10e",
			"registry": "npmjs"
		},
		"moo-0.5.0.tgz": {
			"url": "https://registry.npmjs.org/moo/-/moo-0.5.0.tgz",
			"sha": "72f949e6735aeb27d07eb7c087ea5a70143c56e5",
			"registry": "npmjs"
		},
		"moo-0.5.1.tgz": {
			"url": "https://registry.npmjs.org/moo/-/moo-0.5.1.tgz",
			"sha": "7aae7f384b9b09f620b6abf6f74ebbcd1b65dbc4",
			"registry": "npmjs"
		}
	},
	"_attachments": {
		"moo-0.4.3.tgz": {
			"shasum": "3f847a26f31cf625a956a87f2b10fbc013bfd10e"
		}
	},
	"_rev": "2-f2d1e9cbabd7b87c",
	"_id": "moo",
	"readme": "![](cow.png)\n\nMoo!\n====\n\nMoo is a highly-optimised tokenizer/lexer generator. Use it to tokenize your strings, before parsing 'em with a parser like [nearley](https://github.com/hardmath123/nearley) or whatever else you're into.\n\n* [Fast](#is-it-fast)\n* [Convenient](#usage)\n* uses [Regular Expressions](#on-regular-expressions)\n* tracks [Line Numbers](#line-numbers)\n* handles [Keywords](#keywords)\n* supports [States](#states)\n* custom [Errors](#errors)\n* is even [Iterable](#iteration)\n* has no dependencies\n* 4KB minified + gzipped\n* Moo!\n\nIs it fast?\n-----------\n\nYup! Flying-cows-and-singed-steak fast.\n\nMoo is the fastest JS tokenizer around. It's **~2–10x** faster than most other tokenizers; it's a **couple orders of magnitude** faster than some of the slower ones.\n\nDefine your tokens **using regular expressions**. Moo will compile 'em down to a **single RegExp for performance**. It uses the new ES6 **sticky flag** where possible to make things faster; otherwise it falls back to an almost-as-efficient workaround. (For more than you ever wanted to know about this, read [adventures in the land of substrings and RegExps](http://mrale.ph/blog/2016/11/23/making-less-dart-faster.html).)\n\nYou _might_ be able to go faster still by writing your lexer by hand rather than using RegExps, but that's icky.\n\nOh, and it [avoids parsing RegExps by itself](https://hackernoon.com/the-madness-of-parsing-real-world-javascript-regexps-d9ee336df983#.2l8qu3l76). Because that would be horrible.\n\n\nUsage\n-----\n\nFirst, you need to do the needful: `$ npm install moo`, or whatever will ship this code to your computer. Alternatively, grab the `moo.js` file by itself and slap it into your web page via a `<script>` tag; moo is completely standalone.\n\nThen you can start roasting your very own lexer/tokenizer:\n\n```js\n    const moo = require('moo')\n\n    let lexer = moo.compile({\n      WS:      /[ \\t]+/,\n      comment: /\\/\\/.*?$/,\n      number:  /0|[1-9][0-9]*/,\n      string:  /\"(?:\\\\[\"\\\\]|[^\\n\"\\\\])*\"/,\n      lparen:  '(',\n      rparen:  ')',\n      keyword: ['while', 'if', 'else', 'moo', 'cows'],\n      NL:      { match: /\\n/, lineBreaks: true },\n    })\n```\n\nAnd now throw some text at it:\n\n```js\n    lexer.reset('while (10) cows\\nmoo')\n    lexer.next() // -> { type: 'keyword', value: 'while' }\n    lexer.next() // -> { type: 'WS', value: ' ' }\n    lexer.next() // -> { type: 'lparen', value: '(' }\n    lexer.next() // -> { type: 'number', value: '10' }\n    // ...\n```\n\nWhen you reach the end of Moo's internal buffer, next() will return `undefined`. You can always `reset()` it and feed it more data when that happens.\n\n\nOn Regular Expressions\n----------------------\n\nRegExps are nifty for making tokenizers, but they can be a bit of a pain. Here are some things to be aware of:\n\n* You often want to use **non-greedy quantifiers**: e.g. `*?` instead of `*`. Otherwise your tokens will be longer than you expect:\n\n    ```js\n    let lexer = moo.compile({\n      string: /\".*\"/,   // greedy quantifier *\n      // ...\n    })\n\n    lexer.reset('\"foo\" \"bar\"')\n    lexer.next() // -> { type: 'string', value: 'foo\" \"bar' }\n    ```\n\n    Better:\n\n    ```js\n    let lexer = moo.compile({\n      string: /\".*?\"/,   // non-greedy quantifier *?\n      // ...\n    })\n\n    lexer.reset('\"foo\" \"bar\"')\n    lexer.next() // -> { type: 'string', value: 'foo' }\n    lexer.next() // -> { type: 'space', value: ' ' }\n    lexer.next() // -> { type: 'string', value: 'bar' }\n    ```\n\n* The **order of your rules** matters. Earlier ones will take precedence.\n\n    ```js\n    moo.compile({\n        identifier:  /[a-z0-9]+/,\n        number:  /[0-9]+/,\n    }).reset('42').next() // -> { type: 'identifier', value: '42' }\n\n    moo.compile({\n        number:  /[0-9]+/,\n        identifier:  /[a-z0-9]+/,\n    }).reset('42').next() // -> { type: 'number', value: '42' }\n    ```\n\n* Moo uses **multiline RegExps**. This has a few quirks: for example, the **dot `/./` doesn't include newlines**. Use `[^]` instead if you want to match newlines too.\n\n* Since an excluding character ranges like `/[^ ]/` (which matches anything but a space) _will_ include newlines, you have to be careful not to include them by accident! In particular, the whitespace metacharacter `\\s` includes newlines.\n\n\nLine Numbers\n------------\n\nMoo tracks detailed information about the input for you.\n\nIt will track line numbers, as long as you **apply the `lineBreaks: true` option to any rules which might contain newlines**. Moo will try to warn you if you forget to do this.\n\nNote that this is `false` by default, for performance reasons: counting the number of lines in a matched token has a small cost. For optimal performance, only match newlines inside a dedicated token:\n\n```js\n    newline: {match: '\\n', lineBreaks: true},\n```\n\n\n### Token Info ###\n\nToken objects (returned from `next()`) have the following attributes:\n\n* **`type`**: the name of the group, as passed to compile.\n* **`text`**: the string that was matched.\n* **`value`**: the string that was matched, transformed by your `value` function (if any).\n* **`offset`**: the number of bytes from the start of the buffer where the match starts.\n* **`lineBreaks`**: the number of line breaks found in the match. (Always zero if this rule has `lineBreaks: false`.)\n* **`line`**: the line number of the beginning of the match, starting from 1.\n* **`col`**: the column where the match begins, starting from 1.\n\n\n### Value vs. Text ###\n\nThe `value` is the same as the `text`, unless you provide a [value transform](#transform).\n\n```js\nconst moo = require('moo')\n\nconst lexer = moo.compile({\n  ws: /[ \\t]+/,\n  string: {match: /\"(?:\\\\[\"\\\\]|[^\\n\"\\\\])*\"/, value: s => s.slice(1, -1)},\n})\n\nlexer.reset('\"test\"')\nlexer.next() /* { value: 'test', text: '\"test\"', ... } */\n```\n\n\n### Reset ###\n\nCalling `reset()` on your lexer will empty its internal buffer, and set the line, column, and offset counts back to their initial value.\n\nIf you don't want this, you can `save()` the state, and later pass it as the second argument to `reset()` to explicitly control the internal state of the lexer.\n\n```js\n    lexer.reset('some line\\n')\n    let info = lexer.save() // -> { line: 10 }\n    lexer.next() // -> { line: 10 }\n    lexer.next() // -> { line: 11 }\n    // ...\n    lexer.reset('a different line\\n', info)\n    lexer.next() // -> { line: 10 }\n```\n\n\nKeywords\n--------\n\nMoo makes it convenient to define literals.\n\n```js\n    moo.compile({\n      lparen:  '(',\n      rparen:  ')',\n      keyword: ['while', 'if', 'else', 'moo', 'cows'],\n    })\n```\n\nIt'll automatically compile them into regular expressions, escaping them where necessary.\n\n**Keywords** should be written using the `keywords` transform.\n\n```js\n    moo.compile({\n      IDEN: {match: /[a-zA-Z]+/, type: moo.keywords({\n        KW: ['while', 'if', 'else', 'moo', 'cows'],\n      })},\n      SPACE: {match: /\\s+/, lineBreaks: true},\n    })\n```\n\n\n### Why? ###\n\nYou need to do this to ensure the **longest match** principle applies, even in edge cases.\n\nImagine trying to parse the input `className` with the following rules:\n\n```js\n    keyword: ['class'],\n    identifier: /[a-zA-Z]+/,\n```\n\nYou'll get _two_ tokens — `['class', 'Name']` -- which is _not_ what you want! If you swap the order of the rules, you'll fix this example; but now you'll lex `class` wrong (as an `identifier`).\n\nThe keywords helper checks matches against the list of keywords; if any of them match, it uses the type `'keyword'` instead of `'identifier'` (for this example).\n\n\n### Keyword Types ###\n\nKeywords can also have **individual types**.\n\n```js\n    let lexer = moo.compile({\n      name: {match: /[a-zA-Z]+/, type: moo.keywords({\n        'kw-class': 'class',\n        'kw-def': 'def',\n        'kw-if': 'if',\n      })},\n      // ...\n    })\n    lexer.reset('def foo')\n    lexer.next() // -> { type: 'kw-def', value: 'def' }\n    lexer.next() // space\n    lexer.next() // -> { type: 'name', value: 'foo' }\n```\n\nYou can use [itt](https://github.com/nathan/itt)'s iterator adapters to make constructing keyword objects easier:\n\n```js\n    itt(['class', 'def', 'if'])\n    .map(k => ['kw-' + k, k])\n    .toObject()\n```\n\n\nStates\n------\n\nMoo allows you to define multiple lexer **states**. Each state defines its own separate set of token rules. Your lexer will start off in the first state given to `moo.states({})`.\n\nRules can be annotated with `next`, `push`, and `pop`, to change the current state after that token is matched. A \"stack\" of past states is kept, which is used by `push` and `pop`.\n\n* **`next: 'bar'`** moves to the state named `bar`. (The stack is not changed.)\n* **`push: 'bar'`** moves to the state named `bar`, and pushes the old state onto the stack.\n* **`pop: 1`** removes one state from the top of the stack, and moves to that state. (Only `1` is supported.)\n\nOnly rules from the current state can be matched. You need to copy your rule into all the states you want it to be matched in.\n\nFor example, to tokenize JS-style string interpolation such as `a${{c: d}}e`, you might use:\n\n```js\n    let lexer = moo.states({\n      main: {\n        strstart: {match: '`', push: 'lit'},\n        ident:    /\\w+/,\n        lbrace:   {match: '{', push: 'main'},\n        rbrace:   {match: '}', pop: true},\n        colon:    ':',\n        space:    {match: /\\s+/, lineBreaks: true},\n      },\n      lit: {\n        interp:   {match: '${', push: 'main'},\n        escape:   /\\\\./,\n        strend:   {match: '`', pop: true},\n        const:    {match: /(?:[^$`]|\\$(?!\\{))+/, lineBreaks: true},\n      },\n    })\n    // <= `a${{c: d}}e`\n    // => strstart const interp lbrace ident colon space ident rbrace rbrace const strend\n```\n\nThe `rbrace` rule is annotated with `pop`, so it moves from the `main` state into either `lit` or `main`, depending on the stack.\n\n\nErrors\n------\n\nIf none of your rules match, Moo will throw an Error; since it doesn't know what else to do.\n\nIf you prefer, you can have moo return an error token instead of throwing an exception. The error token will contain the whole of the rest of the buffer.\n\n```js\n    moo.compile({\n      // ...\n      myError: moo.error,\n    })\n\n    moo.reset('invalid')\n    moo.next() // -> { type: 'myError', value: 'invalid', text: 'invalid', offset: 0, lineBreaks: 0, line: 1, col: 1 }\n    moo.next() // -> undefined\n```\n\nYou can have a token type that both matches tokens _and_ contains error values.\n\n```js\n    moo.compile({\n      // ...\n      myError: {match: /[\\$?`]/, error: true},\n    })\n```\n\n### Formatting errors ###\n\nIf you want to throw an error from your parser, you might find `formatError` helpful. Call it with the offending token:\n\n```js\nthrow new Error(lexer.formatError(token, \"invalid syntax\"))\n```\n\nIt returns a string with a pretty error message.\n\n```\nError: invalid syntax at line 2 col 15:\n\n  totally valid `syntax`\n                ^\n```\n\n\nIteration\n---------\n\nIterators: we got 'em.\n\n```js\n    for (let here of lexer) {\n      // here = { type: 'number', value: '123', ... }\n    }\n```\n\nCreate an array of tokens.\n\n```js\n    let tokens = Array.from(lexer);\n```\n\nUse [itt](https://github.com/nathan/itt)'s iteration tools with Moo.\n\n```js\n    for (let [here, next] = itt(lexer).lookahead()) { // pass a number if you need more tokens\n      // enjoy!\n    }\n```\n\n\nTransform\n---------\n\nMoo doesn't allow capturing groups, but you can supply a transform function, `value()`, which will be called on the value before storing it in the Token object.\n\n```js\n    moo.compile({\n      STRING: [\n        {match: /\"\"\"[^]*?\"\"\"/, lineBreaks: true, value: x => x.slice(3, -3)},\n        {match: /\"(?:\\\\[\"\\\\rn]|[^\"\\\\])*?\"/, lineBreaks: true, value: x => x.slice(1, -1)},\n        {match: /'(?:\\\\['\\\\rn]|[^'\\\\])*?'/, lineBreaks: true, value: x => x.slice(1, -1)},\n      ],\n      // ...\n    })\n```\n\n\nContributing\n------------\n\nDo check the [FAQ](https://github.com/tjvr/moo/issues?q=label%3Aquestion).\n\nBefore submitting an issue, [remember...](https://github.com/tjvr/moo/blob/master/.github/CONTRIBUTING.md)"
}