2009-05-20 1 views
1

私は中程度のサイズの言語用の文法を書いていますが、hh:mm:ssという形式の時間リテラルを実装しようとしています。ANTLR:他の数値リテラルも可能な場合の2桁の数字の解析

ただし、たとえば12:34:56timeLiteralとして解析しようとすると、数字のトークンの不一致が発生します。誰かが私が間違っていることを知っていますか?ここで

は、関連するルールは、現在定義された通りである:

timeLiteral 
    : timePair COLON timePair COLON timePair -> ^(TIMELIT timePair*) 
    ; 

timePair 
    : DecimalDigit DecimalDigit 
    ; 

NumericLiteral 
    : DecimalLiteral 
    ; 

fragment DecimalLiteral 
    : DecimalDigit+ ('.' DecimalDigit+)? 
    ; 

fragment DecimalDigit 
    : ('0'..'9') 
    ; 

答えて

3

問題はレクサーはDecimalDigitをgobblingとNumericLiteralを返しているということです。

パーサーはフラグメントルールであるため、DecimalDigitsを表示しません。

timeLiteralをレクサー(名前を大文字にする)に移動することをお勧めします。だから、あなたは何かを持っているだろう

timeLiteral 
    : TimeLiteral -> ^(TIMELIT TimeLiteral*) 
    ; 

number 
    : DecimalLiteral 
    ; 

TimeLiteral 
    : DecimalDigit DecimalDigit COLON 
     DecimalDigit DecimalDigit COLON 
     DecimalDigit DecimalDigit 
    ; 

DecimalLiteral 
    : DecimalDigit+ ('.' DecimalDigit+)? 
    ; 

fragment DecimalDigit 
    : ('0'..'9') 
    ; 

レクサーとパーサーは完全に独立していることに注意してください。レクサーは、どのトークンがパーサーに渡されるかを決定します。、次にパーサがそれらをグループ化します。

関連する問題