Czy ktoś ma prosty przykład, jak zdefiniować gramatykę, która analizuje wcięcie w stylu Pythona dla bloków przy użyciu Jison?Poszukuję przykładów gramatyk Jison, które używają wcięcia dla struktury blokowej.
Odpowiedz
Stworzyłem język za pomocą Jison, który używa python-style indentation. Jest to zautomatyzowany algorytm z białym językiem testujący język o nazwie Bianca.
Bianca ma tylko dwie zależności - jedna to Jison, a druga to Lexer. Jison obsługuje custom scanners, a Lexer jest jednym z takich skanerów.
W językach programowania w stylu C bloki kodu są ograniczone przez nawiasy klamrowe. W wcięciu w stylu Pythona masz jednak tokeny INDENT
i DEDENT
.
Zapisywanie reguły generowania INDENT
i DEDENT
tokenów w Lexerze jest proste. W rzeczywistości dokumentacja Lexer pokazuje dokładnie, jak to zrobić.
Ten fragment kodu jest pobierana bezpośrednio z kodu źródłowego Bianca (lexer.js):
var indent = [0];
lexer.addRule(/^ */gm, function (lexeme) {
var indentation = lexeme.length;
col += indentation;
if (indentation > indent[0]) {
indent.unshift(indentation);
return "INDENT";
}
var tokens = [];
while (indentation < indent[0]) {
tokens.push("DEDENT");
indent.shift();
}
if (tokens.length) return tokens;
});
Krótkie wyjaśnienie jak ten kod działa można znaleźć w dokumentacji Pythona:
Zanim zostanie odczytany pierwszy wiersz pliku, jedno zero zostanie przesunięte na stos; to już nigdy się nie pojawi. Liczby pchnięte na stos zawsze będą rosły od dołu do góry. Na początku każdej linii logicznej poziom wcięcia linii jest porównywany z wierzchołkiem stosu. Jeśli jest równy, nic się nie dzieje. Jeśli jest większy, jest układany na stosie i generowany jest jeden token
INDENT
. Jeśli jest on mniejszy, musi on być jedną z liczb występujących na stosie; wszystkie liczby na stosie, które są większe, są wyskakiwane, a dla każdego numeru jest generowany tokenDEDENT
. Na końcu pliku generowany jest tokenDEDENT
dla każdego numeru pozostającego na stosie, który jest większy od zera.
Myślałem, że jison nie może użyć^na początek. Wygląda na to, że możesz dodać regułę do pliku jisonfile i użyć jej do uzyskania informacji związanych z leksemem. –
Jak to zrobić ze standardowym plikiem lex? Co to jest col? Próbuję zalogować się (to) na regułę i dowiedzieć się, z czego wszystkie te wartości pochodzą. –
Wszystkie te wartości są zdefiniowane w pliku [lexer.js] (https://github.com/aaditmshah/bianca/blob/master/lib/lexer.js). –
- 1. Poszukuję przykładów Rails 3 testów integracyjnych/akceptacyjnych z RSpec
- 2. Poszukuję przykładów użycia "@ _ *" podczas dopasowywania wzorca w Scala
- 3. Poszukuję sugestii dla repozytorium/struktury gałęzi strony git.
- 4. Pisanie powiązań Pythona dla kodu C++, które używają OpenCV
- 5. Strategie dla wielordzeniowych kompilacji (/ MP), które używają #import
- 6. testowanie aplikacji python, które używają mysql
- 7. Które implementacje std :: async używają pul wątków?
- 8. Prolog: Łączenie gramatyk DCG z innymi ograniczeniami
- 9. Które główne witryny używają elementu nawigacyjnego HTML5?
- 10. Liczba tablic, które nie używają odr?
- 11. W jaki sposób sprawdzić poprawność funkcji, które używają losowo?
- 12. Poszukuję trwałej, rozproszonej kolejki pracowników dla erlang
- 13. Poszukuję szybszej alternatywy dla ImageIO
- 14. Problemy z kompilacją ZMQ dla przykładów C++
- 15. Poszukuję gevent dla Pythona 2.7 dla Windows
- 16. Poszukuję API, które wykorzysta wspaniałe moce GPU z .NET
- 17. Poszukuję algorytmu: generowanie szkieletu dla obrazów rastrowych
- 18. Poszukuję zasobów dla kodów ICD-9
- 19. Poszukuję biblioteki przetwarzania obrazu dla czystej Ruby
- 20. zastępowanie przykładów funkcji
- 21. Używanie debuggera Leksah z programami, które używają ReadLn i podobnych
- 22. Emacs: inna wcięcie dla klasy i struktury
- 23. Poszukuję alternatywy dla TortoiseHG pod Win32
- 24. Poszukuję porządnych bibliotek Git dla Javy
- 25. Metody refaktoryzacji, które używają tego samego kodu, ale różne typy
- 26. Poszukuję skalowalnej implementacji "na"
- 27. Jaki jest wynik w javascript z wieloma bibliotekami, które używają $
- 28. Znajdź wszystkie elementy, które używają wspólnego Sublayout w sitecore 6.2.0
- 29. Android Sieci społecznościowe sdk, które używają rodzimych bibliotek
- 30. Jak przetestować metody komponentu bean JSF, które używają parametrów sesji?
Witam! [to pytanie i jego odpowiedzi] (http://stackoverflow.com/questions/1547944/how-do-i-parse-indents-and-dedents-with-pyparsing) bardzo ci pomogło. Myślę. –
dzięki ... wygląda interesująco – interstar
chociaż faktycznie, chyba że jison ma tę samą funkcję co pyparsing, być może tak naprawdę nie odpowiada na pytanie – interstar