2013-02-10 2 views
6

У кого-нибудь есть простой пример того, как определить грамматику, которая анализирует питон-подобный отступ для блоков с использованием Jison?Ищите примеры грамматик Jison, которые используют отступ для блочной структуры

+1

Привет! [этот вопрос и его ответы] (http://stackoverflow.com/questions/1547944/how-do-i-parse-indents-and-dedents-with-pyparsing) помогают вам много. Я думаю. –

+1

спасибо ... выглядит интересным – interstar

+0

, хотя на самом деле, если у jison нет такой же функции, как у pyparsing, возможно, он действительно не отвечает на вопрос – interstar

ответ

7

Я создал язык с использованием Jison, который использует python-style indentation. Это автоматический алгоритм проверки алгоритма белого ящика, который называется Bianca.

Bianca имеет только две зависимости: один - Jison, а другой - Lexer. Джисон поддерживает custom scanners, а Lexer - один из таких сканеров.

В языках программирования на языке C блоки кода ограничены фигурными фигурными скобками. В отступе в стиле python, однако, вы используете INDENT и DEDENT токены.

Написание правила для генерации INDENT и DEDENT токенов в Лексере просты в мозге. Фактически документация Lexer показывает, как это сделать.

Этот фрагмент кода берется непосредственно из исходного кода Бьянки (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; 
}); 

краткое объяснение того, как этот код работает, можно найти в документации Python:

Перед чтением первой строки файла в стек помещается один ноль; это никогда больше не будет удалено. Цифры, помещенные в стек, всегда будут строго возрастать снизу вверх. В начале каждой логической строки уровень отступов линии сравнивается с вершиной стека. Если он равен, ничего не происходит. Если он больше, он помещается в стек, и генерируется один токен INDENT. Если он меньше, то должен быть одним из чисел, встречающихся в стеке; все числа в стеке, которые больше, выскользнут, и для каждого числа, которое выскочил, выдается токен DEDENT. В конце файла для каждого числа, оставшегося в стеке, больше нуля, генерируется токен DEDENT.

+0

Я думал, что jison не может использовать^для начала. Похоже, вы можете добавить правило в файле jisonfile и использовать его для получения связанных с lexeme вещей. –

+0

Как вы это делаете со стандартным файлом lex? Что такое col? Я пытаюсь log (это) на правило и выяснить, из чего все эти значения пришли. –

+0

Все эти значения определены в [lexer.js] (https://github.com/aaditmshah/bianca/blob/master/lib/lexer.js). –