语法validationless文件

我需要一个更less文件的validation器。 我只需要在语法级别validation一个简单的文件。

我不能让validation器跟随依赖关系,或者检测一个mixin是否被声明。 这是我真正的问题。

我find了很多较less的处理器失败,因为该文件有依赖关系,我不能提供在这一点上的过程。

npm包将是完美的。

最后,我决定使用antlr4

脚步:

  • 在计算机中安装antlr或添加到部署过程中
  • 获得语言的语法(less已经完成)
  • 得到npm包来处理语法
  • 在你的应用程序中使用它

configuration是:

$ 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获得语法

在这一点上,你可以生成你的语法的JavaScript版本

在我的情况下,我创build了一个目录,我下载了这些文件,并在里面编写了所有的testing代码:

 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(); 每个语法都不一样 最后一个是很难知道的,但是这是你想要validation的语法中的一点。 在我的情况下,我得到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 ; 

在这种情况下,你可以validationstring像样式表,语句,variables名…

最后一个有趣的地方是错误validation,我用它来停止第一个错误的validation,我的情况很简单,但是可以改进这一点

Interesting Posts