6

私は次のようなルールを持っています

interfaceCommands
    :   descriptionCmd
        ipAddressCmd
        otherCmd
    ;

の期待される順序はCmds文法に記載されているとおりですが、これらの順序が入れ替わった場合にも入力を受け入れることができるはずCmdsです。たとえば、いつでも、実際の入力のipAddressCmddescriptionCmdまたは後に来ることができます。otherCmdこれらの無秩序な入力に対応して解析できるようにするには、文法をどのように変更する必要がありますか?

4

1 に答える 1

10

これにはいくつかの方法があります。最も単純なオプションの 1 つは、次のパーサー規則を使用することです。

interfaceCommands
  : (descriptionCmd | ipAddressCmd | otherCmd)*
  ;

解析が完了した後、リスナーまたはビジターで追加の検証を実行できます (たとえば、1 つだけdescriptionCmdが解析されたことを確認するか、これらの各項目の 1 つだけが解析されたことを確認するなど)。この戦略には多くの利点があります。特に、より多くの種類の構文エラーを明確なメッセージで検出および報告する能力が向上します。

もう 1 つのオプションは、ユーザーがこれらの項目を入力できる方法を単純に列挙することです。これは書き込み/読み取り/検証/保守が難しいため、より一般的なパーサー ルールを使用して後で検証を実行する方法が他にない場合にのみ、このオプションを使用します。

interfaceCommands
  : descriptionCmd ipAddressCmd otherCmd
  | descriptionCmd otherCmd ipAddressCmd
  | ipAddressCmd descriptionCmd otherCmd
  | ipAddressCmd otherCmd descriptionCmd
  | otherCmd descriptionCmd ipAddressCmd
  | otherCmd ipAddressCmd descriptionCmd
  ;
于 2013-07-17T12:24:38.710 に答える