2012-05-13 1 views
0

グループ内に内部グループを持つコンマ区切りグループ(角カッコで囲んである)を解析する必要があります。外部のグループのみを分離する必要があります。内部グループを持つ可能性のあるコンマ区切りグループを解析するためのlpeg文法

私はこれを行う機能を持っている:

function lpeg.commaSplit(arg) 
    local P,C,V,sep = lpeg.P, lpeg.C, lpeg.V, lpeg.P(",") 
    local p = P{ 
     "S"; 
     S = lpeg.T_WSpace * C(V"Element") * (lpeg.T_WSpace * sep * lpeg.T_WSpace * C(V"Element"))^0 * lpeg.T_WSpace, 
     Element = (V"Group")^0 * (1 - lpeg.T_Group - sep)^0 * (V"Group" * (1 - lpeg.T_Group - sep)^0)^0 * (1 - sep)^0, 
     Group = lpeg.T_LGroup * ((1 - lpeg.T_Group) + V"Group")^0 * lpeg.T_RGroup 
    }^-1 
    return lpeg.match(lpeg.Ct(p), arg) 

end 

をしかし、問題は、グループを囲むことがあり、余分な括弧を削除することです。ここで

はテスト文字列です:

[[a,b,[c,d]],[e,[f,g]]] 

[a,b,[c,d] & [e,[f,g]] 

に解析する必要がある内部グループが放置されている注意してください。 a,b,[c,d]],[e,[f,g]のような文字列で終わるので、最後に余分な角かっこを単純に取り除くことはできません。

lpeg文法を変更して外部のグループを許可する方法はありますか?私はLPegで文法を作るの専門家ではないよ、私が行うことが、この演習では、面白い発見

+0

lpeg.T_WSpace、lpeg.T_Groupおよびlpeg.T_LGroupとは何ですか? – PhiLho

+0

@philho笑、彼らが何であるかはっきりしているはずです – Uiy

+2

おそらく、答えを得る機会を増やすために彼らの定義を与える方が良いです...私は推測することができますが、答えたい人の仕事を楽にする方が、あなたがまだそれを望むならば、正確な答えを持つこと。 – PhiLho

答えて

3

...

私はあなたの文法を使用して管理することができませんでしたので、私は小さいと、私自身を先に行って、作られました私は必要なキャプチャをどこに置くことができるのかを理解しやすくしました。

私はまともな経験的結果を得たと思います。これは、グループがより深く入れ子にすることができれば、私は...キャプチャの後処理が少しアドホックているなど、知らない

require"lpeg" 

-- Guesswork... 
lpeg.T_WSpace = lpeg.P" "^0 
lpeg.T_LGroup = lpeg.P"[" 
lpeg.T_RGroup = lpeg.P"]" 
lpeg.T_Group = lpeg.S"[]" 

function lpeg.commaSplit(arg) 
    local P, C, Ct, V, sep = lpeg.P, lpeg.C, lpeg.Ct, lpeg.V, lpeg.P"," 
    local grammar = 
    { 
    "S"; 
    S = lpeg.T_WSpace * V"Group" * lpeg.T_WSpace, 
    Group = Ct(lpeg.T_LGroup * C(V"Units") * lpeg.T_RGroup), 
    Units = V"Unit" * 
     (lpeg.T_WSpace * sep * lpeg.T_WSpace * V"Unit")^0, 
    Unit = V"Element" + V"Group", 
    Element = (1 - sep - lpeg.T_Group)^1, 
    } 
    return lpeg.match(Ct(P(grammar)^-1), arg) 
end 

local test = "[[a,b,[c,d]],[e,[f,g]]]" 
local res = lpeg.commaSplit(test) 
print(dumpObject(res)) 
print(res[1], res[1][1], res[1][2]) 
local groups = res[1] 
local finalResult = {} 
for n, v in ipairs(groups) do 
    if type(v) == 'table' then 
    finalResult[#finalResult+1] = "[" .. v[1] .. "]" 
    end 
end 
print(dumpObject(finalResult)) 

dumpObjectがちょうどテーブルのダンプは、あなたのテストケースで動作します自分の。次のようにこのコードの出力は次のようになります。

local T = 
{ 
    { 
    "[a,b,[c,d]],[e,[f,g]]", 
    { 
     "a,b,[c,d]", 
     { 
     "c,d" 
     } 
    }, 
    { 
     "e,[f,g]", 
     { 
     "f,g" 
     } 
    } 
    } 
} 

table: 0037ED48 [a,b,[c,d]],[e,[f,g]] table: 0037ED70 

local T = 
{ 
    "[a,b,[c,d]]", 
    "[e,[f,g]]" 
} 

個人的に、私は私のものでlpegテーブルを汚染しないだろうが、私はここにあなたのスタイルを保ちました。

私はこれが役立つことを願っています(進歩させるための出発点になります)。