java 中基于 ANTLR 的规则引擎

ANTLR-based rule engine in java

我正在编写 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 (->) 时,生成的代码无法正确解析,我得到的错误是 "mismatched input 'ERROR' expecting ACTION"

解析成功:

tag(9)>0

解析失败:

tag(9)>0 -> ERROR

非常感谢任何有关如何纠正上述问题的指示。

看看这三行:

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

这些是词法分析器规则(大写起始字符)。词法分析器负责将您的输入拆分为确定类型的标记。 'ERROR' 只能有一个标记类型,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.