cs_mfaraday
Messages postés144Date d'inscriptionvendredi 18 avril 2003StatutMembreDernière intervention 4 janvier 2010
-
2 mai 2008 à 18:18
pserru
Messages postés3Date d'inscriptionsamedi 9 octobre 2004StatutMembreDernière intervention24 mai 2009
-
24 mai 2009 à 18:51
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
pserru
Messages postés3Date d'inscriptionsamedi 9 octobre 2004StatutMembreDernière intervention24 mai 2009 24 mai 2009 à 18:51
Bonjour Coucou747, bonjour tous,
Mais bien sûr! La modif concernant le nom du fichier d'entrée dans la source faite, je n'ai pas penser à ajouter
#!/usr/bin/php
en première ligne! Je suis désolé pour le dérangement.
Maintenant, ça a tout de même une autre et fière allure!
Merci.
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 24 mai 2009 à 13:41
salut
execute le avec php recode.php
pserru
Messages postés3Date d'inscriptionsamedi 9 octobre 2004StatutMembreDernière intervention24 mai 2009 24 mai 2009 à 03:49
Bonjour Coucou747
C'est du beau code, et je ne regrette pas (-: encore) le temps passé à tenter la mise en œuvre. J'utilise PHP 5.2.9 en ligne de commamde, sur OpenSuse 10.3. J'ai donc viré les lignes relatives à la sortie en HTML. Et voici la réponse:
> ./recode.php
./recode.php: line 1: ?php: Aucun fichier ou répertoire de ce type
./recode.php: line 3: /bin: is a directory
./recode.php: line 35: syntax error near unexpected token `('
./recode.php: line 35: `En C, avec l'option -O2 (ou 1 ou 3), lorsque le code est _tail_recursif_ (ou recursivite finnie),'
Visiblement, les messages d'erreur sont inadéquats. En mode console, cela arrive régulièrement (si ce n'est systématiquement) á l'éxécution, tandis que les erreurs issues du "parser" sont toujours justes.
Pour une construction "de rien", on s'en sort, mais dans le cas présent, il me faudra essayer PHP comme module Apache, sans doute...
Une idée ?
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 8 mai 2008 à 03:46
en fait, suite a une discution sur irc, j'ai vu que continue prennait un paran, je l'ignorais jusqu'a present, le fait que continue prenne un parametre peut permettre de coder un php - tail recursif.
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 5 mai 2008 à 22:58
non, faudrait faire des calculs d'inference de types pour ca, et dans un langage comme le php, ca ne peut pas se faire aussi facilement...
LocalStone
Messages postés514Date d'inscriptionmercredi 19 mars 2003StatutMembreDernière intervention 1 mars 2009 5 mai 2008 à 22:50
J'avoue ne pas m'être plongé dans ton code et ma question découle uniquement de la description de ta source ...
Peut-on utiliser ton code dans le but de remplacer quelque chose comme :
/* -------------------- */
$strMyString = 'MyString';
$intCharacterPosition = $strMyString -> indexOf('S');
echo $intCharacterPosition; // 2
/* -------------------- */
par :
/* -------------------- */
$strMyString = 'MyString';
$intCharacterPosition = strpos($strMyString, 'S');
echo $intCharacterPosition; // 2
/* -------------------- */
En gros, l'idée c'est de pouvoir rendre tout les type de base PHP compatible avec l'Orienté Objet.
Merci !
P.S. : Commente ton code ... Parce que je pense pas que la première personne venue puisse comprendre tout ce que tu veux faire, même si c'est bien codé.
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 4 mai 2008 à 00:05
en effet, ca peut se transformer simplement en une boucle, mais imagine un exemple plus complique, ca serait alors impossible de faire une simple boucle et un break a la place du return...
sinon, ca se fait en O(1) avec une formule genre n(n+1)/2
cs_yoman64
Messages postés592Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 4 décembre 2008 3 mai 2008 à 23:54
Salut,
L'exemple que tu donnes ça se fait en boucle tout simplement aussi, non ?
function sub_f ($a, $b){
while ($a!=0){
$a1=$a-1;
$b1=$a+$b;
$a=$a1; $b=$b1;
}
return $b
}
function sumOfNaturals($n){
return sub_f($n, 0);
}
Moi je vois mal l'intérêt des Gotos, sauf dans le cas de programmation linéaire ou on doit sauter plus loin dans le code, souvent ça serait vachement pratique.
Je vois pas l'intérêt d'un goto pour faire des boucles comme dans ton exemple, mais peut être y a t'il une subtilité que je n'ai pas comprise ?
PS: Merci pour l'explication sur les tokens, en effet c'est porc de leurs part, je me demande pourquoi...
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 3 mai 2008 à 14:31
pour supprimer la recursiviter de facon automatique, c'est ca ou des Exceptions...
Optitech
Messages postés134Date d'inscriptionsamedi 19 octobre 2002StatutMembreDernière intervention 3 janvier 2009 3 mai 2008 à 10:10
> goto debut;
J'abore !
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 3 mai 2008 à 03:26
en php, t'as des tokens qui n'ont pas de constante (c'est porc de leur part, mais ils ont fait ca...)
regarde la ligne 75 : private static $mytoken = array( c'est ici que j'ai mis les tokens qui n'ont pas de constante (pour pouvoir les traiter de la meme facon que le reste)
Bref, j'ai mis pas beaucoup de tokens, et une grammaire reduite.
cs_yoman64
Messages postés592Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 4 décembre 2008 3 mai 2008 à 02:28
Salut,
Ton code semble excellent, comme à l'habitude, et il m'intéresse beaucoup. Ça va me permettre d'appronfondir mes connaissances sur les tokens en php.
J'ai essayé de l'executer sur le fichier test.php et mis à part quelques warning (Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of [runtime function name]().) ça fonctionne et me retourne un beau code formaté avec des comms doxygen.
Mais dès que je lui passe un code plus complexe j'ai un fatal error :(. Je te laisse l'erreur:
Fatal error: Uncaught exception 'Exception' with message 'Token @ non defini' in /home/alextest/html/recode.php:137
Stack trace:
#0 /home/alextest/html/recode.php(1212): Token->__construct('@')
#1 {main}
thrown in /home/alextest/html/recode.php
J'ai aussi #0 /home/alextest/html/recode.php(1212): Token->__construct('[') sur d'autres fichiers (recode.php par exemple)
Ce que j'en comprends c'est que qu'il y a des tokens non gêrés par ton code, si c'est le cas je me demandais pourquoi ? Est-ce qu'ils sont différents ? Juste pas pensé ?
Tien, pour une fois j'vais laisser une note ^^ 9/10 puisque l'idée est excellente, et le code instructif.
@+
cs_mfaraday
Messages postés144Date d'inscriptionvendredi 18 avril 2003StatutMembreDernière intervention 4 janvier 2010 2 mai 2008 à 22:57
Hello
Je te remercie pour les renseignements... je viens de me rendre compte que ma version de php était relativement... ancienne.
Ce qui m'a permit de mettre à jour php. Et ok ton code fonctionne parfaitement :)
Florian
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 2 mai 2008 à 18:45
c'est etrange... quelle est ta version de php ? et sur quel fichier as tu teste ca ?
moi : 5.2.4
cs_mfaraday
Messages postés144Date d'inscriptionvendredi 18 avril 2003StatutMembreDernière intervention 4 janvier 2010 2 mai 2008 à 18:44
re re Bonsoir
J'apprendrais à lire jusqu'au bout php.net.. l'index 2 est rajouté depuis la version php 5.2.2...
Flo
cs_mfaraday
Messages postés144Date d'inscriptionvendredi 18 avril 2003StatutMembreDernière intervention 4 janvier 2010 2 mai 2008 à 18:38
Re Bonsoir
Je viens de regarder un peu...
Bon à la barbare, j'ai déclaré un $filename = '';
Donc dans un premier temps, php m'envoies des messages :
Strict Standards: Declaration of Token::contient() should be compatible with that of Node::contient() in /app/HTTP/recode.php on line 209
Toute une liste...
et ensuite :
Notice: Undefined offset: 2 in /app/HTTP/recode.php on line 130
Notice: Undefined offset: 2 in /app/HTTP/recode.php on line 131
et enfin un joli :
Fatal error: Uncaught exception 'Exception' with message 'Token [ non defini' in /app/HTTP/recode.php:139 Stack trace: #0 /app/HTTP/recode.php(1217): Token->__construct('[') #1 {main} thrown in /app/HTTP/recode.php on line 139
Bon j'ai quand même zieuté un peu :
- J'ai capté via php.net que token_get_all renvoie un tableau avec mon code source scindé...
- avec un pauvre echo '' . print_r( $lexer, true ) . '
'; en ligne 1134 le script me balance bien mon code source scindé.
- étape suivante tu fais un foreach ($lexer as $token) puis un new Token( $token )
- je regarde la class Token et la j'ai un problème : dans ton construct je vois un $t qui visiblement à au moins 3 lignes (0, 1 et 2) mais moi quand je regarde mon $token j'en ai que deux (0 et 1).
Voila mon problème de mes lignes 130 et 131, je n'ai pas d'index 2 dans mon $token... est ce normal ???
Flo
coucou747
Messages postés12303Date d'inscriptionmardi 10 février 2004StatutMembreDernière intervention30 juillet 201244 2 mai 2008 à 18:27
24 mai 2009 à 18:51
Mais bien sûr! La modif concernant le nom du fichier d'entrée dans la source faite, je n'ai pas penser à ajouter
#!/usr/bin/php
en première ligne! Je suis désolé pour le dérangement.
Maintenant, ça a tout de même une autre et fière allure!
Merci.
24 mai 2009 à 13:41
execute le avec php recode.php
24 mai 2009 à 03:49
C'est du beau code, et je ne regrette pas (-: encore) le temps passé à tenter la mise en œuvre. J'utilise PHP 5.2.9 en ligne de commamde, sur OpenSuse 10.3. J'ai donc viré les lignes relatives à la sortie en HTML. Et voici la réponse:
> ./recode.php
./recode.php: line 1: ?php: Aucun fichier ou répertoire de ce type
./recode.php: line 3: /bin: is a directory
./recode.php: line 35: syntax error near unexpected token `('
./recode.php: line 35: `En C, avec l'option -O2 (ou 1 ou 3), lorsque le code est _tail_recursif_ (ou recursivite finnie),'
Visiblement, les messages d'erreur sont inadéquats. En mode console, cela arrive régulièrement (si ce n'est systématiquement) á l'éxécution, tandis que les erreurs issues du "parser" sont toujours justes.
Pour une construction "de rien", on s'en sort, mais dans le cas présent, il me faudra essayer PHP comme module Apache, sans doute...
Une idée ?
8 mai 2008 à 03:46
5 mai 2008 à 22:58
5 mai 2008 à 22:50
Peut-on utiliser ton code dans le but de remplacer quelque chose comme :
/* -------------------- */
$strMyString = 'MyString';
$intCharacterPosition = $strMyString -> indexOf('S');
echo $intCharacterPosition; // 2
/* -------------------- */
par :
/* -------------------- */
$strMyString = 'MyString';
$intCharacterPosition = strpos($strMyString, 'S');
echo $intCharacterPosition; // 2
/* -------------------- */
En gros, l'idée c'est de pouvoir rendre tout les type de base PHP compatible avec l'Orienté Objet.
Merci !
P.S. : Commente ton code ... Parce que je pense pas que la première personne venue puisse comprendre tout ce que tu veux faire, même si c'est bien codé.
4 mai 2008 à 00:05
sinon, ca se fait en O(1) avec une formule genre n(n+1)/2
3 mai 2008 à 23:54
L'exemple que tu donnes ça se fait en boucle tout simplement aussi, non ?
function sub_f ($a, $b){
while ($a!=0){
$a1=$a-1;
$b1=$a+$b;
$a=$a1; $b=$b1;
}
return $b
}
function sumOfNaturals($n){
return sub_f($n, 0);
}
Moi je vois mal l'intérêt des Gotos, sauf dans le cas de programmation linéaire ou on doit sauter plus loin dans le code, souvent ça serait vachement pratique.
Je vois pas l'intérêt d'un goto pour faire des boucles comme dans ton exemple, mais peut être y a t'il une subtilité que je n'ai pas comprise ?
PS: Merci pour l'explication sur les tokens, en effet c'est porc de leurs part, je me demande pourquoi...
3 mai 2008 à 14:31
3 mai 2008 à 10:10
J'abore !
3 mai 2008 à 03:26
regarde la ligne 75 : private static $mytoken = array( c'est ici que j'ai mis les tokens qui n'ont pas de constante (pour pouvoir les traiter de la meme facon que le reste)
Bref, j'ai mis pas beaucoup de tokens, et une grammaire reduite.
3 mai 2008 à 02:28
Ton code semble excellent, comme à l'habitude, et il m'intéresse beaucoup. Ça va me permettre d'appronfondir mes connaissances sur les tokens en php.
J'ai essayé de l'executer sur le fichier test.php et mis à part quelques warning (Call-time pass-by-reference has been deprecated; If you would like to pass it by reference, modify the declaration of [runtime function name]().) ça fonctionne et me retourne un beau code formaté avec des comms doxygen.
Mais dès que je lui passe un code plus complexe j'ai un fatal error :(. Je te laisse l'erreur:
Fatal error: Uncaught exception 'Exception' with message 'Token @ non defini' in /home/alextest/html/recode.php:137
Stack trace:
#0 /home/alextest/html/recode.php(1212): Token->__construct('@')
#1 {main}
thrown in /home/alextest/html/recode.php
J'ai aussi #0 /home/alextest/html/recode.php(1212): Token->__construct('[') sur d'autres fichiers (recode.php par exemple)
Ce que j'en comprends c'est que qu'il y a des tokens non gêrés par ton code, si c'est le cas je me demandais pourquoi ? Est-ce qu'ils sont différents ? Juste pas pensé ?
Tien, pour une fois j'vais laisser une note ^^ 9/10 puisque l'idée est excellente, et le code instructif.
@+
2 mai 2008 à 22:57
Je te remercie pour les renseignements... je viens de me rendre compte que ma version de php était relativement... ancienne.
Ce qui m'a permit de mettre à jour php. Et ok ton code fonctionne parfaitement :)
Florian
2 mai 2008 à 18:45
moi : 5.2.4
http://fr.php.net/manual/en/function.token-get-all.php
5.2.2 Line numbers are returned in element 2
apparement, on a besoin d'un php >= 5.2.2
2 mai 2008 à 18:44
J'apprendrais à lire jusqu'au bout php.net.. l'index 2 est rajouté depuis la version php 5.2.2...
Flo
2 mai 2008 à 18:38
Je viens de regarder un peu...
Bon à la barbare, j'ai déclaré un $filename = '';
Donc dans un premier temps, php m'envoies des messages :
Toute une liste...
et ensuite :
et enfin un joli :
Bon j'ai quand même zieuté un peu :
- J'ai capté via php.net que token_get_all renvoie un tableau avec mon code source scindé...
- avec un pauvre echo '' . print_r( $lexer, true ) . '
'; en ligne 1134 le script me balance bien mon code source scindé.
- étape suivante tu fais un foreach ($lexer as $token) puis un new Token( $token )
- je regarde la class Token et la j'ai un problème : dans ton construct je vois un $t qui visiblement à au moins 3 lignes (0, 1 et 2) mais moi quand je regarde mon $token j'en ai que deux (0 et 1).
Voila mon problème de mes lignes 130 et 131, je n'ai pas d'index 2 dans mon $token... est ce normal ???
Flo
2 mai 2008 à 18:27
2 mai 2008 à 18:18
Alors la je dois avouer que j'ai rien capté :D Tu m'as bluffé !
Euh... Comment on utilise tout ça dis moi ??
Florian