diff --git a/pendragon.project b/pendragon.project index 4ef4e8a..b21d2c2 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":"display element","description":"for better print","id":6},{"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":"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":"+","content":[]}]} \ No newline at end of file diff --git a/src/pendragon/booleen.rs b/src/pendragon/booleen.rs index ed1aea5..5db8931 100644 --- a/src/pendragon/booleen.rs +++ b/src/pendragon/booleen.rs @@ -20,13 +20,19 @@ impl Pendragon { let mut possible_comparaison: Option = None; 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 { "vrai" => { self.fin_comparaison("vrai", &mut pile_inconnu, &mut pile_operateurs, &mut expression, &mut possible_comparaison)?; expression.push(Element::Booleen(true)); if !precede_par_operation { - return Err(ErreurPendragon::CalculBooleen("il manque un opérateur avant le booléen 'vrai'".into())) + return Err(ErreurPendragon::CalculBooleen(format!("il manque un opérateur entre '{}' et 'vrai'", element_precedent))) } precede_par_operation = false; continue; @@ -35,7 +41,7 @@ impl Pendragon { self.fin_comparaison("faux", &mut pile_inconnu, &mut pile_operateurs, &mut expression, &mut possible_comparaison)?; expression.push(Element::Booleen(false)); if !precede_par_operation { - return Err(ErreurPendragon::CalculBooleen("il manque un opérateur avant le booléen 'faux'".into())) + return Err(ErreurPendragon::CalculBooleen(format!("il manque un opérateur entre '{}' et 'faux'", element_precedent))) } precede_par_operation = false; continue; @@ -44,7 +50,7 @@ impl Pendragon { self.fin_comparaison("non", &mut pile_inconnu, &mut pile_operateurs, &mut expression, &mut possible_comparaison)?; pile_operateurs.push(Operateur::Non); if !precede_par_operation { - return Err(ErreurPendragon::CalculBooleen("il manque un opérateur avant l'opérateur 'non'".into())) + return Err(ErreurPendragon::CalculBooleen(format!("il manque un opérateur entre '{}' et 'non'", element_precedent))) } continue; } @@ -72,14 +78,14 @@ impl Pendragon { } "ouvre-la-parenthese" => { if !precede_par_operation && pile_inconnu.len() > 0 { - return Err(ErreurPendragon::CalculBooleen("il manque un opérateur avant l'ouverture de la parenthèse".into())) + return Err(ErreurPendragon::CalculBooleen(format!("il manque un opérateur entre '{}' et l'ouverture de la parenthèse", element_precedent))) } pile_inconnu.push("ouvre-la-parenthese".into()); continue; } "ferme-la-parenthese" => { if precede_par_operation { - return Err(ErreurPendragon::CalculBooleen("il manque un booleen avant la fermeture de la parenthèse".into())) + return Err(ErreurPendragon::CalculBooleen(format!("il manque un booleen entre '{}' et la fermeture de la parenthèse", element_precedent))) } let nombre_parenthese = compare_parentheses(&pile_inconnu); if nombre_parenthese.0 > nombre_parenthese.1 { @@ -105,7 +111,7 @@ impl Pendragon { } } else if let Ok(type_comparaison) = texte_comme_comparaison(autre) { if let Some(comparaison) = possible_comparaison { - return Err(ErreurPendragon::BooleenInvalide(format!("besoin d'un operateur booleen entre {} et {}", comparaison, type_comparaison))) + return Err(ErreurPendragon::BooleenInvalide(format!("il manque un operateur booleen entre '{}' et '{}'", comparaison, type_comparaison))) } let mut comparaison = Comparaison::nouvelle(); let nombre_parenthese = compare_parentheses(&pile_inconnu); @@ -120,15 +126,12 @@ impl Pendragon { } else { pile_inconnu.push(autre.into()); } -// if !precede_par_operation { -// return Err(ErreurPendragon::CalculBooleen(format!("il manque un opérateur avant le booléen '{}'", autre))) -// } precede_par_operation = false; continue; } } if precede_par_operation { - return Err(ErreurPendragon::CalculBooleen(format!("il manque un booleen avant l'opérateur '{}'", element))) + return Err(ErreurPendragon::CalculBooleen(format!("il manque un booleen entre '{}' et '{}'", element_precedent, element))) } precede_par_operation = true; } @@ -406,7 +409,6 @@ mod test { for c in 0..5 { for d in 1..5 { for e in 0..5 { - println!(); let possible_expression = pendragon.elements_booleen(&format!("non ouvre la parenthèse six plus {} ferme la parenthèse est supérieur à deux fois {} et ouvre la parenthèse {} divisé par deux est inférieur à ouvre la parenthèse {} moins un ferme la parenthèse ou non \"deux\" est égal à \"{}\" ferme la parenthèse", nombre::nombre_comme_texte(a), nombre::nombre_comme_texte(b), @@ -441,6 +443,7 @@ mod test { fn erreur_calcul_booleen() { let pendragon = Pendragon::nouveau(); let textes_invalide = vec![ + "et faux", "vrai et et faux", "vrai ou ou faux", "vrai et vrai faux", diff --git a/src/pendragon/nombre.rs b/src/pendragon/nombre.rs index 0090c2f..17a33a4 100644 --- a/src/pendragon/nombre.rs +++ b/src/pendragon/nombre.rs @@ -299,6 +299,10 @@ pub fn texte_comme_nombre(texte: &str) -> Result { } fn texte_comme_petit_nombre(texte: &str) -> Result { + let texte = texte.trim(); + if texte.starts_with("et") || texte.ends_with("et") { + return Err(ErreurPendragon::NombreInvalide(texte.to_string())) + } let elements: Vec<&str> = texte.split(UNION).collect(); let mut nombre = 0; @@ -435,4 +439,15 @@ mod test { }; } } + + #[test] + fn nombre_invalide_et() { + let pendragon = Pendragon::nouveau(); + let Err(raison) = pendragon.elements_nombre("et") else { + panic!("Devrait détecter une erreur pour 'et'"); + }; + let ErreurPendragon::NombreInvalide(_) = raison else { + panic!("Devrait détecter une erreur de nombre invalide pour 'et', a déclenché : {}", raison); + }; + } } diff --git a/src/pendragon/texte.rs b/src/pendragon/texte.rs index 97a67a6..552a2ce 100644 --- a/src/pendragon/texte.rs +++ b/src/pendragon/texte.rs @@ -37,7 +37,6 @@ impl Pendragon { pile_inconnu.push(element.into()); continue; } - self.puis(&mut expression, &mut pile_inconnu)?; } self.puis(&mut expression, &mut pile_inconnu)?; @@ -61,16 +60,25 @@ impl Pendragon { *pile_inconnu = Vec::new(); return Ok(()); } - if let Ok(_) = self.elements_nombre(premier_element) { + let Err(raison) = self.elements_nombre(premier_element) else { expression.extend(self.elements_nombre(&pile_inconnu.join(" "))?); - } else if let Ok(_) = self.elements_booleen(premier_element) { - expression.extend(self.elements_booleen(&pile_inconnu.join(" "))?); - } else { - return Err(ErreurPendragon::MauvaisArgument(pile_inconnu.join(" ").to_string())); + *pile_inconnu = Vec::new(); + expression.push(Element::Operateur(Operateur::Puis)); + return Ok(()) + }; + if let ErreurPendragon::CalculEntier(_) = raison { + return Err(raison) } - *pile_inconnu = Vec::new(); - expression.push(Element::Operateur(Operateur::Puis)); - Ok(()) + let Err(raison) = self.elements_booleen(premier_element) else { + expression.extend(self.elements_booleen(&pile_inconnu.join(" "))?); + *pile_inconnu = Vec::new(); + expression.push(Element::Operateur(Operateur::Puis)); + return Ok(()); + }; + let ErreurPendragon::CalculBooleen(_) = raison else { + return Err(ErreurPendragon::MauvaisArgument(pile_inconnu.join(" ").to_string())); + }; + Err(raison) } } diff --git a/test.dr b/test.dr index 39a7da8..c6db3c7 100644 --- a/test.dr +++ b/test.dr @@ -11,4 +11,6 @@ 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