代码之家  ›  专栏  ›  技术社区  ›  Axel Podehl

使用SyntaxHighlightRules进行语法验证

  •  0
  • Axel Podehl  · 技术社区  · 5 年前

    我用一个复杂的状态机为我的自定义语言(JMS消息表示)构建了一些新的Ace编辑器模式。现在,重用语法高亮显示来创建错误是非常好的。有可能吗?

    换句话说,假设我的语法高亮显示创建了“invalid”标记,我想使用该标记的行号来标记错误,然后执行如下操作: https://github.com/ajaxorg/ace/wiki/Syntax-validation

    this.$rules = {
        "start": [
            { regex: /[!#].*$/, token: "comment" },
            { regex: /^0x[0-9a-f]+:/, token: "constant" }, // hex offset
            { regex: /(?:[0-9a-fA-F]{4} |[0-9a-fA-F]{2} )/, token: "constant.numeric" }, // hex value
            { regex: /[\S ]{1,16}$/, token: "string" }, // printable value
            { regex: "\\s+", token: "text" },
            { defaultToken: "invalid" }
        ]
    };
    

    enter image description here

    1 回复  |  直到 5 年前
        1
  •  1
  •   Axel Podehl    5 年前

    找到了-我必须管理,王牌编辑真是个好东西。始终按预期工作。

    aceEditor.session.on('change', function(delta) {
    
      var sess = aceEditor.session;
      sess.clearAnnotations();
    
      var invalids = [];
      for( var row=0;row<sess.getLength();row++ ) {
    
        var tokens = sess.getTokens(row);
        if( !tokens ) continue;
    
        for( var t=0;t<tokens.length;t++ ) {
    
          if( tokens[t].type==="invalid" ) {
    
            invalids.push({ row: row, column: 0, text: "Syntax error", type: "error" });
          }
        }
      }
      sess.setAnnotations( invalids );
    });
    

    可能有一种更聪明的方法来实现这一点(也许在某处有一个onToken(type,row,column)函数?),但上面的对我有用。