<分区>
我希望制作一个非常基本的语法荧光笔。我希望找到正确的方向。我知道已经有很多伟大的元素(Codemirror、rainbow.js 等)在做这件事,但我希望获得关于如何创建这些元素的帮助,也许还有一个简单的例子,使用 Javascript(或 clojurescript)。
这些元素是否使用解析语言(使用 PEG.js 之类的东西?)理想情况下,我想使用类似的东西而不是正则表达式来解析语言,但是一旦定义了语言,如何将其转换为语法荧光笔?当然,在每次按键时,您都不会重新解析整个 tex 并应用格式?那么做简单事情的最佳方法是什么?跟踪当前光标位置并只查看前面和后面这么多字符?某种状态机?
任何帮助都会很棒!谢谢
最佳答案
首先,这不是 StackOverflow 的好问题。这里的好问题是具体的并且是关于实际代码的。
Ideally I would like to parse the language using something like that rather than regexs
您需要做的第一件事是了解语言解析器的工作原理。不要使用正则表达式;正则表达式解析正则语言,JS不是正则语言。
语言解析器分两个阶段工作。首先是词法分析,其中文本被分解成标记,然后解析标记。这比直接解析文本要容易得多。由于使用 /
来表示除法、注释和正则表达式,JS 存在一些小的困难,因为它在词汇上有歧义,但您可以很容易地解决这个问题。
所以你应该做的第一件事就是写一个词法分析器。然后写一个解析器。事实上,词法分析器可能足以满足您的需求。
请记住,您必须能够“正确”解析词法或语法不正确的 JS,因为当用户输入时,该程序几乎肯定不是合法程序!这是编写一个好的词法分析器和解析器的难点。仔细考虑您想要什么样的错误恢复试探法,以确保良好的用户体验。
Surely on every single keypress you don't re parse the entire text and apply the formatting?
显然,这取决于您的解析器的速度和文件的大小。
当我们设计 Roslyn 语法荧光笔时,我们知道可能有包含数十万行输入的文件;我们不会在每次按键时重新解析整个文件,因为我们无法编写足够快的解析器。
相反,我们维护一个不可变的解析树并快速遍历它以确定按键发生在哪个标记中。然后我们有一个解析器可以找出哪些解析节点可能已经改变,我们只重新分析和重新解析那些节点,然后从旧树的未更改部分构建一个新的不可变解析树。
我们也只在文件中对用户可见的部分运行语法着色器。
当然,Roslyn 也会在击键之间进行语义分析,但这完全是另一回事。
关于javascript - 非常基本的语法荧光笔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18962644/
相关文章:
javascript - 使用setTimeout()时如何使用call()设置 `this`的值?
javascript - 如何将数组中的对象推送到 csv 中的下一列
javascript - 如何动态检测 Mozilla/Chrome 上是否启用了 SSO?
javascript - AngularJS - 如何覆盖 $urlRouterProvider.when
python - 如何用美汤获取within::before和::after的内容?
javascript - 在 div 上运行 CSS 动画的 Vanilla JavaScript 滚动到 View 中不起作用