【发布时间】:2015-08-05 16:41:22
【问题描述】:
使用漂亮的打印机。根据我目前对 ANTLR 和 StringTemplate 的理解,如果我想将我的所有语法规则与模板匹配并在每次调用语法规则时应用模板,我可以创建名称与我的语法规则匹配的模板。
[附带问题:我应该这样处理它吗?似乎 ANTLR 应该将解析后的文本与输出模板进行匹配。我的工作是确保解析器规则和模板是完整/正确的。]
我认为 ANTLR 3 允许在 ANTLR 语法中直接设置模板,但 ANTLR 4 似乎已经不再这样做了。
基于上述假设,看起来 ANTLR 生成的 MyGrammarBaseListener 类将完成所有工作。
通过将this example 转换为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 中的模板名称?我必须导入什么等?
(我可能会在另一个问题中再次询问有关将规则子代与模板参数匹配的问题...)
【问题讨论】:
标签: java antlr4 stringtemplate-4