我试图理解在处理一个非常大的字符串时我应该如何实现实时语法高亮。我很困惑。这就是我所知道的:
(假设我有函数parsedString parseString(rawString)
)
调用parseString(entireText)
并在每次文本更改时将当前字符串替换为返回的已解析(和样式等)字符串。在处理大数据时,这似乎是一种糟糕的方法。
有人建议分析编辑的范围,并用解析后的字符串parseString(editedRange)
替换当前原始编辑的字符串。
方法(1)足够清楚。我无法理解的是(2)。键入时,对于添加到字符串的每个字符,将触发通知,并且正在解析单个字符(并按原样返回)。
例如,如果我在解析.css文件时需要红色选择器,那么当一个完整的选择器后跟一个应该着色的{
时,我怎么能理解?我想有一些方法可以延迟解析,直到匹配为止。你是如何实现这个的?
我不是在寻找一个有效的应用程序。一个好的解释也很有用。
提前谢谢。
答案 0 :(得分:14)
要重新解析增量更改,您需要为解析器提供较低级别的API。
解析器的状态在处理输入时会发生变化。例如,首先解析器可能正在跳过空格,现在它可能正在读取数字,之后它可能正在为表达式构建抽象语法树。如果您可以在输入中的里程碑点获取所有解析器状态信息的快照,那么您可以通过从更改前的最后一个里程碑开始重新分析增量更改(如果状态在超出该更新的里程碑处相同,则可能会提前停止变化)。
对于简单的语法高亮,就像许多程序员编辑一样,这就是方法。语法突出显示只需要标记化,因此没有太多要捕获的状态。许多编程语言都有很多里程碑式的机会,例如,在新行的开头。在这些情况下,您可能甚至不需要实际保存解析器状态,因为您可能知道它在行的开头始终是相同的。
所以你需要一个像这样的API:
parsedString parseIncrementally(parserState, rawString);