【发布时间】: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
让我们考虑给定的例子。由于我们有可以覆盖的NonsenseProgram 和Foo 类,我们可以控制它作为一个整体返回源。我们可以通过访问_tx_* 属性来修改NonsenseProgram 生成的代码NonsenseProgram.foo 片段(通过覆盖Foo)。我们不能对 NonsenseProgram.count、Foo.a 和 Foo.b 做同样的事情,因为我们有原始的 string 或 int 值。
根据原语的使用情况,我们有以下选择:
- 使用仅包含该原语而不包含其他任何内容的规则包装每个原语。
优点:它现在就可以工作!
缺点:产生我们的语法工具链需要处理的大量嵌套值开销。它实际上只是为了漂亮而弄乱语法...... - 忽略用户的语法,仅使用我们的反向解析规则。
优点:它也很有效!
缺点:您需要用几乎所有语法元素重新实现语法。它会在每次高亮尝试时强制重新格式化代码。 - 使用一些外部突出显示规则。
优点:它会工作......
缺点:再次语法重新实现。 - 使用语言服务器。
优点:从长远来看将是最佳选择。
缺点:It's only mentioned once 没有任何深入的文档。
对任何其他选项有什么建议吗?
【问题讨论】:
标签: python parsing dsl peg textx