0
votes

I have create the grammar(see it bellow) and when I try to validate the string

Time;15 16 * * 1-5; 'muni_eval_comments_'yyyyMMdd_HHmmss'.csv';

have following error message

line 1:, charPositionInLine:57, msg: extraneous input '.csv' expecting {';', '-', ''', '.', '_', ID}

Where I'm wrong and how to fix it?

Regards, Vladimir

lexer grammar FileTriggerLexer;

@header { 
 }

STEP
:
    '/' INTEGER
;

SCHEDULE
:
    'Schedule'
;

SEMICOLON
:
    ';'
;

ASTERISK
:
    '*'
;

CRON
:
    'cron'
;

MARKET_CRON
:
    'marketCron'
;

COMBINED
:
    'combined'
;

FILE_FEED
:
    'FileFeed'
;

TIME: 'Time';

LBRACKET
:
    '('
;

RBRACKET
:
    ')'
;

PERCENT
:
    '%'
;

INTEGER
:
    [0-9]+
;


DASH
:
    '-'
;

DOUBLE_QUOTE
:
    '"'
;

QUOTE
:
    '\''
;

SLASH
:
    '/'
;

DOT
:
    '.'
;

COMMA
:
    ','
;

UNDERSCORE
:
    '_'
;

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

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

WS
:
    [ \t\r\n]+ -> skip
; 
/**
 * Define a grammar called Hello
 */
grammar FileTriggerValidator;

options
   {
    tokenVocab = FileTriggerLexer;
}

r
:
    (
        schedule
        | file_feed
        | time_feed
    )+
;

time_feed
:
    TIME SEMICOLON cron_part SEMICOLON file_name SEMICOLON
;

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 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
:
    (
        ID
        | DOT
        | QUOTE
        | DASH
        | UNDERSCORE
    )+
;

cron_list_element
:
    cron
    | market_cron
;
//

schedule_defined_string
:
    cron
;
// 

cron_part
:
    minutes hours days_of_month month week_days
;
//

minutes
:
    INTEGER
    | with_step_value
;
//

hours
:
    INTEGER
    | with_step_value
;
//

int_list
:
    INTEGER
    (
        COMMA INTEGER
    )*
;

interval
:
    INTEGER DASH INTEGER
;
//

days_of_month
:
    INTEGER
    | with_step_value
;
//

month
:
    INTEGER
    | with_step_value
;
//

week_days
:
    INTEGER
    | with_step_value
;
//

timezone
:
    timezone_part
    (
        SLASH timezone_part
    )?
;
//

timezone_part
:
    ID
    (
        UNDERSCORE ID
    )?
;
//

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

1 Answers

0
votes

Your .csv code fragment has been recognized as REGEX token:

TIME SEMICOLON(;) INTEGER(15) INTEGER(16) ASTERISK(*) ASTERISK(*) 
INTEGER(1) DASH(-) INTEGER(5) SEMICOLON(;) QUOTE(') ID(muni) UNDERSCORE(_)
ID(eval) UNDERSCORE(_) ID(comments) UNDERSCORE(_) QUOTE(') ID(yyyyMMdd)  
UNDERSCORE(_) ID(HHmmss) QUOTE(') REGEX(.csv) QUOTE(') SEMICOLON(;) EOF(<EOF>) EOF

But file_name does not contain REGEX token:

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

Try to include REGEX to file_name rule or remove REGEX and use regEx parser rule instead:

regEx
:
    (
        ID
        | DOT
        | ASTERISK
        | INTEGER
        | PERCENT
    )+
;