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). –
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