2

問題

一見したところ、深刻なバグがなければマクロを適切にネストすることはできません。

主な問題は、データ オブジェクトからマクロの値を取得すると、この値がリストにネストされることです。

a[X] -> $X {% id %}
main -> a["test"] {% id %}

Parse results:
[ [ 'test' ] ]

期待される結果は です[ 'test' ]

簡単な修正は data[0][0] を返すことですが、結果がマクロのレイヤーごとにネストされるため、それだけでは不十分です。

a[X] -> b[$X] {% id %}
b[X] -> $X {% id %}
main -> a["test"] {% id %}

Parse results:
[ [ [ 'x' ] ] ]

バグを修正するdata => data[0][0]ために、各マクロに使用できます。しかし、これは絶対に醜いです。

本当の解決策は、動的スコープを使用することです。(私の知る限り) パラメーターなしでマクロを作成することはできないため、役に立たないパラメーターを使用しましょう。

a[X] -> b["_"] {% id %}
b[_] -> $X {% id %}
main -> a["test"] {% id %}

Parse results:
[ [ 'test' ] ]

これにより、以前に発生したネスティング地獄が停止します。500 のサブマクロを通過しても、同じ結果が得られます。しかし、最後の sub-macro に data[0][0] を配置する必要があります。bこれにより、bマクロを単独で使用aすることができなくなります。これを機能させるには、使用する必要があります。

- 最後のマクロを単独で使用できるようにする - data => data[0][0] の使用を避ける

4

2 に答える 2

0

ソリューション

この問題を回避するための最善の解決策は次のとおりです。

a[X] -> b[$X] {% id %}
b[X] -> c[$X] {% id %}
c[X] -> $X {% data => data[0].join('') %}

main -> a["test"] {% id %}

Parse results:
[ 'test' ]

説明

問題は、最後のサブマクロが結果を取得するとき、nearley はデフォルトですべてを配列と見なすため、結果が配列にネストされ、各レイヤーが同じことを行うことでした。配列で join メソッドを使用すると、文字列になり、各マクロは配列への配置を停止します。

于 2018-10-30T05:58:06.733 に答える