1

(空白で区切られた)ペアのリストを次の形式で解析したい

name1=value1 name2=value2 ...

どこ:

  • NAMEには、空白と等号以外のすべてを含めることができます
  • VALUEには、空白以外のものを含めることができます(等号を含む)。

問題は、パーサーを次のような入力と一致させることです。

name1=value1

'NAME EQUALS VALUE'単一のトークンとしてではなく、個別のトークンとして'VALUE'

PS。これを直接コーディングするのは簡単ですが、より大きなパーサーのコンテキストでこれが必要です。

4

3 に答える 3

1

これを解析するantlrの何かがあります。

a=b=c=d c=d e=f

これはあなたが必要とするすべてではないかもしれませんが、それはコアであるべきです。

grammar NameValuePairs;

pairs   :  namevaluepair (WS namevaluepair)*;

namevaluepair
  :  name '=' value;

name  :  ID;

value  :  ID ('=' ID)*;

WS  :  ' ' {skip()};

EQ  :  '=';

ID  :  ~(' ' | '=')*;
于 2009-06-19T11:39:56.613 に答える
0

VALUEに等号を含めることができると、問題が発生する可能性があると思います。可能であれば、等号を予約文字にするか、別の予約文字に切り替えて「=」を意味する方がよいと思います。

これがより大きなパーサーのコンテキストで機能するかどうかはわかりませんが、スペースで分割して、「NAME = VALUE」ペアの配列(または言語が使用するデータ構造)を提供することができます。次に、配列をループして、「=」に使用している予約文字で再度分割します。'='を変更または予約できない場合は、'='の最初のインスタンスに一致するように正規表現を使用できます。私がベースから離れていないことを願っています!

于 2009-05-22T13:59:53.710 に答える
0

名前と値のペアに強力なパーサーは必要ありません。正規表現で十分です。コンテキスト構造またはネストされた構造がない限り、この「ジョブ」はパーサーではなくレクサーに属します:)

于 2009-05-22T14:04:19.083 に答える