У кого-нибудь есть простой пример того, как определить грамматику, которая анализирует питон-подобный отступ для блоков с использованием Jison?Ищите примеры грамматик Jison, которые используют отступ для блочной структуры
ответ
Я создал язык с использованием 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
.
Я думал, что jison не может использовать^для начала. Похоже, вы можете добавить правило в файле jisonfile и использовать его для получения связанных с lexeme вещей. –
Как вы это делаете со стандартным файлом lex? Что такое col? Я пытаюсь log (это) на правило и выяснить, из чего все эти значения пришли. –
Все эти значения определены в [lexer.js] (https://github.com/aaditmshah/bianca/blob/master/lib/lexer.js). –
Привет! [этот вопрос и его ответы] (http://stackoverflow.com/questions/1547944/how-do-i-parse-indents-and-dedents-with-pyparsing) помогают вам много. Я думаю. –
спасибо ... выглядит интересным – interstar
, хотя на самом деле, если у jison нет такой же функции, как у pyparsing, возможно, он действительно не отвечает на вопрос – interstar