gpt4 book ai didi

Python pygments 词法分析器状态保存

转载 作者:太空狗 更新时间:2023-10-29 18:33:15 25 4
gpt4 key购买 nike

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

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

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

如果我将类名更改为 foobar 我希望能够仅在触摸的标记上运行 default 词法分析器,在本例中为原始标记 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...)在源代码中找到所有匹配项文本,然后处理下一个类型。

这种行为使您无法实现您想要的,因为它在标记类型上循环,而不是在文本上循环。


为了使我的观点更加明显,我在库中添加了 2 行代码,file: pygments/lexer.py, line: 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'>
[...]

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


考虑到这一点以及(如 Tarun Lalwani 在评论中所说)单个新字符可以破坏整个源代码结构这一事实,您最好在每次更新时重新对整个文本进行词法分析。

关于Python pygments 词法分析器状态保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50943417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com