2013-01-23 2 views
3

J'ai fait de mon mieux pour inclure toutes (et seulement) les informations nécessaires. Faites-moi savoir si voir plus pourrait vous aider à m'aider.erreur logique de flex/C++ regex

J'ai des problèmes avec mon regex. Mon programme imprime dans un fichier .txt lexème - paires de jetons. Tout fonctionne correctement, sauf pour les identificateurs et les entiers. Par exemple, le jeton pour un identifiant est 262.

fichier d'entrée de l'échantillon:

function main a: integer returns integer; 
    b: integer is a * 2; 

Exemple de sortie:

function - 269 
maina - 262 
integer - 272 
returns - 274 
integer - 272 
; - 59 
b - 262 
integer - 272 
is - 271 
a - 262 
2 - 263 
; - 59 

sortie correcte serait:

function - 269 
main - 262 
a - 262 
: - 58 
integer - 272 
returns - 274 
integer - 272 
; - 59 
b - 262 
: - 58 
integer - 272 
is - 271 
a - 262 
* - 261 
2 - 263 
; - 59 

Résumer , il combine deux identifiants séparés par un espace blanc, et il supprime également tout jeton après l'identifiant.

Répondre

1

Vous venez d'oublier de mettre des accolades autour de certains des noms. Au lieu de

{letter}(letter|digit)* 

vous devriez écrire

{letter}({letter}|{digit})* 

Vous devez également déplacer les règles de fonction, entier et retours avant la règle pour identifier, étant donné que la règle de correspondance d'identification ceux aussi.

+0

Votre commentaire sur la façon de mettre les mots-clés avant l'identificateur a été utile, mais le fait de caler les noms n'a pas changé les problèmes de sortie. –

+0

Peu importe. Je suis revenu à ma vieille fonction en utilisant vos corrections regex et cela a fonctionné. Merci! –