非常基本的语法荧光笔

Jon*_*ono 0 javascript css syntax-highlighting codemirror clojurescript

我期待制作一个非常基本的sytax荧光笔.我希望能指出正确的方向.我知道有很多伟大的项目已经做到这一点(Codemirror,rainbow.js等),但我希望得到如何创建它们的帮助,也许是一个简单的例子,使用Javascript(或clojurescript).

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

任何帮助都会很棒!谢谢

Eri*_*ert 5

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

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

您需要做的第一件事是学习语言分析器的工作原理.不要使用正则表达式; 正则表达式解析常规语言,而JS不是常规语言.

语言分析器分两个阶段工作.首先,词法分析,其中文本被分解为标记,然后解析标记.这比直接解析文本容易得多.JS提出了一些小的困难,因为使用/意味着分裂,注释和正则表达式,它在词汇上是模棱两可的,但你可以很容易地解决这个问题.

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

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

当然,在每一个按键上你都不会重新解析整个文本并应用格式化?

显然,这取决于解析器的速度和文件的大小.

当我们设计Roslyn语法高亮显示器时,我们知道可能存在包含数十万行的文件; 我们不会在每个按键上重新解析整个文件,因为我们无法编写足够快的解析器.

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

我们还仅对文件中用户可见的部分运行语法着色器.

当然,罗斯林也会在按键之间进行语义分析,但那是另一个蜡球.