Czy ktoś mógłby mi wyjaśnić, dlaczego parsery rekursywno-opadowe nie mogą pracować z gramatyką zawierającą lewą rekursję?Dlaczego parser rekursywno-potomny nie może obsługiwać lewej rekursji
19
A
Odpowiedz
27
rozważenia:
A ::= A B
odpowiednik kod jest
boolean A() {
if (A()) {
return B();
}
return false;
}
zobaczyć nieskończoną rekurencję?
16
dla tego, kto jest zainteresowany
A ::= A B | A C | D | E
może być zapisane jako:
A ::= (D | E) (B | C)*
Ogólna postać przemiana: każdy jeden z nie lewej disjuncts rekurencyjnych następuje dowolny numer lewej rekursywne disjunkty bez pierwszego elementu.
Reformowanie kodu akcji jest trochę podstępne, ale ja też mogę być plug-n-chug.
Powiązane problemy
- 1. Usuwanie lewej rekursji w podstawowym analizatorze składni
- 2. Usuwanie lewej rekursji
- 3. analizowania wyrażenie logiczne bez lewej ręki rekursji
- 4. Eliminacja tej pośredniej lewej rekursji krok po kroku
- 5. Dlaczego Python ma maksymalną głębokość rekursji?
- 6. Nie rozumiem tego wykorzystania rekursji
- 7. Dlaczego parser Stanford z nltk nie przetwarza poprawnie zdania?
- 8. $ parser nie pracuje z przestrzenią
- 9. Thrift klient java nie może poprawnie obsługiwać związku
- 10. Dlaczego "drukuj" drukuje od prawej do lewej?
- 11. Dlaczego metody antlr3 C# parser są prywatne?
- 12. Ile połączeń sieciowych może obsługiwać komputer?
- 13. Czy SignalR może obsługiwać nieodebrane wiadomości?
- 14. Ile baz danych może obsługiwać MySQL?
- 15. Scrollview może obsługiwać tylko jedno bezpośrednie dziecko
- 16. Czy sys.argv może obsługiwać opcjonalne argumenty?
- 17. HorizontalScrollView może obsługiwać tylko jedno bezpośrednie dziecko
- 18. Ile funkcji może obsługiwać nauka naukowa?
- 19. memoization z rekursji
- 20. Czy ktoś mógłby wyjaśnić, dlaczego to naprawia mój błąd rekursji?
- 21. Dlaczego MongoDB może utworzyć unikalny indeks, ale Mongoid nie może?
- 22. Dlaczego str nie może uzyskać drugiego parametru, gdy __str__ może?
- 23. Jak zrozumieć parser Anorm?
- 24. Przetwarzanie wyrażenia od prawej do lewej
- 25. Seter kotek Infinte rekursji
- 26. Dlaczego FacesServlet nie może mieć wzorca url/*.?
- 27. VS8 nie może obsłużyć file.close(); file.open() ;, dlaczego?
- 28. Dlaczego ten program nie może przechwycić wyjątku?
- 29. Dlaczego VC++ nie może zoptymalizować opakowania całkowitego?
- 30. Dlaczego Scala nie może znaleźć pakietu org.apache.commons.lang?
Po raz pierwszy zobaczyłem, że zawsze widziałem porady, aby użyć nowego nie-terminala, zwykle nazywanego A ' –
Cóż, niektóre narzędzia oparte na BNF nie pozwolą() na grupy, więc w końcu utkniesz z nowym rozwiązaniem reguł . Jestem trochę stronniczy od proponowanej przeze mnie formy, ponieważ mój generator parsera również musi wykonać transformację akcji, więc znacznie łatwiej jest działać bez nowej reguły. – BCS
To naprawdę nie odpowiada na pytanie. Byłoby lepiej jako komentarz. –