在漂亮的打印机上工作。根据我目前对 ANTLR 和 StringTemplate 的理解,如果我想将我的所有语法规则与模板匹配并在每次调用语法规则时应用模板,我可以创建名称与我的语法规则匹配的模板。
[附带问题:我应该这样处理它吗?似乎 ANTLR 应该将解析后的文本与输出模板进行匹配。我的工作是确保解析器规则和模板是完整/正确的。]
我认为 ANTLR 3 允许在 ANTLR 语法中直接设置模板,但 ANTLR 4 似乎已经远离了这一点。
基于上述假设,看起来 ANTLR 生成的 MyGrammarBaseListener 类将完成所有工作。
通过将此示例转换为 ANTLR 4,我已经能够收集在解析文本输入时调用的规则的名称。我最终得到了这个enterEveryRule()
:
@Override public void enterEveryRule(ParserRuleContext ctx) {
if (builder.length() > 0) {
builder.append(' ');
}
if (ctx.getChildCount() > 0) {
builder.append('(');
}
int ruleIndex = ctx.getRuleIndex();
String ruleName;
if (ruleIndex >= 0 && ruleIndex < ruleNames.length) {
ruleName = ruleNames[ruleIndex];
System.out.println(ruleName); // this part works as intended
}
else {
ruleName = Integer.toString(ruleIndex);
}
builder.append(ruleName);
// CONFUSION HERE:
// get template names (looking through the API to figure out how to do this)
Set<String> templates = (MyTemplates.stg).getTemplateNames()
// or String[] for return value? Java stuff
// for each ruleName in ruleNames
// if (ruleName == templateName)
// run template using rule children as parameters
// write pretty-printed version to file
}
链接的示例应用更改来创建文本输出,exitEveryRule()
因此我不确定在哪里实际实现我的模板匹配算法。我会尝试两者enter
,exit
看看什么效果最好。
我的主要问题是:如何访问 MyTemplates.stg 中的模板名称?我必须导入什么等?
(我可能会回来询问在另一个问题中将规则子项与模板参数匹配...)