繁体   English   中英

Python pygments lexer状态保存

[英]Python pygments lexer state preservation

在以下c ++文本上运行pygments默认词法分析器: class foo{}; ,结果如下:

(Token.Keyword, 'class')
(Token.Text, ' ')
(Token.Name.Class, 'foo')
(Token.Punctuation, '{')
(Token.Punctuation, '}')
(Token.Punctuation, ';')

请注意,toke foo的类型为Token.Name.Class

如果我将类名更改为foobar我希望仅能在触摸的标记上运行默认词法分析器,在这种情况下,原始标记为foo{

问:如何保存词法分析器状态,以便标记化foobar{会为Token.Name.Class类型提供标记?

拥有此功能将优化大型中间文件的语法突出显示,例如,该大型中间文件在文件中间就发生了更改(用户正在输入文本)。 似乎没有记录的执行此操作的方法,也没有有关如何使用默认pygments lexers进行此操作的信息。

是否有其他语法突出显示系统支持此行为?

编辑:

关于性能,这里是一个示例: http : //tpcg.io/ESYjiF

根据我对源代码的理解,您想要的是不可能的。

我不会挖掘并尝试解释每一个相关的代码行,但是基本上,这是发生的事情:

最后, RegexLexer.get_tokens_unprocessed在定义的令牌类型上循环(类似(("function", ('pattern-to-find-c-function',)), ("class", ('function-to-find-c-class',))) ),然后针对每种类型( functionclasscomment ...)在源文本中查找所有匹配项,然后处理下一个类型。

此行为使您想要的成为不可能,因为它在令牌类型而不是文本上循环。


为了使我的观点更加pygments/lexer.py我在lib 文件中添加了两行代码pygments/lexer.py ,行:628

for rexmatch, action, new_state in statetokens:
    print('looking for {}'.format(action))
    m = rexmatch(text, pos)
    print('found: {}'.format(m))

并使用以下代码运行它:

import pygments
import pygments.lexers

lexer = pygments.lexers.get_lexer_for_filename("foo.h")
sample="""
class foo{};
"""
print(list(lexer.get_tokens(sample)))

输出:

[...]
looking for Token.Keyword.Reserved
found: None
looking for Token.Name.Builtin
found: None
looking for <function bygroups.<locals>.callback at 0x7fb1f29b52f0>
found: None
looking for Token.Name
found: <_sre.SRE_Match object; span=(6, 9), match='foo'>
[...]

如您所见,令牌类型是代码迭代的对象。


考虑到这一点(正如塔伦·拉尔瓦尼Tarun Lalwani )在评论中说的那样),即一个新字符可以破坏整个源代码结构这一事实,您做不到比在每次更新时重新整理整个文本更好的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM