diff --git a/pendragon.project b/pendragon.project index 40b5f7f..6c2eb41 100644 --- a/pendragon.project +++ b/pendragon.project @@ -1 +1 @@ -{"categories":[{"name":"todo","content":[{"name":"multiple compilation error","description":"// Hello there","id":1},{"name":"if","description":"implémente if avec des guillemets de délimitation","id":1},{"name":"scope variable","description":"// Hello there","id":6},{"name":"while","description":"implémente un while","id":2},{"name":"else","description":"// Hello there","id":7},{"name":"break","description":"// Hello there","id":8},{"name":"continue","description":"// Hello there","id":9},{"name":"compilation","description":"// Hello there","id":3}]},{"name":"in progress","content":[]},{"name":"done","content":[{"name":"comparaison","description":"// Hello there","id":2},{"name":"booleen type","description":"// Hello there","id":4},{"name":"soixante-dix","description":"// Hello there","id":1},{"name":"parenthese comparaison","description":"// Hello there","id":1},{"name":"test comparaison","description":"// Hello there","id":4},{"name":"error ligne compilation","description":"// Hello there","id":2},{"name":"commentaires","description":"// Hello there","id":3},{"name":"compile time verification","description":"odre des termes rpn","id":1},{"name":"test multiple space in texte","description":"// Hello there","id":3},{"name":"test puis in texte","description":"// Hello there","id":2},{"name":"enchainement puis","description":"// Hello there","id":5},{"name":"guillemet mal ferme","description":"// Hello there","id":4},{"name":"display element","description":"for better print","id":6},{"name":"puis à la ligne, alinéa","description":"// Hello there","id":1},{"name":"teste double tiret","description":"// Hello there","id":2},{"name":"teste puis seul","description":"tout seul, seul devant, seul fin","id":3},{"name":"erreur calcul bool/nombre","description":"affiche element precedent lorsque mauvais enchainement","id":1}]},{"name":"bug","content":[]},{"name":"to test","content":[{"name":"tests mod","description":"// Hello there","id":3},{"name":"test variable","description":"// Hello there","id":2}]},{"name":"bonus","content":[{"name":"stop cheating with \"-\"","description":"// Hello there","id":5},{"name":"affiche ligne et position erreur","description":"// Hello there","id":1},{"name":"pour numero de ligne execution","description":"sauvegarde numero de ligne dans la commande\n\ncommande.ligne(12)","id":3},{"name":"standardizer erreur","description":"regarder les texte répétés","id":1}]},{"name":"+","content":[]}]} \ No newline at end of file +{"categories":[{"name":"todo","content":[{"name":"if","description":"implémente if avec des guillemets de délimitation","id":1},{"name":"scope variable","description":"// Hello there","id":6},{"name":"while","description":"implémente un while","id":2},{"name":"else","description":"// Hello there","id":7},{"name":"break","description":"// Hello there","id":8},{"name":"continue","description":"// Hello there","id":9},{"name":"compilation","description":"// Hello there","id":3}]},{"name":"in progress","content":[]},{"name":"done","content":[{"name":"comparaison","description":"// Hello there","id":2},{"name":"booleen type","description":"// Hello there","id":4},{"name":"soixante-dix","description":"// Hello there","id":1},{"name":"parenthese comparaison","description":"// Hello there","id":1},{"name":"test comparaison","description":"// Hello there","id":4},{"name":"error ligne compilation","description":"// Hello there","id":2},{"name":"commentaires","description":"// Hello there","id":3},{"name":"compile time verification","description":"odre des termes rpn","id":1},{"name":"test multiple space in texte","description":"// Hello there","id":3},{"name":"test puis in texte","description":"// Hello there","id":2},{"name":"enchainement puis","description":"// Hello there","id":5},{"name":"guillemet mal ferme","description":"// Hello there","id":4},{"name":"display element","description":"for better print","id":6},{"name":"puis à la ligne, alinéa","description":"// Hello there","id":1},{"name":"teste double tiret","description":"// Hello there","id":2},{"name":"teste puis seul","description":"tout seul, seul devant, seul fin","id":3},{"name":"erreur calcul bool/nombre","description":"affiche element precedent lorsque mauvais enchainement","id":1},{"name":"multiple compilation error","description":"// Hello there","id":1},{"name":"tests mod","description":"// Hello there","id":3}]},{"name":"bug","content":[]},{"name":"to test","content":[{"name":"test variable","description":"// Hello there","id":2}]},{"name":"bonus","content":[{"name":"stop cheating with \"-\"","description":"// Hello there","id":5},{"name":"affiche ligne et position erreur","description":"// Hello there","id":1},{"name":"pour numero de ligne execution","description":"sauvegarde numero de ligne dans la commande\n\ncommande.ligne(12)","id":3},{"name":"standardizer erreur","description":"regarder les texte répétés","id":1}]},{"name":"+","content":[]}]} \ No newline at end of file diff --git a/src/pendragon/debug.rs b/src/pendragon/debug.rs index 91bba8f..e42d0e9 100644 --- a/src/pendragon/debug.rs +++ b/src/pendragon/debug.rs @@ -187,9 +187,18 @@ impl fmt::Display for Operateur { impl fmt::Display for Programme { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {//' let mut texte: String = format!("variables : {:?}", self.variables); - for (index, commande) in self.commandes.iter().enumerate() { - texte += &format!("\n#{:2}-{}", index+1, commande); + for (index, phrase) in self.contenu.iter().enumerate() { + texte += &format!("\n#{:2}-{}", index+1, phrase); } write!(f, "{}", texte) } +} + +impl fmt::Display for Phrase { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {//' + match self { + Self::Commande(commande) => write!(f, "{}", commande), + Self::Bloc(_bloc) => write!(f, "bloc inconnu"), + } + } } \ No newline at end of file diff --git a/src/pendragon/mod.rs b/src/pendragon/mod.rs index 095b49b..e5c0ecc 100644 --- a/src/pendragon/mod.rs +++ b/src/pendragon/mod.rs @@ -130,7 +130,6 @@ pub fn format_de_variable(nom: &str) -> bool { #[cfg(test)] mod test { - use std::collections::HashMap; use super::*; #[test] @@ -148,7 +147,7 @@ mod test { ]; for commentaire in commentaires { match pendragon.compile(commentaire.into()) { - Ok(_) => assert_eq!(pendragon.programme.commandes.len(), 0, "Le commentaire '{}' ne devrait pas générer de commande", commentaire), + Ok(_) => assert_eq!(pendragon.programme.contenu.len(), 0, "Le commentaire '{}' ne devrait pas générer de commande", commentaire), Err(erreurs) => { let affichage_erreurs = erreurs.iter().map(|item| format!("{}", item.raison())).collect::>().join("\n\n"); panic!("Erreur de compilation du commentaire '{}' : \n{}", commentaire, affichage_erreurs) diff --git a/src/pendragon/structure.rs b/src/pendragon/structure.rs index 329e3ec..ea5ae8e 100644 --- a/src/pendragon/structure.rs +++ b/src/pendragon/structure.rs @@ -5,19 +5,19 @@ use super::*; pub struct Programme { pub variables: HashMap, - pub commandes: Vec, + pub contenu: Vec, } impl Programme { pub fn nouveau() -> Self { Self { variables: HashMap::new(), - commandes: vec![], + contenu: vec![], } } pub fn ajoute_commande(&mut self, commande: Commande) { - self.commandes.push(commande); + self.contenu.push(Phrase::Commande(commande)); } pub fn ajoute_variable(&mut self, nom: String, type_variable: TypeElement) -> Result<(), ErreurPendragon> { @@ -54,32 +54,27 @@ impl Programme { pub fn execute(&self) -> Result<(), ErreurPendragon> { let mut variables_globales: HashMap = HashMap::new(); - for commande in &self.commandes { - match commande { - Commande::Definis(nom, type_element) => { - variables_globales.insert(nom.to_string(), type_element.comme_element()); - } - Commande::Demande(nom) => { - let valeur = variables_globales[nom].type_element().demande_valeur(&nom)?; - variables_globales.insert(nom.to_string(), valeur); - } - Commande::Modifie(nom, expression) => { - let valeur = match variables_globales[nom].type_element() { - TypeElement::Entier => Element::Entier(nombre::calcule_nombre(expression.clone(), &variables_globales)?), - TypeElement::Texte => Element::Texte(texte::calcule_texte(expression.clone(), &variables_globales)?), - TypeElement::Booleen => Element::Booleen(booleen::calcule_booleen(expression.clone(), &variables_globales)?), - }; - variables_globales.insert(nom.to_string(), valeur); - } - Commande::Affiche(expression) => { - println!("{}", texte::calcule_texte(expression.to_vec(), &variables_globales)?); - } - } + for phrase in &self.contenu { + let Phrase::Commande(commande) = phrase else { + println!("doit executer bloc"); + continue; + }; + commande.execute(&mut variables_globales)?; } Ok(()) } } +pub struct Bloc { + condition: Vec, + contenu: Vec, +} + +pub enum Phrase { + Bloc(Bloc), + Commande(Commande), +} + pub enum Commande { Definis(String, TypeElement), Demande(String), @@ -87,6 +82,32 @@ pub enum Commande { Affiche(Vec), } +impl Commande { + fn execute(&self, variables: &mut HashMap) -> Result<(), ErreurPendragon> { + match self { + Commande::Definis(nom, type_element) => { + variables.insert(nom.to_string(), type_element.comme_element()); + } + Commande::Demande(nom) => { + let valeur = variables[nom].type_element().demande_valeur(&nom)?; + variables.insert(nom.to_string(), valeur); + } + Commande::Modifie(nom, expression) => { + let valeur = match variables[nom].type_element() { + TypeElement::Entier => Element::Entier(nombre::calcule_nombre(expression.clone(), variables)?), + TypeElement::Texte => Element::Texte(texte::calcule_texte(expression.clone(), variables)?), + TypeElement::Booleen => Element::Booleen(booleen::calcule_booleen(expression.clone(), variables)?), + }; + variables.insert(nom.to_string(), valeur); + } + Commande::Affiche(expression) => { + println!("{}", texte::calcule_texte(expression.to_vec(), variables)?); + } + } + Ok(()) + } +} + #[derive(PartialEq, Debug, Clone)] pub enum TypeElement { Entier,