2015-06-23 4 views
2

Мне нужен валидатор для меньшего количества файлов. Мне нужно проверить один файл меньше, только на уровне синтаксиса.синтаксис валидатор для меньшего файла

Я не могу заставить валидатор следить за зависимостями или определить, объявлен ли mixin. Это моя настоящая проблема.

Я нашел намного меньше процессоров, которые терпят неудачу, потому что у файла есть зависимости, которые я не могу предоставить в этой точке процесса.

npm упаковка будет идеальной.

+0

Я могу заверить вас, что нет такого инструмента не существует , –

ответ

2

Наконец, я решил использовать antlr4

шаги:

  • установить ANTLR в компьютере или добавить в процессе развертывания
  • получить грамматику для вашего языка (менее это уже сделано)
  • получить пакет npm для обработки грамматики
  • Используйте его в своем приложении

Конфигурация:

$ cd /usr/local/lib 
$ sudo curl -O http://www.antlr.org/download/antlr-4.5-complete.jar 
$ export CLASSPATH=".:/usr/local/lib/antlr-4.5-complete.jar:$CLASSPATH" 
$ alias antlr4='java -jar /usr/local/lib/antlr-4.5-complete.jar' 
$ alias grun='java org.antlr.v4.runtime.misc.TestRig 

Эта информация непосредственно с веб-страницы.

Теперь вы можете получить грамматику от https://github.com/antlr/grammars-v4

На данный момент вы можете generate the javascript version of your grammar

В моем случае, я создал каталог, я скачал файлы и закодированы все мои тесты внутри:

antlr4 -Dlanguage=JavaScript LessParser.g4 
antlr4 -Dlanguage=JavaScript LessLexer.g4 

Этот процесс генерирует файл javascript, который вы будете использовать, но вам необходимо использовать antlr lib для использования этих файлов в вашей программе узлов.

npm link antlr4 

Ant теперь начинается с кодом:

var antlr4 = require('antlr4/index'); 
var MyGrammarLexer = require('./LessLexer.js'); 
var MyGrammarParser = require('./LessParser.js'); 
var input = "html{ .hey(); color: @light-blue; background:#333}"; 
var chars = new antlr4.InputStream(input); 
var lexer = new MyGrammarLexer.LessLexer(chars); 
var tokens = new antlr4.CommonTokenStream(lexer); 
var parser = new MyGrammarParser.LessParser(tokens); 
parser.buildParseTrees = true; 


var ErrorListener = antlr4.error.ErrorListener; 
function CustomErrorListener() { 
    ErrorListener.call(this); 
    return this; 
} 

CustomErrorListener.prototype = Object.create(ErrorListener.prototype); 
CustomErrorListener.prototype.constructor = CustomErrorListener; 
CustomErrorListener.prototype.syntaxError = function(recognizer, offendingSymbol, line, column, msg, e) { 
    throw ('throw a simple exception'); 
}; 

parser.addErrorListener(new CustomErrorListener()); 

try{ 
    var tree = parser.stylesheet(); 
} catch (e){ 
    console.log('I catch you!!!') 
} 

Важные части в этом коде функция lessLexer, lessParser и parser.stylesheet(); Это разные грамматики. Последнему трудно понять, но это та точка в грамматике, которую вы хотите проверить. В моем случае, я получаю файл LessParser.g4, и у вас есть различные узлы в грамматике в определении:

parser grammar LessParser; 

options { tokenVocab=LessLexer; } 

stylesheet 
    : statement* 
    ; 

statement 
    : importDeclaration 
    | ruleset 
    | variableDeclaration ';' 
    | mixinDefinition 
    ; 

variableName 
    : AT variableName 
    | AT Identifier 
    ; 

commandStatement 
    : (expression+) mathStatement? 
    ; 

mathCharacter 
    : TIMES | PLUS | DIV | MINUS | PERC 
    ; 

В этом случае можно проверить строку, как в таблице стилей, заявление, VARIABLENAME .. .

Последнее интересный момент является ошибка проверки, я использую его, чтобы остановить проверку в первой ошибке, мой случай очень прост, но вы можете улучшить эту точку

+0

Сколько из [этих тестов] (https://github.com/less/less.js/tree/master/test/less) выполняет этот валидатор? –

+0

Я не знаю, но если вы заинтересованы, я пообедаю в эти выходные, и я скажу вам. Важно, вы можете обновить грамматику, если она вам не подходит. –

+0

Нет, не потрудись сделать это только для меня (я привязан к тестовому масти только для справки в случае, если * вам интересно узнать, сколько из синтаксиса меньше синтаксического синтаксического анализатора). На самом деле ему не нужно передавать все вещи там, но по-прежнему много особых синтаксических конструкций, поэтому я боюсь, что для менее или более покрывающего валидатора грамматика будет расти довольно вздутие ... В любом случае, возможно, вы будете вам интересно посмотреть источники ['less4j'] (https://github.com/SomMeri/less4j), так как он также использует' antlr' (таким образом, он также использует соответствующий грамматический код). –

Смежные вопросы