PEG.jsは、SyntaxErrorを生成するときに、かなりのコンテキストを提供します。たとえば、SQLの文法があり、次のようにフィードする場合です。
FOO > 10 A
次に、PEG.jsはこれを返します:
{
"message": "Expected \"AND\", \"ORDER BY\" or end of input but \"A\" found.",
"expected": [
{
"type": "literal",
"value": "AND",
"description": "\"AND\""
},
{
"type": "literal",
"value": "ORDER BY",
"description": "\"ORDER BY\""
},
{
"type": "end",
"description": "end of input"
}
],
"found": "A",
"offset": 9,
"line": 1,
"column": 10,
"name": "SyntaxError"
}
文字列の0〜9文字( "FOO> 10")を解析しましたが、文字10で予期しないトークンが検出されました。次に、予期していたトークンのリストが表示されます:FOO > 10 AND
、、。これらをクエリの有効な部分に追加すると、可能な補完の適切なセットが得られます。FOO > 10 ORDER BY
FOO > 10
function getCompletions(pegParse, text) {
var parsedText = pegParse(text);
var completions = [];
if (parsedText.expected) {
var start = text.substr(0, parsedText.offset);
parsedText.expected.forEach(function(expected) {
if (expected.type != 'literal') return;
var completion = start + expected.value;
if (completion.substr(0, text.length) == text) {
completions.push(completion);
}
});
}
return completions;
}
これは非常に単純です。実際のオートコンプリートは単なるリテラル以上のものに一致し、ユーザーが呼び出している関数の引数のリストなど、文法で使用できないコンテキストを利用するための何らかの方法が必要になります。