{"id":23814052,"url":"https://github.com/notjustanna/tartar","last_synced_at":"2025-09-06T23:31:49.964Z","repository":{"id":41049399,"uuid":"251127025","full_name":"NotJustAnna/tartar","owner":"NotJustAnna","description":"Kotlin lexical analysis and pratt-parsing as a DSL","archived":false,"fork":false,"pushed_at":"2023-10-16T16:51:07.000Z","size":396,"stargazers_count":4,"open_issues_count":3,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-11-19T16:48:21.276Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/NotJustAnna.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":"2020-03-29T20:26:04.000Z","updated_at":"2024-09-09T19:45:10.000Z","dependencies_parsed_at":"2024-05-02T16:23:09.117Z","dependency_job_id":"e970cc94-0d82-48c3-a298-9cbad8ce2eb5","html_url":"https://github.com/NotJustAnna/tartar","commit_stats":null,"previous_names":["notjustanna/tartar","annathelibri/tartar"],"tags_count":7,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotJustAnna%2Ftartar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotJustAnna%2Ftartar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotJustAnna%2Ftartar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/NotJustAnna%2Ftartar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/NotJustAnna","download_url":"https://codeload.github.com/NotJustAnna/tartar/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":232149971,"owners_count":18479564,"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":[],"created_at":"2025-01-02T03:46:19.040Z","updated_at":"2025-01-02T03:46:19.700Z","avatar_url":"https://github.com/NotJustAnna.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# tartar\n\n[![Maven metadata URL](https://img.shields.io/github/v/release/notjustanna/tartar?sort=semver)](https://maven.cafeteria.dev/releases/net/notjustanna/tartar)\n[![GitHub issues](https://img.shields.io/github/issues/notjustanna/tartar)](https://github.com/notjustanna/tartar/issues)\n[![License](https://img.shields.io/github/license/notjustanna/tartar)](https://github.com/notjustanna/tartar/tree/master/LICENSE)\n[![Twitter](https://img.shields.io/twitter/url?style=social\u0026url=https%3A%2F%2Fgithub.com%2Fnotjustanna%2Ftartar)](https://twitter.com/intent/tweet?text=Wow:\u0026url=https%3A%2F%2Fgithub.com%2Fnotjustanna%2Ftartar)\n\nKotlin trie-based lexical analysis and pratt-parsing as a DSL.\n\n### Installation\n\nUsing in Gradle:\n\n```gradle\nrepositories {\n  maven { url = 'https://maven.cafeteria.dev' }\n}\n\ndependencies {\n  implementation 'net.notjustanna:tartar:VERSION'\n}\n```\n\nUsing in Maven:\n\n```xml\n\n\u003crepositories\u003e\n    \u003crepository\u003e\n        \u003cid\u003ecafeteria\u003c/id\u003e\n        \u003cname\u003ecafeteria\u003c/name\u003e\n        \u003curl\u003ehttps://maven.cafeteria.dev\u003c/url\u003e\n    \u003c/repository\u003e\n\u003c/repositories\u003e\n\n\u003cdependencies\u003e\n\u003cdependency\u003e\n    \u003cgroupId\u003enet.notjustanna\u003c/groupId\u003e\n    \u003cartifactId\u003etartar\u003c/artifactId\u003e\n    \u003cversion\u003eVERSION\u003c/version\u003e\n\u003c/dependency\u003e\n\u003c/dependencies\u003e\n```\n\n### Usage\n\nTo create a lexer (also called a tokenizer) use `createLexer { ... }`, which exposes an interface to configure and add\nmatchers to the lexer.\n\nTo create a grammar use `createGrammar { ... }`, which exposes an interface to create and add prefix parsers and infix\nparsers to the grammar.\n\nTo create a parser use `createParser(grammar) { ... }`, which will run the block of code on `parser.parse()`.\n\n#### Example code\n\n```kotlin\n// Create a lexer as simple as a method call.\nval lexer = Lexer.create\u003cToken\u003cTokenType\u003e\u003e {\n    // Implement a token type per line.\n    '+' { processToken(PLUS) }\n    // Built-in extension functions.\n    '\"' { processToken(STRING, readString(it), offset = 2) }\n    // NOOP tokens.\n    ' '()\n    '\\n'()\n}\n\n// Create a pratt-parser grammar. Dead simple.\nval grammar = Grammar.create\u003cTokenType, String\u003e {\n    // Create a prefix parselet as a lambda function.\n    prefix(STRING) { token -\u003e token.value }\n    // Create an infix parselet, with support to precedence as a lambda function.\n    infix(PLUS, 1) { left, _ -\u003e left + parseExpression() }\n}\n\n// Use your grammar to create a pratt-parser.\nval parser = SourceParser.create(lexer, grammar) { // Actual code run by the parser.\n    // Extension function: Throws if there's still tokens.\n    ensureEOF {\n        // Parses a expression using this parsers' grammar.\n        parseExpression()\n    }\n}\n\n// One line of code to rule them all.\nval result = parser.parse(Source.classpath { \"input.str\" })\nprintln(result)\n```\n\nSee the full code [here](https://github.com/notjustanna/tartar/blob/master/src/test/java/examples/StringJoiner.kt),\nas well as other examples [here](https://github.com/notjustanna/tartar/tree/master/src/test/java/examples).\n\n### Special thanks\n\nSpecial thanks to [Avarel](https://github.com/Avarel), this library wouldn't be possible\nwithout his help, feedback and source code of [Lobos](https://github.com/Avarel/Lobos)\nand [Kaiper](https://github.com/Avarel/Kaiper).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnotjustanna%2Ftartar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnotjustanna%2Ftartar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnotjustanna%2Ftartar/lists"}