在textX中创建语法突出显示的方法?

时间:2019-01-16 11:44:43

标签: python parsing dsl peg textx

由于我找不到有关语法突出显示的任何指南,因此我决定准备简单的纯文本编写然后在HTML预览中突出显示所有内容,这对于我目前的范围来说已经足够了。

通过覆盖许多自定义元模型类,我拥有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类可以覆盖,因此我们可以控制它作为整体的返回源。我们可以通过访问NonsenseProgram属性来修改NonsenseProgram.foo生成的代码Foo片段(通过覆盖_tx_*)。我们无法NonsenseProgram.countFoo.aFoo.b进行相同操作,因为我们具有原始stringint值。< / p>

取决于基本语的用法,我们有以下选择:

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

关于其他任何选择的建议吗?

1 个答案:

答案 0 :(得分:0)

你是对的。没有有关基本类型位置的信息。看来您目前涵盖了所有可用选项。

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

过去有一些工作来支持针对基于textX的语言的完整语言服务。这个想法是从体面的代码编辑器/ IDE中获得使用textX指定的任何语言所需的所有功能。 这项工作花了一段时间,但最近由于完全重写而恢复了。它应该得到textX团队的正式支持。您可以关注进度here。尽管该项目目前未提及语法高亮显示,但它仍在我们的议程中。