0

我正在寻找一个非常基本的语法荧光笔。我正在寻找正确的方向。我知道已经有很多很棒的项目(Codemirror、rainbow.js 等),但我希望获得有关如何创建这些项目的帮助,也许还有一个简单的例子,使用 Javascript(或 clojurescript)。

这些项目是否使用解析语言(使用 PEG.js 之类的东西?)理想情况下,我想使用类似的东西而不是正则表达式来解析语言,但是一旦你定义了语言,如何将其变成语法荧光笔? 当然,在每个按键上,您都不会重新解析整个 tex 并应用格式?那么做一些简单的事情的最好方法是什么?跟踪当前光标位置,只查看这么多字符的前后?某种状态机?

任何帮助都会很棒!谢谢

4

1 回答 1

5

首先,这对 StackOverflow 来说不是一个好问题。这里的好问题是具体的和关于实际代码的。

理想情况下,我想使用类似的东西而不是正则表达式来解析语言

您需要做的第一件事是了解语言解析器的工作原理。不要使用正则表达式;正则表达式解析正则语言,JS不是正则语言。

语言解析器分两个阶段工作。首先是词法分析,其中文本被分解为标记,然后对标记进行解析。这比直接解析文本要容易得多。JS 存在一些小困难,因为使用了/表示除法、注释和正则表达式,它在词汇上是不明确的,但你可以很容易地解决这个问题。

所以你应该做的第一件事就是写一个词法分析器。然后写一个解析器。事实上,词法分析器可能足以满足您的需求。

请记住,您必须能够“正确”解析词汇或语法不正确的 JS,因为当用户键入时,该程序几乎肯定不是合法程序!这是编写好的词法分析器和解析器的难点。仔细考虑你想要什么样的错误恢复启发式,以确保良好的用户体验。

当然,在每次按键时,您都不会重新解析整个文本并应用格式?

显然,这取决于您的解析器有多快以及文件有多大。

当我们设计 Roslyn 语法荧光笔时,我们知道其中可能有数十万行正在输入的文件。我们不会在每次按键时重新解析整个文件,因为我们无法编写足够快的解析器。

相反,我们维护一个不可变的解析树并快速遍历它以确定按键发生在哪个令牌中。然后我们有一个解析器,它可以找出哪些解析节点可能已经改变,并且我们只重新分析和重新解析这些节点,然后从旧树的未更改部分构建一个新的不可变解析树。

我们也只对用户可见的文件部分运行语法着色器。

当然,Roslyn 也会在击键之间进行语义分析,但那完全是另外一回事。

于 2013-09-23T15:15:05.490 回答