2009-10-28 9 views
10

Ho aiutato ad aumentare un linguaggio proprietario di vent'anni nella mia azienda. È un linguaggio ampio, completo di Turing. Traducendolo in un altro regime grammaticale (come Antlr) non è un'opzione (non posso decidere di farlo).Ci sono debugger di grammatica Yacc?

Per la maggior parte, l'estensione della grammatica è avvenuta senza intoppi. Ma una volta ogni tanto vado a prendere un ridurre-ridurre o shift-ridurre tale

  • è difficile da eliminare
  • a volte solo non ha senso (per il mio cervello debole)

Dopo aver guardato con molta attenzione i file y.output e i refactories della grammatica sperimentale, di solito ho ottenuto dove volevo andare. A volte ho dovuto scendere a compromessi insoddisfacenti.

Quindi, ci sono strumenti là fuori che possono risucchiare una grammatica yacc, che migliora la navigazione, sperimenta e consente il debug delle modifiche?

Se aggiungo una produzione, mi piacerebbe vedere più della "produzione atomica che viene utilizzata ovunque" (think identifier) ​​"conflitti con la regola foo" (sì, ci sono più informazioni, s/r, r/r, che, ma penso che tu prenda la mia direzione). Sarebbe bello avere qualche accenno all'interazione oltre a mettere il mio cappuccio pensante e provare a immaginare uno stack di simboli e una macchina a stati.

Aggiornamento: Credo che dovrei chiarire. Usiamo Berkeley Yacc. Ho provato usando una versione recente di Bison. Per l'output, ho compilato la grammatica con --report = set di articoli.

Il mio obiettivo con questo post è quello di cercare esterni strumenti che potenziati le strutture grammaticali di debug che nave con Yacc. Oggi è doloroso con il set predefinito. Aiutami a trovare strumenti interattivi migliori, come quelli che puoi utilizzare con Antlr.

risposta

7

È potrebbe avere un aiuto da yacc -d, che produce debug - dà fondamentalmente una lista completa degli stati simbolo di stack e così via. L'output è denso e voluminoso, quindi cercare di leggerlo tutto raramente porta a termine molto (mai per me comunque). Tuttavia, quando apporti una modifica (ad esempio, dà un conflitto r/r, puoi eseguire yacc -d sulla grammatica precedente e quella nuova, quindi eseguire diff sui risultati, per ottenere un run-down molto più dettagliato su cosa cambiamento (s) ha causato il conflitto.

Probabilmente vale la pena notare che i conflitti s/r sono spesso benigni - a meno che non si sia certi che si tratti di un problema, provare a "sistemarlo" spesso non vale la pena. Lo stesso non è vero con i conflitti r/r però. Mentre questi sono a volte benigni, è relativamente raro.

Modifica: Spiacenti, questo dovrebbe essere -v. Hai menzionato y.output, quindi a quanto pare sai già come fare quella parte. Il punto è che non provi a guardare direttamente i file y.output, ma fai una differenza tra quello che è uscito pulito e quello che non ha ottenuto dettagli sul conflitto reale (senza guardare a 10 jillion lines of "stuff" va benissimo

+0

Non sono sicuro di cosa intendi. Con entrambi i nostri yacc, -d significa "genera un file di intestazione per le macro token". Ho appena aggiunto ulteriori informazioni sull'utilizzo dello switch --report = set di elementi. È questo il genere di cosa che intendi? Genera un file, y.output pieno di tutte le informazioni sulla transizione di stato. Lo sto usando, ma speravo in uno strumento interattivo più potente. –

+1

Jerry ha ragione, i conflitti S/R non sono necessariamente bug. Quasi ogni vera grammatica ha un sacco di loro. – DigitalRoss