【问题标题】:Methods of creating syntax highlighting in textX?在文本中创建语法突出显示的方法?
【发布时间】:2019-01-16 11:44:43
【问题描述】:

由于我找不到任何关于语法高亮的指南,我决定准备简单的 write-as-plain-text-and-then-highlight-everything-in-html-preview,这对于我目前的范围来说已经足够了。

通过覆盖许多自定义元模型类,我有 to_source 方法,它实际上反向重新实现了整个语法,因为 reverse parsing 尚不可用。很好,但它忽略了用户格式。

为了保留用户格式,我们只能使用可用的东西:_tx_position_tx_position_end。通过存储的自定义元模型类属性从主 textX 规则下降到其子项适用于大多数情况,但它失败原语。

# textX meta-model file
NonsenseProgram:
    "begin" foo=Foo "," count=INT "end";
;

Foo:
    "fancy" a=ID "separator" b=ID "finished"
;
# textX custom meta-model classes
class NonsenseProgram():
    def __init__(foo, count):
        self.foo = foo
        self.count = count

    def to_source(self):
        pass  # some recursive magic that use _tx_position and _tx_position_end

class Foo():
    def __init__(parent, a, b):
        self.parent = parent
        self.a = a
        self.b = b

    def to_source(self):
        pass  # some recursive magic that use _tx_position and _tx_position_end

让我们考虑给定的例子。由于我们有可以覆盖的NonsenseProgramFoo 类,我们可以控制它作为一个整体返回源。我们可以通过访问_tx_* 属性来修改NonsenseProgram 生成的代码NonsenseProgram.foo 片段(通过覆盖Foo)。我们不能NonsenseProgram.countFoo.aFoo.b 做同样的事情,因为我们有原始的 stringint 值。

根据原语的使用情况,我们有以下选择:

  • 使用仅包含该原语而不包含其他任何内容的规则包装每个原语。
    优点:它现在就可以工作!
    缺点:产生我们的语法工具链需要处理的大量嵌套值开销。它实际上只是为了漂亮而弄乱语法......
  • 忽略用户的语法,仅使用我们的反向解析规则。
    优点:它也很有效!
    缺点:您需要用几乎所有语法元素重新实现语法。它会在每次高亮尝试时强制重新格式化代码。
  • 使用一些外部突出显示规则。
    优点:它会工作......
    缺点:再次语法重新实现。
  • 使用语言服务器。
    优点:从长远来看将是最佳选择。
    缺点:It's only mentioned once 没有任何深入的文档。

对任何其他选项有什么建议吗?

【问题讨论】:

    标签: python parsing dsl peg textx


    【解决方案1】:

    你是对的。没有关于原始类型位置的信息。您目前似乎已经涵盖了可用的选项。

    一个易于实现的选项是将位置簿记直接添加到所有属性的 textX 作为每个创建对象的特殊结构(例如,由属性名称键入的字典)。它应该很容易实现,因此您可以根据需要在问题跟踪器中注册功能请求。

    过去曾进行过一些工作来支持基于 textX 的语言的完整语言服务。我们的想法是从一个体面的代码编辑器/IDE 中获得您期望使用 textX 指定的任何语言的所有功能。 这项工作搁置了一段时间,但最近又恢复了完全重写。它应该得到 textX 团队的官方支持。您可以关注进度here。虽然,该项目目前并未提及语法高亮,但它已在我们的议程上。

    【讨论】:

    • 感谢您的回答,已创建问题:github.com/textX/textX/issues/158。在一些非黑客解决方案可用之前,我将保留问题。
    • 我目前正在从事 textX 语言服务,只是想确认我们将支持语法高亮。语法突出显示取决于 IDE,因此,例如VS Code 使用 TextMate 来描述标记如何被着色(code.visualstudio.com/blogs/2017/02/08/…)。正如 Igor 所说,我们已经为基于 textX 的语言提供了 VS-Code 扩展,我们的解决方案是为特定语言生成 TextMate 文件,VS-Code 知道如何解释该文件。我希望我们也支持语义突出显示(在语言服务器协议中尚不可用)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    相关资源
    最近更新 更多