<commit_before>require('./colors.js');

var parser = yate.parser;

var Fs = require('fs');

parser.init(yate.grammar);

parser.open({ filename: process.argv[2] });
var ast = parser.match('stylesheet');

if (process.argv[3] === '--print') { // FIXME: Заюзать commander.js или еще что.
    console.log( ast.yate() );
    process.exit(0);
}
if (process.argv[3] === '--ast') {
    console.log( ast.toString() );
    process.exit(0);
}

var data;
if (process.argv[3]) {
    data = JSON.parse( Fs.readFileSync( process.argv[3], 'utf-8' ) );
}

// Фазы-проходы по дереву:

// 0. Каждой ноде выставляется поле parent,
//    кроме того, создается (или наследуются от parent'а) scope.
ast.setParents();
ast.trigger('setScope');

// 1. Действие над каждой нодой в ast, не выходящее за рамки этой ноды и ее state/scope/context.
ast.trigger('action');

// 2. Оптимизация дерева. Группировка нод, перестановка, замена и т.д.
// ast.trigger('optimize');

// 3. Валидация. Проверяем типы, определенность переменных/функций и т.д.
ast.trigger('validate');

// Важно! Только после этого момента разрешается вызывать метод type() у нод.
// В фазах 0-3 он никогда не должен вызываться.

// 4. Подготовка к кодогенерации.
ast.trigger('prepare');

var runtime = Fs.readFileSync(__dirname + '/src/runtime.js', 'utf-8');

var js = yate.codetemplates.fill('js', 'main', '', {
    Runtime: runtime,
    Stylesheet: ast
});

if (data) {
    var stylesheet = eval( '(' + js + ')' );<commit_msg>Выводить ast (--ast) после всех проходов по дереву<commit_after>require('./colors.js');

var parser = yate.parser;

var Fs = require('fs');

parser.init(yate.grammar);

parser.open({ filename: process.argv[2] });
var ast = parser.match('stylesheet');

if (process.argv[3] === '--print') { // FIXME: Заюзать commander.js или еще что.
    console.log( ast.yate() );
    process.exit(0);
}
// Фазы-проходы по дереву:

// 0. Каждой ноде выставляется поле parent,
//    кроме того, создается (или наследуются от parent'а) scope.
ast.setParents();
ast.trigger('setScope');

// 1. Действие над каждой нодой в ast, не выходящее за рамки этой ноды и ее state/scope/context.
ast.trigger('action');

// 2. Оптимизация дерева. Группировка нод, перестановка, замена и т.д.
// ast.trigger('optimize');

// 3. Валидация. Проверяем типы, определенность переменных/функций и т.д.
ast.trigger('validate');

// Важно! Только после этого момента разрешается вызывать метод type() у нод.
// В фазах 0-3 он никогда не должен вызываться.

// 4. Подготовка к кодогенерации.
ast.trigger('prepare');

if (process.argv[3] === '--ast') {
    console.log( ast.toString() );
    process.exit(0);
}

var runtime = Fs.readFileSync(__dirname + '/src/runtime.js', 'utf-8');

var js = yate.codetemplates.fill('js', 'main', '', {
    Runtime: runtime,
    Stylesheet: ast
});

var data;
if (process.argv[3]) {
    data = JSON.parse( Fs.readFileSync( process.argv[3], 'utf-8' ) );
}

if (data) {
    var stylesheet = eval( '(' + js + ')' );
{'fraction_non_alphanumeric': 0.1751431458403503, 'fraction_numerical': 0.010778039744021556, 'mean_word_length': 3.6551724137931036, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5642488', 'n_tokens_mistral': 1164, 'n_tokens_neox': 1255, 'n_words': 285}