VSCode语法突出显示问题:正向后退不适用于空格

时间:2019-05-12 03:13:52

标签: visual-studio-code vscode-extensions tmlanguage

我正在为VSCode开发自定义语言语法突出显示扩展。我遇到了一个问题,即在空格旁边使用时,lookbehinds的行为异常。

我要突出显示的代码示例:

variableName :=thisValueShouldHighlight;
variableName := thisValueShouldHighlight;
variableName := thisValueShouldAlsoHighlight,

我尝试使用的代码示例(在tpl.tmLanguage.json中):

"end_variable_assignment": {
    "comment": "Covers ending assignment of a value to a variable. IN PROGRESS",
    "match": "(?<=:=)\\s*(\\w+)(;|,)$",
    "name": "punctuation.accessor.tpl",
    "captures": {
        "1": {
            "name": "entity.name.type.tpl"
        },
        "2": {
            "name": "punctuation.accessor.tpl"
        }
    }
}

此模式包括在文件中(在另一个模式中):

{
    "include": "#end_variable_assignment"
}

症结所在是正则表达式的\\s*部分。您应该可以进行var:=valuevar := value:=value之间的任意数量的空格,无论多少都可以。 但是,当我尝试使用它时,会得到 this

variableName :=thisHighlightsProperly;
variableName := thisFails;

我也只尝试了\\s\\s+,但都没有用。我已经尝试了一些愚蠢的示例,以使用(?<=:=)#(\\w+)...之类的占位符来确保我的逻辑正常工作,然后使用var:=#value对其进行了测试,它确实可以工作……但是它永远不能与空格一起工作。

我不明白为什么会出现这个问题,因为我在其他地方使用\\s*却没有任何问题(只是情况不同)。我不认为这是一个属性问题,因为它适用于所有 空格。

其他信息:我已经在RegexCoach和Regex101.com上对其进行了测试,并且可以在其中运行。

出于测试目的,我还提供了一个代码测试示例,应在此处突出显示:https://drive.google.com/open?id=1yoDXVxW3LFYjejW1wps8ENWUQ4iCal9w

这是我可以提供的最简单的代码示例:

tpl 1.15 module Pattern_Module_Name;
pattern Pattern_name 1.0
    triggers
        on si := SoftwareInstace created, confirmed where name matches "(?i)SomeRegex";
    end triggers;
    body
        // RE: STACKOVERFLOW PROBLEM
        // As you can see, these aren't highlighting properly

        var_name :=thisShouldHighlight;
        var_name := thisShouldHighlightButDoesnt;
        var_name := thisShouldHighlightButDoesnt,
    end body;
end pattern;

我所有的自定义语言代码都可以在我的GitHub上找到:https://github.com/cdpautsch/vscode-tpl

1 个答案:

答案 0 :(得分:0)

因此,感谢@ Gama11,我得以弄清问题所在。另一个模式正在干扰第一个模式,但这种方式对我而言并不明显。

有问题的模式应作为变量赋值(实际上是赋值)的结尾部分,因此在使用函数或字符串(按预期)时不适用。它仅应适用于将数字和其他变量的值分配给所讨论的变量。变量分配的开始部分(获取变量名称并为其分配一些内容)是通过一个单独的块完成的。

乍看之下,我认为这不是问题,因为已经包含另一种与var_assign相匹配的模式(:=)。带有begin_variable_assignment模式的问题是与\\:\\=\\s*匹配的。后面的\\s*是问题所在。删除后,该问题将再次出现。

简而言之,以下不同模式的比赛都可以和平共处:

":="

"^\\s*(\\w+)\\s*(\\:\\=)"

"(?<=:=)\\s*(\\w+)(;|,)$"

但这将兼容:

"^\\s*(\\w+)\\s*(\\:\\=)\\s*"

所有这些纯粹是通过观察/测试。显然,问题在于重叠,可能是长度可变的匹配。