RECODE AST GRAMMAIRE DU PHP

cs_mfaraday Messages postés 144 Date d'inscription vendredi 18 avril 2003 Statut Membre Dernière intervention 4 janvier 2010 - 2 mai 2008 à 18:18
pserru Messages postés 3 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 24 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.

https://codes-sources.commentcamarche.net/source/46528-recode-ast-grammaire-du-php

pserru Messages postés 3 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 24 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és 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
24 mai 2009 à 13:41
salut

execute le avec php recode.php
pserru Messages postés 3 Date d'inscription samedi 9 octobre 2004 Statut Membre Dernière intervention 24 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és 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
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és 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
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és 514 Date d'inscription mercredi 19 mars 2003 Statut Membre Derniè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és 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
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és 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Derniè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és 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
3 mai 2008 à 14:31
pour supprimer la recursiviter de facon automatique, c'est ca ou des Exceptions...
Optitech Messages postés 134 Date d'inscription samedi 19 octobre 2002 Statut Membre Dernière intervention 3 janvier 2009
3 mai 2008 à 10:10
> goto debut;

J'abore !
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
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és 592 Date d'inscription samedi 19 janvier 2002 Statut Membre Derniè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és 144 Date d'inscription vendredi 18 avril 2003 Statut Membre Derniè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és 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
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

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
cs_mfaraday Messages postés 144 Date d'inscription vendredi 18 avril 2003 Statut Membre Derniè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és 144 Date d'inscription vendredi 18 avril 2003 Statut Membre Derniè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és 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
2 mai 2008 à 18:27
il suffit d'aller sur la page http://.../recode.php?argv=test.php
cs_mfaraday Messages postés 144 Date d'inscription vendredi 18 avril 2003 Statut Membre Dernière intervention 4 janvier 2010
2 mai 2008 à 18:18
Bonsoir,

Alors la je dois avouer que j'ai rien capté :D Tu m'as bluffé !

Euh... Comment on utilise tout ça dis moi ??

Florian
Rejoignez-nous