作为 ANTLR 的新手,我试图弄清楚字符串模板是如何工作的。我想根据一个非常简单的输入文件生成一段 Java 代码。由于其灵活的概念,我想使用(字符串)模板。在 Java 中,通常必须生成成员声明,在其他地方初始化它们,甚至在其他地方使用它们。标识符名称应匹配并因此重复。这意味着这里和那里需要很少的模板实例化。当然可以做到,但我似乎无法找出方法,也许我错过了一些重要的“线索”?
我写了一个测试程序来研究这个概念。它需要一个简单的输入文件:
red = #FF0000
green = #00FF00
blue = #0000FF
并且应该产生类似于以下输出的内容:
class MyColors {
// Class members
public java.awt.Color red;
public java.awt.Color green;
public java.awt.Color blue;
// Constructor
/* Question: How to access the right initializer value here?!? The values are not accessible at this level of the grammar*/
public MyColors() {
red = java.awt.Color.getColor("#FF0000");
green = java.awt.Color.getColor("#00FF00");
blue = java.awt.Color.getColor("#0000FF");
}
};
...根据输入填写构造函数中的变量和初始化程序的名称。
我定义的语法如下:
grammar Test;
options {
output=template;
}
colors: (a+=def)+ -> colorClassDef(name={$a});
def: ident '=' name -> colorDef(id={$ident.text}, name={$name.text});
ident: ID;
name: ID;
ID: ('a'..'z'|'A'..'Z'|'#'|'0'..'9')+;
WS: (' '|'\t'|'\r'|'\n')+ { skip(); };
模板定义如下:
group Test;
colorClassDef(name, id) ::= <<
class MyColors {
// Class members
<name:{ v | public java.awt.Color <v>;
}>
// Constructor
/* Question: How to access the initializer value here?!? */
public MyColors() {
<name:{ v | <v> = java.awt.Color.getColor("<id>");
}>
}
};
>>
/* How to return both id and name here seperately, as ID should go into the declaration and name should to into the init? */
colorDef(id, name) ::= <<
<id>
>>
谁能建议我如何让 <id> 和 <name> 脱离规则“def”以便将它们包含在生成代码的正确部分中?
我发现了多个关于多个返回值的问题,例如Returning multiple values in ANTLR rule和antlr2 return multiple values,但没有一个包含字符串模板。我什至买了“这本书”并通过 java 字节码生成器按我的方式工作,但在那里没有找到我的答案。所有示例似乎都为一位输入生成一位输出。(不过没有遗憾,这本书非常适合睡前阅读;-)
谁能指出我缺少什么线索?解决此问题的最合适方法是什么?一些示例代码和指向文档的指针将不胜感激。
谢谢,
马丁