我的语法如下

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/

10-11 00:49
查看更多