我正在编写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
有关如何纠正上述内容的任何指示都受到高度赞赏。
答案 0 :(得分:1)
看看这三行:
WARN: 'WARN';
ERROR: 'ERROR';
ACTION: WARN|ERROR;
这些是词法规则(大写起始字符)。词法分析器负责将输入分成确定类型的标记。 &#39; ERROR&#39;只能有一个令牌类型,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
。