Piszę prosty język szablonu tekstowego dla aplikacji internetowej, którą piszę (pomyśl o szablonie google'a). Po zakończeniu będzie zawierał tylko niewielką liczbę możliwych akcji, proste rzeczy, takie jak "oceniaj i wykonuj", "oceniaj i drukuj", "oceń i wyjdź z html", "komentarz". Myślałem o ręcznym pisaniu całego parsera od zera, ale zacząłem szukać generatorów analizatora składni takich jak lex, flex i antlr. Te wydają się być czymś więcej niż potrzebuję dla mojej prostej składni. Nasuwa się zatem pytanie, w którym momencie praktyczne jest użycie generatora parsera?Kiedy można używać generatora analizatora składni?
Odpowiedz
Prędzej, niż później. Jeśli masz teraz prostą składnię, użycie generatora parsera jest łatwe. Ułatwia to nadal, gdy chcesz dodać zmienne i pętle oraz warunkowe.
Ale czekaj! - Nie ma powodu, aby wymyślać własny język, chyba że jest on specyficzny dla domeny, na przykład eqn
lub TeX
lub języków modelowania molekularnego. Znacznie lepiej jest osadzić język, który został specjalnie zaprojektowany do tego celu. Tcl jest starym strażnikiem w tym królestwie, z Python będącym silnym rywalem. Perl został również zaprojektowany jako osadzony język skryptowy, ale uważam go za kiepski kandydat, ponieważ prawdopodobnie dostarczy on bardzo "tylko do zapisu" kodu w rękach użytkowników.
Projektowanie języka jest trudne, a palenie wszystkich skrzypiących bitów jest jeszcze trudniejsze. Zarówno w Pythonie, jak iw Tcl możesz zdecydować, w jakim stopniu język podstawowy może zostać udostępniony użytkownikom, a także otworzyć zamknięte bity, gdy będziesz ich potrzebować.
Pierwszy mały język, który napisałem (który zadziwiająco jest nadal wykorzystywany w produkcji) byłby o wiele lepszy, gdyby Tcl został tam użyty.
+1 dla "Prędzej niż później" – Mawg
Z jednej strony, jeśli nie masz doświadczenia w korzystaniu z jednego z tych narzędzi i masz czas, to być może jest to dobra okazja, aby nauczyć się tego dla tego przypadku użycia. Mogłabym sobie wyobrazić, że gdybyś był doświadczony w tych narzędziach, po prostu byś ich używał, podobnie jak wielu chwytów dla wyrażeń regularnych dla wielu zadań parsujących.
Z drugiej strony, proste parsery nie są trudne do zrobienia, nie są nawet trudne do utrzymania. Lubię je pisać i zazwyczaj docieram do nich, gdy zadanie wymaga jednego, a nie narzędzia (ale nie jestem super zaznajomiony z narzędziami). W wielu przypadkach wolę prosty parser od regex, w zależności od zadania.
- 1. "Oczekiwany token" za pomocą generatora analizatora cytryny
- 2. Pisanie prostego analizatora składni
- 3. Generator analizatora składni dla Celu C?
- 4. Kiedy można używać jQuery?
- 5. Komunikat o błędzie analizatora składni: Nie można załadować typu
- 6. Metody analizatora składni SBJson iOS są przestarzałe?
- 7. API analizatora składni Nashorn na JDK 8
- 8. Czy rozpoznawanie liczb należy do skanera lub do analizatora składni?
- 9. Pisanie analizatora składni (dla języka znaczników): Teoria i praktyka
- 10. argparse - Łączenie nadrzędnego analizatora składni, akapitów i wartości domyślnych
- 11. Kiedy używać node.js i kiedy używać ajax?
- 12. kiedy używać zadania i kiedy używać wątku?
- 13. Kiedy używać viewDidLoad i kiedy używać awakeFromNib
- 14. Jak używać menedżera kontekstowego Pythona wewnątrz generatora
- 15. Jak przechwycić zdarzenia Attribute za pomocą analizatora składni XML StAX?
- 16. Co to jest dobry kompilator kompilatora kompilatora C#/analizatora składni?
- 17. Kombinatory analizatora składni Scala: wydajnie analizować komentarze w stylu C
- 18. Kiedy należy używać JCR i kiedy należy używać JPA/RDBMS?
- 19. PHP: Kiedy używać funkcji i kiedy używać metod statycznych?
- 20. Bash - Kiedy używać "$" przed zmiennymi?
- 21. Kiedy używać algorytmów genetycznych a kiedy używać sieci neuronowych?
- 22. Kiedy używać JMS i kiedy używać usługi REST?
- 23. Błąd analizatora składni cxf-beans.xml nie można znaleźć deklaracji dla elementu "jaxws: punkt końcowy"
- 24. Nie można znaleźć generatora rspec: zainstaluj.
- 25. Kiedy należy używać jednolitej inicjalizacji?
- 26. Czy można używać składni ScalaTest BDD w środowisku JUnit?
- 27. Dlaczego nie można używać składni konstruktora w typach "unsigned int"?
- 28. Kiedy używać OPTIMIZE w mysql
- 29. Kiedy używać Formatera wartości i kiedy używać Resolvera wartości
- 30. Kiedy używać undef_method i kiedy używać metody remove_method?
Ouch. Miły podstęp przez Adobe, aby uzyskać więcej, niż (prawdopodobnie) zapłacili. ;) Czy "gnu-flex" byłby lepszym tagiem? – spender
Książka Pragmatic Programmera [Wzory implementacji języka] (http://pragprog.com/titles/tpdsl/language-implementation-patterns) ma doskonały pierwszy rozdział omawiający różne "mocne strony" analizatorów dla różnych języków. – sarnold
Antlr jest drogą, szczególnie ze względu na gui AntlrWorks, które naprawdę pomaga w debugowaniu gramatyki i składni. – Mawg