2016-09-01 34 views
0

すべて。私はANTLR4文法は、文の一部のみを受け入れる。

* * 5、私は文字列を解析

00 */3,5私の問題を発見するためにアメリカ/ニューヨーク

を文法(大きな文法のそれの一部)を作成しました

4入力でのノー実行可能な代替 '/'
0123を:私は

ライン1の例外を以下しています

私が発見したように、問題は部分文字列/3,5が "with_step_value"ルールで完全に解析されるということです。パーサーは最初のsybmbolだけを取得します。しかし、なぜ?私は理解しているように、ANTLR「with_step_value」ルールに満足ビューの私のpoindで「/3,5」彼ができると列として

だから、なぜそれのhappendsとどのようにそれを修正する限り、文字列を解析してみては?

よろしく、 ウラジミール

してくださいは、文法や絵が

/*File trigger validator lexer */ 
lexer grammar CronPartLexer; 


INT_LIST: INTEGER (COMMA INTEGER)* ; 
INTERVAL 
: 
    INTEGER DASH INTEGER 
; 

INTEGER 
: 
    [0-9]+ 
; 

DASH 
: 
    '-' 
; 


SLASH 
: 
    '/' 
; 

COMMA 
: 
    ',' 
; 

UNDERSCORE 
: 
    '_' 
; 


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

ASTERISK:'*'; 

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


grammar CronPartValidator; 

options 
    { 
    tokenVocab = CronPartLexer; 
} 

cron_part 
: 
    minutes hours days_of_month month week_days time_zone?; 

    minutes 
: 
    with_step_value 
; 


time_zone 
: 
    timezone_part 
    (
     SLASH timezone_part 
    )? 
; 

timezone_part 
: 
    ID 
    (
     UNDERSCORE ID 
    )? 
; 


hours 
: 
    with_step_value 
; 
// 

// 

days_of_month 
: 
    with_step_value 
; 
// 

month 
: 
    with_step_value 
; 
// 

week_days 
: 
    with_step_value 
; 


with_step_value: 
    INT_LIST|ASTERISK|INTERVAL ((SLASH INT_LIST)?) 
; 

Parse Tree of the full string

Parse Tree of "with_step_value" "*/3,5"

+0

'cron_part'ルールは無効であると定義された' minute'ルールはありません。また、2つの画像は実際には同じです。投稿された文法が実際に報告された問題を再現することを確認してください。 – GRosenberg

+0

申し訳ありませんが、私は "分"ルールを意味します。私は文法でそれを持っている –

答えて

0

ルール

with_step_value: INT_LIST|ASTERISK|INTERVAL ((SLASH INT_LIST)?) ; 
を怒鳴る見ます

は、INT_LISTまたはASTERISKまたはINTERVAL (SLASH INT_LIST)?にのみ一致します。

おそらくこれは、意図したものである。

with_step_value 
    : (INT_LIST 
     | ASTERISK 
     | INTERVAL 
    ) (SLASH INT_LIST)? 
    ; 

enter image description here

関連する問題