{"id":15666456,"url":"https://github.com/clarete/langlang","last_synced_at":"2025-04-13T04:52:01.086Z","repository":{"id":58653415,"uuid":"145063792","full_name":"clarete/langlang","owner":"clarete","description":"Language Toolkit","archived":false,"fork":false,"pushed_at":"2025-04-07T01:52:11.000Z","size":2212,"stargazers_count":12,"open_issues_count":1,"forks_count":3,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-04-13T04:51:54.291Z","etag":null,"topics":["parser-generator","parser-library","parsing","parsing-expression-grammars","pattern-matching","virtual-machine"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/clarete.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING","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-08-17T02:49:59.000Z","updated_at":"2025-04-07T01:52:15.000Z","dependencies_parsed_at":"2024-06-12T16:05:29.108Z","dependency_job_id":"4762fc21-200f-4d17-8d25-a60715d392e5","html_url":"https://github.com/clarete/langlang","commit_stats":{"total_commits":593,"total_committers":3,"mean_commits":"197.66666666666666","dds":0.4806070826306914,"last_synced_commit":"9100e46264526759452bc8a976e6e811aad3bf31"},"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clarete%2Flanglang","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clarete%2Flanglang/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clarete%2Flanglang/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/clarete%2Flanglang/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/clarete","download_url":"https://codeload.github.com/clarete/langlang/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248665767,"owners_count":21142123,"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":["parser-generator","parser-library","parsing","parsing-expression-grammars","pattern-matching","virtual-machine"],"created_at":"2024-10-03T14:00:42.092Z","updated_at":"2025-04-13T04:52:01.080Z","avatar_url":"https://github.com/clarete.png","language":"Rust","readme":"\n# Table of Contents\n\n1.  [Introduction](#orgddb7eae)\n    1.  [Project Status](#orgd86fe89)\n    2.  [Currently supported output languages](#org04be466)\n        1.  [Notes](#org94693b5)\n    3.  [Basic Usage](#org2f71efb)\n2.  [Input Language](#orgdcd704f)\n    1.  [Productions and Expressions](#org5c91f9e)\n    2.  [Terminals](#orgc3e624d)\n    3.  [Non-Terminals](#org2207286)\n    4.  [Expression Composition](#orgababc6d)\n        1.  [Ordered Choice](#org60cd073)\n        2.  [Syntactic Predicates](#org0ec5ee2)\n        3.  [Repetitions](#org761381e)\n        4.  [Lexification](#org0c79d2a)\n        5.  [Error reporting with Labels](#org9feb02a)\n        6.  [Import system](#org9b3847a)\n3.  [Generator Options](#orgdc5b206)\n    1.  [Go](#org12d08a8)\n        1.  [Basic command line arguments](#orgde85bc5)\n        2.  [Additional options](#orgf8e60d5)\n4.  [Roadmap](#org666b6a1)\n5.  [Changelog](#org5a0a7eb)\n    1.  [go/v0.0.8](#org1c41c34)\n    2.  [go/v0.0.7](#orgf5e5d04)\n    3.  [go/v0.0.6](#org9cc48fe)\n    4.  [go/v0.0.5](#orgc07f78b)\n\n\n\u003ca id=\"orgddb7eae\"\u003e\u003c/a\u003e\n\n# Introduction\n\nBring your own grammar and get a feature rich parser generated for\ndifferent languages.  The are reasons why you might want to use this:\n\n-   Concise input grammar format and intuitive algorithm: generates\n    recursive top-down parsers based on Parsing Expression Grammars\n-   Automatic handling of whitespaces, making grammars less cluttered\n-   Error reporting with custom messages via failure `labels`\n-   Partial support for declaring error recovery rules, which allow\n    incremental parsing that returns an output tree even upon multiple\n    parsing errors.\n\n\n\u003ca id=\"orgd86fe89\"\u003e\u003c/a\u003e\n\n## Project Status\n\n-   We're not 1.0 yet, so the API is not stable, which means that data\n    structure shapes might change, and/or behavihor might change,\n    drastically, and without much notice.\n-   Don't submit pull requests without opening an issue and discussing\n    your idea.  We will take the slow approach aiming at great design\n    first, then being stable, then being featureful.\n\n\n\u003ca id=\"org04be466\"\u003e\u003c/a\u003e\n\n## Currently supported output languages\n\n-   [X] Rust¹\n-   [X] Go Lang²\n-   [ ] Python\n-   [ ] Java Script\n-   [ ] Write your own code generator\n\n\n\u003ca id=\"org94693b5\"\u003e\u003c/a\u003e\n\n### Notes\n\n1.  Rust support is based on a virtual machine as its runtime, and not\n    on a generated parser.  That is unlikely to change because our\n    tooling will be built in Rust, so we need more flexibility on the\n    \"host implementation\".  We may give an option to also generate a\n    parser in Rust code that doesn't depend on any libraries, if it\n    provides any value.  But such work isn't planned as of right now.\n\n2.  We're in the middle of dropping the Go implementation in favor of\n    a generating a Go parser from the code written in Rust.\n    Prototyping a few features, like the import system and automatic\n    space handling, was very useful, but once the refactoring of the\n    Rust implementation is in a good place, the Rust version will be\n    better as it will make it easier to generate parsers for other\n    languages than Rust and Go.\n\n\n\u003ca id=\"org2f71efb\"\u003e\u003c/a\u003e\n\n## Basic Usage\n\nIf you just want to test the waters, point the command line utility at\na grammar and pick a starting rule:\n\n    cargo run --bin langlang run --grammar-file grammars/json.peg --start-rule JSON\n\nThat will drop you into an initeractive shell that allows you to try\nout different input expressions.\n\nTake a look at other examples at the directory `grammars` in the root\nof the repository.  It contains a grammar library for commonly used\ninput formats.\n\n\n\u003ca id=\"orgdcd704f\"\u003e\u003c/a\u003e\n\n# Input Language\n\n\n\u003ca id=\"org5c91f9e\"\u003e\u003c/a\u003e\n\n## Productions and Expressions\n\nThe input grammar is as simple as it can get.  It builds off of the\noriginal PEG format, and other features are added conservatively.\nTake the following input as an example:\n\n    Production \u003c- Expression\n\nAt the left side of the arrow there is an identifier and on the right\nside, there is an expression.  These two together are called either\nproductions or (parsing) rules.  Let's go over how to compose them.\nIf you've ever seen or used regular expressions, you've got a head\nstart.\n\n\n\u003ca id=\"orgc3e624d\"\u003e\u003c/a\u003e\n\n## Terminals\n\n-   **Any**: matches any character, and only errors if it reaches\n    the end of the input.  e.g.: `.`\n\n-   **Literal**: anything around quotes (single and double quotes are the\n    same).  e.g.: `'x'`\n\n-   **Class and Range**: classes may contain either ranges or single\n    characters.  e.g.: `[0-9]`, `[a-zA-Z]`, `[a-f0-9_]`.  This last\n    example contains two ranges (`a-f` and `0-9`) and one single char\n    (`_`).  It means **match either one of these**. e.g.: `[a-cA-C]` is\n    translated to `'a' / 'b' / 'c' / 'A' / 'B' / 'C'`.\n\n\n\u003ca id=\"org2207286\"\u003e\u003c/a\u003e\n\n## Non-Terminals\n\nThe biggest addition of this type of grammar on top of regular\nexpressions is the ability to define and recursively call productions.\nHere's a grammar snippet for parsing numbers:\n\n    Signed   \u003c- ('-' / '+') Signed / Decimal\n    Decimal  \u003c- ([1-9][0-9]*) / '0'\n\nThe topmost production `Signed` calls itself or the production\n`Decimal`.  It allows parsing signed and unsigned numbers\nrecursively. (e.g.: `+-+--1` and so forth would be accepted).\n\n\n\u003ca id=\"orgababc6d\"\u003e\u003c/a\u003e\n\n## Expression Composition\n\nThe following operators can be used on both Terminals and\nNon-Terminals, on top of parenthesized expressions:\n\n\u003ctable border=\"2\" cellspacing=\"0\" cellpadding=\"6\" rules=\"groups\" frame=\"hsides\"\u003e\n\n\n\u003ccolgroup\u003e\n\u003ccol  class=\"org-left\" /\u003e\n\n\u003ccol  class=\"org-left\" /\u003e\n\n\u003ccol  class=\"org-left\" /\u003e\n\u003c/colgroup\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth scope=\"col\" class=\"org-left\"\u003eoperator\u003c/th\u003e\n\u003cth scope=\"col\" class=\"org-left\"\u003eexample\u003c/th\u003e\n\u003cth scope=\"col\" class=\"org-left\"\u003ecomment\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003cb\u003eordered choice\u003c/b\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ccode\u003ee1 / e2\u003c/code\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u0026#xa0;\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003cb\u003enot predicate\u003c/b\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ccode\u003e!e\u003c/code\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u0026#xa0;\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003cb\u003eand predicate\u003c/b\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ccode\u003e\u0026amp;e\u003c/code\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003esugar for \u003ccode\u003e!!e\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003cb\u003ezero or more\u003c/b\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ccode\u003ee*\u003c/code\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u0026#xa0;\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003cb\u003eone or more\u003c/b\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ccode\u003ee+\u003c/code\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003esugar for \u003ccode\u003eee*\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003cb\u003eoptional\u003c/b\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ccode\u003ee?\u003c/code\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003esugar for \u003ccode\u003e\u0026amp;ee / !e\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003cb\u003elexification\u003c/b\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ccode\u003e#e\u003c/code\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u0026#xa0;\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\u003cb\u003elabel\u003c/b\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003e\u003ccode\u003ee^label\u003c/code\u003e\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003esugar for \u003ccode\u003ee/throw(label)\u003c/code\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n\n\u003ca id=\"org60cd073\"\u003e\u003c/a\u003e\n\n### Ordered Choice\n\nThis operator tries expressions one at a time, from left to right, and\nstops at the first one to succeed.  Or error if no alternatives work.\nE.g.:\n\n    SomeDigits \u003c- '0' / '1' / '2' / '3' / '4'\n\nPassing `6` to the above expression will generate an error.\n\n\n\u003ca id=\"org0ec5ee2\"\u003e\u003c/a\u003e\n\n### Syntactic Predicates\n\nPredicates are the mechanism that allows unlimited look ahead, as they\ndo not consume any input.  e.g.:\n\n    BracketString \u003c- \"[\" (!\"]\" .)* \"]\"\n\nIn the above example, the **any** expression isn't evaluated if the\nparser finds the closing square bracket.\n\nThe **and** predicate (`\u0026`) is just syntactical sugar for `!!`.\n\n\n\u003ca id=\"org761381e\"\u003e\u003c/a\u003e\n\n### Repetitions\n\n-   **Zero Or More** never fails because, as it can match its expression at\n    least zero times.\n\n-   **One Or More** the syntax sugar for calling the expression once,\n    followed by applying zero or more to the same expression. It can\n    fail at the first time it matches the expression.\n\n-   **Optional** will match an expression zero or one time.\n\n\n\u003ca id=\"org0c79d2a\"\u003e\u003c/a\u003e\n\n### Lexification\n\nBy default, the generated parsers emit code to consume whitespaces\nautomatically before each item within a sequence of a production\nthat's considered not syntactic.  Productions are considered syntactic\nif all their expressions are syntactic.  Expressions are considered\nsyntactic if their output tree is composed only of terminal matches.\nIf there's any path to a non-terminal match, the entire expression,\nand production are considered non syntactic.  e.g.:\n\n    NotSyntactic \u003c- Syntactic \"!\"\n    Syntactic    \u003c- \"a\" \"b\" \"c\"\n\nIn the above example, there is no automatic space consumption injected\nbefore the items of the sequence expression `\"a\" \"b\" \"c\"` as all of\nthem are terminals.  And the `NotSyntactic` production contains non\nterminal calls, which makes it non-syntactic.  Therefore, automatic\nspace handling will be enabled for `NotSyntactic` and disabled for\n`Syntactic`\n\nFor **disabling** automatic space handling of an expression, prefix it\nwith the lexification operator `#`. e.g.:\n\n    Ordinal \u003c- Decimal #('st' / 'nd' / 'rd' / 'th')^ord\n    Decimal \u003c- ([1-9][0-9]*) / '0'\n\nIn the above expression, `Decimal` is considered syntactic, which\ndisables automatic space handling.  `Ordinal` is not syntactic because\nit calls out to another production with a non-terminal.  So, automatic\nspace handling is enabled for that production.  However, between the\nnon-terminal and the choice with terminals, space handling is\ndisabled.  This is what is expected\n\n\u003ctable border=\"2\" cellspacing=\"0\" cellpadding=\"6\" rules=\"groups\" frame=\"hsides\"\u003e\n\n\n\u003ccolgroup\u003e\n\u003ccol  class=\"org-left\" /\u003e\n\n\u003ccol  class=\"org-left\" /\u003e\n\u003c/colgroup\u003e\n\u003cthead\u003e\n\u003ctr\u003e\n\u003cth scope=\"col\" class=\"org-left\"\u003eInput\u003c/th\u003e\n\u003cth scope=\"col\" class=\"org-left\"\u003eResult\u003c/th\u003e\n\u003c/tr\u003e\n\u003c/thead\u003e\n\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\" 3rd\"\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003esucceeds\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\"50th\"\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003esucceeds\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\"2 0th\"\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003efails\u003c/td\u003e\n\u003c/tr\u003e\n\n\n\u003ctr\u003e\n\u003ctd class=\"org-left\"\u003e\"2 th\"\u003c/td\u003e\n\u003ctd class=\"org-left\"\u003efails\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\nThe first input succeeds because space consumption is automatically\nadded to the left of the call to the non terminal `Decimal`, as\n`Ordinal` is not syntactic.  But because the expression that follows\nthe non terminal is marked with the lexification operator, automatic\nspace handling won't be injected between the call to the non terminal\nand the ordered choice with the syntactic suffixed `st`, `nd`, `rd`,\nand `th`.\n\nHere is maybe the most classic example of where lexification is\nneeded: Non-Syntactic String Literals.  Which uses eager look ahead\nand spaces are significant.  e.g.:\n\n    SyntacticStringLiteral     \u003c- '\"' (!'\"' .) '\"'\n    NonSyntacticStringLiteral  \u003c- DQ #((!DQ .)  DQ)\n\nWithout using the lexification operator on the rule\n`NonSyntacticStringLiteral`, it would eat up the spaces after the\nfirst quote, which can be undesired for string fields.\n\nThe rule `SyntacticStringLiteral` doesn't need the lexification\noperator because all of its sub-expressions are terminals, therefore\nthe rule is syntactic and space consumption won't be generated by\ndefault anyway.\n\nThere are definitely more use-cases of the lexification operator out\nthere, these are just the common ones.\n\n\n\u003ca id=\"org9feb02a\"\u003e\u003c/a\u003e\n\n### Error reporting with Labels\n\n\n\u003ca id=\"org9b3847a\"\u003e\u003c/a\u003e\n\n### Import system\n\nProductions of one grammar can be imported from another one.  That\nallows reusing rules and delivering more consolidate grammar files and\nmore powerful parser generated at the end.\n\n    // file player.peg\n    @import AddrSpec from \"./rfc5322.peg\"\n    \n    Player \u003c- \"Name:\" Name \",\" \"Score:\" Number \",\" \"Email:\" AddrSpec\n    Name   \u003c- [a-zA-Z ]+\n    Number \u003c- [0-9]+\n    // ... elided for simplicity\n\n    // file rfc5322.peg\n    // https://datatracker.ietf.org/doc/html/rfc5322#section-3.4.1\n    \n    // ... elided for simplicity\n    AddrSpec  \u003c- LocalPart \"@\" Domain\n    LocalPart \u003c- DotAtom / QuotedString / ObsLocalPart\n    Domain    \u003c- DotAtom / DomainLiteral / ObsDomain\n    // ... elided for simplicity\n\nThe above example illustrates that a rather complete email parser can\nbe used in other grammars using imports.  Behind the scenes, the\n`AddrSpec` rule and all its dependencies have been merged into the\n`player.peg` grammar.\n\n\n\u003ca id=\"orgdc5b206\"\u003e\u003c/a\u003e\n\n# Generator Options\n\n\n\u003ca id=\"org12d08a8\"\u003e\u003c/a\u003e\n\n## Go\n\nFor using the [deprecated] go generator, you can run the following\ncommand:\n\n    go run ./go/cmd -grammar grammars.json\n\n\n\u003ca id=\"orgde85bc5\"\u003e\u003c/a\u003e\n\n### Basic command line arguments\n\n-   `--grammar FILE`: is the only required parameter.  It takes the\n    grammar FILE as input and if no other command line arguments are\n    provided, the output is printed to `stdout`.\n\n-   `--output PATH`: this option replaces `stdout` as the output with\n    the PATH value provided to this command.\n\n-   `--ast-only`: this will prevent the generator from outputing the\n    final parser, and instead, it output the grammar's AST.\n\n-   `--language LANG`: this will cause the generator to output a parser\n    in the target language LANG.  As of this writing, the only\n    supported value is `go`, but there are plans to extend support to\n    both Python and JavaScript/TypeScript.\n\n\n\u003ca id=\"orgf8e60d5\"\u003e\u003c/a\u003e\n\n### Additional options\n\nThe Go code generator provides the following additional knobs to the\ncommand line:\n\n-   `--go-package`: allows customizing what goes in the `package`\n    directive that starts each Go file.\n\n\n\u003ca id=\"org666b6a1\"\u003e\u003c/a\u003e\n\n# Roadmap\n\n-   [ ] MID: [gen\u003csub\u003ego\u003c/sub\u003e] rewrite Go generator in Rust\n-   [ ] MID: [genall] generator interface to be shared by all targets\n-   [ ] SML: [gen\u003csub\u003ego\u003c/sub\u003e] memoize results to guarantee O(1) parsing time\n-   [ ] SML: [gen\u003csub\u003ego\u003c/sub\u003e] allocate output nodes in an arena\n-   [ ] MID: [gen\u003csub\u003epy\u003c/sub\u003e] Python Code Generator: Start from scratch\n-   [ ] MID: [gen\u003csub\u003ejs\u003c/sub\u003e] Java Script Code Generator\n-   [ ] MID: [gen\u003csub\u003ego\u003c/sub\u003e] explore generating Go ASM code instead of text\n-   [ ] MID: Display Call Graph for debugging purposes\n-   [ ] BIG: Bootstrap off hand written parser, so grammar writters can\n    take advantage of the features baked into the parser generator\n\n\n\u003ca id=\"org5a0a7eb\"\u003e\u003c/a\u003e\n\n# Changelog\n\n\n\u003ca id=\"org1c41c34\"\u003e\u003c/a\u003e\n\n## go/v0.0.8\n\n-   [BUG FIX: Clear result cache when parser is reset](https://github.com/clarete/langlang/commit/5195eae565fea7c17ebad2d32f9b917908beec02)\n\n\n\u003ca id=\"orgf5e5d04\"\u003e\u003c/a\u003e\n\n## go/v0.0.7\n\n-   [BUG FIX: Capturing error messages for CHOICE](https://github.com/clarete/langlang/commit/e2553fdaf69ab96ecc1a4184f21a0d61e27b069a)\n\n\n\u003ca id=\"org9cc48fe\"\u003e\u003c/a\u003e\n\n## go/v0.0.6\n\n-   [PERF: Memoize production function results](https://github.com/clarete/langlang/commit/3b3e427ee91999aa30e56927b4b8994829f6105d)\n-   [PERF: Remove fmt.Sprintf from core matching functions](https://github.com/clarete/langlang/commit/0fd67c472f60e5ce9b1e17c20bab7b443dbf62ad)\n\n\n\u003ca id=\"orgc07f78b\"\u003e\u003c/a\u003e\n\n## go/v0.0.5\n\n-   [BREAKING CHANGE: Remove runtime dependencies from output parser](https://github.com/clarete/langlang/commit/fb6fdc9cf56dae3dcdd48c29ebc0ffae9c14ae9b)\n-   [BREAKING CHANGE: Overhaul naming of all the node types](https://github.com/clarete/langlang/commit/3d276aeb7e89c31f0bca6acba1174f6889f7e45c)\n-   [BUG FIX: Labels must be serched as well for recovery rules](https://github.com/clarete/langlang/commit/71c702ac3265bf80e6b5a3dd696b307a018ecc71)\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclarete%2Flanglang","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclarete%2Flanglang","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclarete%2Flanglang/lists"}