2014-02-26 17 views
1

我正在尝试编写dg编程语言的语法文件。这不是很复杂,它是从Python派生的,所以我从Python语法文件中复制。Vim语法文件 - 函数名称末尾的引号[dg编程语言]

的问题是,函数名可以在最后一个单引号:从报价开始,该行突出显示为一个字符串

a = list' 1 2 3 # [1, 2, 3] 

明显。 字符串的定义,这是我从Python语法文件中提取,是这样的:

syn region dgString start=+[bB]\='+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=dgEscape,dgEscapeError 
syn region dgString start=+[bB]\="+ skip=+\\\\\|\\"\|\\$+ excludenl end=+"+ end=+$+ keepend contains=dgEscape,dgEscapeError 
syn region dgString start=+[bB]\="""+ end=+"""+ keepend contains=dgEscape,dgEscapeError 
syn region dgString start=+[bB]\='''+ end=+'''+ keepend contains=dgEscape,dgEscapeError 

syn match dgEscape +\\[abfnrtv'"\\]+ display contained 
syn match dgEscape "\\\o\o\=\o\=" display contained 
syn match dgEscapeError "\\\o\{,2}[89]" display contained 
syn match dgEscape "\\x\x\{2}" display contained 
syn match dgEscapeError "\\x\x\=\X" display contained 
syn match dgEscape "\\$" 

我想有在没有突出显示函数名结束(普通文本)的报价。我怎样才能做到这一点?

参考:

+2

在文档中,它说函数名称可以包含引号字符?我怎么知道'rb''是一个原始的二进制字符串的开始,而不是一个函数名?我认为重要的是确保单引号是描述函数名称的语法元素的一部分;那么你将不必修改字符串的定义。 – benjifisher

+0

其实它没有说出来。但是,如果你快速搜索教程,你可以看到'tuple'','list''和'dict''被使用。我也尝试在repl中定义一个带有引号的函数,它起作用。至于你的第二个问题,可以证明'rb''不是一个有效的函数名(既不是'b''也不是'r''),而其他组合(如'rib'= - > 2')是。 – rubik

回答

1

在默认的Python语法高亮,它看起来好像listpythonBuiltin语法的一部分组。 (如何查见的例子:help synID()下)。所以,我想

:syn keyword pythonBuiltin issubclass iter len list locals map max nextgroup=pythonFoo 
:syn match pythonFoo /'/ contained 

,然后你的示例文本

a = list' 1 2 3 # [1, 2, 3] 
b = list 'a' 'b' 'c' 

正确地强调:list'作为一个内置后跟一个Foo被识别, 'a'被识别为字符串。

这个想法是,在vim处理完一个列出的关键字之后,我新创建的语法项目被赋予了优先权,所以'被新组占据并且不可用作字符串的开始。

原则上,您可以使用用户定义的函数做同样的事情。问题出现在与函数匹配的语法定义中。默认的python语法文件似乎突出显示函数定义,但不是用法。 (更确切地说,函数名称按defclass@之前。)

另一种方法是由可选[bB]或类似字符之前插入一个零宽度启动的字原子修改字符串的定义,或者坚持认为字符串前面没有单词字符。处理一个字符串的单引号版本(你的例子的第一行),这将是

:syn region dgString start=+\%(\w\@<!\|\<[bB]\)'+ skip=+\\\\\|\\'\|\\$+ excludenl end=+'+ end=+$+ keepend contains=dgEscape,dgEscapeError 
+0

谢谢,它完美的作品! – rubik