2016-08-14 11 views
0

antlr4文法で文字列を渡さないでください(それは怒鳴る参照)、私は、文字列を検証しようとすると、私は文法を作成する必要があり

時間; 15 16 * * 1-5。 'muni_eval_comments_'yyyyMMdd_HHmmss'.csv'; 'の.csv' 外来入力{期待 ';'、 ' - '、 ' '''、57、MSG:

はエラーメッセージを

ライン1 :, charPositionInLineを以下ています。 '_'、ID}

どこが間違っていて、それを修正するのですか?

よろしく、 ウラジミール

あなた .csvコードフラグメントはREGEXトークンとして認識されている
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? 
; 

答えて

0

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

に試してみてください: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を01を含むfile_nameにルールやREGEXを削除し、代わりにregExパーサー規則を使用します。

regEx 
: 
    (
     ID 
     | DOT 
     | ASTERISK 
     | INTEGER 
     | PERCENT 
    )+ 
; 
関連する問題