2016-12-19 2 views
-1

Les règles de lexer doivent-elles être non ambiguës dans Antlr4?Gammes de chiffres dans Antlr4? Les règles de lexer devraient-elles être non ambiguës dans Antlr4?

Supposons que je voudrais analyser les dates et définies

hour: DIGIT09 | (DIGIT1 DIGIT09) | (DIGIT2 DIGIT04); 

month: DIGIT19 | (DIGIT1 DIGIT02); 

DIGIT12: '1'..'2'; 

DIGIT1: '1'; 

DIGIT2: '2'; 

DIGIT19: '1'..'9'; 

DIGIT09: '0'..'9'; 

DIGIT04: '0'..'4'; 

DIGIT04: '0'..'2'; 

Ici, je défini des plages de chiffres dans lexer. Mais il semble que cela ne fonctionne pas, car ils sont ambigus. Puis-je définir des plages dans l'analyseur au lieu de lexer?

Répondre

1

Ce type de validation est mieux exécuté dans un écouteur ou un visiteur qui s'exécute après la création d'une arborescence d'analyse. Commençons avec un simple numéro:

NUMBER : [0-9]+; 

ensuite définir hour et month basé sur ce point:

hour : NUMBER; 
month : NUMBER; 

Une fois que vous avez un arbre d'analyse syntaxique, mettre en œuvre enterHour et enterMonth pour valider que le NUMBER contenu dans chacun est valide .

Cette approche fournit la meilleure combinaison de récupération d'erreur et de signalisation d'erreur dans le cas où l'utilisateur entre une entrée incorrecte.

+0

Ai-je une valeur prête sur 'enter'? Ne devrais-je pas le faire dans 'exit'? Comment dois-je rapporter le résultat du test? – Dims