2

スクリプト言語用のパーサーを作成するために Irony を使用していますが、ちょっとした問題に遭遇しました。

'(' [ Ident { ',' Ident } ] ')'

私はすでにいくつかのトリックを試しました

Chunk.Rule = (Ident | Ident + "," + Chunk);
CallArgs.Rule = '(' + Chunk + ')' | '(' + ')';

しかし、それは醜く、それが本来の方法で機能するかどうかさえわかりません(まだ試していません...)。誰か提案はありますか?

編集:私はこれらのヘルパー メソッド (MakeStarList、MakePlusList) を見つけましたが、Irony のドキュメントが完全に不足しているため、それらの使用方法を見つけることができませんでした...誰か手がかりはありますか?

4

1 に答える 1

1
// Declare the non-terminals
var Ident = new NonTerminal("Ident");
var IdentList = new NonTerminal("Term");

// Rules
IdentList.Rule = ToTerm("(") + MakePlusRule(IdentList, ",", Ident) + ")";
Ident.Rule = // specify whatever Ident is (I assume you mean an identifier of some kind).

MakePlusRule ヘルパー メソッドを使用して、端末の 1 つまたは複数のオカレンスを定義できます。MakePlusRule は基本的に、端末を標準の再帰的なリスト イディオムとして提示するだけです。

Ident |  IdentList + "," + Ident

また、ターミナルをリストを表すものとしてマークし、パーサーにリスト ツリーを子ノードの便利なリストとして展開するように指示します。

于 2013-12-19T08:04:20.570 に答える