starałem się analizować proste Lisp/program podobny do kodubudynku Lisp/Scheme-jak drzewo parse z Flex/bizon
E.g. (func a (b c d))
i zbudować drzewo z niego, I mógłby zrobić parsowania w C bez użycia bison
(tj., Używając tylko flex
, aby zwrócić tokeny i budować drzewo z rekursją). Ale z gramatyką bison
nie jestem pewien, gdzie dodać kod do zbudować listę (tj. , która reguła kojarzyć z gromadzenie symboli terminalu i gdzie połączyć utworzoną listę do węzła nadrzędnego).
Moja gramatyka jest podobna do tej tutaj: Lisp grammar in yacc gramatyka jest poprawna i może rozpoznawać kod.
I retagged od 'flex' do' gnu-flex' mimo przeciw-porady tutaj: http://meta.stackexchange.com/questions/26460/tag-for-two-flexes/26708#26708 tylko dlatego, że to mylące dla wielu odwiedzających stronę, aby zobaczyć ikonę Adobe na tagu. Mam nadzieję, że wkrótce zostanie to posortowane. Powodzenia w uzyskaniu odpowiedzi na twoje pytanie. – bernie
Prawie nie potrzebujesz flex ani bison do parsowania prostych wyrażeń S. Powinieneś być w stanie zakodować to jako prosty parser rekurencyjny z ręcznym zwiniętym lexerem dla atomów, nawiasów i szyfrującego białą przestrzeń w czymś podobnym do setki linii C lub mniejszej. Oryginalni tłumacze LISP z pewnością robili to z niewielką ilością kodu. –
Ira: To prawda, że nie ma potrzeby stosowania parsera, ale "ręcznie zwinięty lexer" działa tylko w przypadku zwykłych podzbiorów zabawek, które zwykle kończą się na ludziach. Niektóre Lisps/Schemes mają tokeny, które mogą być * bardzo * owłosione. Dla Twojej rozrywki, oto przykład prawidłowej stałej liczbowej w [Rakieta] (http://racket-lang.org/): '# e # x + e # s + e @ -e # l-e'. –