Использование SyntaxHighlightRules для проверки синтаксиса - PullRequest
0 голосов
/ 23 января 2019

Я создал несколько новых режимов редактора Ace для своего пользовательского языка (представления сообщений JMS) со сложным конечным автоматом.Теперь было бы здорово повторно использовать подсветку синтаксиса и для создания ошибок.Возможно ли это?

Другими словами, допустим, моя подсветка синтаксиса создает «недопустимые» токены, и я хочу использовать номер строки этого токена, чтобы отметить ошибку, а затем сделать что-то вроде этого: https://github.com/ajaxorg/ace/wiki/Syntax-validation

Простейшим форматом является формат HEX:

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" }
    ]
};

И скажем, редактор создал это состояние с недопустимым токеном в строке 4:

enter image description here

Есть ли (желательно простой) способ получить номера строк моих недействительных токенов?Или использовать мой конечный автомат $ rules для проверки синтаксиса?

1 Ответ

0 голосов
/ 24 января 2019

Нашел - я должен админ, Ace Editor - действительно хороший материал.Всегда работает как положено.

Что работает для меня, после вычисления токенов документа с помощью конечного автомата правил, я перебираю все токены и нахожу «недействительные», а затем устанавливаю аннотации в этих строках.Первоначально просто «Синтаксическая ошибка», но разные типы «недействительных» могут означать разные вещи в будущем.Таким образом, мне нужно написать валидацию синтаксиса валидации только один раз.

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 (тип, строка, столбец) где-нибудь?), Но приведенный выше работает для меня.

...