{"id":19071425,"url":"https://github.com/ascoders/syntax-parser","last_synced_at":"2025-04-05T03:12:48.936Z","repository":{"id":40202680,"uuid":"139658966","full_name":"ascoders/syntax-parser","owner":"ascoders","description":"Light and fast 🚀parser! With zero dependents. - Sql Parser Demo added!","archived":false,"fork":false,"pushed_at":"2023-10-28T04:37:05.000Z","size":1330,"stargazers_count":480,"open_issues_count":14,"forks_count":46,"subscribers_count":17,"default_branch":"master","last_synced_at":"2025-03-29T02:09:16.368Z","etag":null,"topics":["lexer","parser","sql","sql-parser"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ascoders.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-07-04T02:33:31.000Z","updated_at":"2025-03-06T09:50:39.000Z","dependencies_parsed_at":"2024-11-09T01:29:55.387Z","dependency_job_id":"f4da92ad-f8e4-4201-b07e-5168aad3b8bd","html_url":"https://github.com/ascoders/syntax-parser","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ascoders%2Fsyntax-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ascoders%2Fsyntax-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ascoders%2Fsyntax-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ascoders%2Fsyntax-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ascoders","download_url":"https://codeload.github.com/ascoders/syntax-parser/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247280272,"owners_count":20912967,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["lexer","parser","sql","sql-parser"],"created_at":"2024-11-09T01:28:21.517Z","updated_at":"2025-04-05T03:12:48.913Z","avatar_url":"https://github.com/ascoders.png","language":"TypeScript","readme":"\u003cp align=\"center\"\u003e\n    \u003ch2 align=\"center\"\u003esyntax-parser\u003c/h2\u003e\n    \u003cp align=\"center\"\u003e\n        \u003ci\u003e\n            syntax-parser is a parser using pure javascript, so it can both run in browser and nodejs.\n        \u003c/i\u003e\n    \u003cp\u003e\n    \u003cp align=\"center\"\u003e\n        \u003ci\u003e\n            \u003ca href=\"https://travis-ci.org/syntax-parser/syntax-parser\"\u003e\n              \u003cimg src=\"https://img.shields.io/travis/syntax-parser/syntax-parser/master.svg?style=flat\" alt=\"CircleCI Status\"\u003e\n            \u003c/a\u003e\n            \u003ca href=\"https://www.npmjs.com/package/syntax-parser\"\u003e\n              \u003cimg src=\"https://img.shields.io/npm/v/syntax-parser.svg?style=flat\" alt=\"NPM Version\"\u003e\n            \u003c/a\u003e\n            \u003ca href=\"https://codecov.io/github/syntax-parser/syntax-parser\"\u003e\n              \u003cimg src=\"https://img.shields.io/codecov/c/github/syntax-parser/syntax-parser/master.svg\" alt=\"Code Coverage\"\u003e\n            \u003c/a\u003e\n        \u003c/i\u003e\n    \u003c/p\u003e\n\u003c/p\u003e\n\n[syntax-parser](https://www.npmjs.com/package/syntax-parser) supports:\n\n- lexer.\n- parser.\n\n## Lexer\n\n`createLexer` can help you create a lexer.\n\n### Example\n\n```typescript\nimport { createLexer } from 'syntax-parser';\n\nconst myLexer = createLexer([\n  {\n    type: 'whitespace',\n    regexes: [/^(\\s+)/],\n    ignore: true\n  },\n  {\n    type: 'word',\n    regexes: [/^([a-zA-Z0-9]+)/]\n  },\n  {\n    type: 'operator',\n    regexes: [/^(\\+)/]\n  }\n]);\n\nmyLexer('a + b');\n// [\n//   { \"type\": \"word\", \"value\": \"a\", \"position\": [0, 1] },\n//   { \"type\": \"operator\", \"value\": \"+\", \"position\": [2, 3] },\n//   { \"type\": \"word\", \"value\": \"b\", \"position\": [4, 5] }\n// ]\n```\n\n**type**\n\n`Token` type name, you can use any value here, and you will use it in the parser stage.\n\n**regexes**\n\nRegexes that use to be matched for each `Token` type.\n\n**ignore**\n\nThe matching `Token` will not be added to the `Token` result queue.\n\nIn general, whitespace can be ignored in syntax parsing.\n\n## Parser\n\n`createParser` can help you create a parser. Parser requires a lexer.\n\n```typescript\nimport { createParser, chain, matchTokenType, many } from 'syntax-parser';\n\nconst root = () =\u003e chain(addExpr)(ast =\u003e ast[0]);\n\nconst addExpr = () =\u003e\n  chain(matchTokenType('word'), many(addPlus))(ast =\u003e ({\n    left: ast[0].value,\n    operator: ast[1] \u0026\u0026 ast[1][0].operator,\n    right: ast[1] \u0026\u0026 ast[1][0].term\n  }));\n\nconst addPlus = () =\u003e\n  chain('+', root)(ast =\u003e ({\n    operator: ast[0].value,\n    term: ast[1]\n  }));\n\nconst myParser = createParser(\n  root, // Root grammar.\n  myLexer // Created in lexer example.\n);\n\nmyParser('a + b');\n// ast:\n// [{\n//   \"left\": \"a\",\n//   \"operator\": \"+\",\n//   \"right\": {\n//     \"left\": \"b\",\n//     \"operator\": null,\n//     \"right\": null\n//   }\n// }]\n```\n\n### chain\n\nBasic grammatical element, support four parameters:\n\n#### string\n\nString means match token:\n\n```typescript\nchain('select', 'table'); // Match 'select table'\n```\n\n#### array\n\nArray means 'or':\n\n```typescript\nchain('select', ['table', 'chart']); // Match both 'select table' and 'select chart'\n```\n\n#### matchTokenType\n\n`matchTokenType` allow you match `Token` type defined in lexer.\n\n```typescript\nchain('select', matchTokenType('word')); // Match 'select [any word!]'\n```\n\n#### function\n\nIt's easy to call another chain function:\n\n```typescript\nconst a = () =\u003e chain('select', b);\nconst b = () =\u003e chain('table');\n```\n\n### many/optional\n\nJust as literal meaning:\n\n```typescript\nconst a = () =\u003e chain('select', optional('table')); // Match both 'select' and 'select table'\nconst b = () =\u003e chain('select', many(',', matchTokenType('word'))); // Match both 'select' and 'select a' and 'select a, b' .. and so on.\n```\n\n\u003e `optional` `many` can also use `chain` as parameter. `many(chain(..))`\n\nThe last callback allow partial redefin of local ast:\n\n```typescript\nchain('select', 'table')(\n  ast =\u003e ast[0] // return 'select'\n);\n```\n\n## Tests\n\n```bash\nnpm test\n```\n\n## Monaco Editor Sql Editor\n\n\u003cimg width=600 src=\"https://img.alicdn.com/tfs/TB1hGD0dMaH3KVjSZFjXXcFWpXa-1143-649.gif\"\u003e\n\nIf you want to see this demo, run this command:\n\n```bash\nnpm run docs\n```\n\nThen select demo `Monaco Editor`.","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fascoders%2Fsyntax-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fascoders%2Fsyntax-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fascoders%2Fsyntax-parser/lists"}