Validation java中基于ANTLR的规则引擎
我正在编写ANTLRv4语法,以实现一个简单的规则引擎来解析修复消息,并指定违反规则时要采取的操作 这就是我目前的语法: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 :
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;
...