不要在antlr4语法中传递字符串

时间:2016-08-14 09:00:07

标签: parsing grammar antlr4

我已经创建了语法(请参见下文),当我尝试验证字符串

  

时间; 15 16 * * 1-5; ' muni_eval_comments _' YYYYMMDD_HHMMSS'的.csv&#39 ;;

有以下错误消息

  

第1行:,charPositionInLine:57,msg:无关输入' .csv'期待{&#39 ;;',' - ',''','。',' _& #39;,ID}

我错在哪里以及如何解决?

此致 弗拉基米尔

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

答案 0 :(得分:0)

您的.csv代码片段已被识别为REGEX令牌:

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

file_name不包含REGEX令牌:

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

尝试将REGEX添加到file_name规则或删除REGEX并改为使用regEx解析器规则:

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