Domanda

Ho contribuito a migliorare un linguaggio proprietario di vent'anni all'interno della mia azienda. È un linguaggio ampio e completo di Turing. Tradurlo in un altro regime grammaticale (come Antlr) non è un'opzione (non posso decidere questo).

Per la maggior parte, l'estensione della grammatica è avvenuta senza intoppi. Ma ogni tanto riceverò una riduzione-riduzione o una riduzione-riduzione

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

Dopo un sacco di fissi dolorosi sui file y.output e sui rifattamenti grammaticali sperimentali, di solito sono arrivato dove volevo andare. A volte ho dovuto scendere a compromessi insoddisfacenti.

Quindi, ci sono strumenti là fuori che possono risucchiare una grammatica yacc, che migliorano la navigazione, la sperimentazione e consentono il debug delle modifiche?

Se aggiungo una produzione, mi piacerebbe vedere più della "produzione atomica che viene utilizzata ovunque" (pensa all'identificatore) "è in conflitto con la regola" " (sì, ci sono più informazioni, s / r, r / r, di quello, ma penso che tu abbia la mia deriva). Sarebbe bello avere qualche accenno all'interazione oltre a indossare il mio cappello pensante e provare a immaginare una pila di simboli e una macchina a stati.

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

Il mio obiettivo con questo post è quello di cercare strumenti esterni che aumentano le strutture di debug grammaticale fornite con yacc. Oggi è doloroso con il set predefinito. Aiutami a trovare strumenti interattivi migliori, come quelli che puoi usare con Antlr.

È stato utile?

Soluzione

potresti ottenere un po 'di aiuto da yacc -d , che produce output di debug - in pratica fornisce un elenco completo degli stati dello stack di simboli e simili. L'output è denso e voluminoso, quindi cercare di leggere tutto direttamente raramente realizza molto (non lo è mai stato per me). Tuttavia, quando si apporta una modifica, dà (ad esempio) un conflitto r / r, è possibile eseguire yacc -d sulla grammatica precedente e su quella nuova, quindi eseguire diff sui risultati, per ottenere un riassunto molto più dettagliato su quali cambiamenti hanno causato il conflitto.

Probabilmente vale la pena notare, tuttavia, che i conflitti s / r sono spesso benigni - a meno che tu non sia abbastanza sicuro che sia un problema, provando a "risolvere" spesso non vale la pena. Lo stesso non vale per i conflitti r / r. Mentre questi sono a volte benigni, è relativamente raro.

Modifica: Oops - scusa, dovrebbe essere -v. Citi y.output, quindi apparentemente 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 in modo pulito e quello che non ha ottenuto alcuni dettagli sull'attuale conflitto (senza fissare 10 jillion righe di "roba" va bene.

Altri suggerimenti

Questo è il migliore che ho ottenuto: http://tldp.org/HOWTO/Lex-YACC-HOWTO-7. html

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