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