Come specificare il numero esatto di occorrenza di un token in ANTLR?
-
08-07-2019 - |
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?
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.