ここにはいくつかのことがあります。
最も重要なことは、PEGが貪欲であることを認識する必要があるということです。つまり、ルールはas(DOT id)*
にあるものを含むすべての DOT id シーケンスに一致します。startRule
DOT b:id
これは、先読みを使用して解決できます。
join
もう 1 つは、デフォルトでは各文字を配列のメンバーとして返すため、忘れずに を使用する必要があることです。
セミコロンのルールも追加しました。
これを試して:
start =
namespace:namespace DOT name:string OPEN_BRACE CLOSE_BRACE SM nl?
{
return { namespace : namespace, name : name };
}
/* Here I'm using the lookahead: (member !OPEN_BRACE)* */
namespace =
first:string rest:(member !OPEN_BRACE)*
{
rest = rest.map(function (x) { return x[0]; });
rest.unshift(first);
return rest;
}
member =
DOT str:string
{ return str; }
DOT =
'.'
OPEN_BRACE =
'('
CLOSE_BRACE =
')'
SM =
';'
nl =
"\n"
string =
str:[a-zA-Z]+
{ return str.join(''); }
そして、私が知る限り、その行を正しく解析しています。