Validation java中基于ANTLR的规则引擎

Validation java中基于ANTLR的规则引擎,validation,antlr,antlr4,rule-engine,fix-protocol,Validation,Antlr,Antlr4,Rule Engine,Fix Protocol,我正在编写ANTLRv4语法,以实现一个简单的规则引擎来解析修复消息,并指定违反规则时要采取的操作 这就是我目前的语法: grammar RuleDefinition; ruleset: rule+; rule : 'tag(' INT ')' numberOp (INT | FLOAT| STRING) (ACTION_DIRECTOR action)?; ID : [a-zA-Z]+ ; // match identifiers INT :

我正在编写ANTLRv4语法,以实现一个简单的规则引擎来解析修复消息,并指定违反规则时要采取的操作

这就是我目前的语法:

    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 : '"' (' '..'~')* '"';
以下项的分析失败:

tag(9)>0 -> ERROR

非常感谢任何关于如何纠正上述问题的建议。

请看以下三行:

WARN: 'WARN';
ERROR: 'ERROR';
ACTION: WARN|ERROR;
这些是lexer规则(大写开始字符)。lexer负责将您的输入拆分为确定类型的令牌。”ERROR'只能有一个标记类型,ANTLR决定它为
ERROR
(两个规则
ERROR
ACTION
匹配,并且首先定义
ERROR

要解决此问题,请将一些lexer规则转换为解析器规则(小写开始字符):


解析器规则组成标记,而不是连接它们。这意味着动作可以是
WARN
ERROR

嗨,谢谢你的回答。不幸的是,我不能让这个工作。我已经按照建议更改了语法,但是我得到了“不匹配的输入”='预期为{'='、'>'、'>=','更新语法定义和导致语法分析器失败的示例字符串。嗨,科罗纳,我已经用你的建议更新了语法。语法分析失败,标记(9)>0“先前已成功解析。numberOp是
NUMBER\u OP
的替代品,您必须删除numberOp.works!:)非常感谢您的帮助,我已经接受了答案。
WARN: 'WARN';
ERROR: 'ERROR';
ACTION: WARN|ERROR;
rule :  'tag' '(' INT ')' numberOp (INT | FLOAT| STRING) (ACTION_DIRECTOR action)*;

....

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

...