Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用于更少文件的语法验证程序_Javascript_Node.js_Npm_Less_Antlr - Fatal编程技术网

Javascript 用于更少文件的语法验证程序

Javascript 用于更少文件的语法验证程序,javascript,node.js,npm,less,antlr,Javascript,Node.js,Npm,Less,Antlr,我需要一个较少的文件验证程序。我只需要在语法级别验证一个更少的文件 我无法让验证器跟踪依赖项或检测是否声明了mixin。这是我真正的问题 我发现有很多处理器失败,这是因为文件有依赖关系,我在这个过程中无法提供 npm软件包将是完美的。最后,我决定使用 步骤: 在计算机中安装antlr或将其添加到部署过程中 获取您语言的语法(已完成的较少) 获取npm包以处理语法 在应用程序中使用它 配置为: $ cd /usr/local/lib $ sudo curl -O http://www.antl

我需要一个较少的文件验证程序。我只需要在语法级别验证一个更少的文件

我无法让验证器跟踪依赖项或检测是否声明了mixin。这是我真正的问题

我发现有很多处理器失败,这是因为文件有依赖关系,我在这个过程中无法提供


npm软件包将是完美的。

最后,我决定使用

步骤:

  • 在计算机中安装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
此信息直接来自网页

现在你可以从

在这一点上,你可以

在我的例子中,我创建了一个目录,下载了文件并将所有测试编码在其中:

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
  ;
在本例中,您可以验证字符串,如样式表、语句、variableName


最后一个有趣的点是错误验证,我用它来停止第一个错误中的验证,我的案例非常简单,但你可以改进这一点

我可以向你保证没有这样的工具。这个验证程序通过了多少次?我不知道,但如果你感兴趣,我会在这个周末吃午饭,我会告诉你。重要的是,如果不适合你,你可以更新语法。不,不要麻烦只为我做这件事(我链接到测试套件只是为了参考,如果你有兴趣知道语法分析器包含的语法少了多少)。事实上,它不需要传递所有的东西,但它仍然有很多特定的语法结构,所以我担心对于一个更少或更多的覆盖验证器,语法会变得非常臃肿。。。无论哪种方式,您都可能有兴趣查看源代码,因为它还使用
antlr
(因此也使用相关的语法代码)。