Question

Je dois définir la grammaire d'un fichier comme celui présenté ci-dessous.

// Fichier d'exemple
NameCount = 4
Nom = un
Nom = b
Nom = c
Nom = d
// Fin de fichier

Je peux maintenant définir des jetons pour NameCount et Nom . Mais je dois définir la structure du fichier, y compris le nombre valide d'instances de jeton Nom , qui correspond à la valeur après NameCount . J'ai la valeur analysée et convertie en un entier et stockée dans une variable de portée globale de la grammaire (disons dans la variable nc ).

Comment définir dans la grammaire que Nom doit être répété exactement nc ?

Était-ce utile?

La solution

Cela ne peut pas être exprimé dans la grammaire elle-même. Si le nombre était fixe, vous pouvez exprimer le nombre de jetons attendus. Mais le flux de jetons change en fonction de la valeur. Ce que vous pouvez faire est d’inclure cela dans la combinaison lexer / analyseur. Mais vous ne pouvez pas créer cette construction uniquement avec la syntaxe de grammaire simple. Vous voulez probablement quelque chose dans le sens de

grammar test;

@members {
  private int count = 0;
  private int names = 0;
}

file
    : count (name)+
      {
        if (count != names) throw new Exception("");
      }
    ;

count
    : 'NameCount' EQ Number
      {
        count = Integer.parseInt($Number.text);
      }
    ;

name
    : 'Name' EQ Value
      {
        names++;
      }
...

Autres conseils

Je ne suis pas sûr qu'il s'agisse d'une grammaire sans contexte. Si ce n’est pas le cas, vous ne pouvez pas demander à ANTLR d’analyser la langue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top