PEG.js - выдает ошибку, если выражение не совпадает - PullRequest
0 голосов
/ 26 июня 2018

В настоящее время я пишу грамматику PEG.js и хочу, чтобы она выводила пользовательские ошибки. Например, в настоящее время у меня есть эта структура для создания функции.

//Function Declaration
FUNCTION_DECLARATION = 
FUNCTION __ t:(TYPE/VOID) __ n:KEY a:ARGUMENT_DECLARATION
_ b:FUNCTION_BLOCK
(END)
{return {context : "FUNCTION_DECLARATION",location:location(), type:t,name:n, 
args:a, block:b};
}

Я хочу иметь возможность обнаруживать определенные ошибки, например отсутствующий тег END в конце объявления функции. Для этого мне нужно иметь возможность выполнить {действие], когда выражение НЕ СООТВЕТСТВУЕТ.

Кто-нибудь знает, как это сделать? Я знаю, как запустить {действие], когда выражение действительно совпадает, как вы можете видеть из моего оператора return.

Кроме того, было бы здорово, если бы местоположение ошибки могло указывать на часть выражения, которая уже была проанализирована перед отсутствующим END.

С наилучшими пожеланиями, Рикардо

1 Ответ

0 голосов
/ 02 июля 2018

PEG.js уже содержит некоторую пользовательскую обработку ошибок. Когда вы запускаете метод parse(), вы можете перехватить ошибку и проверить атрибут location, чтобы точно определить, откуда она появилась. Вот пример:

 try {
    var entry = Parser.parse(text);
 } catch (err) {
    if (!err.hasOwnProperty('location')) throw(err);
    // Slice `text` with a little context before and after the error offset
    alert('Error: ' + text.slice(err.location.start.offset-10,
       err.location.end.offset+10).replace(/\r/g, '\\r'));
 }

EDIT

Попробуйте посмотреть здесь . Метод error может быть полезен для изучения. Вот пример, извлеченный из проблем с github.

start = sign:[+-]? digits:[0-9]+ {
  var result = parseInt((sign || "") + digits.join(""), 10);

  if (result % 2 == 0) {
    error("The number must be an odd integer.");
  }

  return result;
}
...