我的语法如下
grammar MyRule;
gatewayRuleExpr : useStat #useStmtExpr
| ifStmnt #ifStmtExpr
;
offerRuleExpr : '(' offerRuleExpr ')' # parensExpr
| left=offerRuleExpr 'and' right=offerRuleExpr # andExpr
| left=offerRuleExpr 'or' right=offerRuleExpr # orExpr
| simpleExpr # clauseExpr
;
simpleExpr : TAG 'in' '(' stringList ')' ;
stringList : STRING (',' STRING)* ;
ifStmnt : 'if' useCond ('else' 'if' useCond ) * ('else' useStat)? ;
useCond : '(' offerRuleExpr ')' 'then' useStat ;
useStat : 'use' USE_TAG (orderStat)? 'from' '(' stringList ')';
orderStat: 'in' 'order' | 'in' 'reverse' 'order';
USE_TAG : 'gateway';
TAG : 'pay_type' | 'bank' | 'brand' | 'bin' | 'bin_group';
STRING : ''' [A-Za-z0-9]* ''';
WS: [ trn]+ -> skip ;
我可以用它来达到目的。
当我生成Java代码时,Parser包括一个名为StringListContext的类,它是我的stringList语法分析器的上下文。
是否有给定的表达式
pay_type在('NB','C')和(brand在('VISA','MASTER')或银行在("HDFC"、"ITI")
我需要StringListContext来生成一个名为getStringSet的函数,该函数将返回列表值的HashSet。我不希望在调用函数时动态创建集合,相反,它应该在解析时创建集合,并且调用应该立即返回实例。有没有一种方法可以让我使用语法来构建这个需求,而不需要手动修改生成的代码。
这回答了如何在解析时获得哈希集的核心问题:
stringList
locals[Set<String> s = new HashSet<>()]
: t+=STRING (',' t+=STRING)* { $s.addAll($t); }
;
当规则匹配时,StringListContext的每个实例都将包含一个由嵌入操作填充的公共变量"s"。最终Antlr4参考文件p268对此进行了详细说明。
若要添加"getStringSet"函数,请使用@members块。让函数将StringListContext实例作为参数,并返回值"s"。