2017-03-08 18 views
1

peg.jsを使用してパーサーを書く方法を学習しており、ユニークな問題が発生しました。私は;をデリミタとして使用して、文字列をキー値のペアに分類しています。Peg.jsパーサーで区切り文字を解析できません

:解析する文字列がname=prabesh;city=Bangaloreの場合。私のパーサは現在、キーとしてnameをとり、を値とし、cityをキーとし、bangaloreを値とします。

デリミタが文字列の一部である場合はどうですか?例えば

city=bangalore;address=#12/1;santacruz

どのようにあなたがそれを解析することができますか?

アプローチ:連続し;のための最初の=検索からの連続;の すなわちを検索し、その値として=と最後;間のテキストを検討してください。

この方法の問題点は、値そのものに=があると、パーサが正しく解析できないことです。

例えば、これは失敗します。token=crbz23;4=134;

任意の提案ですか?

答えて

1

PEG文法では、一致させたくないものについて具体的に説明する必要があります。あなたの例では、に先読みしたいのではなく、セミコロンに遭遇した場合にはが新しいキーと一致するようにします。この問題を解決するための一般的なPEGイディオムは、(!(id) .)+のようになります。

start = 
    exp+ 

exp = 
    key '=' val ';'? 

key = 
    $([a-z]+) 

val = 
    $((!(';' key '=') .)+) 

入力:

city=bangalore;address=#12/1;santacruz 

出力:

[ 
    [ 
     "city", 
     "=", 
     "bangalore", 
     ";" 
    ], 
    [ 
     "address", 
     "=", 
     "#12/1;santacruz", 
     null 
    ] 
] 
ここでは、あなたの入力を使用した例です
関連する問題