Regex不在我的驾驶室,但我仍在尝试将PIC 18 Assembly(https://github.com/amorrow/pic-assembly-textmate-bundle)的现有语法定义更新为较新的PIC 24/33指令集。
我基本上只是扩展关键字列表。问题是许多(但不是全部)指令具有字节变体,例如mov
指令具有mov.b
变体。突出显示适用于指令的mov
部分,但忽略突出显示.b
。将mov
和mov.b
添加到关键字列表不起作用,也没有添加mov\.b
。
这是它的样子(为便于阅读而缩写的指令列表):
<dict>
<key>match</key>
<string>\b(add|addc|mov)\b</string>
<key>name</key>
<string>keyword.mnemonic</string>
</dict>
正则表达式对我来说仍然非常陌生,我不确定如何让它知道mov.b
是一整条指令。
答案 0 :(得分:0)
\b(?:add|addc|mov)(?:\.\S+)?\b
怎么样?适用于“mov.b”,“mov.b.cde”等等。
我添加了一个可选的“。”后跟一个或多个非空白字符。
答案 1 :(得分:0)
在列表中的基本指令之前添加前缀指令解决了问题。
例如:
<dict>
<key>match</key>
<string>\b(add\.b|add|addc\.b|addc|mov\.b|mov)\b</string>
<key>name</key>
<string>keyword.mnemonic</string>
</dict>
答案 2 :(得分:0)
正如我在评论中建议的那样,您可以使用非捕获组(?:...)
和量词?
来减少正则表达式引擎的工作:
<dict>
<key>match</key>
<string>\b(add(?:\.b)?|addc(?:\.b)?|mov(?:\.b)?)\b</string>
<key>name</key>
<string>keyword.mnemonic</string>
</dict>
或更多因子分解:(我添加了nop
和rlf
助记符来显示括号的水平深度)
<dict>
<key>match</key>
<string>\b(nop|(?:addc?|mov)(?:\.b)?|rlf)\b</string>
<key>name</key>
<string>keyword.mnemonic</string>
</dict>