2010-04-21 8 views
1

Comment spécifier un nombre de chiffres fixe dans la grammaire antlr?Format de nombre fixe dans ANTLR

Je souhaite analyser une ligne contenant des champs d'un nombre fixe de caractères. Chaque champ est un nombre.

0034 | 9056 | 4567 | 0987 | -2340 | +345 | 1000

La ligne ci-dessus est un exemple de ligne. | indique les limites des champs (qui ne seront pas dans le fichier actuel, montrés ici juste pour indiquer la limite).

Les champs peuvent inclure des caractères blancs +/-

Répondre

-1

Qu'en est-ce qui suit:

INT : ('+'|'-')? ('0'..'9')+; 
+0

Cela ne correspond pas à un nombre fixe de caractères, mais un nombre arbitraire (> 0). –

1

je garderais la grammaire lexer aussi simple que possible et juste correspondre à zéro ou plusieurs espaces suivis d'un signe facultatif suivi d'un nombre dans votre grammaire de l'analyseur. Après avoir fait correspondre cela, vérifiez (dans votre grammaire de l'analyseur) si la "largeur" ​​du champ est correcte.

Un exemple grammaire:

line 
    : field ('|' field)* 
    ; 

field 
    : Spaces? ('+' | '-')? Number // validate if 'field' is correct in this rule 
    ; 

Number 
    : '0'..'9'+ 
    ; 

Spaces 
    : ' '+ 
    ; 

Et un système de validation possible pourrait ressembler à:

line 
    : field ('|' field)* 
    ; 

field 
@init{int length = 0;} 
    : (Spaces {length += $Spaces.text.length();})? 
    ('+' | '-')? Number {length += $Number.text.length(); if(length != 4) {/* do something */}} 
    ; 

Number 
    : '0'..'9'+ 
    ; 

Spaces 
    : ' '+ 
    ;