2012-08-30 9 views
7

Cela devrait être assez simple. Je travaille sur une grammaire lexer en utilisant ANTLR, et je veux limiter la longueur maximale des identifiants de variables à 30 caractères. Je tentais d'y arriver avec cette ligne (ci-dessous regex normale - à l'exception de la « » chose - la syntaxe):Syntaxe de quantificateur de plage dans ANTLR Regex

ID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'){0,29} {System.out.println("IDENTIFIER FOUND.");} 
    ; 

Aucune erreur dans la génération de code, mais la compilation a échoué en raison d'une ligne dans le code généré qui était tout simplement :

0,29

il est évident que antlr est de prendre la section de texte entre les crochets et le placer dans l'accepter zone d'état ainsi que la ligne d'impression. J'ai recherché le site ANTLR, et je n'ai trouvé aucun exemple ou référence à une expression équivalente. Quelle devrait être la syntaxe de cette expression?

Répondre

8

ANTLR ne prend pas en charge la syntaxe de quantificateur {m,n}. ANTLR voit le {} de votre quantificateur et ne peut pas les distinguer des {} qui entourent vos actions.

Solutions:

  1. Faire respecter la limite sémantiquement. Laissez-le rassembler un ID de taille illimitée, puis le déposer/tronquer dans le cadre de votre code d'action ou plus tard dans le compilateur.
  2. Créez les règles de quantification manuellement.

Voici un exemple d'une règle manuelle qui limite les ID à 8.

SUBID : ('a'..'z'|'A'..'Z'|'0'..'9'|'_') 
     ; 
ID : ('a'..'z'|'A'..'Z') 
    (SUBID (SUBID (SUBID (SUBID (SUBID (SUBID SUBID?)?)?)?)?)?)? 
    ; 

Personnellement, je partirais avec la solution sémantique (# 1). Il y a très peu de raisons ces jours-ci de limiter les identifiants dans une langue, et encore moins de provoquer une erreur de syntaxe (abandon prématuré de la compilation) lorsqu'une telle règle est violée.

+0

Nous vous remercions de votre aide. – user1634761

+1

Si ANTLR était utilisé uniquement pour générer des compilateurs pour les langages de programmation, il pourrait y avoir peu d'utilité pour les quantificateurs. Mais une grammaire (schéma) pour valider n'importe quel type de données structurées en a certainement besoin - les numéros de carte de crédit sont 16 chiffres, pas 13 ou 25. Le livre ANTLR4 possède des grammaires JSON et XML, mais sans contraintes de jeton de base La grammaire ANTLR en tant que version abstraite (indépendante du codec) de JSON Schema et XSD. – Dave

+0

"Il y a très peu de raisons aujourd'hui de limiter les identifiants dans une langue" - cela ne signifie pas qu'aucune langue n'existe avec des identifiants limités, ni que les gens pourraient vouloir écrire des parseurs pour eux. –

Questions connexes