0

我正在为 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*正则表达式的一部分。您应该能够在 and 之间使用orvar:=valuevar := value任意数量的空格,不管有多少。但是,当我尝试使用它时,我得到了这个::=value

variableName :=thisHighlightsProperly;
variableName := thisFails;

我也尝试过\\sand \\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

4

1 回答 1

1

所以感谢@Gama11,我能够找出问题所在。另一种模式干扰了第一种模式,但不是以一种对我来说立即显而易见的方式。

有问题的模式是变量赋值的结束部分(实际上是赋值),所以它在使用函数或字符串时不适用(如预期的那样)。它应该只适用于将数字和其他变量的值分配给相关变量。变量赋值的开始部分(取一个变量名并给它赋值)是用一个单独的块完成的。

乍一看,我不认为这是一个问题,因为已经包含另一个模式 ( var_assign) 与:=. 该模式的问题begin_variable_assignment在于它与\\:\\=\\s*. 尾随\\s*是问题。删除它会导致问题再次出现。

简而言之,以下不同模式的匹配都可以和平共存:

":="

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

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

但这将兼容:

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

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

于 2019-05-13T00:09:40.873 回答