Наконец, я решил использовать 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 .. .
Последнее интересный момент является ошибка проверки, я использую его, чтобы остановить проверку в первой ошибке, мой случай очень прост, но вы можете улучшить эту точку
Я могу заверить вас, что нет такого инструмента не существует , –