[英]ANTLR Grammar for a recursive expression
我遇到了需要根據業務規則驗證一組輸入的問題。
輸入集可以由類似
public class RuleInput{
public String payType;
public String bank;
public String brand;
//....Getters and setters
}
我的系統客戶端可以在我的系統中配置許多規則。 為了配置規則,我已經定義了如下的DSL
RULE1 - payType in ('NB,'CC') and bank in ('HDFC', 'CITI')
RULE2 - payType in ('NB') and (bank in ('HDFC','AXIS') or brand in ('VISA'))
現在給定ruleInput = RuleInput(NB,HDFC,VISA)和函數
public boolean validateAgainstRule(String ruleId, RuleInput input);
像validateAgainstRule(“ RULE2”,ruleInput)這樣的調用應返回true;
我正在考慮將ANTLR用於相同的功能(但是我對此很陌生)。 我試圖建立這樣的語法
expression :
primary_expression
| expression OR expression
| expression AND expression
| LPAREN expression RPAREN
;
primary_expression : //A simple expression
simple
;
simple : TAG_EXPR | BIN_EXPR ;
TAG : 'payment_type' | 'issuer' | 'brand' ;
BIN_TAG : 'bins' ;
BIN_EXPR : BIN_TAG IN BIN_LIST ;
TAG_EXPR : TAG IN LIST ;
LIST : LPAREN TEXT (COMMA TEXT)* RPAREN ;
BIN_LIST : LPAREN BIN (COMMA BIN)* RPAREN ;
IN : 'in' ;
OR : 'or' ;
AND : 'and' ;
LPAREN : '(' ;
RPAREN : ')' ;
COMMA : ',' ;
TEXT : [A-Z]+ ;
BIN : [0-9][0-9][0-9][0-9][0-9][0-9] ;
WS : [ \t\r\n]+ -> skip ;
有人可以幫助我為我的要求寫語法嗎? 我想我甚至需要使用語法中的動作來接受輸入。
注意:我什至考慮過使用流口水,但是我只有一種規則,對於這種小問題,使用流口水會很麻煩。 因此想到只與ANTLR一起使用。
我的語法中有幾件事我聽不懂-似乎與您的DSL不匹配...
在這里,請嘗試以下操作:
rule : ID '-' expression ;
expression : '(' expression ')' # parensExpr
| expression 'and' expression # andExpr
| expression 'or' expression # orExpr
| simpleExpr # clauseExpr
;
simpleExpr : TAG 'in' '(' stringList ')' ;
stringList : STRING (',' STRING)* ;
TAG : 'payType' | 'bank' | 'brand';
STRING : '\'' [A-Za-z0-9]* '\\';
ID: [A-Za-z0-9]+;
WS: [ \t\r\n]+ -> skip ;
ANTLR將為您生成一個基礎樹訪問者類,使用它來檢查您的表達式,或者構建一個AST並對此進行檢查(此方法更好,但實現時間更長)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.