Próbuję utworzyć parser za pomocą golang's yacc tool. Znalazłem nex, aby uprościć tworzenie lexera, aby dać parser. Mój problem polega na tym, że wygenerowany analizator składni nie ma żadnej metody ani pola, które dałoby mi dostęp do wyniku analizowania. Mógłbym po prostu zapisać wynik analizy w zmiennej globalnej, ale wydaje się, że jest błędny.Uzyskiwanie dostępu do wyniku parser wygenerowanego przez golang yacc
Obecnie Dodałem następujące jako Pierwsza próba górze mojego pliku 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{}
}
Czy istnieje Zalecanych/lepszy sposób na uzyskanie w wyniku z parsera?
(Ponieważ to czuje się trochę nadużycie generatora ...)
Co masz na myśli przez wyniku parsowania? – andlabs
Podczas analizowania danych wejściowych buduję strukturę drzewa. Jest przechowywany w '$$. Expr'. Chcę uzyskać korzeń tego drzewa. Wydaje się, że powyższa funkcja "Wynik" uzyskuje dostęp do właściwego wyniku, ale wydaje się nieco zła. Nie jestem w 100% pewny, że 'p.stack [1]' będzie tam, gdzie wynik root/parsowania jest zawsze przechowywany ... –
Tak, nie upuszczajcie w nieudokumentowanych strukturach danych Yacca, jak przypuszczam. Sądzę, że jest to albo "zmienne globalne", albo "pola typu bazowego interfejsu yyLexer"; Używam tego ostatniego – andlabs