Piszę parser dla języka, a skaner jest przeznaczony doPutting węzły do drzewa parsowania, które nie powinny być tam
- bądź też powrócić niepotrzebnych terminali (np whitespacing) OR
- nie w tym celu:
na podstawie flagi boolowskiej.
Teraz, w parserze, nie chcę zagracać gramatyki tymi wszystkimi terminalami, powinny one zostać połknięte w jakiś sposób "automagicznie" przez drzewo analizy, które buduję.
Aby wykonać tę "magię", pomyślałem, że połączę terminale (po prostu połączę okrągłą listę), tak żebym mógł je po prostu powtórzyć i "wypełnić puste miejsca" w miarę jak następuje redukcja (używam LALR (1)) generator parsera).
To brzmi jak rozsądny pomysł, chociaż jest jeden problem. Pamiętaj, że powiedziałem "albo wrócić ... albo nie"? W scenariuszu (2) uwolniłbym terminal, bo kto wie, co będzie dalej? I nie chcę żadnych wycieków pamięci.
Ale w scenariuszu (1) nie mogę zwolnić terminala, ponieważ na jego podstawie zdecyduję się na dalsze redukcje, w których proces "wypełnij puste pola" powinien się zatrzymać.
Nie mogę tego zwolnić warunkowo z tego samego powodu: nie wiem, co będzie dalej. Co się stanie, jeśli nie zostanie uruchomiony proces "wypełnienia pustych miejsc"? A co, jeśli w ogóle nie będzie żadnej redukcji?
Czy miałeś podobne problemy? Jak to rozwiązałeś?
Uwaga: to wszystko w mojej głowie i być może nie wyjaśniłem tego wystarczająco wyraźnie, proszę zapytaj, a ja zmienię moje pytanie. Scenariusz jest nieco bardziej złożony, nie piszę tego od zera, gdzie mógłbym wykorzystać moją wyobraźnię, integruję go z czymś innym, więc być może odpowiem: "Nie mogę tego zrobić z powodu ograniczeń środowiskowych ".
Uzupełnienie
Jedynym naprawdę dobry pomysł, który przychodzi mi do głowy jest widelec i poprawić generator parsera, co już robiłem w niektórych pomniejszych miejsc tu i tam, aby przezwyciężyć niektóre z tych ograniczenia, o których wspomniałem powyżej.
Wiem, czego chcę, i chcę, aby białe znaki na drzewie. Naprawdę. Po prostu to, czego chcę, nie jest czymś zwykłym, czego ludzie chcą. I mam dobre powody, by mieć te żetony w drzewie. Naprawdę dobre powody. Bez tych powodów nie zrobiłbym tego w pierwszej kolejności. Ale dzięki za ostrzeżenie mnie o tym. – Flavius
Tak, jest jasne, że wiesz, czego chcesz. Mówiąc, że masz naprawdę dobre powody, nie wyjaśniając ich, a w szczególności powiedz nam, jaki efekt końcowy masz nadzieję osiągnąć, to dostaniesz "konwencjonalną odpowiedź mówi ...". ... Jeśli chcesz pojechać niekonwencjonalną trasą, możesz uogólnić to, co zrobiliśmy z DMS: dołącz swoje mikro-żetony (zarówno białe spacje, jak i komentarze) jako sekwencję do tokenów językowych. –
Tak, właśnie to zrobiłem, tak jak wspomniałem w pytaniu, używając list powiązanych, chociaż w końcu skorzystałem z połączenia podwójnie powiązanego. Zużycie pamięci wciąż mnie martwi, dwóch dodatkowych członków wskaźnika na tokeny to całkiem sporo, prawda? Nie wiem, chyba skończę ten prototyp i zobaczę, jak to działa. – Flavius