2011-02-09 43 views
0

我想写一个翻译器。这个想法是将特殊的C++接口转换为C++/CLI。我有一个解析所有内容并生成AST的antlr语法。现在我想使用这些信息和一些字符串模板来发出源代码。使用Antlr/Stringtemplates编写翻译器

我的想法是将某些对象层次结构中的AST转换为属性(例如,包含索引属性方法的接口对象包含方法描述对象 然后主字符串模板将与根对象将属性插入到正确的位置或将它们传递给子模板

现在我的问题: 如何编写需要调用一些未定义次数的字符串模板/属性?示例:一个接口包含一个这意味着,方法的子模板需要多次调用,每次使用不同的属性。我怎样才能把它写成stringtemplate的混合体&索引属性?

谢谢您的帮助 托比亚斯

回答

0

我在做一些非常相似。基本思想是你的模型必须公开一些对象的列表,然后在你的字符串模板中使用这个列表。例如,假设我有一个非常聪明的实现。我将使用Java,因为这是我最了解的;你应该明白了。

https://gist.github.com/894632

public class GeneratedClass { 
    private String accessModifier; 
    private String name; 
    private String superClass; 
    private List<Method> methods; 
} 

public class Method { 
    private String comments; 
    private String name; 
    private String accessModifier; 
    private Type returnType; 
    private List<Argument> arguments; 
    private String body; 
} 

public class Argument { 
    private Type type; 
    private String name; 
} 

public class Type { 
    private String name; 
} 

对于我的模板,我可能有以下几点:

group Java; 

class(accessModifier, name, superclass, methods)::=<< 

$accessModifier$ class $name$ extends $superclass$ { 

    $methods:method(); separator="\n"$ 

} 
>> 

method(method)::=<< 
/** 
$method.comments$ 
*/ 
$method.accessModifier$ $method.returnType.name$ $name$ ($method.arguments:argument(); separator=","$) { 
    $method.body$ 
} 
>> 

argument(argument)::=<< 
$argument.type.name$ $argument.name$ 
>> 

的关键是,我在功能应用模板,为每个方法的对象我有;这就是$methods:method()所做的。如果我有一个空列表,根本不会调用任何模板。这处理可变大小问题。我在方法定义中做了类似的事情; ($method.arguments:argument(); separator=","$)。这将在圆括号之间创建逗号分隔的方法参数列表,就像您期望的那样。