2013-01-05 4 views
0

Je suis en train de convertir une ligne a, f_1(b, c, f_2(d, e)) à une ligne avec fonction de style Lisp appel a (f_1 b c (f_2 d e)) en utilisant Text::Balanced sous-routines:Perl: Convertir un appel de fonction à une fonction de style Lisp appel

Un appel de fonction est sous la forme f(arglist), arglist peut avoir un ou plusieurs appels de fonction en son sein avec des appels hiérarchiques aussi;

La façon dont j'ai essayé -

my $text = q|a, f_1(a, b, f_2(c, d))|; 

my ($match, $remainder) = extract_bracketed($text); # defaults to '()' 
# $match is not containing the text i want which is : a, b, f_2(c,d) because "(" is preceded by a string; 

my ($d_match, $d_remainder) = extract_delimited($remainder,","); 
# $d_match doesnt contain the the first string 
# planning to use remainder texts from the bracketed and delimited operations in a loop to translate. 

a même essayé le sous extract_tagged avec l'étiquette de départ comme /^[\w_0-9]+\(/ et balise de fin comme /\)/, mais ne fonctionne pas là-bas aussi. Parse::RecDescent est difficile à comprendre et à utiliser dans un court laps de temps.

+1

Vous n'avez pas (cité) délimité littéraux. Vous n'avez aucune utilité pour 'extract_delimited'. Vous n'essayez même jamais d'extraire les identifiants ??? Je pense qu'il est temps que tu embauches quelqu'un. Vous n'avez pas le temps de faire notre travail pour écrire votre code. – ikegami

Répondre

1

Tout ce qui semble nécessaire pour transformer le style LISP est de supprimer les virgules et de déplacer chaque parenthèse ouvrante avant les noms de fonctions qui le précèdent.

Ce programme fonctionne en segmentant la chaîne en identificateurs /\w+/ ou entre parenthèses /[()]/ et en stockant la liste dans le tableau @tokens. Ce tableau est ensuite analysé, et chaque fois qu'un identificateur est suivi d'une parenthèse ouvrante, les deux sont commutés.

use strict; 
use warnings; 

my $str = 'a, f_1(b, c, f_2(d, e))'; 

my @tokens = $str =~ /\w+|[()]/g; 

for my $i (0 .. $#tokens-1) { 
    @tokens[$i,$i+1] = @tokens[$i+1,$i] if "@tokens[$i,$i+1]" =~ /\w \(/; 
} 

print "@tokens\n"; 

sortie

a (f_1 b c (f_2 d e))