2011-02-09 100 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=","$)。這將在圓括號之間創建逗號分隔的方法參數列表,就像您期望的那樣。