在ANTLR中,我应该如何实现具有状态/上下文的访问者?

在ANTLR中,我应该如何实现具有状态/上下文的访问者?,antlr,antlr4,Antlr,Antlr4,我正试图编写一个简单的ANTLR解析器来处理日期调整,例如,我可以编写:+1w+1d表示“穿越一周一天”,或者MIN(+30d,+1m)表示“从输入日期算起30天,或者1个月,以较早者为准”。这些规则应该是可组合的,因此MIN(+30d,+1m)+1d表示“第二天(自输入日期起30天,或自输入日期起1个月,以较早者为准)”,+1dMIN(+30d,+1m)表示“自输入日期起30天或自输入日期起1个月,以较早者为准” [我理解这里的例子相对老套-真正的语法需要理解周末、假期、月份界限等,因此可能是

我正试图编写一个简单的ANTLR解析器来处理日期调整,例如,我可以编写:
+1w+1d
表示“穿越一周一天”,或者
MIN(+30d,+1m)
表示“从输入日期算起30天,或者1个月,以较早者为准”。这些规则应该是可组合的,因此
MIN(+30d,+1m)+1d
表示“第二天(自输入日期起30天,或自输入日期起1个月,以较早者为准)”,
+1dMIN(+30d,+1m)
表示“自输入日期起30天或自输入日期起1个月,以较早者为准”

[我理解这里的例子相对老套-真正的语法需要理解周末、假期、月份界限等,因此可能是“输入日期后一个月(输入日期的月底或输入日期后的星期五-以先到者为准)”等]

我想写的代码是:

DateAdjutmeParser parser=buildFromString(“最大(+30d,+1m)”;
ParseTree=parser.rootNode();
return new MyVisitor().visit(tree,LocalDate.of(2020,4,23))//这里不允许有额外的参数。
问题是如何准确传递“上下文日期”?我无法将其作为成员存储在
MyVisitor
类中,因为
visit()
调用是递归的,这将覆盖上下文。我可以建立一组具有正确方法的并行对象,但这似乎是很多样板

有ANTLR解决方案吗


更多详情:

这是我想写的访客:

公共类MyVisitor扩展了DateAdjustBaseVisitor{
@凌驾
公共LocalDate访问FsetRule(DateAdjustParser.OffsetRuleContext ctx){
LocalDate上下文日期=//
返回contextDate.plus(Integer.valueOf(ctx.num.toString()),ChronoUnit.valueOf(ctx.unit.toString());
}
@凌驾
公共LocalDate visitMinMaxRule(DateAdjustParser.MinMaxRuleContext ctx){
LocalDate上下文日期=//
LocalDate left=this.visitChildren(ctx.left,contextDate);
LocalDate right=this.visitChildren(ctx.right,contextDate);
if(ctx.type.getText().equals(“MIN”)){
返回左。比较(右)>0?左:右;
}否则{
返回左。比较(右)<0?左:右;
}
}
}
这是我的语法:

grammar DateAdjust;

rootNode: offset+;

offset
    : num=NUMBER unit=UNIT                             #OffsetRule
    | type=( MIN | MAX ) '(' left=offset ',' right=offset ')' #MinMaxRule
    ;

UNIT: [dwmy]; //Days Weeks Months Years
NUMBER: [+-]?[0..9]+;
MAX: 'MAX';
MIN: 'MIN';

不是特定于Antlr的解决方案,但典型的DSL解决方案是使用作用域状态表(又称符号表)来累积AST/CST遍历的结果


看这个。另一个存在于世界上

抱歉-我试图保持我的例子简洁,但我想我失败了。我感谢你的帮助。我试着用更多的例子来阐述我的简介。