gpt4 book ai didi

error-handling - ANTLR4语法无法识别20为数字

转载 作者:行者123 更新时间:2023-12-03 08:26:50 26 4
gpt4 key购买 nike

我创建了以下语法(请在下面查看),当我解析以下字符串时

"Schedule;cron(\"*/3 * * * * America/New_York\");'TestFile'yyyy-M-dd-HH-mm;America/New_York;20"



避难所错误消息

"line 1:89: mismatched input '20' expecting NUMBER"




奇怪,就我的观点而言:[0-9] +;将允许“20”。我哪里错了?

问候,
弗拉基米尔
    lexer grammar FileTriggerLexer;

@header {
}

STEP
:
'/' INTEGER
;

SCHEDULE
:
'Schedule'
;

SEMICOLON
:
';'
;

ASTERISK
:
'*'
;

CRON
:
'cron'
;

MARKET_CRON
:
'marketCron'
;

COMBINED
:
'combined'
;

FILE_FEED
:
'FileFeed'
;

LBRACKET
:
'('
;

RBRACKET
:
')'
;

PERCENT
:
'%'
;

INTEGER
:
[0-9]+
;

MINUTES_INTERVAL
:
[1-59]
;

HOURS_INTERVAL
:
[0-23]
;

WEEK_DAYS_INTERVAL
:
[1-7]
;

MONTH_INTERVAL
:
[1-12]
;

DAYS_OF_MONTH_INTERVAL
:
[1-31]
;

DASH
:
'-'
;

NUMBER
:
[0-9]+
;



DOUBLE_QUOTE
:
'"'
;

QUOTE
:
'\''
;

SLASH
:
'/'
;

DOT
:
'.'
;

COMMA
:
','
;

UNDERSCORE
:
'_'
;

ID
:
[a-zA-Z] [a-zA-Z0-9]*
;



REGEX
:
(
ID
| DOT
| ASTERISK
| NUMBER
|PERCENT
)+
;

WS
:
[ \t\r\n]+ -> skip
; // skip spaces, tabs, newlines

/**
* Define a grammar called Hello
*/
grammar FileTriggerValidator;

options
{
tokenVocab = FileTriggerLexer;
}

r
:
(schedule
| file_feed)+
;

expression
:
schedule
| file_feed
;

file_feed
:
file_feed_name SEMICOLON source_file SEMICOLON source_host SEMICOLON
source_host SEMICOLON regEx SEMICOLON regEx
(
SEMICOLON source_host
)*
;

formatString
:
source_host
(
'%' source_host?
)* DOT source_host
;

regEx
:
REGEX
;

source_host
:
ID
(
DASH ID
)*
;

file_feed_name
:
FILE_FEED
;

source_file
:
(
ID
| DASH
| UNDERSCORE
)+
;

schedule
:
SCHEDULE SEMICOLON schedule_defining SEMICOLON file_name SEMICOLON timezone

(
SEMICOLON NUMBER
)?
;

schedule_defining
:
cron
| market_cron
| combined_cron
;

cron
:
CRON LBRACKET DOUBLE_QUOTE cron_part timezone DOUBLE_QUOTE RBRACKET
;

market_cron
:
MARKET_CRON LBRACKET DOUBLE_QUOTE cron_part timezone DOUBLE_QUOTE COMMA
DOUBLE_QUOTE ID DOUBLE_QUOTE RBRACKET
;

combined_cron
:
COMBINED LBRACKET cron_list_element
(
COMMA cron_list_element
)* RBRACKET
;

mic_defining
:
ID
;

file_name
:
(
ID
| DOT
| QUOTE
| DASH
)+
;

cron_list_element
:
cron
| market_cron
;
//

schedule_defined_string
:
cron
;
//

cron_part
:
minutes hours days_of_month month week_days
;
//

minutes
:
MINUTES_INTERVAL
| with_step_value
;
//

hours
:
HOURS_INTERVAL
| with_step_value
;
//

int_list
:
INTEGER
(
COMMA INTEGER
)*
;

interval
:
INTEGER DASH INTEGER
;
//

days_of_month
:
DAYS_OF_MONTH_INTERVAL
| with_step_value
;
//

month
:
MONTH_INTERVAL
| with_step_value
;
//

week_days
:
WEEK_DAYS_INTERVAL
| with_step_value
;
//

timezone
:
timezone_part
(
SLASH timezone_part
)?
;
//

timezone_part
:
ID
(
UNDERSCORE ID
)?
;
//

with_step_value
:
(
int_list
| interval
| ASTERISK
) STEP?
;
//

最佳答案

您基本上犯了#1词法分析器错误。

Lexer规则定义了priority rules,在您的情况下INTEGER规则优先于NUMBER。两者具有相同的定义,因此无论如何您都可以简单地将所有NUMBER出现替换为INTEGER

请注意,您的*_INTERVAL规则定义并不代表您的想法。例如DAYS_OF_MONTH_INTERVAL(定义为[1-31])将匹配1-31范围内的一位数字,这意味着它将匹配123中的任何一个,而不会匹配其他任何内容。就像您的INTEGER规则一样,它被NUMBER规则遮盖了。

删除所有这些*_INTERVAL规则,并仅保留INTEGER规则。请记住,词法化是一个独立的过程,而解析器对此没有任何影响。不要尝试在语法中验证您的cron表达式,您会遇到很多困难。首先,解析您的文件,然后对结果执行单独的验证传递。

关于error-handling - ANTLR4语法无法识别20为数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38917035/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com