Domanda

Devo definire la grammatica di un file come quella mostrata di seguito.

// File di esempio
NameCount = 4
Nome = a
Nome = b
Nome = c
Nome = d
// Fine del file

Ora sono in grado di definire i token per Nome account e Nome . Ma devo definire la struttura del file incluso il numero valido di istanze di token Nome , che è il valore dopo Nome account . Ho il valore analizzato e convertito in un numero intero e memorizzato in una variabile nell'ambito globale della grammatica (diciamo nella variabile nc ).

Come definire in grammatica che Nome dovrebbe ripetere esattamente nc volte?

È stato utile?

Soluzione

Questo non può essere espresso nella grammatica stessa. Se il numero è stato corretto, è possibile esprimere il numero di token previsti. Ma il flusso di token cambia in base al valore. Quello che puoi fare è includerlo nella combinazione lexer / parser. Ma non puoi creare questo costrutto solo con la semplice sintassi grammaticale. Probabilmente vuoi qualcosa del genere

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++;
      }
...

Altri suggerimenti

Non sono sicuro che si tratti di una grammatica senza contesto. In caso contrario, non puoi dire a ANTLR di analizzare la lingua.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top