2013-02-10 14 views
6

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.

+1

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

+1

dzięki ... wygląda interesująco – interstar

+0

chociaż faktycznie, chyba że jison ma tę samą funkcję co pyparsing, być może tak naprawdę nie odpowiada na pytanie – interstar

Odpowiedz

7

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 token DEDENT. Na końcu pliku generowany jest token DEDENT dla każdego numeru pozostającego na stosie, który jest większy od zera.

+0

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

+0

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

+0

Wszystkie te wartości są zdefiniowane w pliku [lexer.js] (https://github.com/aaditmshah/bianca/blob/master/lib/lexer.js). –

Powiązane problemy