Antlr4:意外解析

时间:2016-08-30 13:30:06

标签: antlr antlr4

所有我都开发了ANTR4语法。在解析字符串

期间
  

时间; 25 10 * * *;'faccalc_minus1_cron.out.'yyyyMMdd.HHmm; America / New_York

我有以下错误

  

表达式中的字符无效!表达:;'无效的字符:;'   无关的输入';'期待{'',INTEGER,' - ','/',','}   失踪 ';'在 '_'   时区格式不正确:faccalc_minus1

我没有理解为什么,因为正则表达式规则包含'_'。

如何解决?

此致 弗拉基米尔

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 个答案:

答案 0 :(得分:1)

要分析此类问题,请转储令牌流以查看词法分析器实际执行的操作。要直接转储令牌,请参阅此answer。例如,AntlrDT还提供了相应解析树的图形分析(我是AntlrDT的作者)。

FileTriggerParser - ParseTree

由此可以很容易地看出with_step_value规则中出现第一个错误:不允许使用尾随分号。

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