2010-11-25 14 views
0

je suis l'apprentissage de Perl, je voudrais entourée d'une expression comme cellePerl: manipulation de chaînes autour d'une expression mathématique

function1(mathematical_expresion1)*function2(mathematical_expresion2) 

Où peut-être ce mot function1'and « fonction2 » et combiner des nombres à l'intérieur, par exemple function1 pourrait être fun3dec, fun4nels, factor9 ou autre ... donc mon code sera devenu cette

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

Où et entouré surroundedend sont des chaînes de cordes.

Donc, si j'ai une expression comme ceci:

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 

je pourrais entourer une toute multiplication de deux termes dans l'expression précédente.

Merci de m'avoir appris Perl!

+0

peut-on imbriquer des fonctions? Les multiplications peuvent-elles être imbriquées dans les fonctions? pouvez-vous utiliser des crochets supplémentaires pour entourer les expressions? –

Répondre

1

Voici une première solution (incomplète), qui soulève des questions sur ce que vous voulez faire:

J'ai utilisé une syntaxe plus simple pour concision et de clarté - les arguments des fonctions sont simples chiffres ou expressions. les noms de fonctions sont des lettres simples. L'entourage est remplacé par S{}. Cependant, il est facile de passer de ceci à votre exemple.

sample.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) 

Donc, ce qui devrait la ligne 7 faire? Que devrait faire la ligne 8?

La ligne 9 ne fonctionne pas parce que mon code n'est pas assez intelligent, et je ne sais pas si vous avez besoin de travailler.


Je suggère que vous avez vraiment besoin d'un analyseur (par exemple yacc) ainsi que d'un lexer. Perl a un lexeur, mais pas un analyseur.

Le problème ici est que vous êtes à la recherche pour les instances de:

<expression> `*` <expression> 

mais étant donné que l'expression est définie comme

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

Vous avez besoin d'un push down automaton pour faire ce travail correctement. Les expressions régulières Perl ne peuvent tout simplement pas faire cela.

NOTE: cela fait une dizaine d'années depuis mon cours de compilateur, donc je suis peut-être un peu bancal dans ma terminologie.

+0

ligne 7 devrait faire 'S {S {A (1) * B (2)} * S {C (3) * D (4)}} – Peterstone

+0

ligne 8 devrait faire S {A (S {B (2) * C (3)}) * D (4)} – Peterstone

+1

vous avez besoin d'un analyseur. Jetez un oeil à Lex et Yacc. –