{"id":20285634,"url":"https://github.com/marcisbee/nanolex","last_synced_at":"2025-04-11T08:40:25.725Z","repository":{"id":224770562,"uuid":"764201830","full_name":"Marcisbee/nanolex","owner":"Marcisbee","description":"🪁 Parser grammar builder","archived":false,"fork":false,"pushed_at":"2025-02-20T21:33:42.000Z","size":83,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-10T06:50:31.387Z","etag":null,"topics":["grammar","lexer","parser-library","tokenizer"],"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/Marcisbee.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":"2024-02-27T16:56:05.000Z","updated_at":"2025-02-20T21:32:36.000Z","dependencies_parsed_at":"2024-02-27T17:30:53.006Z","dependency_job_id":"20459a7c-972b-4d2c-b32f-90c9eadedd5b","html_url":"https://github.com/Marcisbee/nanolex","commit_stats":null,"previous_names":["marcisbee/nanolex"],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Marcisbee%2Fnanolex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Marcisbee%2Fnanolex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Marcisbee%2Fnanolex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Marcisbee%2Fnanolex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Marcisbee","download_url":"https://codeload.github.com/Marcisbee/nanolex/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248362344,"owners_count":21091099,"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":["grammar","lexer","parser-library","tokenizer"],"created_at":"2024-11-14T14:27:59.018Z","updated_at":"2025-04-11T08:40:25.705Z","avatar_url":"https://github.com/Marcisbee.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# nanolex\n\n@TODO readme\n\nVery experimental parser building library\n\n## Usage\n\n```sh\nnpm i nanolex\n```\n\n```ts\nimport { createToken, EOF, getComposedTokens, nanolex } from \"nanolex\";\n\n// Define tokens\nconst Whitespace = createToken(/[ \\t\\n\\r]+/, \"WhiteSpace\");\nconst LParen = createToken(\"(\");\nconst RParen = createToken(\")\");\nconst Comma = createToken(\",\");\nconst Integer = createToken(/-?\\d+/, \"Integer\");\nconst Identifier = createToken(/\\w+/, \"Identifier\");\n\n// List of tokenizable tokens\nconst tokens = getComposedTokens([\n  Whitespace,\n  LParen,\n  RParen,\n  Comma,\n  Integer,\n]);\n\n// Define the usage of your parser\nexport function parser(value: string) {\n  // Initiate grammar\n  const {\n    consume,\n    zeroOrOne,\n    zeroOrMany,\n    zeroOrManySep,\n    and,\n    or,\n    patternToSkip,\n    throwIfError,\n  } = nanolex(value, tokens);\n\n  // Write patterns to skip, in this case ignore whitespace\n  // Pattern is just grammar\n  patternToSkip(consume(Whitespace));\n\n  // Write parser grammar patterns here\n\n  function FUNCTION() {\n    return and([\n      consume(Identifier),\n      consume(LParen),\n      PARAMS,\n      consume(RParen),\n    ], transform)();\n\n    function transform([name, _, params]) {\n      return {\n        type: \"function\",\n        name,\n        params,\n      };\n    }\n  }\n\n  function PARAMS() {\n    return zeroOrManySep(\n      VALUE,\n      consume(Comma),\n    )();\n  }\n\n  function VALUE() {\n    return or([\n      consume(Integer, Number),\n      FUNCTION,\n    ])();\n  }\n\n  // Run the grammar\n  const [output] = throwIfError(and([FUNCTION, consume(EOF)]));\n\n  return output;\n}\n```\n\n```ts\nimport { parser } from \"./parser.ts\";\n\nparser(\"SUM(1, SUM(2, 3))\");\n/*\n{\n  \"type\": \"function\",\n  \"name\": \"SUM\",\n  \"params\": [\n    1,\n    {\n      \"type\": \"function\",\n      \"name\": \"SUM\",\n      \"params\": [2, 3]\n    }\n  ]\n}\n*/\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcisbee%2Fnanolex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarcisbee%2Fnanolex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarcisbee%2Fnanolex/lists"}