java中基于ANTLR的规则引擎

时间:2015-06-04 04:17:14

标签: validation antlr antlr4 rule-engine fix-protocol

我正在编写ANTLRv4语法来实现一个简单的规则引擎来解析FIX消息,并指定违反规则时要采取的行动。

这是我目前的语法所在:

    grammar RuleDefinition;

ruleset: rule+;

rule :  'tag(' INT ')' numberOp (INT | FLOAT| STRING) (ACTION_DIRECTOR action)?;

ID      :   [a-zA-Z]+ ;        // match identifiers
INT     :   [0-9]+;            // match integers
FLOAT   :   '0'..'9'+('.'('0'..'9')*)? ;            // match float
NEWLINE :'\r'? '\n' ;           // return newlines to parser (end-statement signal)
WS     : [ \t\n\r]+ -> skip ;   // toss out whitespace
NUMBER_OP      :   EQ|GR|GE|LS|LE|NE;
numberOp       :   EQ|GR|GE|LS|LE|NE;
EQ      :   '=';
GR: '>';
GE: '>=';
LS: '<';
LE: '<=';
NE: '!=';
ACTION_DIRECTOR : '->';
action: 'WARN' | 'ERROR';
STRING : '"' (' '..'~')* '"';

问题是当规则包含ACTION_DIRECTOR( - &gt;)时生成的代码无法正确解析,我得到的错误是&#34;输入不匹配&#39; ERROR&#39;期待行动&#34;

解析成功:

tag(9)>0

解析失败:

tag(9)>0 -> ERROR

有关如何纠正上述内容的任何指示都受到高度赞赏。

1 个答案:

答案 0 :(得分:1)

看看这三行:

WARN: 'WARN';
ERROR: 'ERROR';
ACTION: WARN|ERROR;

这些是词法规则(大写起始字符)。词法分析器负责将输入分成确定类型的标记。 &#39; ERROR&#39;只能有一个令牌类型,ANTLR会将其确定为ERROR(两个规则ERRORACTION匹配,首先定义ERROR

要解析此转换,将一些词法分析器规则解析为解析器规则(小写的起始字符):

rule :  'tag' '(' INT ')' numberOp (INT | FLOAT| STRING) (ACTION_DIRECTOR action)*;

....

action : WARN | ERROR;
numberOp :   EQ|GR|GE|LS|LE|NE;
stringOp :   EQ|NE;

...

解析器规则组成令牌而不是加入它们。这意味着操作可以是WARNERROR