簡體   English   中英

ANTLR語法用於遞歸表達式

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM