2015-06-23 35 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库在节点程序中使用此文件。

npm link antlr4 

蚂蚁现在开始代码:

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

不,请不要为我这样做(如果*你*有兴趣知道语法分析器覆盖的Less语法的多少,我将它链接到测试套装仅供参考)。事实上,它不需要传递所有的东西,但它仍然有很多特定的语法结构,所以我害怕覆盖更少或更多的验证器,语法会变得相当膨胀......无论哪种方式,你可能会有兴趣看看['less4j'](https://github.com/SomMeri/less4j)源码,因为它也使用'antlr'(因此也使用相关的语法代码)。 –