{"id":16009586,"url":"https://github.com/fwcd/cfg-to-regex","last_synced_at":"2026-03-03T09:08:43.519Z","repository":{"id":98824681,"uuid":"261236482","full_name":"fwcd/cfg-to-regex","owner":"fwcd","description":"Tool for converting context-free-grammars into recursive regexes","archived":false,"fork":false,"pushed_at":"2020-05-04T17:35:23.000Z","size":19,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-15T16:40:09.321Z","etag":null,"topics":["compiler","context-free-grammar","pcre","regex"],"latest_commit_sha":null,"homepage":"","language":"Elixir","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/fwcd.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,"zenodo":null}},"created_at":"2020-05-04T16:22:44.000Z","updated_at":"2023-12-28T05:40:43.000Z","dependencies_parsed_at":"2023-05-25T16:00:32.731Z","dependency_job_id":null,"html_url":"https://github.com/fwcd/cfg-to-regex","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/fwcd/cfg-to-regex","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fwcd%2Fcfg-to-regex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fwcd%2Fcfg-to-regex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fwcd%2Fcfg-to-regex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fwcd%2Fcfg-to-regex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fwcd","download_url":"https://codeload.github.com/fwcd/cfg-to-regex/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fwcd%2Fcfg-to-regex/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30038672,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-03T06:58:30.252Z","status":"ssl_error","status_checked_at":"2026-03-03T06:58:15.329Z","response_time":61,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["compiler","context-free-grammar","pcre","regex"],"created_at":"2024-10-08T13:03:02.363Z","updated_at":"2026-03-03T09:08:43.514Z","avatar_url":"https://github.com/fwcd.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"# CFG to Regex Compiler\nA small tool to convert context-free grammars (written in ANTLR syntax) into a regex.\n\nModern regex engines support many features that exceed the expressiveness of classic regular expressions, e.g. recursion, backreferences and lookaround, thus making it possible to encode arbitrary CFGs in a single regex.\n\nHence the generated regex requires the following features:\n\n* **Recursion** to encode arbitrary context-free productions\n    * represented as `(?\u0026name)` where `name` is the name of a capturing group\n* **Named capturing groups** to encode the rule names\n    * represented as `(?\u003cname\u003e...)` where `name` defines the name of the capturing group\n\n## Installation\nIf [available in Hex](https://hex.pm/docs/publish), the package can be installed\nby adding `cfg_to_regex` to your list of dependencies in `mix.exs`:\n\n```elixir\ndef deps do\n  [\n    {:cfg_to_regex, \"~\u003e 0.1.0\"}\n  ]\nend\n```\n\nDocumentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)\nand published on [HexDocs](https://hexdocs.pm). Once published, the docs can\nbe found at [https://hexdocs.pm/cfg_to_regex](https://hexdocs.pm/cfg_to_regex).\n\n## Building\nTo build the application, run `mix escript.build` to generate an executable.\n\n## Usage\nThis executable only requires the Erlang runtime to be installed on the system and can be invoked directly or using `escript`:\n\n`escript cfg_to_regex [start rule] [path/to/grammar.g4]`\n\n## Example\nSample grammars can be found in the `examples` directory. For example does the following context-free (and non-regular) grammar:\n\n```antlr\nhello : 'Hello';\nworld : 'World';\nhello_world : hello hello_world world | ', ';\n```\n\n...compile to the following regex:\n\n```\n(?\u003chello_world\u003e(?\u003chello\u003e(?:Hello))(?\u0026hello_world)(?\u003cworld\u003e(?:World))|(?:, ))\n```\n\nAs a more extreme example, we can express the entire ANSI C grammar using a single regex:\n\n\u003cdetails\u003e\u003csummary\u003eC grammar regex\u003c/summary\u003e\n\n```\n(?\u003ctranslation_unit\u003e(?\u003cexternal_declaration\u003e(?\u003cfunction_definition\u003e(?\u003cdeclaration_specifiers\u003e(?\u003cstorage_class_specifier\u003e(?\u003cTYPEDEF\u003e(?:typedef))|(?\u003cEXTERN\u003e(?:extern))|(?\u003cSTATIC\u003e(?:static))|(?\u003cAUTO\u003e(?:auto))|(?\u003cREGISTER\u003e(?:register)))|(?\u0026storage_class_specifier)(?\u0026declaration_specifiers)|(?\u003ctype_specifier\u003e(?\u003cVOID\u003e(?:void))|(?\u003cCHAR\u003e(?:char))|(?\u003cSHORT\u003e(?:short))|(?\u003cINT\u003e(?:int))|(?\u003cLONG\u003e(?:long))|(?\u003cFLOAT\u003e(?:float))|(?\u003cDOUBLE\u003e(?:double))|(?\u003cSIGNED\u003e(?:signed))|(?\u003cUNSIGNED\u003e(?:unsigned))|(?\u003cstruct_or_union_specifier\u003e(?\u003cstruct_or_union\u003e(?\u003cSTRUCT\u003e(?:struct))|(?\u003cUNION\u003e(?:union)))(?\u003cIDENTIFIER\u003e(?:[a-zA-Z0-9_]+))(?:\\{)(?\u003cstruct_declaration_list\u003e(?\u003cstruct_declaration\u003e(?\u003cspecifier_qualifier_list\u003e(?\u0026type_specifier)(?\u0026specifier_qualifier_list)|(?\u0026type_specifier)|(?\u003ctype_qualifier\u003e(?\u003cCONST\u003e(?:const))|(?\u003cVOLATILE\u003e(?:volatile)))(?\u0026specifier_qualifier_list)|(?\u0026type_qualifier))(?\u003cstruct_declarator_list\u003e(?\u003cstruct_declarator\u003e(?\u003cdeclarator\u003e(?\u003cpointer\u003e(?:\\*)|(?:\\*)(?\u003ctype_qualifier_list\u003e(?\u0026type_qualifier)|(?\u0026type_qualifier_list)(?\u0026type_qualifier))|(?:\\*)(?\u0026pointer)|(?:\\*)(?\u0026type_qualifier_list)(?\u0026pointer))(?\u003cdirect_declarator\u003e(?\u0026IDENTIFIER)|(?:\\()(?\u0026declarator)(?:\\))|(?\u0026direct_declarator)(?:\\[)(?\u003cconstant_expression\u003e(?\u003cconditional_expression\u003e(?\u003clogical_or_expression\u003e(?\u003clogical_and_expression\u003e(?\u003cinclusive_or_expression\u003e(?\u003cexclusive_or_expression\u003e(?\u003cand_expression\u003e(?\u003cequality_expression\u003e(?\u003crelational_expression\u003e(?\u003cshift_expression\u003e(?\u003cadditive_expression\u003e(?\u003cmultiplicative_expression\u003e(?\u003ccast_expression\u003e(?\u003cunary_expression\u003e(?\u003cpostfix_expression\u003e(?\u003cprimary_expression\u003e(?\u0026IDENTIFIER)|(?\u003cCONSTANT\u003e(?:[0-9]+))|(?\u003cSTRING_LITERAL\u003e(?:\")(?:[a-zA-Z0-9]+)(?:\"))|(?:\\()(?\u003cexpression\u003e(?\u003cassignment_expression\u003e(?\u0026conditional_expression)|(?\u0026unary_expression)(?\u003cassignment_operator\u003e(?:=)|(?\u003cMUL_ASSIGN\u003e(?:\\*=))|(?\u003cDIV_ASSIGN\u003e(?:\\/=))|(?\u003cMOD_ASSIGN\u003e(?:%=))|(?\u003cADD_ASSIGN\u003e(?:\\+=))|(?\u003cSUB_ASSIGN\u003e(?:\\-=))|(?\u003cLEFT_ASSIGN\u003e(?:\u003c\u003c=))|(?\u003cRIGHT_ASSIGN\u003e(?:\u003e\u003e=))|(?\u003cAND_ASSIGN\u003e(?:\u0026=))|(?\u003cXOR_ASSIGN\u003e(?:\\^=))|(?\u003cOR_ASSIGN\u003e(?:\\|=)))(?\u0026assignment_expression))|(?\u0026expression)(?:,)(?\u0026assignment_expression))(?:\\)))|(?\u0026postfix_expression)(?:\\[)(?\u0026expression)(?:\\])|(?\u0026postfix_expression)(?:\\()(?:\\))|(?\u0026postfix_expression)(?:\\()(?\u003cargument_expression_list\u003e(?\u0026assignment_expression)|(?\u0026argument_expression_list)(?:,)(?\u0026assignment_expression))(?:\\))|(?\u0026postfix_expression)(?:\\.)(?\u0026IDENTIFIER)|(?\u0026postfix_expression)(?\u003cPTR_OP\u003e(?:\\-\u003e))(?\u0026IDENTIFIER)|(?\u0026postfix_expression)(?\u003cINC_OP\u003e(?:\\+\\+))|(?\u0026postfix_expression)(?\u003cDEC_OP\u003e(?:\\-\\-)))|(?\u0026INC_OP)(?\u0026unary_expression)|(?\u0026DEC_OP)(?\u0026unary_expression)|(?\u003cunary_operator\u003e(?:\u0026)|(?:\\*)|(?:\\+)|(?:\\-)|(?:~)|(?:!))(?\u0026cast_expression)|(?\u003cSIZEOF\u003e(?:sizeof))(?\u0026unary_expression)|(?\u0026SIZEOF)(?:\\()(?\u003ctype_name\u003e(?\u0026specifier_qualifier_list)|(?\u0026specifier_qualifier_list)(?\u003cabstract_declarator\u003e(?\u0026pointer)|(?\u003cdirect_abstract_declarator\u003e(?:\\()(?\u0026abstract_declarator)(?:\\))|(?:\\[)(?:\\])|(?:\\[)(?\u0026constant_expression)(?:\\])|(?\u0026direct_abstract_declarator)(?:\\[)(?:\\])|(?\u0026direct_abstract_declarator)(?:\\[)(?\u0026constant_expression)(?:\\])|(?:\\()(?:\\))|(?:\\()(?\u003cparameter_type_list\u003e(?\u003cparameter_list\u003e(?\u003cparameter_declaration\u003e(?\u0026declaration_specifiers)(?\u0026declarator)|(?\u0026declaration_specifiers)(?\u0026abstract_declarator)|(?\u0026declaration_specifiers))|(?\u0026parameter_list)(?:,)(?\u0026parameter_declaration))|(?\u0026parameter_list)(?:,)(?\u003cELLIPSIS\u003e(?:\\.\\.\\.)))(?:\\))|(?\u0026direct_abstract_declarator)(?:\\()(?:\\))|(?\u0026direct_abstract_declarator)(?:\\()(?\u0026parameter_type_list)(?:\\)))|(?\u0026pointer)(?\u0026direct_abstract_declarator)))(?:\\)))|(?:\\()(?\u0026type_name)(?:\\))(?\u0026cast_expression))|(?\u0026multiplicative_expression)(?:\\*)(?\u0026cast_expression)|(?\u0026multiplicative_expression)(?:\\/)(?\u0026cast_expression)|(?\u0026multiplicative_expression)(?:%)(?\u0026cast_expression))|(?\u0026additive_expression)(?:\\+)(?\u0026multiplicative_expression)|(?\u0026additive_expression)(?:\\-)(?\u0026multiplicative_expression))|(?\u0026shift_expression)(?\u003cLEFT_OP\u003e(?:\u003c\u003c))(?\u0026additive_expression)|(?\u0026shift_expression)(?\u003cRIGHT_OP\u003e(?:\u003e\u003e))(?\u0026additive_expression))|(?\u0026relational_expression)(?:\u003c)(?\u0026shift_expression)|(?\u0026relational_expression)(?:\u003e)(?\u0026shift_expression)|(?\u0026relational_expression)(?\u003cLE_OP\u003e(?:\u003c))(?\u0026shift_expression)|(?\u0026relational_expression)(?\u003cGE_OP\u003e(?:\u003e))(?\u0026shift_expression))|(?\u0026equality_expression)(?\u003cEQ_OP\u003e(?:==))(?\u0026relational_expression)|(?\u0026equality_expression)(?\u003cNE_OP\u003e(?:!=))(?\u0026relational_expression))|(?\u0026and_expression)(?:\u0026)(?\u0026equality_expression))|(?\u0026exclusive_or_expression)(?:\\^)(?\u0026and_expression))|(?\u0026inclusive_or_expression)(?:\\|)(?\u0026exclusive_or_expression))|(?\u0026logical_and_expression)(?\u003cAND_OP\u003e(?:\u0026\u0026))(?\u0026inclusive_or_expression))|(?\u0026logical_or_expression)(?\u003cOR_OP\u003e(?:\\|\\|))(?\u0026logical_and_expression))|(?\u0026logical_or_expression)(?:\\?)(?\u0026expression)(?::)(?\u0026conditional_expression)))(?:\\])|(?\u0026direct_declarator)(?:\\[)(?:\\])|(?\u0026direct_declarator)(?:\\()(?\u0026parameter_type_list)(?:\\))|(?\u0026direct_declarator)(?:\\()(?\u003cidentifier_list\u003e(?\u0026IDENTIFIER)|(?\u0026identifier_list)(?:,)(?\u0026IDENTIFIER))(?:\\))|(?\u0026direct_declarator)(?:\\()(?:\\)))|(?\u0026direct_declarator))|(?::)(?\u0026constant_expression)|(?\u0026declarator)(?::)(?\u0026constant_expression))|(?\u0026struct_declarator_list)(?:,)(?\u0026struct_declarator))(?:;))|(?\u0026struct_declaration_list)(?\u0026struct_declaration))(?:\\})|(?\u0026struct_or_union)(?:\\{)(?\u0026struct_declaration_list)(?:\\})|(?\u0026struct_or_union)(?\u0026IDENTIFIER))|(?\u003cenum_specifier\u003e(?\u003cENUM\u003e(?:enum))(?:\\{)(?\u003cenumerator_list\u003e(?\u003cenumerator\u003e(?\u0026IDENTIFIER)|(?\u0026IDENTIFIER)(?:=)(?\u0026constant_expression))|(?\u0026enumerator_list)(?:,)(?\u0026enumerator))(?:\\})|(?\u0026ENUM)(?\u0026IDENTIFIER)(?:\\{)(?\u0026enumerator_list)(?:\\})|(?\u0026ENUM)(?\u0026IDENTIFIER))|(?\u003cTYPE_NAME\u003e(?\u0026IDENTIFIER)))|(?\u0026type_specifier)(?\u0026declaration_specifiers)|(?\u0026type_qualifier)|(?\u0026type_qualifier)(?\u0026declaration_specifiers))(?\u0026declarator)(?\u003cdeclaration_list\u003e(?\u003cdeclaration\u003e(?\u0026declaration_specifiers)(?:;)|(?\u0026declaration_specifiers)(?\u003cinit_declarator_list\u003e(?\u003cinit_declarator\u003e(?\u0026declarator)|(?\u0026declarator)(?:=)(?\u003cinitializer\u003e(?\u0026assignment_expression)|(?:\\{)(?\u003cinitializer_list\u003e(?\u0026initializer)|(?\u0026initializer_list)(?:,)(?\u0026initializer))(?:\\})|(?:\\{)(?\u0026initializer_list)(?:,)(?:\\})))|(?\u0026init_declarator_list)(?:,)(?\u0026init_declarator))(?:;))|(?\u0026declaration_list)(?\u0026declaration))(?\u003ccompound_statement\u003e(?:\\{)(?:\\})|(?:\\{)(?\u003cstatement_list\u003e(?\u003cstatement\u003e(?\u003clabeled_statement\u003e(?\u0026IDENTIFIER)(?::)(?\u0026statement)|(?\u003cCASE\u003e(?:case))(?\u0026constant_expression)(?::)(?\u0026statement)|(?\u003cDEFAULT\u003e(?:default))(?::)(?\u0026statement))|(?\u0026compound_statement)|(?\u003cexpression_statement\u003e(?:;)|(?\u0026expression)(?:;))|(?\u003cselection_statement\u003e(?\u003cIF\u003e(?:if))(?:\\()(?\u0026expression)(?:\\))(?\u0026statement)|(?\u0026IF)(?:\\()(?\u0026expression)(?:\\))(?\u0026statement)(?\u003cELSE\u003e(?:else))(?\u0026statement)|(?\u003cSWITCH\u003e(?:switch))(?:\\()(?\u0026expression)(?:\\))(?\u0026statement))|(?\u003citeration_statement\u003e(?\u003cWHILE\u003e(?:while))(?:\\()(?\u0026expression)(?:\\))(?\u0026statement)|(?\u003cDO\u003e(?:do))(?\u0026statement)(?\u0026WHILE)(?:\\()(?\u0026expression)(?:\\))(?:;)|(?\u003cFOR\u003e(?:for))(?:\\()(?\u0026expression_statement)(?\u0026expression_statement)(?:\\))(?\u0026statement)|(?\u0026FOR)(?:\\()(?\u0026expression_statement)(?\u0026expression_statement)(?\u0026expression)(?:\\))(?\u0026statement))|(?\u003cjump_statement\u003e(?\u003cGOTO\u003e(?:goto))(?\u0026IDENTIFIER)(?:;)|(?\u003cCONTINUE\u003e(?:continue))(?:;)|(?\u003cBREAK\u003e(?:break))(?:;)|(?\u003cRETURN\u003e(?:return))(?:;)|(?\u0026RETURN)(?\u0026expression)(?:;)))|(?\u0026statement_list)(?\u0026statement))(?:\\})|(?:\\{)(?\u0026declaration_list)(?:\\})|(?:\\{)(?\u0026declaration_list)(?\u0026statement_list)(?:\\}))|(?\u0026declaration_specifiers)(?\u0026declarator)(?\u0026compound_statement)|(?\u0026declarator)(?\u0026declaration_list)(?\u0026compound_statement)|(?\u0026declarator)(?\u0026compound_statement))|(?\u0026declaration))|(?\u0026translation_unit)(?\u0026external_declaration))\n```\n\n\u003c/details\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffwcd%2Fcfg-to-regex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffwcd%2Fcfg-to-regex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffwcd%2Fcfg-to-regex/lists"}