diff --git a/pendragon.project b/pendragon.project index b21d2c2..8d5f043 100644 --- a/pendragon.project +++ b/pendragon.project @@ -1 +1 @@ -{"categories":[{"name":"todo","content":[{"name":"erreur calcul bool/nombre","description":"affiche element precedent lorsque mauvais enchainement","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":"puis à la ligne, alinéa","description":"// Hello there","id":1}]},{"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":"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":"+","content":[]}]} \ No newline at end of file +{"categories":[{"name":"todo","content":[{"name":"erreur calcul bool/nombre","description":"affiche element precedent lorsque mauvais enchainement","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":"puis à la ligne, alinéa","description":"// Hello there","id":1}]},{"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":"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":"+","content":[]}]} \ No newline at end of file diff --git a/src/pendragon/debug.rs b/src/pendragon/debug.rs index eccd43a..2b3c30d 100644 --- a/src/pendragon/debug.rs +++ b/src/pendragon/debug.rs @@ -72,9 +72,9 @@ impl fmt::Display for Commande { impl fmt::Display for Element { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {//' match self { - Self::Entier(nombre) => write!(f, "{}", nombre), + Self::Entier(nombre) => write!(f, "{}", nombre::nombre_comme_texte(*nombre)), Self::Texte(texte) => write!(f, "\"{}\"", texte), - Self::Booleen(booleen) => write!(f, "{}", booleen), + Self::Booleen(booleen) => write!(f, "{}", booleen::booleen_comme_texte(*booleen)), Self::Variable(nom, type_variable) => write!(f, "{}:{}", nom, type_variable.nom()), Self::Operateur(operateur) => write!(f, "{}", operateur), Self::Comparaison(comparaison) => write!(f, "{}.", comparaison), @@ -103,12 +103,12 @@ impl fmt::Display for Comparaison { impl fmt::Display for TypeComparaison { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {//' match self { - Self::Egal => write!(f, "=="), - Self::Different => write!(f, "!="), - Self::SuperieurEgal => write!(f, ">="), - Self::InferieurEgal => write!(f, "<="), - Self::Superieur => write!(f, ">"), - Self::Inferieur => write!(f, "<"), + Self::Egal => write!(f, "égal à"), + Self::Different => write!(f, "différent de"), + Self::SuperieurEgal => write!(f, "supérieur ou égal à"), + Self::InferieurEgal => write!(f, "inférieur ou égal à"), + Self::Superieur => write!(f, "supérieur à"), + Self::Inferieur => write!(f, "inférieur à"), } } } diff --git a/src/pendragon/nombre.rs b/src/pendragon/nombre.rs index 17a33a4..b61ff47 100644 --- a/src/pendragon/nombre.rs +++ b/src/pendragon/nombre.rs @@ -17,7 +17,13 @@ impl Pendragon { let mut pile_operateurs: Vec = Vec::new(); let mut precede_par_operation: bool = true; - for element in elements_texte { + for (index, element) in elements_texte.iter().enumerate() { + let element_precedent = if index > 0 { + elements_texte[index-1] + } else { + "le début" + }; + let element: &str = *element; match element { "plus" => { while let Some(operateur) = pile_operateurs.last() { @@ -61,14 +67,14 @@ impl Pendragon { } "ouvre-la-parenthese" => { if !precede_par_operation { - return Err(ErreurPendragon::CalculEntier("il manque un opérateur avant l'ouverture de parenthèse".into())) + return Err(ErreurPendragon::CalculEntier(format!("il manque un opérateur entre '{}' l'ouverture de parenthèse", element_precedent))) } pile_operateurs.push(Operateur::ParentheseEntier); continue } "ferme-la-parenthese" => { if precede_par_operation { - return Err(ErreurPendragon::CalculEntier("il manque un nombre avant la fermeture de parenthèse".into())) + return Err(ErreurPendragon::CalculEntier(format!("il manque un nombre entre '{}' et la fermeture de parenthèse", element_precedent))) } while let Some(operateur) = pile_operateurs.pop() { if operateur == Operateur::ParentheseEntier { @@ -80,7 +86,7 @@ impl Pendragon { } autre => { if !precede_par_operation { - return Err(ErreurPendragon::CalculEntier(format!("il manque un opérateur avant le nombre '{}'", autre))) + return Err(ErreurPendragon::CalculEntier(format!("il manque un opérateur entre '{}' et '{}'", element_precedent, autre))) } precede_par_operation = false; if format_de_variable(autre) { @@ -93,7 +99,7 @@ impl Pendragon { } } if precede_par_operation { - return Err(ErreurPendragon::CalculEntier(format!("il manque un nombre avant l'opérateur '{}'", element))) + return Err(ErreurPendragon::CalculEntier(format!("il manque un nombre entre '{}' et '{}'", element_precedent, element))) } precede_par_operation = true; } diff --git a/src/pendragon/texte.rs b/src/pendragon/texte.rs index 552a2ce..c31104b 100644 --- a/src/pendragon/texte.rs +++ b/src/pendragon/texte.rs @@ -58,6 +58,7 @@ impl Pendragon { if pile_inconnu.len() == 1 && format_de_variable(premier_element) { expression.push(Element::Variable(premier_element.into(), self.programme.variable(premier_element)?)); *pile_inconnu = Vec::new(); + expression.push(Element::Operateur(Operateur::Puis)); return Ok(()); } let Err(raison) = self.elements_nombre(premier_element) else { @@ -100,10 +101,12 @@ pub fn calcule_texte(expression: Vec, variables: &HashMap { match calcule_texte(expression, &HashMap::new()) { Ok(texte) => { - let vrai_texte = format!("hello{}therevrai", nombre::nombre_comme_texte(a*b)); + let vrai_texte = format!("hello{}therevraitroisdeux", nombre::nombre_comme_texte(a*b)); assert_eq!(texte, vrai_texte, "Calcul d'expression (texte) donne un mauvais résultat : {}", texte); } Err(raison) => { diff --git a/test.dr b/test.dr index c6db3c7..0cad3c0 100644 --- a/test.dr +++ b/test.dr @@ -9,8 +9,11 @@ Modifie B avec trois fois A fois ouvre la parenthèse trois fois A plus C ferme Nota Bene : 3*A*(3*A+C). Affiche "Résultat : " puis B. + Si A supérieur ou égal à trois, Définis Bool comme booléen. Modifie Bool avec vrai. -Affiche vrai et faux. \ No newline at end of file +Affiche vrai et faux. + +Affiche trois plus un. \ No newline at end of file