3

我需要编写一个词法分析器来正确突出我的命令行工具命令。

$ dvc add file.csv
$ dvc pipeline list

所以命令以它开头,dvc它可能有一个或两个子命令 -addpipeline list分别。

因此,它应该分别在第一种和第二种情况下突出显示dvc add和。dvc pipeline list

contains: [
          {
            begin: /^\s*\$\s(dvc|git) [a-z-]+/,
            returnBegin: true,
            contains: [
              {
                begin: /dvc [a-z-]+ ?/,
                lexemes: '[a-z-]+',
                keywords: {
                  built_in:
                    'dvc'
                },
                contains: [
                  {
                    begin: /\w+(?![\S])/,
                    keywords: {
                      built_in: 'list'
                    }
                  }
                ],
                className: 'strong'
              }
            ]
          }
        ]

dvc pipeline list即使父正则表达式 ie/^\s*\$\s(dvc|git) [a-z-]+/应该只匹配 until ,它也匹配dvc pipeline。它究竟是如何运作的?

如何/dvc [a-z-]+ ?/覆盖它并继续匹配表达式?

请在此处参考此库文档:https ://highlightjs.readthedocs.io/en/latest/reference.html

4

1 回答 1

0

Begin 只是开始一场比赛,并不限制比赛。第一个规则匹配,然后倒带......然后/dvc [a-z-]+ ?/匹配,然后开始在......中寻找孩子,contains所以然后/\w+(?![\S])/匹配(你仍然在你的强规则内)所以你会看到:

<strong>dvc pipeline list</strong>
<!-- matches /^\s*\$\s(dvc|git) [a-z-]+/ -->
  <!-- matches /dvc [a-z-]+ ?/ -->
  <strong>
    dvc pipeline   
      <!-- contains matches  /\w+(?![\S])/ --> 
      list
      <!-- no more matches for /\w+(?![\S])/ --> 
      <!-- end fires, back up -->
    <!-- no more matches for /dvc [a-z-]+ ?/-->
    <!-- end fires --> 
  </strong>
  <!-- back up -->

如果你想检测一堆不同的模式,我会为每个模式建议不同的模式:

{ begin: /dvc add .../, contains: ... }
{ begin: /dvc pipeline .../, contains: ... }

虽然您可能还想看看startsvs contains。编写语法来表达匹配 A,然后是 B,然后是 C 可能非常困难。工具就在那里,但要正确并充满危险而不是做一些简单的事情可能会非常复杂。

于 2020-10-18T00:44:52.650 回答