2009-08-14 7 views
1

Supposons que j'ai une expression régulière lex commeLes conditions d'erreur de gestion dans Lex plutôt que Yacc?

[aA][0-9]{2,2}[pP][sS][nN]? { return TOKEN; } 

Si un utilisateur entre

A75PsN 
A75PS 

Il égalera

Mais si un utilisateur dit quelque chose comme

A75PKN 

I voudrait qu'il erreur et dise "Caractère K non reconnu, attend S "

Ce que je fais en ce moment est juste en train d'écrire comme

let [a-zA-Z] 
num [0-9] 

{let}{num}{2,2}{let}{2,3} 

Et puis essentiellement re-lexing la chaîne en Yacc pour que je puisse avoir des conditions d'erreur significatives

Comment puis-je contourner ce?

La seule chose que je peux penser est d'utiliser des groupes nommés?

Répondre

2

Wow! Schéma intéressant.

Si vous voulez détecter cela dans l'analyseur lexical, vous devez avoir une règle fourre-tout qui traite de «toute chaîne autrement non reconnue» et produit un message d'erreur.

Déterminer que c'était le K qui a causé le problème va être un enfer.

[^aA][0-9]{2,2}[pP][sS][nN]? { report_error(); return ERROR; } 
[aA][0-9]{2,2}[^pP][sS][nN]? { report_error(); return ERROR; } 
[aA][0-9]{2,2}[pP][^sS][nN]? { report_error(); return ERROR; } 
[aA][0-9]{2,2}[pP][sS][^nN] { report_error(); return ERROR; } 

Notez la mise en place des carets et l'absence de point d'interrogation! Traiter des non-chiffres, ou trop de chiffres, ou trop peu de chiffres - urgh!

En général, vous seriez mieux de reconnaître tous les « identifiants » puis valider ceux qui sont OK:

[a-zA-Z][0-9]{2,2}[a-zA-Z]{2,5} { return validate_id_string(); } 

Choisissez votre poison ce que vous autorisez dans la routine de validation; il décide si ce qui a été entré est OK ou non, et sa valeur de retour contrôle ce que la règle Lex renvoie à la grammaire. C'est une façon de distinguer les mots-clés des identifiants aussi.

Généraliser et simplifier l'expression régulière en fonction de ce qui se passe réellement.

+0

Très bonne réponse. Ne devrait pas valider_id_string() être comme validate_id_string (yytext) ?? Passer dans le yytext pour valider? – DevDevDev

+0

@DevDevDev: transmettre yytext est optionnel puisque yytext est global. Cela dépend en partie si vous utiliserez la fonction ailleurs. Oui, les paramètres sont meilleurs que les globaux. Mais j'illustre la technique générale, pas les subtilités minutieuses du bon style de codage. –

+0

Merci! Je n'essayais pas de commenter le style de codage que je me demandais si vous vouliez dire validate_id_string accéderait à yytext. – DevDevDev

Questions connexes