PEG.js-如果表达式不匹配则抛出错误

时间:2018-06-26 15:45:14

标签: javascript parsing compiler-errors compiler-construction peg

我目前正在编写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标记。为此,我需要能够在表达式未匹配时运行{action]。

有人知道该怎么做吗?我只知道当表达式实际上与我的return语句所见匹配时如何运行{action]。

此外,如果错误位置有可能指向表达式中已经丢失的END之前已解析的部分,那将是很好的选择。

最好的问候, 里卡多

1 个答案:

答案 0 :(得分:0)

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'));
 }

编辑

尝试查看hereerror方法可能会有所帮助。 Here's是从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;
}