less 文件的语法验证器
syntax validator for a less file
我需要一个 less 文件的验证器。我需要验证一个 less 文件,仅在语法级别。
我无法让验证器遵循依赖项或检测是否声明了混合宏。这才是我真正的问题。
我发现很多 less 处理器失败,因为文件具有我无法在此过程的这一点提供的依赖项。
npm 包将是完美的。
最后,我决定用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 库才能在节点程序中使用此文件。
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
;
在这种情况下,您可以像样式表、语句、变量名一样验证字符串...
最后一个有趣的点是错误验证,我用它来停止第一个错误的验证,我的情况很简单,但你可以改进这一点
我需要一个 less 文件的验证器。我需要验证一个 less 文件,仅在语法级别。
我无法让验证器遵循依赖项或检测是否声明了混合宏。这才是我真正的问题。
我发现很多 less 处理器失败,因为文件具有我无法在此过程的这一点提供的依赖项。
npm 包将是完美的。
最后,我决定用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 库才能在节点程序中使用此文件。
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
;
在这种情况下,您可以像样式表、语句、变量名一样验证字符串...
最后一个有趣的点是错误验证,我用它来停止第一个错误的验证,我的情况很简单,但你可以改进这一点