我的语法如下
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: [ \t\r\n]+ -> skip ;
我可以为此目的使用它。
当我生成Java代码时,解析器会包含一个名为StringListContext的类,该类是我的stringList解析器语法的上下文。
反正有表达吗
(_NB,CC)和((VISA,MASTER)品牌中的pay_type或银行
in('HDFC','CITI'))
我需要StringListContext来生成一个名为getStringSet的函数,该函数会向我返回列表值的HashSet。我不希望在调用函数时动态创建集合,而是应该在解析时本身创建该集合,并且该调用应立即向我返回该实例。有没有一种方法可以使用语法来构建此需求,而无需手动更改生成的代码。
最佳答案
这回答了您在解析时如何获取HashSet的核心问题:
stringList
locals[Set<String> s = new HashSet<>()]
: t+=STRING (',' t+=STRING)* { $s.addAll($t); }
;
匹配规则时,StringListContext的每个实例将包含一个由嵌入式操作填充的公共变量'。权威的Antlr4参考p268对此进行了详细介绍。
要添加“ getStringSet”函数,请使用@members块。让函数将StringListContext实例作为参数,并返回值“ s”。
关于java - ANTLR解析后生成字符串列表的哈希集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29208628/