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
(两个规则 ERROR
和 ACTION
匹配,并且 ERROR
是第一个定义的)。
要解决此问题,请将一些词法分析器规则转换为解析器规则(小写起始字符):
rule : 'tag' '(' INT ')' numberOp (INT | FLOAT| STRING) (ACTION_DIRECTOR action)*;
....
action : WARN | ERROR;
numberOp : EQ|GR|GE|LS|LE|NE;
stringOp : EQ|NE;
...
解析器规则组成标记而不是连接它们。这意味着一个动作可以是 WARN
或 ERROR
.
我正在编写 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
(两个规则 ERROR
和 ACTION
匹配,并且 ERROR
是第一个定义的)。
要解决此问题,请将一些词法分析器规则转换为解析器规则(小写起始字符):
rule : 'tag' '(' INT ')' numberOp (INT | FLOAT| STRING) (ACTION_DIRECTOR action)*;
....
action : WARN | ERROR;
numberOp : EQ|GR|GE|LS|LE|NE;
stringOp : EQ|NE;
...
解析器规则组成标记而不是连接它们。这意味着一个动作可以是 WARN
或 ERROR
.