有没有熟悉 antlr4 的懂哥

我正在实现一个查询语言的语义分析,其中我定义了数字的词法规则如下

然后我在解析分页命令时我使用如下的语法规则来进行匹配

page_stmt : F_PAGE EQ number F_SIZE EQ number ; number :(NUMBER)+ ; NUMBER : DIGIT+ ; fragment DIGIT : [0-9];

但是无论如何都报错,不能命中我定义的数字规则

name = 2023-01-01 and action in ('allow','src') or id = 12314 page = 1 size = 2

如下是生成的语法树

image.png

总是提示被DATE_TIME干扰了

最后附上完整g4文件

grammar Dsl; @header { package net.skycloud.dsl; } parse : ( dsl_stmt_list )* EOF ; dsl_stmt_list : SCOL* dsl_stmt ( SCOL+ dsl_stmt )* SCOL* ; dsl_stmt : OPEN_PAR* expr ( ( K_AND | K_OR) OPEN_PAR* expr CLOSE_PAR* )* CLOSE_PAR* page_stmt? ordering_term? ; expr : K_NOT* ( field ) operator OPEN_PAR* ( literal_value | literal_list | FUNCTION | dates ) CLOSE_PAR* ; page_stmt : F_PAGE EQ number F_SIZE EQ number ; ordering_term : K_ORDER K_BY field ordering_op? (COMMA field ordering_op? )* ; ordering_op : ( K_ASC | K_DESC ) ; operator : EQ | NOT_EQ | CONTAINS | NOT_CONTAINS | LT_EQ | LT | GT | GT_EQ | K_IN | K_NOT K_IN | K_IS | K_WAS | K_IS K_NOT | K_WAS K_NOT | K_CHANGED K_TO ; literal_value : STRING_LITERAL | NUMBER* | IDENTIFIER | state_name | field | dates ; FUNCTION : [a-zA-Z]+ '(' (.*? | FUNCTION) ')' ; literal_list : '(' literal_value ( COMMA literal_value )* ')' ; keyword : K_AFTER | K_AND | K_ASC | K_BEFORE | K_BY | K_CHANGED | K_DESC | K_IN | K_IS | K_NOT | K_NULL | K_ON | K_OR | K_ORDER | K_TO | K_WAS ; state_name : K_EMPTY ; field : F_ID | F_NAME | F_ENABLED | F_DATASOURCE | F_HITCOUNT | F_UNIQUEKEY | F_SOURCE_USER | F_SOURCE_IP | F_SOURCE_NAME | F_DESTNATION_IP | F_DESTNATION_NAME | F_SERVICE_PROTOCOL | F_SERVICE_PORT | F_SRC_ZONE | F_DST_ZONE | F_ACTION | F_DESCRIPTION | F_TABLE | F_SECTION | F_SRC_NEGATED | F_DST_NEGATED | F_SVC_NEGATED | F_SOURCE_IS_ANY | F_DESTNATION_IS_ANY | F_SERVICE_IS_ANY | F_SCHEDULE_NAME | F_LOG_OPTION | F_DEVICE_ID | F_DEVICE_NAME ; number :(NUMBER)+ ; dates : DATETIME ; DATETIME : ('-'|'+')? (NUMBER ('d'|'w'|'y'|'h'|'m')?)+ | ('"' DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT (DIGIT DIGIT ':' DIGIT DIGIT)? '"') | ('\'' DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT (DIGIT DIGIT ':' DIGIT DIGIT)? '\'') | ( DIGIT DIGIT DIGIT DIGIT '-' DIGIT DIGIT '-' DIGIT DIGIT (DIGIT DIGIT ':' DIGIT DIGIT)? ) ; NUMBER : DIGIT+ ; WHITESPACE : ' ' -> skip ; SCOL : ';'; DOT : '.'; OPEN_PAR : '('; CLOSE_PAR : ')'; COMMA : ','; EQ : '='; STAR : '*'; CONTAINS : '~'; NOT_CONTAINS : '!~'; LT : '<'; LT_EQ : '<='; GT : '>'; GT_EQ : '>='; NOT_EQ : '!='; K_AFTER : A F T E R; K_AND : A N D; K_ASC : A S C; K_BEFORE : B E F O R E; K_BY : B Y; K_CHANGED : C H A N G E D; K_DESC : D E S C; K_EMPTY : E M P T Y; K_IN : I N; K_IS : I S; K_NOT : N O T; K_NULL : N U L L; K_ON : O N; K_OR : O R; K_ORDER : O R D E R; K_TO : T O; K_WAS : W A S; F_ID : I D; F_NAME : N A M E; F_ACTION: A C T I O N; F_DESTNATION_IP : (D E S T N A T I O N '.' I P | D S T '.' I P); F_DESTNATION_NAME : (D E S T N A T I O N '.' N A M E | D E S T N A T I O N '.' N A M E); F_DESTNATION_IS_ANY : (D E S T I N A T I O N '.' I S A N Y | D S T '.' I S A N Y); F_SOURCE_IP : (S O U R C E '.' I P | S R C '.' I P); F_SOURCE_NAME : (S O U R C E '.' N A M E | S R C '.' N A M E); F_SOURCE_USER : (S O U R C E '.' U S E R | S R C '.' U S E R); F_SOURCE_IS_ANY : (S O U R C E '.' I S A N Y | S R C '.' I S A N Y); F_SERVICE_PORT : (S E R V I C E '.' P O R T | S V C '.' P O R T); F_SERVICE_PROTOCOL : (S E R V I C E '.' P R O T O C O L | S V C '.' P R O T O C O L); F_SERVICE_IS_ANY : (S E R V I C E '.' I S A N Y | S V C '.' I S A N Y); F_DEVICE_NAME : D E V I C E '.' N A M E; F_SECTION : S E C T I O N; F_TABLE : T A B L E; F_DEVICE_ID : D E V I C E '.' I D; F_DESCRIPTION : D E S C R I P T I O N; F_ENABLED : E N A B L E D; F_DATASOURCE : D A T A S O U R C E; F_HITCOUNT : H I T C O U N T; F_UNIQUEKEY : U N I Q U E K E Y; F_LOG_OPTION : L O G O P T I O N; F_SRC_ZONE : (S R C Z O N E | S O U R C E Z O N E); F_DST_ZONE : (D S T Z O N E | D E S T N A T I O N Z O N E); F_SRC_NEGATED: (S R C '.' N E G A T E D| S O U R C E '.' N E G A T E D); F_DST_NEGATED: (D S T '.' N E G A T E D| D E S T N A T I O N '.' N E G A T E D); F_SVC_NEGATED: (S E R V I C E '.' N E G A T E D| S V C '.' N E G A T E D); F_SCHEDULE_NAME: S C H E D U L E '.' N A M E; F_PAGE: (P A G E | P); F_SIZE: (S I Z E | S); IDENTIFIER : '"' (~'"' | '""')* '"' | '`' (~'`' | '``')* '`' | '[' ~']'* ']' | [a-zA-Z_] [a-zA-Z_0-9.\-]* // TODO check: needs more chars in set | '-' | [A-Z]+ '-' [0-9]+ // ex) KEY-### ; STRING_LITERAL : '\'' ('\\'. | '\'\'' | ~('\'' | '\\'))* '\'' | '"' ( '\\'. | '""' | ~('"'| '\\') )* '"' ; COMMENT : '/*' .*? '*/' -> skip ; LINE_COMMENT : '//' ~[\r\n]* -> skip ; SPACES : [ \u000B\t\r\n] -> channel(HIDDEN) ; fragment DIGIT : [0-9]; fragment A : [aA]; fragment B : [bB]; fragment C : [cC]; fragment D : [dD]; fragment E : [eE]; fragment F : [fF]; fragment G : [gG]; fragment H : [hH]; fragment I : [iI]; fragment J : [jJ]; fragment K : [kK]; fragment L : [lL]; fragment M : [mM]; fragment N : [nN]; fragment O : [oO]; fragment P : [pP]; fragment Q : [qQ]; fragment R : [rR]; fragment S : [sS]; fragment T : [tT]; fragment U : [uU]; fragment V : [vV]; fragment W : [wW]; fragment X : [xX]; fragment Y : [yY]; fragment Z : [zZ];