1) Lexing:
Récupérer tout les tokens du fichier. Un design pattern "FlyWeight" est particulièrement adapté pour optimiser le stockage de ceux-ci. Si le lexing échoue (commentaires mal refermés, caractères invalides), retourner une erreur et tuer le script. Peut être fait à la main ou à l'aide de Flex/Bison.
Voir listes chaînées, design pattern.
2) Parsing:
Construire un arbre de grammaire à l'aide de tokens récupérer. Vérifier la grammaire au fur et à mesure. En cas d'erreur de grammaire, détruire proprement l'arbre, retourner une erreur et tuer le script. Peut être fait à la main ou à l'aide de Flex/Bison.
Voir les arbres généraux.
3) Binding:
Relier dans l'arbre chaque définition de variable ou de fonctions avec son appel. En cas de variable/fonctions orpheline, retourner une erreur "undefined variable", libérer proprement ce qui à été allouer, et tuer le script.
Voir les pointeurs et les arbres généraux, design pattern visitor.
4) Type checking:
A l'aide de l'arbre précédemment binder, vérifier que le type de la variable et son utilisation correspondent bien au même type. Par exemple si on essaie pas de stocker une string dans un int. En cas d'erreur, retourner une erreur "type mismatch", libérer proprement ce qui à été allouer, et tuer le script.
Voir design pattern visitor.
5) Exécution
Maintenant que le script à été entièrement vérifié, se servir de l'arbre pour exécuter ce qui à été écrit. Soit tu convertis ton langage en un langage connus (delphi, C, ...) afin de le compiler par la suite, soit tu crée un exécutable (donc tu convertis en assembleur), soit tu l'interprètes, cad tu l'exécute directement. Pour exécuter l'arbre, il suffit de le parcourir et de transcrire les actions à la volée.
Je te conseille de le faire en programmation orienté objet. Attention, ce projet est vraiment bien plus difficile que tu ne le penses...
Toutefois, c'est sympa de voir des gens motivés pour des choses un peu plus recherché qu'une n-ième "Calculatrice".
Je manque cruellement de temps en ce moment, mais j'aurais bien écrit un exemple de langage simplissime pour étayer mes dires.
Bonne chance à toi.
craftsystem
Messages postés143Date d'inscriptionsamedi 21 juillet 2007StatutMembreDernière intervention 7 mars 2009 17 sept. 2007 à 16:59
Merci
je ne peux pas m'arrêter maintenant
sa dois faire 1 mois et quelque que je me suis lancé au delphi
et se projet ma tellement apris que je ne peux pas PAS continuer
je travaille en se moment sur le moyen d'interprété une simple condition
sa seras déjà bien...
cs_Michel34
Messages postés79Date d'inscriptionsamedi 28 décembre 2002StatutMembreDernière intervention27 juin 2011 17 sept. 2007 à 13:26
Je felicite ton courage,
Mais comme l'explique les autres c'est tres ambitieux , si tu commencer par exemple par ecrire un Add On a Delphi . Je m'explique si tu ecrit une vrai Librairie avec ses propres bibliotheques avec un langage basique en francais et que l'on compilera tout simplement avec Delphi du fait que c'est sous l'environnement Delphi que l'on travaillera , pour te faire une idée un peu le langage Windev .
enfin pour moi ca serait a peu pres le meme chalenge pour toi.
je te souhaite bonne continuation dans tes projets.
Michel
craftsystem
Messages postés143Date d'inscriptionsamedi 21 juillet 2007StatutMembreDernière intervention 7 mars 2009 11 sept. 2007 à 17:35
Merci beaucoup
la mise a jour et dispo
cs_matrix1
Messages postés169Date d'inscriptiondimanche 16 février 2003StatutMembreDernière intervention15 avril 2008 11 sept. 2007 à 15:22
je te souhaite bon courage man, et je peut te dire qur si t'a le feeling que la programmation c'est tous ce que tu sais faire dans la vie, ben! continue, je te conseil de télécharger la documentation de la creation de noyau linux ainsi que de tous l'os, car c gartuit et disponible, pq? ben! simplement car même c tu prendra bc de temps pour faire un langage ou même si tu ne peut pas le faire, tu vas apprendre bc de chose, je te consiel de ne pas arreter , t'es encore jeun et ta tout le temps ;)
craftsystem
Messages postés143Date d'inscriptionsamedi 21 juillet 2007StatutMembreDernière intervention 7 mars 2009 9 sept. 2007 à 22:52
Salut
je viens de testé ce code pour analyser ligne par ligne un RichEdit, mais j'ai un souci...
Elle lis juste ma primière ligne en boucle
CODE:
procedure TForm1.ExecuterClick(Sender: TObject);
var sprocess, sprocess2, s, sGo, sCopy, MSGend : string;
N, msgPos, j : integer;
msg : string;
function isValidChar(const c : char) : boolean;
const validChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$-_.+!*''(),{}|\^~[]`<>#%|<>;/?:@&=';
begin
result := Pos(c, validChars) <> 0;
end;
begin
//début de ton code
RichEdit.Lines.BeginUpdate;
try
for N:= 0 to RichEdit.Lines.Count-1 do
Begin
s:= RichEdit.Lines[N];
sGo:= RichEdit.Lines[N];
sprocess:=RichEdit.Lines[N];
sprocess2:= Copy(sprocess, 1, 3);
if sprocess2 = 'fin' then
exit
else if sprocess2 = 'msg' then
//début de l'analyse de syntaxe
//Cherche une chaine de caractère commençant par ' " '.
msgPos:= Pos('"', sGo);
While msgPos <> 0 do begin // si il y en a une...
sCopy:= Copy(sGo, msgPos, Length(sGo));
j:= 1;
MSGend := '"';
//Cherche la fin de la chaine de caractère.
While isValidChar(sCopy[j]) do begin
MSGend := MSGend + sCopy[j];
j:=j + 1;
end;
msg := copy(sCopy, j, length(sCopy));
//===========================================================
showmessage (msg);
//===========================================================
//Fin de ton code
RichEdit.Lines[N]:= s;
end;
end;
finally
RichEdit.Lines.EndUpdate
end;
end;
end.
j'ai mis un RichEdit et un Button pour le test
et j'ai utiliser la méthode HighLightUrl
pour analyser mes syntaxes.
voilà
si on peu m'éclairé
craftsystem
Messages postés143Date d'inscriptionsamedi 21 juillet 2007StatutMembreDernière intervention 7 mars 2009 5 sept. 2007 à 22:08
Sa fait peur sur le coup
mais bon avec un peu de courage sa devrait le faire
tu te lances dans un sacré boulot ...
je ne sais pas si tu te rend compte de la somme de travail et de connaissance qu'il faut
pour pouvoir donner "vie" a un tel projet
Maintenant si tu veux voir un compilateur écrit en Delphi
afin de te rendre compte de ce qui t'attend ... c'est ici : http://other.jrsoftware.org/ip/ bien que le projet soit gelé il reste quand même un très bon exemple et a plusieurs niveaux
à voir absolument !!!
craftsystem
Messages postés143Date d'inscriptionsamedi 21 juillet 2007StatutMembreDernière intervention 7 mars 2009 5 sept. 2007 à 15:00
J'y travaille déjà, mais merci pour toute c'est info.
je me suis fais un petit délire de type de syntaxe que je voudrais utiliser
dite moi si c'est clair et facile a accimiler
exemple:
: commentaire
: annoncer une variable string
x. ok = "good"
: condition
si ok = "good" alors
msg "good" : messagebox
sinon
: saute vers la case bad
-> bad
: addresse de bad
<- bad
msg "bad"
se n'est qu'une esquise
il me reste tellement a apprendre
Oniria
Messages postés292Date d'inscriptiondimanche 14 mars 2004StatutMembreDernière intervention18 décembre 20143 5 sept. 2007 à 13:35
Bonjour,
Je pense que c'est une bonne initiative, mais il faut déja penser à ce que va apporter ton langage aux différents développeurs. Il existe déja beaucoup de langages différents mais dont chacun apporte ses avantages et ses inconvénients. Je pense que avant de créer un langage, il faut bien poser à plat les besoins des différents programmeurs. Si on regarde de plus pret, la grosse tendance et la programmation facile et rapide. Si on doit passer plusieurs mois à apprendre un langage que l'on est le seul à connaitre, ton langage sera mort nés. Par contre, si tu créer un langage simple, mais puissant, qui apporte de réels avantages par rapport aux autres, ton langage sera utilisé par beaucoup de monde. Je travaille dans la programmation industrielle, nous utilisons un environnement de développement appelé ISAGRAF. Cet environnement est exceptionnel car il est simple car il y a 2 type principaux de programmation : graphique (les opérations sont des boites affichées que l'on relit entre elle par des fils), textuelle (on peut ecrire des partie de code en pseudo C ). L'environnement ne compile pas, il crée des fichier C que l'on compile après avec le compilateur associé au µControleur du boitier à programmer.
En donnant cet exemple, je veux juste te faire remarquer que l'idée est bonne, mais que si tu veux ralier des programmeurs à ta cause, il faut un vrai cahier des charges en s'appuyant sur ce qui existe pour montrer les avantages d'un travail aussi colossal...
Par contre, Je souligne ton courage...
Oniria
craftsystem
Messages postés143Date d'inscriptionsamedi 21 juillet 2007StatutMembreDernière intervention 7 mars 2009 5 sept. 2007 à 11:46
merci
sylvunix
Messages postés93Date d'inscriptionmardi 11 avril 2006StatutMembreDernière intervention 4 mars 2009 5 sept. 2007 à 11:30
Une simple recherche google te donnera toute la documentation et de nombreux exemples sur lex et yacc en langage C. Pour information, j'ai également utilisé il y a longtemps un shareware de Delphi qui fonctionnait très bien (http://www.bumblebeesoftware.com/index.htm).
craftsystem
Messages postés143Date d'inscriptionsamedi 21 juillet 2007StatutMembreDernière intervention 7 mars 2009 5 sept. 2007 à 10:29
Je te remercie pour ton message clair
Je crois que je me suis emballé dans ce que j'ai dit (la fatigue et l'enthousiasme)
Franchement
Si je réussi un language interprété "Ce serait déjà un très bon début !" comme tu le dis
comment utilise ton flex et bison? svp que je regarde sa
merci encore
sylvunix
Messages postés93Date d'inscriptionmardi 11 avril 2006StatutMembreDernière intervention 4 mars 2009 5 sept. 2007 à 10:05
Bonjour craftsystem,
Tu vas me dire que j'en veux aux débutants et que je cherche à démotiver toute initiative. Mais comme le dit f0xi, que je salut au passage, créer son propre langage est un projet très ambitieux qui demande de nombreuses compétences.
J'ai pour ma part créé plusieurs langages dont un, il y a une dizaine d'années, qui a été intégré dans un logiciel commercial. Mon expérience me permet de t'affirmer que tu prends le problème par la fin. En résumé, tu t'attaques à l'emballage alors qu'il n'y a rien dans le paquet ...
Je m'explique.
Un langage se définit par une syntaxe et une grammaire. La syntaxe permet entre autre de dire comment on écrit une chaîne de caractères, le nom d'une variable ... La grammaire quant à elle détermine comment sont structurés les éléments d'un source (affectation, test, boucle, fonction, ...).
Cela doit être le point de départ de ton projet faute de quoi ton algorithme qui va traiter ton code source sera totalement bogué. Je te conseille de t'intéresser aux outils comme lex et yacc (ou flex et bison en open source) sur lesquels ont été créés de très nombreux langages interprétés ou non (principalement dans le monde Unix).
Ensuite vient la phase génération de code. Il faut à ce niveau avoir un très bon niveau en assembleur et une très grande maîtrise du système d'exploitation cible (format du binaire, appels systèmes ...).
Tu peux te limiter à la génération d'un code source dans un autre langage. L'intérêt me semble dans ce cas limité car tu auras en final un langage moins riche et complexe à utiliser car tu devras également compiler le source résultant ... (cf NSDK pour les connaisseurs).
Enfin la cerise sur le gâteau est l'éditeur de source ou EDI pour les versions plus évoluées. Optionnel, il offrira une interface agréable à l'utilisateur final.
Je pense que tu devrais revoir ta cible et te limiter à un langage interprété. Ce serait déjà un très bon début !
craftsystem
Messages postés143Date d'inscriptionsamedi 21 juillet 2007StatutMembreDernière intervention 7 mars 2009 5 sept. 2007 à 05:38
Je me doute que je vais me tirer les cheveux plus d'une fois,
Mais bon...
Franchement je vais te dire pour le moment j'y vais tranquille.
NO STRESS!!
Si je réussi a créer une condition. Déjà je serais trop heureux
Je poste la mise a jour de se pas
Fini le System HighlightURL
faute de ne pas pouvoir installer SynEdit
merci FireJocker pour ton composant FireColorSynth
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 5 sept. 2007 à 05:12
je ne rigole pas, mais même moi j'ai abandonner ce genre d'idée.
faire son propre OS ou son propre langage.
ça demande la maitrise parfaite d'au moins deux choses, le C/C++ et l'assembleur.
sans parler des concepts et regles concernant l'elaboration de ce genre de choses.
sinon un truc, l'affichage des sources galere si on mets des caracteres speciaux dans le nom des repertoires (++) ...
20 sept. 2007 à 18:01
metanil
20 sept. 2007 à 12:13
je te remercie beaucoup pour toute c'est explication
20 sept. 2007 à 11:11
1) Lexing:
Récupérer tout les tokens du fichier. Un design pattern "FlyWeight" est particulièrement adapté pour optimiser le stockage de ceux-ci. Si le lexing échoue (commentaires mal refermés, caractères invalides), retourner une erreur et tuer le script. Peut être fait à la main ou à l'aide de Flex/Bison.
Voir listes chaînées, design pattern.
2) Parsing:
Construire un arbre de grammaire à l'aide de tokens récupérer. Vérifier la grammaire au fur et à mesure. En cas d'erreur de grammaire, détruire proprement l'arbre, retourner une erreur et tuer le script. Peut être fait à la main ou à l'aide de Flex/Bison.
Voir les arbres généraux.
3) Binding:
Relier dans l'arbre chaque définition de variable ou de fonctions avec son appel. En cas de variable/fonctions orpheline, retourner une erreur "undefined variable", libérer proprement ce qui à été allouer, et tuer le script.
Voir les pointeurs et les arbres généraux, design pattern visitor.
4) Type checking:
A l'aide de l'arbre précédemment binder, vérifier que le type de la variable et son utilisation correspondent bien au même type. Par exemple si on essaie pas de stocker une string dans un int. En cas d'erreur, retourner une erreur "type mismatch", libérer proprement ce qui à été allouer, et tuer le script.
Voir design pattern visitor.
5) Exécution
Maintenant que le script à été entièrement vérifié, se servir de l'arbre pour exécuter ce qui à été écrit. Soit tu convertis ton langage en un langage connus (delphi, C, ...) afin de le compiler par la suite, soit tu crée un exécutable (donc tu convertis en assembleur), soit tu l'interprètes, cad tu l'exécute directement. Pour exécuter l'arbre, il suffit de le parcourir et de transcrire les actions à la volée.
Je te conseille de le faire en programmation orienté objet. Attention, ce projet est vraiment bien plus difficile que tu ne le penses...
Toutefois, c'est sympa de voir des gens motivés pour des choses un peu plus recherché qu'une n-ième "Calculatrice".
Je manque cruellement de temps en ce moment, mais j'aurais bien écrit un exemple de langage simplissime pour étayer mes dires.
Bonne chance à toi.
17 sept. 2007 à 16:59
je ne peux pas m'arrêter maintenant
sa dois faire 1 mois et quelque que je me suis lancé au delphi
et se projet ma tellement apris que je ne peux pas PAS continuer
je travaille en se moment sur le moyen d'interprété une simple condition
sa seras déjà bien...
17 sept. 2007 à 13:26
Mais comme l'explique les autres c'est tres ambitieux , si tu commencer par exemple par ecrire un Add On a Delphi . Je m'explique si tu ecrit une vrai Librairie avec ses propres bibliotheques avec un langage basique en francais et que l'on compilera tout simplement avec Delphi du fait que c'est sous l'environnement Delphi que l'on travaillera , pour te faire une idée un peu le langage Windev .
enfin pour moi ca serait a peu pres le meme chalenge pour toi.
je te souhaite bonne continuation dans tes projets.
Michel
11 sept. 2007 à 17:35
la mise a jour et dispo
11 sept. 2007 à 15:22
9 sept. 2007 à 22:52
je viens de testé ce code pour analyser ligne par ligne un RichEdit, mais j'ai un souci...
Elle lis juste ma primière ligne en boucle
CODE:
procedure TForm1.ExecuterClick(Sender: TObject);
var sprocess, sprocess2, s, sGo, sCopy, MSGend : string;
N, msgPos, j : integer;
msg : string;
function isValidChar(const c : char) : boolean;
const validChars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$-_.+!*''(),{}|\^~[]`<>#%|<>;/?:@&=';
begin
result := Pos(c, validChars) <> 0;
end;
begin
//début de ton code
RichEdit.Lines.BeginUpdate;
try
for N:= 0 to RichEdit.Lines.Count-1 do
Begin
s:= RichEdit.Lines[N];
sGo:= RichEdit.Lines[N];
sprocess:=RichEdit.Lines[N];
sprocess2:= Copy(sprocess, 1, 3);
if sprocess2 = 'fin' then
exit
else if sprocess2 = 'msg' then
//début de l'analyse de syntaxe
//Cherche une chaine de caractère commençant par ' " '.
msgPos:= Pos('"', sGo);
While msgPos <> 0 do begin // si il y en a une...
sCopy:= Copy(sGo, msgPos, Length(sGo));
j:= 1;
MSGend := '"';
//Cherche la fin de la chaine de caractère.
While isValidChar(sCopy[j]) do begin
MSGend := MSGend + sCopy[j];
j:=j + 1;
end;
msg := copy(sCopy, j, length(sCopy));
//===========================================================
showmessage (msg);
//===========================================================
//Fin de ton code
RichEdit.Lines[N]:= s;
end;
end;
finally
RichEdit.Lines.EndUpdate
end;
end;
end.
j'ai mis un RichEdit et un Button pour le test
et j'ai utiliser la méthode HighLightUrl
pour analyser mes syntaxes.
voilà
si on peu m'éclairé
5 sept. 2007 à 22:08
mais bon avec un peu de courage sa devrait le faire
merci pour cette PETITE SOURCE...lol
5 sept. 2007 à 21:35
tu te lances dans un sacré boulot ...
je ne sais pas si tu te rend compte de la somme de travail et de connaissance qu'il faut
pour pouvoir donner "vie" a un tel projet
Maintenant si tu veux voir un compilateur écrit en Delphi
afin de te rendre compte de ce qui t'attend ... c'est ici : http://other.jrsoftware.org/ip/
bien que le projet soit gelé il reste quand même un très bon exemple et a plusieurs niveaux
à voir absolument !!!
5 sept. 2007 à 15:00
je me suis fais un petit délire de type de syntaxe que je voudrais utiliser
dite moi si c'est clair et facile a accimiler
exemple:
: commentaire
: annoncer une variable string
x. ok = "good"
: condition
si ok = "good" alors
msg "good" : messagebox
sinon
: saute vers la case bad
-> bad
: addresse de bad
<- bad
msg "bad"
se n'est qu'une esquise
il me reste tellement a apprendre
5 sept. 2007 à 13:35
Je pense que c'est une bonne initiative, mais il faut déja penser à ce que va apporter ton langage aux différents développeurs. Il existe déja beaucoup de langages différents mais dont chacun apporte ses avantages et ses inconvénients. Je pense que avant de créer un langage, il faut bien poser à plat les besoins des différents programmeurs. Si on regarde de plus pret, la grosse tendance et la programmation facile et rapide. Si on doit passer plusieurs mois à apprendre un langage que l'on est le seul à connaitre, ton langage sera mort nés. Par contre, si tu créer un langage simple, mais puissant, qui apporte de réels avantages par rapport aux autres, ton langage sera utilisé par beaucoup de monde. Je travaille dans la programmation industrielle, nous utilisons un environnement de développement appelé ISAGRAF. Cet environnement est exceptionnel car il est simple car il y a 2 type principaux de programmation : graphique (les opérations sont des boites affichées que l'on relit entre elle par des fils), textuelle (on peut ecrire des partie de code en pseudo C ). L'environnement ne compile pas, il crée des fichier C que l'on compile après avec le compilateur associé au µControleur du boitier à programmer.
En donnant cet exemple, je veux juste te faire remarquer que l'idée est bonne, mais que si tu veux ralier des programmeurs à ta cause, il faut un vrai cahier des charges en s'appuyant sur ce qui existe pour montrer les avantages d'un travail aussi colossal...
Par contre, Je souligne ton courage...
Oniria
5 sept. 2007 à 11:46
5 sept. 2007 à 11:30
5 sept. 2007 à 10:29
Je crois que je me suis emballé dans ce que j'ai dit (la fatigue et l'enthousiasme)
Franchement
Si je réussi un language interprété "Ce serait déjà un très bon début !" comme tu le dis
comment utilise ton flex et bison? svp que je regarde sa
merci encore
5 sept. 2007 à 10:05
Tu vas me dire que j'en veux aux débutants et que je cherche à démotiver toute initiative. Mais comme le dit f0xi, que je salut au passage, créer son propre langage est un projet très ambitieux qui demande de nombreuses compétences.
J'ai pour ma part créé plusieurs langages dont un, il y a une dizaine d'années, qui a été intégré dans un logiciel commercial. Mon expérience me permet de t'affirmer que tu prends le problème par la fin. En résumé, tu t'attaques à l'emballage alors qu'il n'y a rien dans le paquet ...
Je m'explique.
Un langage se définit par une syntaxe et une grammaire. La syntaxe permet entre autre de dire comment on écrit une chaîne de caractères, le nom d'une variable ... La grammaire quant à elle détermine comment sont structurés les éléments d'un source (affectation, test, boucle, fonction, ...).
Cela doit être le point de départ de ton projet faute de quoi ton algorithme qui va traiter ton code source sera totalement bogué. Je te conseille de t'intéresser aux outils comme lex et yacc (ou flex et bison en open source) sur lesquels ont été créés de très nombreux langages interprétés ou non (principalement dans le monde Unix).
Ensuite vient la phase génération de code. Il faut à ce niveau avoir un très bon niveau en assembleur et une très grande maîtrise du système d'exploitation cible (format du binaire, appels systèmes ...).
Tu peux te limiter à la génération d'un code source dans un autre langage. L'intérêt me semble dans ce cas limité car tu auras en final un langage moins riche et complexe à utiliser car tu devras également compiler le source résultant ... (cf NSDK pour les connaisseurs).
Enfin la cerise sur le gâteau est l'éditeur de source ou EDI pour les versions plus évoluées. Optionnel, il offrira une interface agréable à l'utilisateur final.
Je pense que tu devrais revoir ta cible et te limiter à un langage interprété. Ce serait déjà un très bon début !
5 sept. 2007 à 05:38
Mais bon...
Franchement je vais te dire pour le moment j'y vais tranquille.
NO STRESS!!
Si je réussi a créer une condition. Déjà je serais trop heureux
Je poste la mise a jour de se pas
Fini le System HighlightURL
faute de ne pas pouvoir installer SynEdit
merci FireJocker pour ton composant FireColorSynth
http://www.phidels.com/php/index.php3?page=../php/pagetelechargementzip.php3&id=576&PHPSESSID=7c51bd43b9fabf18d721ec2281468ead
5 sept. 2007 à 05:12
faire son propre OS ou son propre langage.
ça demande la maitrise parfaite d'au moins deux choses, le C/C++ et l'assembleur.
sans parler des concepts et regles concernant l'elaboration de ce genre de choses.
sinon un truc, l'affichage des sources galere si on mets des caracteres speciaux dans le nom des repertoires (++) ...