当前位置: 首页 > 知识库问答 >
问题:

Antlr4:意外解析

公良玺
2023-03-14

我所开发的ANTR4语法。在解析字符串期间

时间;25 10 * * *;' faccalc_minus1_cron.out.'yyyyMMdd。嗯;美国/New_York

我有以下错误

表达式中的字符无效!表达式:;'无效字符:;'无关输入“;”应为{“”,整数,“-”,“/”,“,”},缺少“;”“\uu”处的时区格式不正确:faccalc\u minus1

我不理解为什么,因为正则表达式规则包含“\u1”。

怎么修?

你好,弗拉基米尔

lexer grammar FileTriggerLexer;

CRON
:
    'cron'
;

MARKET_CRON
:
    'marketCron'
;

COMBINED
:
    'combined'
;

FILE_FEED
:
    'FileFeed'
;

MANUAL_NOTICE
:
    'ManualNotice'
;

TIME
:
    'Time'
;

MARKET_TIME
:
    'MarketTime'
;


SCHEDULE
:
    'Schedule'
;

PRODUCT
:
    'Product'
;

UCA_CLIENT
:
    'UCAClient'
;

APEX_GSM
:
    'ApexGSM'
;

DELAY
:
    'Delay'
;

CATEGORY
:
    'Category'
;

EXCHANGE
:
    'Exchange'
;

CALENDAR_EXCHANGE
:
    'CalendarExchange'
;

FEED
:
    'Feed'
;

RANGE
:
    'Range'
;

SYNTH
:
    'Synth'
;

TRIGGER
:
    'Trigger'
;

DELAYED_TRIGGER
:
    'DelayedTrigger'
;

INTRA_TRIGGER
:
    'IntraTrigger'
;

CURRENT_TRIGGER
:
    'CurrentTrigger'
;

CALENDAR_FILE_FEED
:
    'CalendarFileFeed'
;

PREVIOUS
:
    'Previous'
;

LATE_DELAY
:
    'LateDelay'
;

BUILD_ARCHIVE
:
    'BuildArchive'
;

COMPRESS
:
    'Compress'
;


LATE_TIME
:
    'LateTime'
;

CALENDAR_CATEGORY
:
    'CalendarCategory'
;

APEX_GPM
:
    'ApexGPM'
;

PORTFOLIO_NOTICE
:
    'PortfolioNotice'
;

FixedTimeOfDay: 'FixedTimeOfDay';

SEMICOLON
:
    ';'
;

ASTERISK
:
    '*'
;

LBRACKET
:
    '('
;

RBRACKET
:
    ')'
;

PERCENT
:
    '%'
;

INTEGER
:
    [0-9]+
;

DASH
:
    '-'
;

DOUBLE_QUOTE
:
    '"'
;

QUOTE
:
    '\''
;

SLASH
:
    '/'
;

DOT
:
    '.'
;

COMMA
:
    ','
;

UNDERSCORE
:
    '_'
;

EQUAL
:
    '='
;

MORE_THAN
:
    '>'
;

LESS
:
    '<'
;

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

WS
:
    [ \t\r\n]+ -> skip
; 


/**
 * Define Fied Trigger valdiator grammar
 */
grammar FileTriggerValidator;

options
   {
    tokenVocab = FileTriggerLexer;
}

r
:
    (
        schedule
        | file_feed
        | time_feed
        | market_time_feed
        | manual_notice
        | portfolio_notice
        | not_checked
    )+
;

not_checked
:
    (
        PRODUCT
        | UCA_CLIENT
        | APEX_GSM
        | APEX_GPM
        | DELAY
        | CATEGORY
        | CALENDAR_CATEGORY
        | EXCHANGE
        | CALENDAR_EXCHANGE
        | FEED
        | RANGE
        | SYNTH
        | TRIGGER
        | DELAYED_TRIGGER
        | INTRA_TRIGGER
        | CURRENT_TRIGGER
        | CALENDAR_FILE_FEED
        | PREVIOUS
        | LATE_DELAY
        | LATE_TIME
        | COMPRESS
        | BUILD_ARCHIVE
    )
    (
        SEMICOLON anyList
    )?
;

anyList
:
    anyElement
    (
        SEMICOLON anyElement
    )*
;

anyElement
:
    cron
    | file_name
    | with_step_value
    | source_file
    | timezone
    | regEx
;

portfolio_notice
:
    PORTFOLIO_NOTICE SEMICOLON regEx
;

manual_notice
:
    MANUAL_NOTICE SEMICOLON file_name SEMICOLON timezone
;

time_feed
:
    TIME SEMICOLON cron_part
    (
        timezone?
    ) SEMICOLON file_name SEMICOLON timezone
;

market_time_feed
:
    MARKET_TIME SEMICOLON cron_part timezone SEMICOLON file_name SEMICOLON
    timezone
    (
        SEMICOLON UNDERSCORE? INTEGER
    )*
;

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

regEx
:
    (
        ID
        | DOT
        | ASTERISK
        | INTEGER
        | PERCENT
        | UNDERSCORE
        | DASH
        | LESS
        | MORE_THAN
        | EQUAL
        | SLASH
        | LBRACKET
        | RBRACKET
        | DOUBLE_QUOTE
        | QUOTE
        | COMMA
    )+
;

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 DASH? INTEGER
    )*
;

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
:
    regEx
;

cron_list_element
:
    cron
    | market_cron
;
//

schedule_defined_string
:
    cron
;
// 

cron_part
:
    minutes hours days_of_month month week_days
;
//

minutes
:
    with_step_value
;

hours
:
    with_step_value
;
//

int_list
:
    INTEGER
    | interval
    (
        COMMA INTEGER
        | interval
    )*
;

interval
:
    INTEGER DASH INTEGER
;
//

days_of_month
:
    with_step_value
;
//

month
:
    with_step_value
;
//

week_days
:
    with_step_value
;
//

timezone
:
    timezone_part
    (
        SLASH timezone_part
    )?
;
//

timezone_part
:
    ID
    (
        UNDERSCORE ID
    )?
;
//

with_step_value
:
    (
        INTEGER
        | COMMA
        | SLASH
        | ASTERISK
        | DASH
    )+
;

step
:
    SLASH int_list
;

共有1个答案

丰岳
2023-03-14

要分析此类问题,请转储令牌流以查看lexer实际在做什么。要直接转储令牌,请参见此答案。例如,AntlrDT还提供了相应解析树的图形分析(我是AntlrDT的作者)。

由此可以很容易地看出,第一个错误出现在带有步骤值的规则中:不允许使用尾随分号。

第二个错误在timezone_part规则中:不允许重复出现ID UNDERSCORE

 类似资料:
  • 我的ANTLR4有问题。我正在尝试从python 3代码打印AST,但有一些错误,我不知道如何修复它们。 我编写了简单的测试代码: 我运行了程序,但出现了以下错误: 我的主要班级: 我有这个网站的语法:https://github.com/antlr/grammars-v4/tree/master/python3

  • 我有一个语法,当解析在一次传递(整个文件)很好。 现在我希望将解析分解成组件。并在子库上运行解析器。我遇到了一个问题,我假设其他解析子库的人会看到下面的规则: 当上面的规则从一个顶级的开始规则解析到EOF时,一切都很好。当解析为子规则(而不是解析为EOF)时,解析器在没有thing子句时会感到不安,因为它希望看到“,”字符或EOF字符。 第8行:0不匹配的输入“%”应为{,“,”} 当我解析到EO

  • 我试图以C#为目标,使用Antlr4解析一个日期。在我的情况下,有效日期应具有以下内容 采用格式 年份只能有4位数字 月和日只能有2位 我知道类似的问题已经出现了,但它们的解决方案似乎对我不起作用 如何创建将解析日期的antlr4语法 ANTLR:识别日期和数字的最简单方法? 我在某个地方读到过,有一种类似优先级的解析,其中基于语法文件如何编写的顶级规则首先被评估。因此,考虑一下,除了日期,我的语

  • 我正在研究一种上下文敏感的语法。下面是它的描述: 它描述表达式集。 每个表达式包含一个或多个由逻辑运算符分隔的部分。 每个部分由可选字段标识符组成,后面跟着一些比较运算符(也是可选的)和值列表。 值也用逻辑运算符分隔。 默认值为字符序列。有时(取决于上下文)可以扩展每个值的可能字符集。它甚至可以使用比较运算符(根据第三条规则,用于从值列表中分离字段标识符)来将其视为值的字符。 以下是语法的简化版本

  • 背景: 我使用JAXB将XML解组为Java对象。最初,我只是使用JAXB来执行解组。然后对代码进行静态分析,并提出了XML外部实体注入的高关键性问题。经过一点研究,我发现了一个建议(https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#JAXB_Unmarshaller)使用配置为防止解析

  • 问题内容: 我不明白为什么这几行 导致异常并打印 …而“不可解析的”时间与我传递给SimpleDateFormat()的格式字符串兼容。 问题答案: 这是一个区域设置问题。用: