在ANTLR解析后生成字符串列表的哈希集



我的语法如下

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"。

相关内容

  • 没有找到相关文章

最新更新