0

I´m learning Perl, I would like to surrounded an expression like that

function1(mathematical_expresion1)*function2(mathematical_expresion2)

Where 'function1'and 'function2' could be whatever word and combine numbers inside, for instance function1 could be fun3dec, fun4nels, factor9 or whatever... so my code will became this

surrounded(function1(mathematical_expresion1)*function2(mathematical_expresion2))surroundedend

Where surrounded and surroundedend are string chains.

So if I have an expression like this:

exp(-49/200)-exp(-49/200)*(x-49/200)+1/2*exp(-49/200)*(x-49/200)^2-1/6*exp(-49/200)*(x-49/200)^3+1/24*exp(-49/200)*(x-49/200)^4-1/120*exp(-49/200)*(x-49/200)^5+1/720*exp(-49/200)*(x-49/200)^6-1/5040*exp(-49/200)*(x-49/200)^7+1/40320*exp(-49/200)*(x-49/200)^8-1/362880*exp(-49/200)*(x-49/200)^9+1/3628800*exp(-49/200)*(x-49/200)^10-1/39916800*exp(-49/200)*(x-49/200)^11+1/479001600*exp(-49/200)*(x-49/200)^12

I could surround a all multiplication of two terms in the previous expression.

Thank you for teach me Perl!

4

1 に答える 1

1

これが最初の(不完全な)解決策であり、何をしたいのかについていくつかの疑問が生じます。

簡潔さと明確さのために、より単純な構文を使用しました。関数への引数は、単純な数字または式です。関数名は一文字です。サラウンドは に置き換えられS{}ます。ただし、これからあなたの例に拡張するのは簡単です。

サンプル.txt:

 1  A(1)
 2  A(1)*B(2)
 3  C(2)+A(1)*B(2)
 4  C(A(1)*B(2))
 5  C(A(1)*B(3)+C(4))
 6  A(1)*B(2)+C(3)*D(4)
 7  A(1)*B(2)*C(3)*D(4)
 8  A(B(2)*C(3))*D(4)
 9  C(A(1)+B(3))*C(4)

perl < sample.txt -pe 's/(\w\(\d+\)\*\w\(\d+\))/S{\1}/g'

 1  A(1)
 2  S{A(1)*B(2)}
 3  C(2)+S{A(1)*B(2)}
 4  C(S{A(1)*B(2)})
 5  C(S{A(1)*B(3)}+C(4))
 6  S{A(1)*B(2)}+S{C(3)*D(4)}
 7  S{A(1)*B(2)}*S{C(3)*D(4)}
 8  A(S{B(2)*C(3)})*D(4)
 9  C(A(1)+B(3))*C(4)

では、7行目は何をすべきでしょうか? 8行目は何をすべきですか?

私のコードは十分に賢くないため、9行目は機能しません。また、機能する必要があるかどうかもわかりません。


レクサーだけでなく、パーサー (yacc など) も必要になることをお勧めします。Perl にはレクサーがありますが、パーサーはありません。

ここでの問題は、次のインスタンスを検索していることです。

<expression> `*` <expression>

しかし、式は次のように定義されているため、

<expression> = \d+
             | <function>
             | <expression> <op> <expression>

これを正しく機能させるには、プッシュ ダウン オートマトンが必要です。Perl の正規表現ではこれができません。

注: コンパイラ コースを受講してから 10 年が経ちました。

于 2010-11-25T14:43:35.763 に答える