{"id":638,"date":"2025-12-04T20:30:13","date_gmt":"2025-12-04T20:30:13","guid":{"rendered":"https:\/\/camilo.matajira.com\/?p=638"},"modified":"2025-12-04T20:30:13","modified_gmt":"2025-12-04T20:30:13","slug":"jed-v0-1-parsing-the-dsl-with-lark","status":"publish","type":"post","link":"https:\/\/camilo.matajira.com\/?p=638","title":{"rendered":"Jed v0.1 &#8211; Parsing the DSL with Lark"},"content":{"rendered":"\n<p>Following the previous post, this post deals with the parsing of the DSL or grammar of jed.<br>The idea of this mini project is to be able to parse the syntax the substitute command.<\/p>\n\n\n\n<p>Below are example of the substitute command (S and s).<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>jed '\/^comm.*\/.\/aut.*\/ s\/Camilo MATAJIRA\/Camilo A. MATAJIRA\/g' file.json\njed '\/author\/ S\/name\/author_name\/g' file.json\njed ':\/fake_email@gmail.com\/ S\/email\/commiter_mail\/g' file.json\njed '\/.*\/:\/fake_email@gmail.com\/ S\/email\/commiter_mail\/g' file.json\njed '\/.*\/.\/.*\/:\/fake_email@gmail.com\/ S\/email\/commiter_mail\/g' file.json\njed '\/.*\/.\/.*\/.\/.*\/:\/fake_email@gmail.com\/ S\/email\/commiter_mail\/g' file.json<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">jed<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">\/^comm.*\/.\/aut.*\/ s\/Camilo MATAJIRA\/Camilo A. MATAJIRA\/g<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">file.json<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">jed<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">\/author\/ S\/name\/author_name\/g<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">file.json<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">jed<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">:\/fake_email@gmail.com\/ S\/email\/commiter_mail\/g<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">file.json<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">jed<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">\/.*\/:\/fake_email@gmail.com\/ S\/email\/commiter_mail\/g<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">file.json<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">jed<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">\/.*\/.\/.*\/:\/fake_email@gmail.com\/ S\/email\/commiter_mail\/g<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">file.json<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">jed<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">\/.*\/.\/.*\/.\/.*\/:\/fake_email@gmail.com\/ S\/email\/commiter_mail\/g<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">file.json<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>To parse the grammar of jed, I use Lark. (https:\/\/lark-parser.readthedocs.io\/en\/stable\/)<br>Lark is &#8220;a modern parsing library for Python. Lark can parse any context-free grammar.&#8221;<\/p>\n\n\n\n<p>Turns out that parsing the grammar was quite simple. Below is the code snippet to<br>parse the substitute command:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>from lark import Lark, Transformer\n\ngrammar = r\"\"\"\nstart: command+\n\ncommand: JREGEX* \":\"? JVALUE? \"s\/\" OLD_PATTERN \"\/\" NEW_PATTERN \"\/\" FLAGS   -> jed_substitute_value_regex\n       | JREGEX* \":\"? JVALUE? \"S\/\" OLD_PATTERN \"\/\" NEW_PATTERN \"\/\" FLAGS   -> jed_substitute_key_regex\n\nREGEX: \/[a-zA-Z0-9 \\&#91;\\&#93;+.?*]+\/\nJREGEX: \"\/\"REGEX\"\/\"\".\"?\nJVALUE: \"\/\"REGEX\"\/\"\nNEW_PATTERN: REGEX\nOLD_PATTERN: REGEX\nFLAGS: LETTER+\n\n%import common.LETTER\n%import common.WS\n%ignore WS\n\"\"\"<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #FF79C6\">from<\/span><span style=\"color: #F8F8F2\"> lark <\/span><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> Lark, Transformer<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">grammar <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">r<\/span><span style=\"color: #FF5555\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">start: command<\/span><span style=\"color: #FF79C6\">+<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">command: JREGEX<\/span><span style=\"color: #FF79C6\">*<\/span><span style=\"color: #F1FA8C\"> &quot;:&quot;<\/span><span style=\"color: #FF79C6\">?<\/span><span style=\"color: #F1FA8C\"> JVALUE<\/span><span style=\"color: #FF79C6\">?<\/span><span style=\"color: #F1FA8C\"> &quot;s\/&quot; OLD_PATTERN &quot;\/&quot; NEW_PATTERN &quot;\/&quot; FLAGS   -&gt; jed_substitute_value_regex<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">       <\/span><span style=\"color: #FF79C6\">|<\/span><span style=\"color: #F1FA8C\"> JREGEX<\/span><span style=\"color: #FF79C6\">*<\/span><span style=\"color: #F1FA8C\"> &quot;:&quot;<\/span><span style=\"color: #FF79C6\">?<\/span><span style=\"color: #F1FA8C\"> JVALUE<\/span><span style=\"color: #FF79C6\">?<\/span><span style=\"color: #F1FA8C\"> &quot;S\/&quot; OLD_PATTERN &quot;\/&quot; NEW_PATTERN &quot;\/&quot; FLAGS   -&gt; jed_substitute_key_regex<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">REGEX: \/<\/span><span style=\"color: #BD93F9\">[a-zA-Z0-9 <\/span><span style=\"color: #FF79C6\">\\&#91;\\&#93;<\/span><span style=\"color: #BD93F9\">+.?*]<\/span><span style=\"color: #FF79C6\">+<\/span><span style=\"color: #F1FA8C\">\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">JREGEX: &quot;\/&quot;REGEX&quot;\/&quot;&quot;<\/span><span style=\"color: #8BE9FD; font-style: italic\">.<\/span><span style=\"color: #F1FA8C\">&quot;<\/span><span style=\"color: #FF79C6\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">JVALUE: &quot;\/&quot;REGEX&quot;\/&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">NEW_PATTERN: REGEX<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">OLD_PATTERN: REGEX<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">FLAGS: LETTER<\/span><span style=\"color: #FF79C6\">+<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">%import common<\/span><span style=\"color: #8BE9FD; font-style: italic\">.<\/span><span style=\"color: #F1FA8C\">LETTER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">%import common<\/span><span style=\"color: #8BE9FD; font-style: italic\">.<\/span><span style=\"color: #F1FA8C\">WS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">%ignore WS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF5555\">&quot;&quot;&quot;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Lark uses regular expressions to define the grammar, and those regex expressions can be built on top others.<br>Check for example JREGEX, which is built on top of REGEX.<br>JREGEX can capture the &#8220;\/.*\/.\/.*\/.\/.*\/&#8221; succession of key regexes.<\/p>\n\n\n\n<p>The most impressive part of Lark, is that simply by pointing an arrow after the regex, the interpreter<br>of Lark (the transformer) will execute the defined function. See the code snippet below:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>JREGEX* \":\"? JVALUE? \"s\/\" OLD_PATTERN \"\/\" NEW_PATTERN \"\/\" FLAGS   -> jed_substitute_value_regex<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #BD93F9\">JREGEX<\/span><span style=\"color: #FF79C6\">*<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">:<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #FF5555; font-style: italic; text-decoration: underline\">?<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">JVALUE<\/span><span style=\"color: #FF5555; font-style: italic; text-decoration: underline\">?<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">s\/<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">OLD_PATTERN<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">\/<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">NEW_PATTERN<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">\/<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">FLAGS<\/span><span style=\"color: #F8F8F2\">   <\/span><span style=\"color: #FF5555; font-style: italic; text-decoration: underline\">-&gt;<\/span><span style=\"color: #F8F8F2\"> jed_substitute_value_regex<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>This is, if the regex of the left matches, then function &#8220;jed_substitute_value_regex&#8221; would be executed.<\/p>\n\n\n\n<p>I created a jed v0.1, just to show how Lark makes easy interpreting jed&#8217;s DLS and the output received.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>#!\/usr\/bin\/env -S uv run --script\n#\n# \/\/\/ script\n# requires-python = \">=3.12\"\n# dependencies = &#91;\"lark>=1.3.1\"&#93;\n# \/\/\/\n\n\nimport argparse\nimport sys\nfrom lark import Lark, Transformer\n\ngrammar = r\"\"\"\nstart: command+\n\ncommand: JREGEX* \":\"? JVALUE? \"s\/\" OLD_PATTERN \"\/\" NEW_PATTERN \"\/\" FLAGS   -> jed_substitute_value_regex\n       | JREGEX* \":\"? JVALUE? \"S\/\" OLD_PATTERN \"\/\" NEW_PATTERN \"\/\" FLAGS   -> jed_substitute_key_regex\n\nREGEX: \/[a-zA-Z0-9 \\&#91;\\&#93;+.?*]+\/\nJREGEX: \"\/\"REGEX\"\/\"\".\"?\nJVALUE: \"\/\"REGEX\"\/\"\nNEW_PATTERN: REGEX\nOLD_PATTERN: REGEX\nFLAGS: LETTER+\n\n%import common.LETTER\n%import common.WS\n%ignore WS\n\"\"\"\n\n\nclass SedTransformer(Transformer):\n    def __init__(self, text):\n        super().__init__()\n        self.text = text\n\n    def jed_substitute_value_regex(self, args):\n        print(\"Function: jed_substitute_value_regex\")\n        print(args)\n        sys.exit()\n\n    def jed_substitute_key_regex(self, args):\n        print(\"Function: jed_substitute_key_regex\")\n        print(args)\n        sys.exit()\n\n\nif __name__ == \"__main__\":\n    argument_parser = argparse.ArgumentParser(\n        prog=\"jed\",\n        description=\"Sed for json!\",\n    )\n    argument_parser.add_argument(\"jed_script\")\n    args = argument_parser.parse_args()\n\n    grammar_parser = Lark(grammar)\n    tree = grammar_parser.parse(args.jed_script)\n    t = SedTransformer(\"\")\n    t.transform(tree)\n    print(t.text)\n\n# vim: set syntax=python filetype=python:<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #6272A4\">#!\/usr\/bin\/env -S uv run --script<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6272A4\">#<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6272A4\"># \/\/\/ script<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6272A4\"># requires-python = &quot;&gt;=3.12&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6272A4\"># dependencies = &#91;&quot;lark&gt;=1.3.1&quot;&#93;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6272A4\"># \/\/\/<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> argparse<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> sys<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">from<\/span><span style=\"color: #F8F8F2\"> lark <\/span><span style=\"color: #FF79C6\">import<\/span><span style=\"color: #F8F8F2\"> Lark, Transformer<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">grammar <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">r<\/span><span style=\"color: #FF5555\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">start: command<\/span><span style=\"color: #FF79C6\">+<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">command: JREGEX<\/span><span style=\"color: #FF79C6\">*<\/span><span style=\"color: #F1FA8C\"> &quot;:&quot;<\/span><span style=\"color: #FF79C6\">?<\/span><span style=\"color: #F1FA8C\"> JVALUE<\/span><span style=\"color: #FF79C6\">?<\/span><span style=\"color: #F1FA8C\"> &quot;s\/&quot; OLD_PATTERN &quot;\/&quot; NEW_PATTERN &quot;\/&quot; FLAGS   -&gt; jed_substitute_value_regex<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">       <\/span><span style=\"color: #FF79C6\">|<\/span><span style=\"color: #F1FA8C\"> JREGEX<\/span><span style=\"color: #FF79C6\">*<\/span><span style=\"color: #F1FA8C\"> &quot;:&quot;<\/span><span style=\"color: #FF79C6\">?<\/span><span style=\"color: #F1FA8C\"> JVALUE<\/span><span style=\"color: #FF79C6\">?<\/span><span style=\"color: #F1FA8C\"> &quot;S\/&quot; OLD_PATTERN &quot;\/&quot; NEW_PATTERN &quot;\/&quot; FLAGS   -&gt; jed_substitute_key_regex<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">REGEX: \/<\/span><span style=\"color: #BD93F9\">[a-zA-Z0-9 <\/span><span style=\"color: #FF79C6\">\\&#91;\\&#93;<\/span><span style=\"color: #BD93F9\">+.?*]<\/span><span style=\"color: #FF79C6\">+<\/span><span style=\"color: #F1FA8C\">\/<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">JREGEX: &quot;\/&quot;REGEX&quot;\/&quot;&quot;<\/span><span style=\"color: #8BE9FD; font-style: italic\">.<\/span><span style=\"color: #F1FA8C\">&quot;<\/span><span style=\"color: #FF79C6\">?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">JVALUE: &quot;\/&quot;REGEX&quot;\/&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">NEW_PATTERN: REGEX<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">OLD_PATTERN: REGEX<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">FLAGS: LETTER<\/span><span style=\"color: #FF79C6\">+<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">%import common<\/span><span style=\"color: #8BE9FD; font-style: italic\">.<\/span><span style=\"color: #F1FA8C\">LETTER<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">%import common<\/span><span style=\"color: #8BE9FD; font-style: italic\">.<\/span><span style=\"color: #F1FA8C\">WS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F1FA8C\">%ignore WS<\/span><\/span>\n<span class=\"line\"><span style=\"color: #FF5555\">&quot;&quot;&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">class<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #8BE9FD\">SedTransformer<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #8BE9FD; font-style: italic\">Transformer<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">__init__<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FFB86C; font-style: italic\">text<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #8BE9FD; font-style: italic\">super<\/span><span style=\"color: #F8F8F2\">().<\/span><span style=\"color: #BD93F9\">__init__<\/span><span style=\"color: #F8F8F2\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">.text <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> text<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">jed_substitute_value_regex<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FFB86C; font-style: italic\">args<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #8BE9FD\">print<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">Function: jed_substitute_value_regex<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #8BE9FD\">print<\/span><span style=\"color: #F8F8F2\">(args)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        sys.exit()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #FF79C6\">def<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #50FA7B\">jed_substitute_key_regex<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #BD93F9; font-style: italic\">self<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #FFB86C; font-style: italic\">args<\/span><span style=\"color: #F8F8F2\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #8BE9FD\">print<\/span><span style=\"color: #F8F8F2\">(<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">Function: jed_substitute_key_regex<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #8BE9FD\">print<\/span><span style=\"color: #F8F8F2\">(args)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        sys.exit()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #FF79C6\">if<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #BD93F9\">__name__<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #FF79C6\">==<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">__main__<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    argument_parser <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> argparse.ArgumentParser(<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FFB86C; font-style: italic\">prog<\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">jed<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">        <\/span><span style=\"color: #FFB86C; font-style: italic\">description<\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">Sed for json!<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">,<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    )<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    argument_parser.add_argument(<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">jed_script<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    args <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> argument_parser.parse_args()<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    grammar_parser <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> Lark(grammar)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    tree <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> grammar_parser.parse(args.jed_script)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    t <\/span><span style=\"color: #FF79C6\">=<\/span><span style=\"color: #F8F8F2\"> SedTransformer(<\/span><span style=\"color: #E9F284\">&quot;&quot;<\/span><span style=\"color: #F8F8F2\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    t.transform(tree)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">    <\/span><span style=\"color: #8BE9FD\">print<\/span><span style=\"color: #F8F8F2\">(t.text)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6272A4\"># vim: set syntax=python filetype=python:<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Below is the example output:<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro\" data-code-block-pro-font-family=\"Code-Pro-JetBrains-Mono\" style=\"font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#282A36\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><span role=\"button\" tabindex=\"0\" style=\"color:#F8F8F2;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>.\/jed \"\/url.*\/.\/b.*\/.\/&#91;a-z&#93;+\/:\/Helloold\/ s\/old\/new\/g\"                 1 \u21b5\nFunction: jed_substitute_value_regex\n[Token('JREGEX', '\/url.*\/.'), Token('JREGEX', '\/b.*\/.'), Token('JREGEX', '\/&#91;a-z&#93;+\/'), Token('JVALUE', ':\/Helloold\/'), Token('OLD_PATTERN', 'old'), Token('NEW_PATTERN', 'new'), Token('FLAGS', 'g')]\n\n.\/jed \"\/url.*\/.\/b.*\/.\/&#91;a-z&#93;+\/:\/hello_old\/ s\/old\/new\/g\"\nFunction: jed_substitute_value_regex\n[Token('JREGEX', '\/url.*\/.'), Token('JREGEX', '\/b.*\/.'), Token('JREGEX', '\/&#91;a-z&#93;+\/'), Token('JVALUE', ':\/hello_old\/'), Token('OLD_PATTERN', 'old'), Token('NEW_PATTERN', 'new'), Token('FLAGS', 'g')]\n\n.\/jed \"\/url.*\/.\/b.*\/.\/&#91;a-z&#93;+\/:\/hello_old\/ s\/old\/new\/g\"\nFunction: jed_substitute_value_regex\n[Token('JREGEX', '\/url.*\/.'), Token('JREGEX', '\/b.*\/.'), Token('JREGEX', '\/&#91;a-z&#93;+\/'), Token('JVALUE', ':\/hello_old\/'), Token('OLD_PATTERN', 'old'), Token('NEW_PATTERN', 'new'), Token('FLAGS', 'g')]\n\n.\/jed \"\/url.*\/ S\/old\/new\/g\"\nFunction: jed_substitute_key_regex\n&#91;Token('JREGEX', '\/url.*\/'), Token('OLD_PATTERN', 'old'), Token('NEW_PATTERN', 'new'), Token('FLAGS', 'g')&#93;<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki dracula\" style=\"background-color: #282A36\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #50FA7B\">.\/jed<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">\/url.*\/.\/b.*\/.\/&#91;a-z&#93;+\/:\/Helloold\/ s\/old\/new\/g<\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F8F8F2\">                 <\/span><span style=\"color: #BD93F9\">1<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">\u21b5<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">Function:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">jed_substitute_value_regex<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">[Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">JREGEX<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">\/url.*\/.<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">JREGEX<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">\/b.*\/.<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">JREGEX<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">\/&#91;a-z&#93;+\/<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">JVALUE<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">:\/Helloold\/<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">OLD_PATTERN<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">old<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">NEW_PATTERN<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">new<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">FLAGS<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">g<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">)]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">.\/jed<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">\/url.*\/.\/b.*\/.\/&#91;a-z&#93;+\/:\/hello_old\/ s\/old\/new\/g<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">Function:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">jed_substitute_value_regex<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">[Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">JREGEX<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">\/url.*\/.<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">JREGEX<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">\/b.*\/.<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">JREGEX<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">\/&#91;a-z&#93;+\/<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">JVALUE<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">:\/hello_old\/<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">OLD_PATTERN<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">old<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">NEW_PATTERN<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">new<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">FLAGS<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">g<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">)]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">.\/jed<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">\/url.*\/.\/b.*\/.\/&#91;a-z&#93;+\/:\/hello_old\/ s\/old\/new\/g<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">Function:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">jed_substitute_value_regex<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">[Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">JREGEX<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">\/url.*\/.<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">JREGEX<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">\/b.*\/.<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">JREGEX<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">\/&#91;a-z&#93;+\/<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">JVALUE<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">:\/hello_old\/<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">OLD_PATTERN<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">old<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">NEW_PATTERN<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">new<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">FLAGS<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">g<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">)]<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">.\/jed<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #E9F284\">&quot;<\/span><span style=\"color: #F1FA8C\">\/url.*\/ S\/old\/new\/g<\/span><span style=\"color: #E9F284\">&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #50FA7B\">Function:<\/span><span style=\"color: #F8F8F2\"> <\/span><span style=\"color: #F1FA8C\">jed_substitute_key_regex<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F8F8F2\">&#91;Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">JREGEX<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">\/url.*\/<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">OLD_PATTERN<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">old<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">NEW_PATTERN<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">new<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">), Token(<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">FLAGS<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">, <\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F1FA8C\">g<\/span><span style=\"color: #E9F284\">&#39;<\/span><span style=\"color: #F8F8F2\">)&#93;<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>See, with this info it will be easy to work with. Lark is calling the corresponding function through the transformer.<br>The data structures received are also easy to work with.<br>The next step is to implement the logic of the substitute command.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Following the previous post, this post deals with the parsing of the DSL or grammar of jed.The idea of this mini project is to be able to parse the syntax the substitute command. Below are example of the substitute command (S and s). To parse the grammar of jed, I use Lark. (https:\/\/lark-parser.readthedocs.io\/en\/stable\/)Lark is &#8220;a&#8230;<\/p>\n","protected":false},"author":1,"featured_media":639,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-638","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-projects"],"_links":{"self":[{"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/posts\/638","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=638"}],"version-history":[{"count":1,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/posts\/638\/revisions"}],"predecessor-version":[{"id":640,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/posts\/638\/revisions\/640"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=\/wp\/v2\/media\/639"}],"wp:attachment":[{"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=638"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/camilo.matajira.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}