Jak radzisz sobie z białymi znakami i komentarzami? Fragmenty, które zazwyczaj są usuwane podczas etapu analizy składniowej? Chcę włączyć komentarze w całym dokumencie, które analizuję. Czy dodajesz je w każdym elementarnym parserze, który definiuję jako jedyną opcję?parsec: czy istnieje łatwy sposób na umieszczanie komentarzy/białych znaków w gramatyce?
Odpowiedz
Sposób, w jaki jest to wykonywane w Text.Parsec.Token
, polega na tym, że każdy token zużywa białe znaki i komentarze, które za nim podążają.
Odbywa się to dzięki pomocy lexeme
Combinator:
lexeme p = do { x <- p; whitespace; return x }
która biegnie parser p
zużywa białą przestrzeń poniższy go i wraca cokolwiek p
zwracane.
Jeśli spojrzeć na źródła makeTokenParser
(link) zobaczysz, że wiele z tych analizatorów tokenów są owinięte pomocą lexeme
COMBINATOR, np:
symbol name
= lexeme (string name)
zastosowania takiego podejścia, w komentarzach do lexeme
(link) punktu wyjścia że jedyny czas, w którym analizator składni musi jawnie zużyć białą przestrzeń, znajduje się na początku danych wejściowych, aby pominąć dowolną białą przestrzeń przed pierwszym tokerem.
Powinieneś użyć zdolności parsec do zdefiniowania "parsera tokenów". Chodzi o to, że definiujesz cechy swojego języka w LanguageDef
, a następnie używasz wyprowadzonych analizatorów w wynikowym TokenParser
, np. identifier
, integer
itd. Możesz użyć funkcji lexeme
ze swojego TokenParser
, aby zamienić każdy analizator składni na taki, który połknie wszystkie końcowe spacje.
Aby uzyskać więcej informacji, patrz makeTokenParser.
Przykładem jest this code, który napisałem. To jest kod w świecie rzeczywistym, więc może nie tak dobrze jak w tutorialu, ale możesz zobaczyć, jak definiuję lang = makeTokenParser...
, a następnie w poniższych parserach używaj parserów takich jak whiteSpace lang
, parens lang
. parseTime
jest przykładem, gdzie używam lexeme
wokół "normalnego" analizatora składni.
Czy jest jakiś przykład użycia tokena? – mb14
- 1. Czy istnieje łatwy sposób na dołączenie źródła w środowisku Eclipse?
- 2. Czy istnieje łatwy sposób na graficzne tworzenie wykresów w neo4j?
- 3. Czy istnieje łatwy sposób na uzyskanie nazwy ServerName w Symfony?
- 4. Czy istnieje łatwy sposób na zmianę wersji PHP podczas programowania?
- 5. Czy istnieje łatwy sposób na powtórzenie NSArray do tyłu?
- 6. Czy istnieje łatwy sposób na wyczyszczenie merytorycznego repozytorium artefaktów?
- 7. Łatwy sposób na wyłączenie UITextField?
- 8. Łatwy sposób na połączenie plists?
- 9. Łatwy sposób na usunięcie akcentów UTF-8 z ciągu znaków?
- 10. Czy istnieje łatwy sposób porównania bliskości dwóch kolorów?
- 11. Łatwy sposób na nieprzerwane odliczanie
- 12. Łatwy sposób na przeprowadzanie testów na klejnot?
- 13. Łatwy sposób na znalezienie Subtree w drzewie
- 14. Czy istnieje prosty lub piękny sposób na odwrócenie ciągu znaków?
- 15. Czy istnieje sposób na określenie nazwy tabeli jako łańcucha znaków?
- 16. Libgdx: Czy istnieje łatwy sposób wyśrodkować tekst na każdej osi na przycisku?
- 17. Czy istnieje łatwy sposób na określenie, ile czasu zajmuje oczekiwanie na GIL Pythona?
- 18. Łatwy sposób na ucieczkę Zmienne szablonu Django
- 19. Łatwy sposób na zmianę motywu jQuery UI?
- 20. Czy istnieje łatwy sposób na zdobywanie punktów czarną obwódką w gnuplot?
- 21. Łatwy sposób na awarię programu VB.NET
- 22. Łatwy sposób instalowania wtyczek Eclipse na Ubuntu
- 23. Czy istnieje sposób konwersji z UTF8 na iso-8859-1?
- 24. Czy istnieje prosty sposób uzyskania liczby znaków drukowanych w C++?
- 25. Czy istnieje czysty sposób określania literałów znaków w Swift?
- 26. Łatwy sposób na NSCoder włączone klasy
- 27. Czy istnieje sposób wyłączenia @AdditionalCriteria w EclipseLink?
- 28. Łatwy sposób na wypełnienie ResultSet z danymi
- 29. Czy istnieje sposób przekonwertować RedisValue [] na ciąg []?
- 30. Czy istnieje łatwy sposób na połączenie dwóch uporządkowanych sekwencji przy użyciu LINQ?
Najpopularniejszym (niezależnym od biblioteki) sposobem wykonania tej czynności jest po prostu krok tokenizujący przed faktycznym analizowaniem i odrzucenie wszystkich białych znaków i komentarzy. – Cubic