对以下c++文本运行pygments默认lexer:class foo{};
,结果如下:
(Token.Keyword, 'class')
(Token.Text, ' ')
(Token.Name.Class, 'foo')
(Token.Punctuation, '{')
(Token.Punctuation, '}')
(Token.Punctuation, ';')
注意托克foo
的类型是Token.Name.Class
。在
如果我将类名改为foobar
,我希望能够只在接触的令牌上运行默认lexer,在本例中是原始标记foo
和{
问:如何保存lexer状态,使标记化foobar{
将给出类型为Token.Name.Class
的标记?在
拥有这个特性可以优化大型源文件的语法高亮显示,例如,在文件中间发生了更改(用户正在键入文本)。似乎没有文档化的方法来实现这一点,也没有关于如何使用默认的pygments lexers来实现这一点的信息。在
有没有其他语法高亮显示系统支持这种行为?在
编辑:
这里有一个关于性能的例子:http://tpcg.io/ESYjiF
从我对源代码的理解来看,你想要什么是不可能的。在
我不会挖掘并试图解释每一行相关的代码,但基本上,发生的事情如下:
lexer
调用get_tokens
方法并处理错误。在self.get_tokens_unprocessed
最后,^{} 循环定义的标记类型(类似于
(("function", ('pattern-to-find-c-function',)), ("class", ('function-to-find-c-class',)))
),对于每个类型(function
,class
,comment
…)查找源文本中的所有匹配项,然后处理下一个类型。在这种行为使您想要的不可能实现,因为它在标记类型上循环,而不是在文本上循环。在
为了使我的观点更加明显,我在lib中添加了2行代码,file: ^{}, line: 628
用这个代码运行它:
^{pr2}$输出:
如您所见,令牌类型是代码迭代的对象。在
考虑到这一点和(正如Tarun Lalwani在评论中所说的)一个新字符可以破坏整个源代码结构这一事实,在每次更新时重新对整个文本进行词法分析是再好不过的了。在
相关问题 更多 >
编程相关推荐