由于我找不到有关语法突出显示的任何指南,因此我决定准备简单的纯文本编写然后在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
让我们考虑给出的例子。由于我们有NonsenseProgram
和Foo
类可以覆盖,因此我们可以控制它作为整体的返回源。我们可以通过访问NonsenseProgram
属性来修改NonsenseProgram.foo
生成的代码Foo
片段(通过覆盖_tx_*
)。我们无法对NonsenseProgram.count
,Foo.a
和Foo.b
进行相同操作,因为我们具有原始string
或int
值。< / p>
取决于基本语的用法,我们有以下选择:
关于其他任何选择的建议吗?
答案 0 :(得分:0)
你是对的。没有有关基本类型位置的信息。看来您目前涵盖了所有可用选项。
一个易于实现的选择是将位置记账直接添加到所有属性的textX中,作为每个创建对象上的特殊结构(例如,以属性名称作为键的字典)。它应该易于实现,因此您可以根据需要在问题跟踪器中注册功能请求。
过去有一些工作来支持针对基于textX的语言的完整语言服务。这个想法是从体面的代码编辑器/ IDE中获得使用textX指定的任何语言所需的所有功能。 这项工作花了一段时间,但最近由于完全重写而恢复了。它应该得到textX团队的正式支持。您可以关注进度here。尽管该项目目前未提及语法高亮显示,但它仍在我们的议程中。