Sto cercando di creare un parser utilizzando golang's yacc tool. Ho trovato nex per semplificare la creazione di un lexer per fornire il parser. Il mio problema ora è che il parser generato non ha alcun metodo o campo per darmi accesso al risultato dell'analisi. Potrei semplicemente memorizzare il risultato dell'analisi in una variabile globale, ma ciò sembra sbagliato.Accesso al risultato di un parser golang yacc generato
Attualmente ho aggiunto la segue come un primo tentativo alla cima del mio file parser.y:
type ResultParser interface {
yyParser // Generated parser interface
Result() s.Expr // s.Expr is an interface for the parsed result
}
func (p *yyParserImpl) Result() s.Expr {
return p.stack[1].expr
}
func NewResultParser() ResultParser {
return &yyParserImpl{}
}
Esiste un Recomended/modo migliore di ottenere il risultato del parser?
(Dal momento che questo si sente come un po 'di un abuso del generatore ...)
Che cosa si intende per risultato di analisi? – andlabs
Quando analizzo l'input, costruisco una struttura ad albero. È memorizzato in $ $$ expr'. Voglio ottenere la radice di quell'albero. La precedente funzione 'Result' sembra accedere al risultato giusto, ma sembra un po 'hacky. Non sono sicuro al 100% che 'p.stack [1]' sarà dove il risultato root/parse è sempre archiviato ... –
Sì, non importare le strutture dati non documentate di yacc, suppongo. Immagino che sia "variabili globali" o "campi del tipo sottostante dell'interfaccia yyLexer"; Io uso il secondo – andlabs