単純な文法をPEG.js プレイグラウンドに入力することで、PEG に頭を悩ませようとしています。
例 1:
- 入力:
"abcdef1234567ghijklmn8901opqrs"
望ましい出力:
["abcdef", "1234567", "ghijklmn", "8901", "opqrs"]
実際の出力:
["abcdef", ["1234567", ["ghijklmn", ["8901", ["opqrs", ""]]]]]
この例はほとんど機能しますが、結果の配列を 100 万レベルにネストしないように PEG.js を取得できますか? concat()
どこかの代わりに使うのがコツjoin()
だと思いますが、場所がわかりません。
start
= Text
Text
= Numbers Text
/ Characters Text
/ EOF
Numbers
= numbers: [0-9]+ {return numbers.join("")}
Characters
= text: [a-z]+ {return text.join("")}
EOF
= !.
例 2:
例 1 と同じ問題とコードですが、Characters ルールを次のように変更すると、同じ結果が得られると予想されます。
Characters
= text: (!Numbers .)+ {return text.join("")}
結果の出力は次のとおりです。
[",a,b,c,d,e,f", ["1234567", [",g,h,i,j,k,l,m,n", ["8901", [",o,p,q,r,s", ""]]]]]
これらの空の一致がすべて取得されるのはなぜですか?
例 3:
最後の質問。これはまったく機能しません。どうすればそれを機能させることができますか?ボーナス ポイントとして、効率性に関するヒントはありますか? たとえば、可能であれば再帰を避けるべきですか?
優れた PEG チュートリアルへのリンクもいただければ幸いです。( http://www.codeproject.com/KB/recipes/grammar_support_1.aspx )を読みましたが、ご覧のとおり、さらに助けが必要です ...
- 入力:
'abcdefghijklmnop"qrstuvwxyz"abcdefg'
- 望ましい出力:
["abcdefghijklmnop", "qrstuvwxyz", "abcdefg"]
- 実際の出力:
"abcdefghijklmnop\"qrstuvwxyz\"abcdefg"
start
= Words
Words
= Quote
/ Text
/ EOF
Quote
= quote: ('"' .* '"') Words {return quote.join("")}
Text
= text: (!Quote . Words) {return text.join("")}
EOF
= !.