我希望制作一款非常基本的sytax荧光笔。我希望能指出正确的方向。我知道有很多伟大的项目已经做到这一点(Codemirror,rainbow.js等),但我希望得到如何创建它们的帮助,也许是一个简单的例子,使用Javascript(或clojurescript)。
这些项目是否使用解析语言(使用像PEG.js这样的东西?)理想情况下我想用类似的东西解析语言而不是正则表达式,但是一旦你定义了语言,将它转换为语法荧光笔?当然,在每一个按键上你都不会重新解析整个tex并应用格式化?那么做一些简单的事情最好的方法是什么?跟踪当前光标位置,只看前面和后面这么多字符?某种状态机?
任何帮助都会很棒!感谢
答案 0 :(得分:5)
首先,这对StackOverflow来说不是一个好问题。这里的好问题是特定的和关于实际代码。
理想情况下,我想使用类似的东西而不是正则表达式来解析语言
您需要做的第一件事是学习语言分析器的工作原理。不要使用正则表达式;正则表达式解析常规语言,JS不是常规语言。
语言解析器分两个阶段工作。首先是词法分析,其中文本被分解为标记,然后解析标记。这比直接解析文本容易得多。由于使用/
来表示除法,注释和正则表达式,JS存在一些轻微的困难,因为词汇含糊不清,但你可以很容易地解决这个问题。
所以你要做的第一件事就是写一个词法分析器。然后编写一个解析器。事实上,词法分析器可能足以满足您的需求。
请记住,您必须能够“正确”解析词汇或语法不正确的JS ,因为当用户输入时,该程序几乎肯定不是合法程序!这是编写优秀词法分析器和解析器的难点。仔细考虑您想要的错误恢复启发式方法,以确保良好的用户体验。
当然,在每一个按键上你都不会重新解析整个文本并应用格式化吗?
显然,这取决于解析器的速度和文件的大小。
当我们设计Roslyn语法高亮显示器时,我们知道可能存在包含数十万行的文件;我们不会在每个按键上重新解析整个文件,因为我们无法编写足够快的解析器。
相反,我们维护一个不可变的解析树并快速遍历它以确定keypress发生在哪个令牌中。然后我们有一个解析器可以找出哪些解析节点可能已经改变,我们只重新解析并重新解析那些节点,然后从旧树的未改变部分构建一个新的不可变解析树。
我们还只对文件中对用户可见的部分运行语法着色器。
当然,罗斯林也会在按键之间进行语义分析,但那是另一个蜡球。