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 正则表达式无法做到这一点。

注意:我的编译器课程已经十年了,所以我的术语可能有点不稳定。

于 2010-11-25T14:43:35.763 回答