2009-05-20 11 views
1

J'écris une grammaire pour un langage de taille moyenne, et j'essaie d'implémenter des littéraux de temps de la forme hh:mm:ss.ANTLR: Numérotation à 2 chiffres lorsque d'autres littéraux numériques sont également possibles

Cependant, chaque fois que j'essaie d'analyser, par exemple, 12:34:56 en tant que timeLiteral, j'obtiens des exceptions de jeton non concordantes sur les chiffres. Est-ce que quelqu'un sait ce que je peux faire mal?

Voici les règles pertinentes actuellement définies:

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

timePair 
    : DecimalDigit DecimalDigit 
    ; 

NumericLiteral 
    : DecimalLiteral 
    ; 

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

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

Répondre

3

Le problème est que le lexer engloutit le DecimalDigit et le retour d'un NumericLiteral.

L'analyseur ne verra jamais DecimalDigits car il s'agit d'une règle de fragment.

Je recommanderais de déplacer timeLiteral dans le lexeur (en capitalisant son nom). Donc, vous auriez quelque chose comme

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

number 
    : DecimalLiteral 
    ; 

TimeLiteral 
    : DecimalDigit DecimalDigit COLON 
     DecimalDigit DecimalDigit COLON 
     DecimalDigit DecimalDigit 
    ; 

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

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

Gardez à l'esprit que l'analyseur et sont lexer complètement indépendants. Le lexeur détermine quels jetons seront transmis à l'analyseur, puis l'analyseur arrive à les regrouper.