Powiedzmy, że napisałem funkcję do oceny prostej operacji matematycznej i mam pewne dane wejściowe użytkownika w ciągu znaków, takie jak: "1 + [2 + [3 + 4]]" Jak mogę przeanalizować te nawiasy kwadratowe i wyodrębnić najpierw tekst najbardziej wewnętrzny (3 + 4), ocenić go, a następnie przeanalizować zewnętrzne nawiasy klamrowe (2 + 7)? Mam podstawową wiedzę na temat wyszukiwania Regex i zastępowania, ale wiem, że nie będą wykonywać rekursji w ten sposób. Chciałbym wykonać podstawowy kod java, a nie kolejny jar/API, jeśli mogę tego uniknąć.Metoda java do parsowania wyrażeń zagnieżdżonych
Odpowiedz
Najczystszym sposobem na osiągnięcie celu jest napisanie do tego celu narzędzia Lexer i analizatora składni. Napisanie recursive descent parser nie jest trudne do zrobienia od zera dla wyrażeń arytmetycznych.
Istnieje wiele przykładów kodu w Internecie. This is an example, którego możesz użyć do inspiracji.
Lexer ma na celu znormalizowanie danych wejściowych i przekształcenie go w strumień tokenów. W ten sposób twój Parser musi pracować tylko na tokenach, zamiast dodatkowo zajmować się problemami białych znaków i innymi irytującymi rzeczami.
Twoexamples dla algorytmów wysokiego poziomu, które są oparte na stosach, another example, które pokazują podejście do nurkowania rekursywnego.
myślę regex nie jest to dobry wybór, aby osiągnąć tę funkcjonalność
należy przekonwertować wypowiedzi użytkownika do postfix lub notacji prefiksu, a następnie zbudować drzewa wyrażenie z nich. Jest to standardowe podejście w CS (język nie ma znaczenia tutaj), aby rozwiązać ten problem w czystym sposób
Recursion działa dobrze dla nich:
int parse(String expression){
//use a regex to find an instance of [ followed by numbers/operators, followed by ]
//replace it with parse(whatever's inside the brackets)
//continue until there are none left
//evaluate the string (which should be a sequence of numbers and operators without brackets)
}
Użyj stos. Gdy natrafisz na otwarty nawias, wciśnij cokolwiek pracujesz na stos i zacznij nowe wyrażenie. Kiedy uderzysz w nawias zamykający, popnij stos i użyj wyrażenia właśnie obliczonego jako następny element. Lub, jak powiedzieli poprzednie plakaty, użyj rekurencji lub drzewa.
Dla języka Java można użyć JavaCC dla parser/lekser. Użyłem tego w wielu projektach. Jest dość łatwy w użyciu. Jeden z przykładów, jak sądzę, obejmuje analizę arytmetyczną. JavaCC zbuduje drzewo składniowe, w którym można przejść.
Próba arytmetyczna za pomocą JavaCC dałaby dobre wprowadzenie do gramatyki bezkontekstowej i koncepcji drzewa składni abstrakcyjnej. Jeśli się uczysz, jest to dobry krok do zrobienia po wypróbowaniu tego, co @emboss zasugerował
- 1. Używanie Parsera do parsowania wyrażeń regularnych
- 2. Jak używać pyparsing do parsowania wyrażeń zagnieżdżonych, które mają wiele typów otwieracza/zamykania?
- 3. Dlaczego ghc generuje tyle bezużytecznych wyrażeń zagnieżdżonych?
- 4. Java API do parsowania pliku schematu XSD
- 5. IntelliJ IDEA Ostrzeżenie "Metoda nadpisania" z wyrażeń lambda Java 8
- 6. Metoda zagnieżdżonych @Transactional i wycofanie
- 7. Fuzzy Data parsowania z Java
- 8. Metoda enum Java do Delphi
- 9. C# Metoda dynamiczna - IL vs drzewa wyrażeń
- 10. Najlepsza metoda SQL Server do dopasowywania wyrażeń i trafności kolejności
- 11. Biblioteka Pythona do parsowania regex do AST?
- 12. wiosna - MongoDB - findBy Metoda zagnieżdżonych obiektów
- 13. Java: Sposoby parsowania XML w E4X?
- 14. Standardowa metoda parsowania dokumentów XML bez pobierania DTD
- 15. Nielegalne uruchamianie wyrażeń Java Boolean?
- 16. Runtime oceny wyrażeń w metodzie Java odwołuje
- 17. Metoda Java do sumowania dowolnej liczby int
- 18. Java: klon naruszenie metoda
- 19. Java metoda przeciążenie - dwuznaczność
- 20. Regex do parsowania parametrów SQL
- 21. Biblioteka C++ do parsowania logów
- 22. Wskazówki do parsowania wyrażenia ciągu?
- 23. Data parsowania podobna do 1240915075
- 24. Używanie NSJSONSerialization do parsowania JSON'a
- 25. parsowania zagnieżdżone Records w Immutable.js
- 26. Czy ktoś jeszcze przeniesiony wyrażeń Lambda do Java 7?
- 27. Wzorzec Java dla zagnieżdżonych wywołań zwrotnych?
- 28. analizator wyrażeń boolowskich w języku Java
- 29. Wiele klas wyrażeń w jednym pliku Java
- 30. zagnieżdżonych list do dict
Powiązane: https://stackoverflow.com/questions/3422673/evaluating-a-math-expression-given-in-string -Formularz – Boann