StringTemplate和ASTs

时间:2014-08-19 19:43:15

标签: java abstract-syntax-tree stringtemplate

我使用StringTemplate执行从一种语言到几种后端的模型转换。我从一个手工生成的AST开始,它具有类层次结构,例如语言中的类型。我的问题与StringTemplate中复杂层次结构的翻译有关。让我们检查一下Type层次结构,它是在类层次结构中实现的,类似于:

class Type { }
class IntType extends Type { ...bitsize for integer here... }
class Boolean extends Type {}
class ArrayType extends Type { ...array dimensions and base type here}
class RecordType extends Type { ...field information here...}

有没有办法根据类型信息进行条件分支?我已经看到很多例子直接在语言的具体语法中进行条件分支,模板遵循生产,但这不是我的情况。我看到它的方式至少有四种方法可以做到这一点:

  1. 根本不使用StringTemplate来处理复杂的层次结构;而是直接在Java中翻译。但是,这意味着我对模板的使用非常少:我想翻译的许多语言功能(参数,声明等)都有类型,所以我必须只使用模板"叶子水平"元件。

  2. "逃生"使用Type对象的渲染器返回Java。这可能会导致我使用渲染器回调Java,然后调用另一个StringTemplate对象来渲染各个类型,但我认为这是o.k。

  3. 将子类型的识别符添加到我的Java类中,我可以直接在模板中使用它,并在那里进行条件格式化。

  4. Hack getter / setter方法为感兴趣的对象构建字符串表示,例如: 将String getStringTemplateTypeString()添加到我的Type类中,然后使用以下命令引用它: type.stringTemplateTypeString

  5. 我确信还有其他方法可以做到这一点;这里有很多灵活性。我目前倾向于选择#2,但我希望得到这个受人尊敬的社区的一些意见:)。我想以一种简单明了的方式来做这件事(当我添加额外的后端时,我不必在一堆文件中更改内容),并且干净。

    非常感谢!

    麦克

1 个答案:

答案 0 :(得分:0)

根据我对你的问题的理解,解决方法可以是4和2的组合,你有一个方法将返回类型,你做一个基于它的条件if-else块和在主模板中本身叫另一个模板。这样,您只需要在课程中添加额外的getter。请知道这是否无法解决您的问题。