raku:用于解析部分的降价语法

byt*_*nit 6 raku

我想创建一个 raku 语法,可用于解析简化的 Markdown 语法。这种简化的降价语法必须满足以下条件:

  • Markdown 中的标题必须以“#”开头,后跟一个空格,或者必须用“-”序列(至少 2 个)加下划线。
  • 文字不能自立。它必须以标题开头。

为了解析这个语法,我创建了以下脚本:

#!/usr/bin/perl6

use v6;

grammar gram {
    token TOP {
        <text>
    }
    token text {
        [ <section> ]+
    }
    token section {
        <headline> <textline>*
    }
    token headline {
        ^^ [<hashheadline> | <underlineheadline>] $$
    }
    token hashheadline {
        <hashprefix> <headlinecontent>
    }
    token hashprefix {
        [\#] <space>
    }
    token underlineheadline {
        <headlinecontent> [\n] <underline>
    }
    token underline {
        [\-]**2..*
    }
    token headlinecontent {
        [\N]+
    }
    token textline {
        ^^ (<[\N]-[\#]> (<[\N]-[\ ]> [\N]*)? )? [\n] <!before [\-][\-]>
    }
}

my @tests = "",                                         #should not match and doesn't match - OK
            "test1",                                    #should not match and doesn't match - OK
            "test2\n",                                  #should not match and doesn't match - OK
            "test3\nnewline",                           #should not match and doesn't match - OK
            "test4\n----",                              #should match and does match        - OK
            "test5\n----\nnewline",                     #should match but doesn't match     - NOK
            "#test6\nnewline",                          #should not match and doesn't match - OK
            "# test7\nnewline",                         #should match but doesn't match     - NOK
            "# test8",                                  #should match and does match        - OK
            "test9\n----\nnewline\nanother\nnew line",  #should match but doesn't match     - NOK
            "# test10\nnewline\nhead\n---\nanother",    #should match but doesn't match     - NOK
            ;

for @tests -> $test {
    say gram.parse($test).perl;
}
Run Code Online (Sandbox Code Playgroud)

但是我对这个语法有问题:正如 test-array 的评论中所述,语法有问题,但我不知道是什么。

rai*_*iph 5

textline令牌更改为:

token textline { \n* <!before <headline>> \N+ \n? }
Run Code Online (Sandbox Code Playgroud)

我没有考虑过这种更改是否是您真正想要的,但这意味着您的测试按您指定的方式工作。


通常,使用 CommaIDE 开发语法。大多数问题的位置(例如您发布的问题)立即变得显而易见。(解决方案当然是一个独特的步骤,但查明问题通常是大部分工作。)


通常,通过生成最小示例来调试不明显的问题(请参阅我对您的问题的评论中提供的链接,但跳过可重现的部分)。

这样做通常是相对快速地查明任何不明显问题所在的最有效方法。

这也是一个有趣的游戏,通过将你的直觉与松散的二进制印章式方法相结合,你会更快地玩这个游戏。


一般而言,在问关于 SO 的问题时,首先生成一个最小示例(如刚才讨论的),然后使其成为最小可重现示例(建立在最小示例上)。(你问题中的例子是 100% 可重复的——谢谢!——但我正在为其他读者和你写这个答案。)

一个最小的可重复示例对你自己来说是一个洞察力和效率的问题,对于其他人来说,这两者加上礼貌。一旦我了解问题所在,解决您的问题花了我大约 1 分钟。但我花了 15 分钟做了你会“最好”做的事情,然后再在这里提问:

  • 最适合您,因为它很有趣(并且会稳步提高您的 bug 搜寻效率)。

  • 对我来说是最好的,谁享受了本来应该属于你的乐趣。

  • 最适合试图回答您的问题的其他人,这样我们就不会重复不必要的工作。

  • 最适合后来的读者,他们会得到解决真正困惑的简单问题,而不是不幸的复杂问题,这些问题使真正的问题变得模糊不清,以至于失去了对读者的价值。

  • 最适合 Rakoons,因为发布最少的可重复示例是 StackOverflow 的版主和普通读者认为一个好问题的基本要素,这意味着他们更有可能认真对待 Raku,帮助我们缓和我们的问题,并成为 Rakoons。

也就是说,我并不是要阻止你提出问题,远非如此。如果在阅读并尝试应用 Minimal Reproducible Example 页面中的指南后,您发现自己遇到了困难,请继续提问,并在问题中解释您在生成最小和/或可复制示例时遇到的任何问题,因为那会有所帮助。